Skip to main content

Overview

Brew currently ships an official TypeScript SDK for the public API. It is a thin, typed wrapper over the same /api/v1 endpoints documented in the API reference. The SDK does not invent a second contract. It follows the OpenAPI source of truth.

Current SDK

SDKPackageInstall
TypeScript@brew.new/sdknpm install @brew.new/sdk

What You Get

  • Typed request and response shapes.
  • One client with resource methods like brew.contacts.upsert(...).
  • Automatic retries for safe retry cases.
  • Auto-generated idempotency keys on POST.
  • Typed BrewApiError handling for non-2xx responses.

Current TypeScript SDK Resources

The TypeScript SDK exposes every public v1 resource. Reads are flat — one list() per resource that returns a { data, pagination } collection, or a single row when you pass its id (list({ emailId }), list({ audienceId }), …). ?include= opt-ins (html, versions, graph, count, events, logs) embed the heavier detail on demand.
ResourceMethodsNotes
brew.usagegetPlan, credit balance, and email-send quota.
brew.analyticscampaigns, automations, events, eventsAllRead-only KPIs + the unified event explorer.
brew.analytics.sendslist, listAllThe single send read. list({ sendId, include: 'events' }) returns one send + its per-recipient events; list({ emailId }) filters to a design. Writes stay on brew.emails.send.
brew.analytics.triggerInstanceslist, listAllFired-trigger instance history (list({ triggerInstanceId }) for one).
brew.automationscreate, list, patch, publish, unpublish, delete, testDeterministic graph; every sendEmail node pins emailVersionId. list({ automationId, include: 'graph,versions' }) returns one automation. publish() / unpublish() are convenience wrappers over patch({ published }).
brew.automations.triggerscreate, list, patch, delete, fireDeterministic create (brew_api provider hardcoded server-side) → bare row. list({ triggerEventId }) for one; patch is metadata-only; gate firing via automation.published.
brew.automations.runslist, listAllRead-only run history. list({ automationRunId, include: 'logs' }) returns one run + its logs[].
brew.emailsgenerate, import, edit, list, auditAccessibility, restore, delete, sendAI body generation via generate({ prompt }); import({ format, content }) ingests existing HTML/MJML/JSX into an editable design. list({ emailId, include: 'html,versions' }) returns one design (carries previewImage). send(input) delivers a design — pass test: true for a one-off QA send. Send reads live on brew.analytics.sends.
brew.sendscancelcancel(sendId) cancels a scheduled or queued send → { sendId, status: 'canceled' }. Idempotent (already-canceled → 200); 409 once the send is sending / sent / failed, 404 for an unknown / cross-brand id.
brew.contactsupsert, patch, delete, search, validate, importCsvThe contact read is search({ filters, audienceId?, search?, sort, count?, cursor }) — by-email = a { field: 'email', operator: 'equals' } filter. upsert / delete take a single contact or a batch (≤ 1000).
brew.contentgenerateImage, gif, transform, htmlToPng, addImageCredit-metered media generation + image ops. gif({ from }) and transform({ operation }) are discriminated unions.
brew.fieldslist, create, deleteCustom contact fields.
brew.audienceslist, create, update, deleteSaved audiences. list({ audienceId, include: 'count' }) returns one audience + its live member count.
brew.domainslist, add, verify, updateSettings, deleteSending domains. list({ domainId }) for one; list({ sendableOnly: true }) filters to verified senders.
brew.brandget, patch, update, getImagesBrand readiness + design context. get({ include }) embeds identity / emailDesign / imageStyle / logos; patch() (alias update()) writes them; getImages({ q?, type?, aspectRatio? }) searches the brand image library (q = credit-metered semantic search; no q = a free browse).
brew.templateslistOrg-wide public template catalog (rows carry html + previewImage).
brew.helpgetNo-auth machine-readable API catalog (GET /v1/help).
Brand management is not part of the public API or the SDK. Each API key is bound to exactly one brand, and every resource above except templates (org-wide) and help (no-auth) automatically scopes to that brand. Create and manage keys at brew.new/settings/api. See the API introduction’s Brand Scoping section for the full breakdown.

Other Languages

The TypeScript SDK is the only one Brew currently ships as a typed, versioned wrapper. For Python / Go / Ruby / Java / PHP / Swift / Kotlin / .NET, generate a client from the canonical OpenAPI 3.1 spec — see Generate your own SDK for the recommended generators and one-command scaffolds. The spec lives at:
  • https://brew.new/openapi/public-api-v1.yaml — served from the API host
  • https://docs.brew.new/api-reference/openapi-public-v1.yaml — served from this docs site
If you want REST directly (no codegen), every endpoint works fine with curl / httpx / fetch — see the cURL examples on every generated Public API v1 endpoint page.

SDK Or REST API

Use the SDK when you want:
  • Type safety.
  • Less HTTP boilerplate.
  • Built-in retries and idempotency support.
  • A resource-oriented client surface.
import { createBrewClient } from '@brew.new/sdk'

const brew = createBrewClient({
  apiKey: process.env.BREW_API_KEY!,
})

const { data: domains } = await brew.domains.list()

Suggested Reading Order

  1. Authentication
  2. TypeScript Installation
  3. TypeScript Quickstart
  4. API Reference

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:

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.