curl --request GET \
--url https://brew.new/api/v1/contacts \
--header 'Authorization: Bearer <token>'import requests
url = "https://brew.new/api/v1/contacts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://brew.new/api/v1/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://brew.new/api/v1/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://brew.new/api/v1/contacts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://brew.new/api/v1/contacts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://brew.new/api/v1/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Doe",
"subscribed": true,
"validationStatus": "valid",
"verificationStatus": "valid",
"suppressed": false,
"suppressedReason": null,
"consent": {
"source": "form",
"capturedAt": "2026-04-08T12:00:00.000Z",
"policyVersion": "2026-03"
},
"createdAt": "2026-04-08T12:00:00.000Z",
"updatedAt": "2026-04-08T12:05:00.000Z",
"importId": null,
"customFields": {
"plan": "enterprise",
"revenue": 4200
}
},
{
"email": "john@example.com",
"firstName": "John",
"lastName": "Smith",
"subscribed": true,
"validationStatus": "valid",
"verificationStatus": "valid",
"suppressed": false,
"suppressedReason": null,
"consent": {
"source": "form",
"capturedAt": "2026-04-08T12:00:00.000Z",
"policyVersion": "2026-03"
},
"createdAt": "2026-04-08T12:00:00.000Z",
"updatedAt": "2026-04-08T12:05:00.000Z",
"importId": null,
"customFields": {
"plan": "starter"
}
}
],
"pagination": {
"limit": 50,
"cursor": "eyJsYXN0SWQiOiIxMjMiLCJsYXN0U29ydCI6MTcxMjU5MjAwMDAwMH0=",
"hasMore": true
}
}List contacts
Lists the brand’s contacts under { data, pagination }, newest first by default.
Use when paging through contacts, running a free-text search, or reading one saved audience’s members. Typed filter clauses and counts are searchContacts.
Input search (free text), audienceId (only that saved audience’s members), sort (any core column or custom field, default createdAt) and order, limit and cursor.
Returns 200 with a page of Contact rows.
Errors 400 INVALID_REQUEST for an unknown audienceId, an unsupported sort field or an invalid cursor.
See also getContact, searchContacts, upsertContacts, listContactFields.
curl --request GET \
--url https://brew.new/api/v1/contacts \
--header 'Authorization: Bearer <token>'import requests
url = "https://brew.new/api/v1/contacts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://brew.new/api/v1/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://brew.new/api/v1/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://brew.new/api/v1/contacts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://brew.new/api/v1/contacts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://brew.new/api/v1/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Doe",
"subscribed": true,
"validationStatus": "valid",
"verificationStatus": "valid",
"suppressed": false,
"suppressedReason": null,
"consent": {
"source": "form",
"capturedAt": "2026-04-08T12:00:00.000Z",
"policyVersion": "2026-03"
},
"createdAt": "2026-04-08T12:00:00.000Z",
"updatedAt": "2026-04-08T12:05:00.000Z",
"importId": null,
"customFields": {
"plan": "enterprise",
"revenue": 4200
}
},
{
"email": "john@example.com",
"firstName": "John",
"lastName": "Smith",
"subscribed": true,
"validationStatus": "valid",
"verificationStatus": "valid",
"suppressed": false,
"suppressedReason": null,
"consent": {
"source": "form",
"capturedAt": "2026-04-08T12:00:00.000Z",
"policyVersion": "2026-03"
},
"createdAt": "2026-04-08T12:00:00.000Z",
"updatedAt": "2026-04-08T12:05:00.000Z",
"importId": null,
"customFields": {
"plan": "starter"
}
}
],
"pagination": {
"limit": 50,
"cursor": "eyJsYXN0SWQiOiIxMjMiLCJsYXN0U29ydCI6MTcxMjU5MjAwMDAwMH0=",
"hasMore": true
}
}Authorizations
Send your Brew API key as Authorization: Bearer brew_xxx.
Headers
The brand this request acts on. REQUIRED for organization-scoped credentials (otherwise 400 BRAND_ID_REQUIRED — there is no default brand); list ids with GET /v1/brands. Brand-scoped credentials may omit it, and sending a different brand returns 403 BRAND_SCOPE_MISMATCH. A brand outside your organization returns 404 BRAND_NOT_FOUND.
1 - 64Query Parameters
Free-text search.
1Only members of this saved audience.
1 - 641asc, desc Page size (1-100). Defaults to 100.
1 <= x <= 10050
1 - 8192Was this page helpful?