> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brew.new/llms.txt
> Use this file to discover all available pages before exploring further.

# Read a saved email audit

> Returns a bounded page of the normalized audit findings, including finding IDs, rule IDs, targets, remediation, and the audited content hash. Reading pages is free and never reruns the audit. Continue using pagination.cursor. Reports are retained for seven days; the report’s expiresAt is the separate audit-attestation expiry. Completion and coverage fields identify incomplete analysis or representative-only findings.



## OpenAPI

````yaml /api-reference/openapi-public-v1.yaml get /v1/emails/audits/{auditId}
openapi: 3.1.0
info:
  title: Brew Public API v1
  version: 1.0.0
  description: >-
    Brew Public API v1. Generated from the app Zod contracts
    (`lib/<domain>/contracts.ts`): this document is the contract, and every
    operation documents exactly the error codes it can return.


    - Base URL `https://brew.new/api`; every path starts with `/v1`; JSON in and
    out. Request bodies and query strings are strict: an unknown key is `400
    INVALID_REQUEST` and `error.param` names it.

    - Identity is always in the path. `GET /v1/<collection>` lists (`{ data,
    pagination: { limit, cursor, hasMore } }`; page until `cursor` is `null`),
    and `GET /v1/<collection>/{id}` returns the bare resource, the same object a
    write returns. `?include=` expands relations on a detail read only, and is
    `400` on a list. There is no `?<idKey>=` read anywhere.

    - Writes carry identity in the path and return the bare resource: `POST
    /v1/<collection>` creates (`201`, or `202` when work continues
    asynchronously), `PATCH` and `DELETE /v1/<collection>/{id}` update or delete
    (`DELETE` answers `{ <idField>, deleted }` and is idempotent). Lifecycle
    state changes such as publishing ride `PATCH` as attributes. Two writes
    report more than the row and say so in their shape: `POST` and `PATCH
    /v1/contacts` are upserts that answer `{ contact, created | updated, … }`
    because whether a row was created, which fields changed, and which field
    definitions were minted are facts about the write, not about the contact.

    - Non-CRUD operations are explicit action sub-paths, for example `POST
    /v1/automations/{automationId}/test`, `POST /v1/domains/{domainId}/verify`,
    `POST /v1/sends/{sendId}/cancel` and `POST
    /v1/automations/triggers/{triggerEventId}/fire`.

    - Every resource has one root. Sends read and write at `/v1/sends`, fired
    triggers at `/v1/automations/trigger-instances`, and `/v1/analytics/*` holds
    only reports (aggregates over a window). Every endpoint answers in the same
    envelopes, with no exceptions.

    - Field names are camelCase; enum values are lowercase snake_case;
    timestamps are ISO 8601 UTC strings. Identifiers are opaque strings of at
    most 64 characters (`triggerEventId` up to 256); never parse a prefix.

    - Everything that runs shares one status vocabulary: `queued`, `scheduled`,
    `running`, `paused`, `completed`, `partially_completed`, `failed`,
    `canceled`. It covers sends, automation runs, manual audience runs, audience
    builds and inbox placement tests, so one status switch reads them all. A
    step inside a run is `running`, `completed`, `failed` or `skipped`.

    - Every error on every endpoint is `{ error: { code, type, message,
    suggestion, docs, param?, retryAfter?, details? } }`. Branch on `code`: the
    closed list is the `ApiErrorCode` component and every operation documents
    exactly the codes it can return. Non-fatal caveats arrive as `warnings: [{
    code, message, field? }]` on `2xx` bodies.

    - A credential is brand-scoped (the brand is implicit; send nothing) or
    organization-scoped (name the brand with the `X-Brand-Id` header on
    brand-scoped operations, else `400 BRAND_ID_REQUIRED`; there is no default
    brand). Only `POST /v1/api-keys` carries a `brandId` field, and only a
    signed-in organization admin session may call `/v1/api-keys`. A brand
    outside your reach surfaces as `404`, never `403`.

    - Send `Idempotency-Key` (up to 100 characters) on any POST you might
    repeat: the same key and body replays the original response for 24 hours;
    the same key with a different body is `409 IDEMPOTENCY_CONFLICT`. Rate
    limits are per credential and named policy (`X-RateLimit-*` headers; `429`
    carries `Retry-After`). Credit-metered operations advertise `402` and carry
    `x-brew-credited: true` in the spec.

    - Discovery without a key: `GET /v1/help` (JSON catalog with scopes, credits
    and rate limits per operation), `GET /v1/llms.txt` (this guide) and `GET
    /v1/health`. The OpenAPI document is served at `/openapi.json`.
  contact:
    name: Brew Support
    url: https://docs.brew.new
    email: support@brew.new
