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

> ## Agent Instructions
> Every Lath operation is POST https://platform.trylath.com/<operation name with dots replaced by slashes>, with a JSON body and `Authorization: Bearer <key>`. `email.send` is POST /email/send.
> Branch on `error.code`, never on `error.message`. Every refusal also carries `error.fix`, which names the next step.
> Send an `Idempotency-Key` header on any operation that is not retry-safe, so a retry cannot run it twice.
> A `lath_test_` key emails only the account's own members and sends no SMS; a `lath_live_` key reaches real recipients and is billed.
> The OpenAPI document, generated from the same registry as the routes, is at https://platform.trylath.com/openapi.json.

# audience.contact.stats

> Counts this environment's contacts: how many there are, and per channel how many may be messaged on at least one topic (consenting), how many gave consent and have since withdrawn all of it (withdrawn), and how many addresses are suppressed. Consent is each contact's latest record per channel and topic, the same rule a send applies. Suppressions count addresses, not contacts, so an address suppressed without a contact is still counted.



## OpenAPI

````yaml /api-reference/openapi.json post /audience/contact/stats
openapi: 3.1.0
info:
  title: Lath API
  version: 0.1.0
  description: >-
    Every operation is one POST. The same set is reachable over MCP, the SDK and
    the CLI; nothing is dashboard-only.
servers:
  - url: https://platform.trylath.com
    description: This deployment
security: []
paths:
  /audience/contact/stats:
    post:
      tags:
        - audience
      summary: audience.contact.stats
      description: >-
        Counts this environment's contacts: how many there are, and per channel
        how many may be messaged on at least one topic (consenting), how many
        gave consent and have since withdrawn all of it (withdrawn), and how
        many addresses are suppressed. Consent is each contact's latest record
        per channel and topic, the same rule a send applies. Suppressions count
        addresses, not contacts, so an address suppressed without a contact is
        still counted.
      operationId: audience.contact.stats
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $schema: https://json-schema.org/draft/2020-12/schema
              type: object
              properties: {}
              additionalProperties: false
      responses:
        '200':
          description: '{ activityId, result }. activityId is empty for reads.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  activityId:
                    type: string
                    description: The activity this call created, or empty for a read.
                  result:
                    $schema: https://json-schema.org/draft/2020-12/schema
                    type: object
                    properties:
                      total:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                      email:
                        type: object
                        properties:
                          consenting:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          withdrawn:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          suppressed:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                        required:
                          - consenting
                          - withdrawn
                          - suppressed
                        additionalProperties: {}
                      sms:
                        type: object
                        properties:
                          consenting:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          withdrawn:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          suppressed:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                        required:
                          - consenting
                          - withdrawn
                          - suppressed
                        additionalProperties: {}
                    required:
                      - total
                      - email
                      - sms
                    additionalProperties: {}
                required:
                  - activityId
                  - result
        '400':
          description: invalid_input or invalid_json
        '401':
          description: unauthenticated
        '403':
          description: forbidden
        '404':
          description: not_found
        '409':
          description: 'conflict: idempotency_mismatch, email_taken, last_key'
        '413':
          description: body_too_large
        '429':
          description: rate_limited
      security:
        - bearer: []
components:
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: >-
        A Lath API key: lath_live_sk… or lath_test_sk… on a server,
        lath_live_pk… or lath_test_pk… in a browser.

````