Brew list endpoints use opaque cursor pagination. Every paginated response carries aDocumentation Index
Fetch the complete documentation index at: https://docs.brew.new/llms.txt
Use this file to discover all available pages before exploring further.
pagination: { limit, cursor?, hasMore } envelope so callers can iterate without page-counting math.
The pagination envelope
Endpoints that paginate
| Endpoint | Default limit | Max limit | Cursor | Notes |
|---|---|---|---|---|
GET /v1/contacts | 50 | 100 | Yes | Filterable + sortable (search, sort, order, logic, filters). |
GET /v1/automation/runs | 25 | 100 | Yes | Filterable on automationId, triggerEventId, status, mode, from, to. ?include=logs attaches per-node logs. |
Endpoints that don’t paginate (yet)
These return the full set for the brand. Practical limits ship below; if you have a brand that consistently exceeds them, contact support and we’ll add cursor pagination.| Endpoint | Practical cap | Why |
|---|---|---|
GET /v1/audiences | ~hundreds | Saved audiences are managed in the dashboard; brands typically have ≤ 100. |
GET /v1/domains | ~tens | Each brand verifies a handful of sending domains. |
GET /v1/fields | ~hundreds | Custom contact field definitions; usually ≤ 50. |
GET /v1/emails | ~thousands | Returns the latest version per emailId. Filterable on emailType, status, createdAtFrom/To, updatedAtFrom/To. |
GET /v1/templates | ~thousands | Public template catalog; filterable on brand, category, semantic. |
GET /v1/triggers | ~hundreds | Includes integration-provisioned + API-created triggers. |
GET /v1/automations | ~hundreds | Returns latest version per automationId. |
Single-row lookups (always a one-element list)
Several get-one endpoints return the same envelope as the list — a one-element array — so SDK code stays uniform whether you’re fetching a single row or many:| Endpoint | Body |
|---|---|
GET /v1/triggers?triggerEventId=tri_xxx | { triggers: [TriggerRow] } |
GET /v1/automations?automationId=auto_xxx | { automations: [AutomationRow] } (optionally automations[0].versions[] with ?include=versions) |
GET /v1/automation/runs?automationRunId=run_xxx | { runs: [AutomationRunRow], logs?: [...] } (optional logs[] with ?include=logs) |
404 <RESOURCE>_NOT_FOUND — never an empty array.
Canonical iteration loop
The standard cursor pattern — works forcontacts and automation runs:
SDK pagination (TypeScript)
The official@brew.new/sdk returns the raw { contacts, pagination } shape — pass the cursor back on the next call:
brew.contacts.list → brew.automationRuns.list with the same shape.
Filter combinations
GET /v1/contacts supports search + sort + filter on the same call:
GET /v1/automation/runs supports time-range and status filters:
Cursor semantics
- Opaque. Cursors are server-generated tokens. Don’t parse them; don’t synthesise them. The format may change between releases.
- Stable within a page. A cursor returned on page N points to “the next batch of rows that existed when N was rendered”. New rows inserted concurrently may show up; deleted rows may be skipped. This is fine for analytics / bulk export; if you need strict snapshot reads, freeze a time bound with
?from=&to=. - 24-hour TTL. Cursors don’t expire on a strict clock today, but treat them as if they’re good for ~24h — re-start with no cursor if a job pauses overnight.
See also
- Rate limits — a tight pagination loop can burn through
100/minquickly; consider parallelizing across keys or honoringX-RateLimit-Remaining. - Batch operations — for writing lots of rows fast (
POST /v1/contactsaccepts up to 1000 rows per request). - Errors —
404on a get-one lookup;400 INVALID_REQUESTon bad cursors.
Need Help?
Our team is ready to support you at every step of your journey with Brew. Choose the option that works best for you:- Self-Service Tools
- Talk to Our Team
Search Documentation
Type in the “Ask any question” search bar at the top left to instantly find relevant documentation pages.
ChatGPT/Claude Integration
Click “Open in ChatGPT” at the top right of any page to analyze documentation with ChatGPT or Claude for deeper insights.