servers:
  - url: https://brew.new/api
    description: Production
  - url: http://localhost:3000/api
    description: Local development
security:
  - bearerAuth: []
  - apiKeyAuth: []
tags:
  - name: Emails
    description: >-
      Email designs and sending. Generate a design with the Brew email agent,
      edit, version, restore — then send it: `POST /v1/sends` delivers a design
      to a target (a saved audience, an inline list, or a single address) via a
      verified domain, and `POST /v1/sends` with `test: true` fires a one-off
      test. Sending is not campaign-specific. Send reads live under Sends
      (`/v1/sends`).
  - name: Sends
    description: >-
      The unit of delivery and analytics. `POST /v1/sends` delivers a design to
      a target; `GET /v1/sends` lists campaign sends (with lifetime stats) or,
      with a join filter, one automation’s per-recipient deliveries; `GET
      /v1/sends/{sendId}` reads one send and its events. Cancel, pause and
      resume are action sub-paths.
  - name: Brands
    description: >-
      Brand lifecycle for ORGANIZATION-scoped credentials: list the brands a
      credential can reach, read one, and create a new one (extraction runs
      asynchronously — poll `GET /v1/brands/{brandId}` until `status:
      completed`). These endpoints act on the organization, so they take no
      `X-Brand-Id`.
  - name: Analytics
    description: >-
      Read-only cross-resource reports: the brand overview, windowed automation
      performance and the unified event feed. Send rows (with lifetime stats)
      live at `/v1/sends`; fired triggers at
      `/v1/automations/trigger-instances`.
  - name: Automations
    description: >-
      Automation graphs — deterministic create from explicit `nodes` +
      `connections`, update, version, publish / unpublish, test. Includes
      trigger event definitions + the fire endpoint (`/v1/automations/triggers`)
      and run history (`/v1/automations/runs`).
  - name: Contacts
    description: Create, search, patch, and delete contacts. Email is the primary key.
  - name: Contact Fields
    description: List, create, and delete custom contact field definitions.
  - name: Audiences
    description: Saved contact filter sets — a recipient target for sends.
  - name: Domains
    description: 'Sending domains: add, read DNS records, verify, configure sender defaults.'
  - name: Templates
    description: Public template gallery (read-only) usable as generation references.
  - name: Brand
    description: The single brand bound to the API key.
  - name: Chats
    description: >-
      Read a brand-scoped digest of a Brew chat — referenced
      emails/automations/triggers + a trimmed transcript — so an external agent
      can resume the conversation.
  - name: Integrations
    description: >-
      Brand-scoped catalog of connectable providers plus which ones are already
      connected. Connect itself stays in Settings (`/integrations/{provider}`).
  - name: API Keys
    description: >-
      Mint, list, and revoke API keys through a signed-in Clerk session whose
      active organization role is exactly `org:admin`. API-key and OAuth actors
      receive `403`. `POST` body `brandId` is the new key's binding (the only v1
      body field named `brandId`).
  - name: Meta
    description: >-
      Public discovery surface (no auth): the machine-readable API catalog
      (`/v1/help`).
paths:
  /v1/emails/audits/{auditId}:
    get:
      tags:
        - Emails
      summary: Read a saved email audit
      description: >-
        Returns a bounded page of the normalized audit findings, including
        finding IDs, rule IDs, targets, remediation, and the audited content
        hash. Reading pages is free and never reruns the audit. Continue using
        pagination.cursor. Reports are retained for seven days; the report’s
        expiresAt is the separate audit-attestation expiry. Completion and
        coverage fields identify incomplete analysis or representative-only
        findings.
      operationId: getEmailAudit
      parameters:
        - schema:
            type: string
            format: uuid
          required: true
          name: auditId
          in: path
        - schema:
            type: string
            maxLength: 100
          required: false
          name: cursor
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            description: Page size (1-100). Defaults to 100.
            example: 50
          required: false
          description: Page size (1-100). Defaults to 100.
          name: limit
          in: query
          example: 50
        - name: X-Brand-Id
          in: header
          required: false
          description: >-
            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`.
          schema:
            type: string
            minLength: 1
            maxLength: 64
          example: kx7b3s7fapqz8mjm12ekz1kxdx87yceg
      responses:
        '200':
          description: One page of saved findings.
          headers:
            x-request-id:
              schema:
                type: string
                description: >-
                  Unique request identifier. Share this with support when
                  debugging a request.
                example: req_8cac13fd94e6420cacdd75a1aa403a28
              required: true
              description: >-
                Unique request identifier. Share this with support when
                debugging a request.
            X-RateLimit-Limit:
              schema:
                type: integer
                description: Requests allowed in the current rolling rate limit window.
                example: 100
              required: true
              description: Requests allowed in the current rolling rate limit window.
            X-RateLimit-Remaining:
              schema:
                type: integer
                description: Requests remaining in the current rolling rate limit window.
                example: 99
              required: true
              description: Requests remaining in the current rolling rate limit window.
            X-RateLimit-Reset:
              schema:
                type: integer
                description: >-
                  Unix timestamp in seconds for when the rolling window fully
                  resets.
                example: 1712592360
              required: true
              description: >-
                Unix timestamp in seconds for when the rolling window fully
                resets.
          content:
            application/json:
              schema:
                type: object
                properties:
                  schemaVersion:
                    type: number
                    enum:
                      - 1
                  rulesetVersion:
                    type: string
                    minLength: 1
                    maxLength: 100
                  auditId:
                    type: string
                    format: uuid
                  contentHash:
                    type: string
                    pattern: ^sha256:[0-9a-f]{64}$
                  auditedAt:
                    type: string
                    format: date-time
                  expiresAt:
                    type: string
                    format: date-time
                  policy:
                    type: object
                    properties:
                      purpose:
                        type: string
                        enum:
                          - marketing
                          - transactional
                          - unknown
                      source:
                        type: string
                        enum:
                          - provided
                          - defaulted
                          - trusted_adapter
                      unsubscribe:
                        type: string
                        enum:
                          - required
                          - not_required
                          - not_evaluated
                    required:
                      - purpose
                      - source
                      - unsubscribe
                    additionalProperties: false
                  summary:
                    type: object
                    properties:
                      blockers:
                        type: integer
                        minimum: 0
                      errors:
                        type: integer
                        minimum: 0
                      warnings:
                        type: integer
                        minimum: 0
                      info:
                        type: integer
                        minimum: 0
                      total:
                        type: integer
                        minimum: 0
                    required:
                      - blockers
                      - errors
                      - warnings
                      - info
                      - total
                    additionalProperties: false
                  checks:
                    type: array
                    items:
                      oneOf:
                        - type: object
                          properties:
                            id:
                              type: string
                              minLength: 1
                              maxLength: 128
                            status:
                              type: string
                              enum:
                                - passed
                            durationMs:
                              type: integer
                              minimum: 0
                            findingCount:
                              type: number
                              enum:
                                - 0
                          required:
                            - id
                            - status
                            - durationMs
                            - findingCount
                          additionalProperties: false
                        - type: object
                          properties:
                            id:
                              type: string
                              minLength: 1
                              maxLength: 128
                            status:
                              type: string
                              enum:
                                - issues
                            durationMs:
                              type: integer
                              minimum: 0
                            findingCount:
                              type: integer
                              exclusiveMinimum: 0
                          required:
                            - id
                            - status
                            - durationMs
                            - findingCount
                          additionalProperties: false
                        - type: object
                          properties:
                            id:
                              type: string
                              minLength: 1
                              maxLength: 128
                            status:
                              type: string
                              enum:
                                - not_applicable
                            reason:
                              type: string
                              enum:
                                - no_remote_links
                                - no_remote_images
                                - no_remote_assets
                                - missing_copy
                                - requires_sending_domain
                                - send_transport_owned
                                - requires_audience_context
                                - separate_deliverability_test
                                - transactional_purpose
                                - unknown_purpose
                          required:
                            - id
                            - status
                            - reason
                          additionalProperties: false
                        - type: object
                          properties:
                            id:
                              type: string
                              minLength: 1
                              maxLength: 128
                            status:
                              type: string
                              enum:
                                - unavailable
                            reason:
                              type: string
                              enum:
                                - timeout
                                - upstream
                                - invalid_response
                            retryable:
                              type: boolean
                            durationMs:
                              type: integer
                              minimum: 0
                          required:
                            - id
                            - status
                            - reason
                            - retryable
                            - durationMs
                          additionalProperties: false
                    maxItems: 32
                  metrics:
                    type: object
                    properties:
                      htmlBytes:
                        type: integer
                        minimum: 0
                      linkCount:
                        type: integer
                        minimum: 0
                      imageCount:
                        type: integer
                        minimum: 0
                      gifCount:
                        type: integer
                        minimum: 0
                      loadedSize:
                        oneOf:
                          - type: object
                            properties:
                              status:
                                type: string
                                enum:
                                  - exact
                              htmlBytes:
                                type: integer
                                minimum: 0
                              remoteAssetBytes:
                                type: integer
                                minimum: 0
                              totalBytes:
                                type: integer
                                minimum: 0
                              assetCount:
                                type: integer
                                minimum: 0
                            required:
                              - status
                              - htmlBytes
                              - remoteAssetBytes
                              - totalBytes
                              - assetCount
                            additionalProperties: false
                          - type: object
                            properties:
                              status:
                                type: string
                                enum:
                                  - lower_bound
                              htmlBytes:
                                type: integer
                                minimum: 0
                              knownRemoteAssetBytes:
                                type: integer
                                minimum: 0
                              knownTotalBytes:
                                type: integer
                                minimum: 0
                              unknownAssetCount:
                                type: integer
                                exclusiveMinimum: 0
                            required:
                              - status
                              - htmlBytes
                              - knownRemoteAssetBytes
                              - knownTotalBytes
                              - unknownAssetCount
                            additionalProperties: false
                    required:
                      - htmlBytes
                      - linkCount
                      - imageCount
                      - gifCount
                      - loadedSize
                    additionalProperties: false
                  findings:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          minLength: 1
                          maxLength: 512
                        ruleId:
                          type: string
                          minLength: 1
                          maxLength: 128
                        category:
                          type: string
                          enum:
                            - compliance
                            - links
                            - images
                            - accessibility
                            - compatibility
                            - copy
                            - size
                            - markup
                        severity:
                          type: string
                          enum:
                            - blocker
                            - error
                            - warning
                            - info
                        impact:
                          type: string
                          enum:
                            - block
                            - confirm
                            - advisory
                        message:
                          type: string
                          minLength: 1
                          maxLength: 1000
                        remediation:
                          type: string
                          minLength: 1
                          maxLength: 1000
                        occurrenceCount:
                          type: integer
                          exclusiveMinimum: 0
                          description: >-
                            Total occurrences of this RULE across the email,
                            stamped on every representative finding of the rule
                            so the total survives representative truncation.
                            Reconcile by max per rule — summing across findings
                            overcounts.
                        sources:
                          type: array
                          items:
                            type: string
                            minLength: 1
                            maxLength: 64
                          minItems: 1
                          maxItems: 16
                        standards:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: string
                                minLength: 1
                                maxLength: 128
                              url:
                                type: string
                                maxLength: 2048
                                pattern: ^https?:\/\/
                            required:
                              - id
                            additionalProperties: false
                          maxItems: 8
                        target:
                          oneOf:
                            - type: object
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - email
                              required:
                                - kind
                              additionalProperties: false
                            - type: object
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - subject
                              required:
                                - kind
                              additionalProperties: false
                            - type: object
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - preview_text
                              required:
                                - kind
                              additionalProperties: false
                            - type: object
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - link
                                index:
                                  type: integer
                                  minimum: 0
                                displayUrl:
                                  type: string
                                  maxLength: 300
                              required:
                                - kind
                                - index
                                - displayUrl
                              additionalProperties: false
                            - type: object
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - image
                                index:
                                  type: integer
                                  minimum: 0
                                displayUrl:
                                  type: string
                                  maxLength: 300
                              required:
                                - kind
                                - index
                                - displayUrl
                              additionalProperties: false
                            - type: object
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - element
                                selector:
                                  type: string
                                  minLength: 1
                                  maxLength: 300
                              required:
                                - kind
                                - selector
                              additionalProperties: false
                      required:
                        - id
                        - ruleId
                        - category
                        - severity
                        - impact
                        - message
                        - remediation
                        - sources
                        - target
                      additionalProperties: false
                    maxItems: 100
                  totalFindings:
                    type: integer
                    minimum: 0
                  findingsTruncated:
                    type: boolean
                  completion:
                    oneOf:
                      - type: object
                        properties:
                          status:
                            type: string
                            enum:
                              - complete
                          readiness:
                            type: string
                            enum:
                              - ready
                              - needs_review
                              - not_ready
                          score:
                            type: integer
                            minimum: 0
                            maximum: 100
                        required:
                          - status
                          - readiness
                          - score
                        additionalProperties: false
                      - type: object
                        properties:
                          status:
                            type: string
                            enum:
                              - partial
                          readiness:
                            type: string
                            enum:
                              - unknown
                              - not_ready
                          score:
                            type: 'null'
                        required:
                          - status
                          - readiness
                          - score
                        additionalProperties: false
                  pagination:
                    type: object
                    properties:
                      cursor:
                        type:
                          - string
                          - 'null'
                      hasMore:
                        type: boolean
                      returned:
                        type: number
                      storedFindings:
                        type: number
                    required:
                      - cursor
                      - hasMore
                      - returned
                      - storedFindings
                    additionalProperties: false
                required:
                  - schemaVersion
                  - rulesetVersion
                  - auditId
                  - contentHash
                  - auditedAt
                  - expiresAt
                  - policy
                  - summary
                  - checks
                  - metrics
                  - findings
                  - totalFindings
                  - findingsTruncated
                  - completion
                  - pagination
                additionalProperties: false
        '400':
          description: >-
            `BRAND_ID_REQUIRED`: An organization-scoped credential called a
            brand-scoped operation without naming the brand.


            `INVALID_REQUEST`: The body or query failed validation: an unknown
            key, a wrong type, or a missing required field. `param` names the
            offender.
          headers:
            x-request-id:
              schema:
                type: string
                description: >-
                  Unique request identifier. Share this with support when
                  debugging a request.
                example: req_8cac13fd94e6420cacdd75a1aa403a28
              required: true
              description: >-
                Unique request identifier. Share this with support when
                debugging a request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              examples:
                brandIdRequired:
                  summary: BRAND_ID_REQUIRED
                  value:
                    error:
                      code: BRAND_ID_REQUIRED
                      type: invalid_request
                      message: >-
                        An organization-scoped credential called a brand-scoped
                        operation without naming the brand.
                      suggestion: >-
                        List brands with GET /v1/brands, then name one with the
                        X-Brand-Id header. There is no default brand.
                      docs: https://docs.brew.new/api-reference/api/authentication
                invalidRequest:
                  summary: INVALID_REQUEST
                  value:
                    error:
                      code: INVALID_REQUEST
                      type: invalid_request
                      message: >-
                        The body or query failed validation: an unknown key, a
                        wrong type, or a missing required field. `param` names
                        the offender.
                      suggestion: Fix the field reported in `param` and retry.
                      docs: https://docs.brew.new/api-reference/api/errors
        '401':
          description: >-
            `API_KEY_REVOKED`: The API key was revoked.


            `AUTHENTICATION_REQUIRED`: No API key or session accompanied the
            request.


            `INVALID_API_KEY`: The API key is malformed or unknown.
          headers:
            x-request-id:
              schema:
                type: string
                description: >-
                  Unique request identifier. Share this with support when
                  debugging a request.
                example: req_8cac13fd94e6420cacdd75a1aa403a28
              required: true
              description: >-
                Unique request identifier. Share this with support when
                debugging a request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              examples:
                apiKeyRevoked:
                  summary: API_KEY_REVOKED
                  value:
                    error:
                      code: API_KEY_REVOKED
                      type: authentication_error
                      message: The API key was revoked.
                      suggestion: Create a new active API key and retry.
                      docs: https://docs.brew.new/api-reference/api/authentication
                authenticationRequired:
                  summary: AUTHENTICATION_REQUIRED
                  value:
                    error:
                      code: AUTHENTICATION_REQUIRED
                      type: authentication_error
                      message: No API key or session accompanied the request.
                      suggestion: >-
                        Provide a valid API key or sign in with an organization
                        session.
                      docs: https://docs.brew.new/api-reference/api/authentication
                invalidApiKey:
                  summary: INVALID_API_KEY
                  value:
                    error:
                      code: INVALID_API_KEY
                      type: authentication_error
                      message: The API key is malformed or unknown.
                      suggestion: >-
                        Check the API key format and retry with a valid active
                        key.
                      docs: https://docs.brew.new/api-reference/api/authentication
        '403':
          description: >-
            `ACCOUNT_SUSPENDED`: The organization behind the credential is
            suspended.


            `BRAND_SCOPE_MISMATCH`: A brand-scoped credential named a brand
            other than the one it is bound to.


            `INSUFFICIENT_PERMISSIONS`: The credential lacks the permission
            scope the operation needs.


            `INSUFFICIENT_ROLE`: The caller lacks the access the operation
            needs: `param` names `member` (access to the brand) or `org_admin`
            (the organization role).
          headers:
            x-request-id:
              schema:
                type: string
                description: >-
                  Unique request identifier. Share this with support when
                  debugging a request.
                example: req_8cac13fd94e6420cacdd75a1aa403a28
              required: true
              description: >-
                Unique request identifier. Share this with support when
                debugging a request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              examples:
                accountSuspended:
                  summary: ACCOUNT_SUSPENDED
                  value:
                    error:
                      code: ACCOUNT_SUSPENDED
                      type: authorization_error
                      message: The organization behind the credential is suspended.
                      suggestion: >-
                        The organization behind this credential is suspended.
                        Contact support@brew.new; do not retry.
                      docs: https://docs.brew.new/api-reference/api/authentication
                brandScopeMismatch:
                  summary: BRAND_SCOPE_MISMATCH
                  value:
                    error:
                      code: BRAND_SCOPE_MISMATCH
                      type: authorization_error
                      message: >-
                        A brand-scoped credential named a brand other than the
                        one it is bound to.
                      suggestion: >-
                        Omit the brand to use the one this credential is bound
                        to, or use an organization-scoped credential to reach
                        other brands.
                      docs: https://docs.brew.new/api-reference/api/authentication
                insufficientPermissions:
                  summary: INSUFFICIENT_PERMISSIONS
                  value:
                    error:
                      code: INSUFFICIENT_PERMISSIONS
                      type: authorization_error
                      message: >-
                        The credential lacks the permission scope the operation
                        needs.
                      suggestion: Use an API key or session with the required permission.
                      docs: https://docs.brew.new/api-reference/api/authentication
                insufficientRole:
                  summary: INSUFFICIENT_ROLE
                  value:
                    error:
                      code: INSUFFICIENT_ROLE
                      type: authorization_error
                      message: >-
                        The caller lacks the access the operation needs: `param`
                        names `member` (access to the brand) or `org_admin` (the
                        organization role).
                      suggestion: >-
                        Ask an organization admin to run this, to add you to the
                        brand, or to make you an admin.
                      docs: https://docs.brew.new/api-reference/api/authentication
        '404':
          description: >-
            `AUDIT_NOT_FOUND`: No saved audit matches that id in this brand, or
            its seven day retention has expired.


            `BRAND_NOT_FOUND`: The named or bound brand does not exist in this
            organization (unknown, deleting, or another organization).
          headers:
            x-request-id:
              schema:
                type: string
                description: >-
                  Unique request identifier. Share this with support when
                  debugging a request.
                example: req_8cac13fd94e6420cacdd75a1aa403a28
              required: true
              description: >-
                Unique request identifier. Share this with support when
                debugging a request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              examples:
                auditNotFound:
                  summary: AUDIT_NOT_FOUND
                  value:
                    error:
                      code: AUDIT_NOT_FOUND
                      type: not_found
                      message: >-
                        No saved audit matches that id in this brand, or its
                        seven day retention has expired.
                      suggestion: >-
                        Use an auditId returned by POST /v1/emails/audit for
                        this brand, or run a new audit.
                      docs: https://docs.brew.new/api-reference/api/errors
                brandNotFound:
                  summary: BRAND_NOT_FOUND
                  value:
                    error:
                      code: BRAND_NOT_FOUND
                      type: not_found
                      message: >-
                        The named or bound brand does not exist in this
                        organization (unknown, deleting, or another
                        organization).
                      suggestion: >-
                        List the brands this credential can reach with GET
                        /v1/brands.
                      docs: https://docs.brew.new/api-reference/api/errors
        '429':
          description: >-
            `RATE_LIMITED`: The credential exhausted the rolling window for this
            route policy; Retry-After says when it reopens.
          headers:
            x-request-id:
              schema:
                type: string
                description: >-
                  Unique request identifier. Share this with support when
                  debugging a request.
                example: req_8cac13fd94e6420cacdd75a1aa403a28
              required: true
              description: >-
                Unique request identifier. Share this with support when
                debugging a request.
            X-RateLimit-Limit:
              schema:
                type: integer
                description: Requests allowed in the current rolling rate limit window.
                example: 100
              required: true
              description: Requests allowed in the current rolling rate limit window.
            X-RateLimit-Remaining:
              schema:
                type: integer
                description: Requests remaining in the current rolling rate limit window.
                example: 99
              required: true
              description: Requests remaining in the current rolling rate limit window.
            X-RateLimit-Reset:
              schema:
                type: integer
                description: >-
                  Unix timestamp in seconds for when the rolling window fully
                  resets.
                example: 1712592360
              required: true
              description: >-
                Unix timestamp in seconds for when the rolling window fully
                resets.
            Retry-After:
              schema:
                type: integer
                description: Seconds to wait before retrying the request.
                example: 42
              required: true
              description: Seconds to wait before retrying the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              examples:
                rateLimited:
                  summary: RATE_LIMITED
                  value:
                    error:
                      code: RATE_LIMITED
                      type: rate_limit
                      message: >-
                        The credential exhausted the rolling window for this
                        route policy; Retry-After says when it reopens.
                      suggestion: >-
                        Wait for the retry window before sending another
                        request.
                      docs: https://docs.brew.new/api-reference/api/rate-limits
                      retryAfter: 42
        '500':
          description: >-
            `INTERNAL_ERROR`: An unexpected failure; the x-request-id header
            identifies it.
          headers:
            x-request-id:
              schema:
                type: string
                description: >-
                  Unique request identifier. Share this with support when
                  debugging a request.
                example: req_8cac13fd94e6420cacdd75a1aa403a28
              required: true
              description: >-
                Unique request identifier. Share this with support when
                debugging a request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              examples:
                internalError:
                  summary: INTERNAL_ERROR
                  value:
                    error:
                      code: INTERNAL_ERROR
                      type: internal_error
                      message: >-
                        An unexpected failure; the x-request-id header
                        identifies it.
                      suggestion: >-
                        Retry the request. If it keeps failing, contact support
                        with the x-request-id header.
                      docs: https://docs.brew.new/api-reference/api/errors
components:
  schemas:
    ApiErrorEnvelope:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              $ref: '#/components/schemas/ApiErrorCode'
            type:
              type: string
              enum:
                - authentication_error
                - authorization_error
                - invalid_request
                - not_found
                - not_implemented
                - conflict
                - rate_limit
                - payment_required
                - service_unavailable
                - internal_error
            message:
              type: string
              minLength: 1
            param:
              type: string
              minLength: 1
            suggestion:
              type: string
              minLength: 1
            docs:
              type: string
              format: uri
            retryAfter:
              type: integer
              minimum: 0
            details:
              type: object
              additionalProperties: {}
          required:
            - code
            - type
            - message
            - suggestion
            - docs
      required:
        - error
    ApiErrorCode:
      type: string
      enum:
        - ACCOUNT_SUSPENDED
        - API_KEY_REVOKED
        - AUDIENCE_BUILD_ACTIVE
        - AUDIENCE_BUILD_ALREADY_ACTIVE
        - AUDIENCE_EDIT_CONFLICT
        - AUDIENCE_NOT_FOUND
        - AUDIENCE_RUN_NOT_FOUND
        - AUDIT_NOT_FOUND
        - AUTHENTICATION_REQUIRED
        - AUTOMATION_GRAPH_INVALID
        - AUTOMATION_NOT_FOUND
        - AUTOMATION_NOT_PAUSABLE
        - AUTOMATION_NOT_PUBLISHED
        - AUTOMATION_RUN_NOT_FOUND
        - AUTOMATION_VERSION_CONFLICT
        - AUTOMATION_VERSION_NOT_FOUND
        - BATCH_TOO_LARGE
        - BRAND_DOMAIN_CONFLICT
        - BRAND_ID_REQUIRED
        - BRAND_LIMIT_REACHED
        - BRAND_NOT_FOUND
        - BRAND_NOT_READY
        - BRAND_SCOPE_MISMATCH
        - CHAT_NOT_FOUND
        - CONSENT_REQUIRED
        - CONTACT_NOT_FOUND
        - CONTENT_OPERATION_FAILED
        - CONTRACT_LOCKED_BY_PUBLISHED_AUTOMATIONS
        - CORE_FIELD_IMMUTABLE
        - DOMAIN_ALREADY_EXISTS
        - DOMAIN_CLAIMED_ELSEWHERE
        - DOMAIN_NOT_FOUND
        - DOMAIN_NOT_READY
        - DOMAIN_OTHER_BRAND
        - DOMAIN_PROVIDER_ERROR
        - DOMAIN_PURPOSE_NOT_ALLOWED
        - DOMAIN_VERIFICATION_FAILED
        - DOMAIN_VERIFIED_ELSEWHERE
        - EMAIL_GENERATION_FAILED
        - EMAIL_GROUP_NAME_CONFLICT
        - EMAIL_GROUP_NOT_FOUND
        - EMAIL_IMPORT_FAILED
        - EMAIL_IN_PROGRESS
        - EMAIL_IN_USE_BY_AUTOMATION
        - EMAIL_NOT_FOUND
        - EMAIL_NOT_READY
        - EMAIL_RUN_AMBIGUOUS
        - EMAIL_TEMPLATE_INVALID
        - EMAIL_VERSION_NOT_FOUND
        - EXPORT_PROVIDER_ERROR
        - EXPORT_UNSUPPORTED
        - FIELD_NOT_FOUND
        - FIELD_TYPE_MISMATCH
        - FIGMA_ACCESS_DENIED
        - FIGMA_CONVERSION_FAILED
        - FIGMA_FRAME_NOT_FOUND
        - FIGMA_NOT_CONNECTED
        - FIGMA_UNAVAILABLE
        - FIGMA_URL_INVALID
        - FLOW_NOT_FOUND
        - IDEMPOTENCY_CONFLICT
        - IDEMPOTENCY_IN_PROGRESS
        - INSUFFICIENT_CREDITS
        - INSUFFICIENT_PERMISSIONS
        - INSUFFICIENT_ROLE
        - INTEGRATION_NOT_CONNECTED
        - INTERNAL_ERROR
        - INVALID_API_KEY
        - INVALID_EMAIL
        - INVALID_PAYLOAD
        - INVALID_REQUEST
        - LIQUID_RENDER_ERROR
        - METHOD_NOT_ALLOWED
        - MISSING_EMAIL
        - NO_ELIGIBLE_RECIPIENTS
        - NO_PUBLISHED_AUTOMATION
        - NOT_FOUND
        - NOT_IMPLEMENTED
        - ORG_SCOPE_REQUIRED
        - PAYLOAD_SCHEMA_EMAIL_REQUIRED
        - PAYLOAD_TOO_LARGE
        - PREVIEW_NOT_FOUND
        - PUBLISH_VALIDATION_FAILED
        - RATE_LIMITED
        - RECIPIENT_UNSUBSCRIBED
        - REFERENCE_EMAIL_NOT_FOUND
        - RESUBSCRIBE_NOT_ALLOWED
        - RUN_IN_PROGRESS
        - RUN_NOT_CANCELLABLE
        - RUN_NOT_PAUSABLE
        - RUN_NOT_PAUSED
        - RUN_NOT_RESUMABLE
        - RUN_START_FAILED
        - RUN_STOP_FAILED
        - SEND_NOT_CANCELLABLE
        - SEND_NOT_FOUND
        - SEND_NOT_PAUSABLE
        - SEND_NOT_RESUMABLE
        - SEND_QUOTA_EXCEEDED
        - SERVICE_UNAVAILABLE
        - TEMPLATE_NOT_FOUND
        - TRIGGER_ALREADY_EXISTS
        - TRIGGER_EVENT_NOT_FOUND
        - TRIGGER_HAS_DEPENDENT_AUTOMATIONS
        - TRIGGER_IMMUTABLE
        - TRIGGER_INSTANCE_NOT_FOUND
        - TRIGGER_LIMIT_REACHED
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: 'Send your Brew API key as `Authorization: Bearer brew_xxx`.'
      x-default: Bearer brew_your_api_key
    apiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: 'Send your Brew API key as `X-API-Key: brew_xxx`.'
      x-default: brew_your_api_key

````