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

# Get a direct send

> <Warning>
  **Coming soon.** This endpoint will be available by mid November 2026.
</Warning>

<small>_Requires the `contacts:read` scope (or a broader one that includes it)._</small>

Read where a direct email or LinkedIn send stands, by the `reference` its send route answered with. A send stays readable for at least 30 days after it was made.

Read `state` first: `sentAt` is set only once the send has gone out, and `estimatedSendAt` only while it waits for its schedule. A send made with `scheduleId` when the schedule was open or opened within the next ten minutes was queued for that moment at once and reads `queued` with `sendAfter`; one whose schedule opened later reads `waitingForSchedule` with `estimatedSendAt` until the schedule opens. A LinkedIn send for later reads `sending` from the moment it is handed to the account's queue until it has gone out or failed. A `failed` send carries `failureReason`, a sentence, and `failureCode` when the failure has one; see the model for the values. An email that has gone out carries `renderedSubject` and `renderedBody` as sent, with the signature and the tracking; both are null when the sent message can no longer be read.

An email send made by a teammate is readable when you may act for that teammate. A LinkedIn send is readable by every teammate who can see its LinkedIn account. A send of another team answers 404.



## OpenAPI

````yaml /api-reference/bundled.yaml get /v3/direct-sends/{reference}
openapi: 3.1.0
info:
  version: 3.0.0
  title: Reply API
  description: API for managing email sequences, contacts, and automation workflows
servers:
  - url: https://api.reply.io
security:
  - bearerAuth: []
tags:
  - name: Contacts
    description: Manage individual contacts
  - name: Contact Lists
    description: Manage contact lists and contact membership
  - name: Accounts
    description: Manage accounts (companies/organizations)
  - name: Account Lists
    description: Manage account lists and account membership
  - name: Custom Fields
    description: Manage custom contact fields
  - name: Prompt Actions
    description: Save reusable AI prompts and run them on contacts to fill custom fields
  - name: Contact Blacklist Rules
    description: Manage blacklist rules for domains, emails, and email exceptions
  - name: Live Data
    description: >-
      Find new contacts via Live Data searches and read typeahead values for the
      Live Data / Autopilot filter sidebar
  - name: Contact Enrichment
    description: >-
      Enrich contacts with emails, phone numbers, LinkedIn data, and AI-filled
      custom fields
  - name: Email Validations
    description: Estimate and schedule asynchronous email validation jobs
  - name: AI SDR Web Search
    description: Find contacts via AI-driven web search and review past searches
  - name: Sequences
    description: Manage email automation sequences
  - name: Sequence Steps
    description: Manage individual steps in sequences
  - name: Sequence Contacts
    description: Manage contacts within sequences
  - name: Sequence Folders
    description: Organize sequences into folders
  - name: Email Accounts
    description: Manage email accounts used for sending and receiving
  - name: Sequence Email Accounts
    description: Manage email accounts linked to sequences
  - name: LinkedIn Accounts
    description: Manage LinkedIn accounts for outreach
  - name: Sequence LinkedIn Accounts
    description: Manage LinkedIn accounts linked to sequences
  - name: Sequence Templates
    description: Manage sequence templates
  - name: Email Templates
    description: Manage email templates and template folders
  - name: Voices
    description: Manage cloned voices used for AI voice message steps
  - name: Schedules
    description: Manage email send schedules and timing
  - name: Holiday Calendars
    description: Manage holiday calendars for scheduling
  - name: Inbox
    description: >-
      Manage inbox threads — list/filter, read state, replies, category
      assignment, and meeting-intent flagging
  - name: Inbox Categories
    description: Manage per-team inbox thread categories and assign threads to them
  - name: Direct Outreach
    description: >-
      Send one-off outreach directly to a contact outside of any sequence —
      direct emails and LinkedIn connection requests, messages, InMails, and
      voice messages
  - name: Tasks
    description: Manage tasks and to-do items
  - name: Reports
    description: >-
      Generate and access performance reports across email, calls, tasks,
      LinkedIn, and team performance
  - name: AI SDR Sequences
    description: >-
      Manage AI SDR sequences and their AI SDR-specific settings — create, read
      settings, partial update, autopilot enable/disable/force-start, approval
      mode, sequence structure, and playbook/knowledge-base connections
  - name: AI SDR Sequence Structures
    description: >-
      Browse the sequence structures — reusable outlines of AI SDR sequence
      steps — that can be applied to AI SDR sequences
  - name: AI SDR Strategist
    description: Trigger AI Strategist runs
  - name: AI SDR Playbooks
    description: >-
      Manage AI SDR playbooks — tone, voice, and style guides applied during
      personalized message generation
  - name: AI SDR Knowledge Bases
    description: >-
      Manage AI SDR knowledge bases — collections of documents, links, reply
      handlers, and reengagement cards that inform the agent's responses
  - name: AI SDR Offers
    description: >-
      Manage AI SDR offers — bundles of company-context inputs (ICP, pain
      points, value propositions, etc.) used to personalize outreach
  - name: AI SDR Pending Approvals
    description: >-
      Review, send, regenerate, and provide feedback on AI-generated messages
      awaiting human approval
  - name: AI SDR Sequence Preview
    description: >-
      Read and regenerate per-contact previews of the messages a sequence will
      send, and provide feedback on preview messages
  - name: AI SDR Insights
    description: Read AI SDR insights for sequence contacts
  - name: AI SDR Intent Signals
    description: >-
      Read Reply industry IDs and technology slugs used in AI SDR intent-signal
      configuration (typeahead)
  - name: AI Prompts
    description: >-
      Manage the AI prompts used to configure sequence steps, and preview the
      output a prompt produces
  - name: AI SDR Learnings
    description: >-
      Manage the standing rules that shape how the AI writes — list, read,
      create, partially update and delete AI learnings
  - name: Registration
    description: Register the contact that domain purchases are filed under
  - name: Domains
    description: Find domains available to buy for outreach
  - name: Purchased Domains
    description: >-
      List the domains your team bought, with their subscription, setup and
      renewal state, and renew them
  - name: Pre-warmed Domains
    description: >-
      Find pre-warmed domains on sale, with mailboxes that are already warming,
      and list the ones your team bought
  - name: Mailboxes
    description: >-
      Add mailboxes to domains your team already bought, priced before you
      order, and reconnect them
  - name: User Account
    description: Account information and authentication verification
  - name: Teams
    description: Add existing users of your organization to its teams
  - name: Settings
    description: Manage team and user settings
  - name: Billing
    description: Subscription details and monthly active contacts usage
  - name: Rate Limits
    description: Your API rate limits, your current usage and the packages that raise them
  - name: Support Requests
    description: Raise and follow support requests with Reply's support team
  - name: Webhooks
    description: Manage webhook subscriptions and inspect delivery history
  - name: Background Jobs
    description: >-
      Track and cancel asynchronous background operations (e.g., email
      validation)
  - name: Attachments
    description: >-
      Upload file attachments used across email templates, sequence steps, and
      direct emails
paths:
  /v3/direct-sends/{reference}:
    get:
      tags:
        - Direct Outreach
      summary: Get a direct send
      description: >-
        <Warning>
          **Coming soon.** This endpoint will be available by mid November 2026.
        </Warning>


        <small>_Requires the `contacts:read` scope (or a broader one that
        includes it)._</small>


        Read where a direct email or LinkedIn send stands, by the `reference`
        its send route answered with. A send stays readable for at least 30 days
        after it was made.


        Read `state` first: `sentAt` is set only once the send has gone out, and
        `estimatedSendAt` only while it waits for its schedule. A send made with
        `scheduleId` when the schedule was open or opened within the next ten
        minutes was queued for that moment at once and reads `queued` with
        `sendAfter`; one whose schedule opened later reads `waitingForSchedule`
        with `estimatedSendAt` until the schedule opens. A LinkedIn send for
        later reads `sending` from the moment it is handed to the account's
        queue until it has gone out or failed. A `failed` send carries
        `failureReason`, a sentence, and `failureCode` when the failure has one;
        see the model for the values. An email that has gone out carries
        `renderedSubject` and `renderedBody` as sent, with the signature and the
        tracking; both are null when the sent message can no longer be read.


        An email send made by a teammate is readable when you may act for that
        teammate. A LinkedIn send is readable by every teammate who can see its
        LinkedIn account. A send of another team answers 404.
      operationId: GetDirectSend
      parameters:
        - name: reference
          in: path
          required: true
          description: >-
            The send's reference, `email-<id>`, `linkedin-<id>` or
            `linkedin-scheduled-<id>`. A reference not of this form answers 404
            `directSend.notFound`.
          schema:
            type: string
      responses:
        '200':
          description: The send.
          content:
            application/json:
              schema:
                type: object
                title: Direct Send
                description: >-
                  One direct send - an email or a LinkedIn action sent to a
                  contact outside any sequence - read by its reference.
                required:
                  - reference
                  - channel
                  - contactId
                  - state
                  - sendAfter
                properties:
                  reference:
                    type: string
                    description: >-
                      The reference the send route answered with, `email-<id>`,
                      `linkedin-<id>` or `linkedin-scheduled-<id>`. Treat it as
                      opaque.
                    example: email-48213
                  channel:
                    type: string
                    title: Direct Send Channel
                    description: The channel a direct send goes out on.
                    enum:
                      - email
                      - linkedIn
                  contactId:
                    type: integer
                    description: ID of the contact the send is addressed to.
                  state:
                    type: string
                    title: Direct Send State
                    description: >-
                      Where a direct send stands.


                      | Value | Meaning |

                      |---|---|

                      | `queued` | Accepted and waiting for its moment; it can
                      still be cancelled. |

                      | `waitingForSchedule` | Accepted and waiting for its
                      schedule to open, more than ten minutes after acceptance;
                      `estimatedSendAt` says when. A schedule open sooner queues
                      the send at once (`queued`). It can still be cancelled. |

                      | `sending` | Being sent right now - for a LinkedIn send,
                      handed to the account's queue and waiting or running
                      there. It can no longer be cancelled, except a LinkedIn
                      send for later that waits in the account's queue and has
                      not been started. |

                      | `sent` | Gone out. |

                      | `failed` | Did not go out, or its outcome is unknown;
                      `failureCode` and `failureReason` say why. |

                      | `cancelled` | Cancelled while queued; it will not go
                      out. |
                    enum:
                      - queued
                      - waitingForSchedule
                      - sending
                      - sent
                      - failed
                      - cancelled
                  sendAfter:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      UTC moment after which the send is attempted - the
                      requested `sendAfter`, when the send was accepted, or the
                      schedule opening it was queued for. Null while the send
                      waits for its schedule; `estimatedSendAt` is set then. A
                      send cancelled while waiting, or failed because its
                      schedule or the contact's time zone was gone, reads the
                      requested `sendAfter` when it was given one, and null when
                      it was made with a schedule and no `sendAfter` - it was
                      never given a moment. This holds for email and LinkedIn
                      alike.
                  estimatedSendAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      When the schedule the send waits for next opens, as read
                      now; the send goes out within about 10 minutes of it. A
                      schedule open at acceptance or opening within the next ten
                      minutes queued the send for that moment at once, so it
                      reads `queued` with `sendAfter` and this null. Set in the
                      `waitingForSchedule` state only, and null there when the
                      schedule does not open within 30 days of the moment the
                      send waits from (the requested `sendAfter`, or now once
                      that has passed).
                  sentAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      UTC moment the send went out. Set in the `sent` state
                      only.
                  messageId:
                    type: string
                    nullable: true
                    description: >-
                      Message-ID of the email once it has gone out. Always null
                      for LinkedIn.
                  failureCode:
                    type: string
                    nullable: true
                    description: >-
                      What the failure was, as the `code` the send route answers
                      that failure with. Set in the `failed` state when the
                      failure has a code of its own; null otherwise, and then
                      `failureReason` tells it.


                      | Value | Meaning |

                      |---|---|

                      | `contact.missingVariables` | The email's template uses
                      variables that have no value for the contact;
                      `missingVariables` names them. Nothing went out. |

                      | `contact.renderingFailed` | The email's template could
                      not be rendered for the contact. Nothing went out. |

                      | `contact.notFound` | The contact has no valid email
                      address. Nothing went out. |

                      | `contact.contactInBlackList` | The contact is on the
                      blacklist. Nothing went out. |

                      | `contact.scheduleNotFound` | The schedule the send
                      waited for was deleted. Nothing went out. |

                      | `contact.scheduleHasNoSlot` | The schedule the send
                      waited for was left with no active day that has a time
                      range, so it never opens. Nothing went out. |

                      | `contact.contactTimeZoneMissing` | The send waited for
                      its schedule in the contact's time zone
                      (`useContactTimeZone` `true`), and the contact no longer
                      has one. Nothing went out. |

                      | `directSend.dispatchWindowMissed` | The send was never
                      attempted: its moment passed without it being picked up.
                      Nothing went out; sending again is safe. |

                      | `directSend.dispatchInterrupted` | The send was
                      attempted but its outcome is unknown. It may have gone
                      out; check before sending again. |

                      | `directLinkedIn.weeklyLimitReached` | LinkedIn is
                      limiting the account's connection requests, or refused
                      this one for the account's limit; for a send for later,
                      the limit outlasted its retry window. Nothing went out;
                      send again once the account is no longer limited. |

                      | `directLinkedIn.dailyLimitReached` | A LinkedIn send for
                      later stayed blocked by the account's daily allowance for
                      the action until its retry window ended. Nothing went out.
                      |

                      | `directLinkedIn.missedWindow` | A LinkedIn send for
                      later was due while nothing could hand it to the account's
                      queue, and its retry window ended first. Nothing went out;
                      sending again is safe. |

                      | `directLinkedIn.scheduleNotFound` | The schedule a
                      LinkedIn send waited for was deleted. Nothing went out. An
                      email send reads `contact.scheduleNotFound` for the same
                      failure, so a client handling both channels should expect
                      both codes. |

                      | `directLinkedIn.scheduleHasNoSlot` | The schedule a
                      LinkedIn send waited for was left with no active day that
                      has a time range, so it never opens. Nothing went out. An
                      email send reads `contact.scheduleHasNoSlot` for the same
                      failure. |

                      | `directLinkedIn.contactTimeZoneMissing` | A LinkedIn
                      send waited for its schedule in the contact's time zone
                      (`useContactTimeZone` `true`), and the contact no longer
                      has one. Nothing went out. |

                      | `directLinkedIn.alreadyConnected` | A LinkedIn
                      connection request for later found the contact already
                      connected when it became due. Nothing went out. |

                      | `directLinkedIn.notConnected` | A LinkedIn connection
                      request for later found an invitation to the contact still
                      pending when it became due, or a LinkedIn message for
                      later found the contact not connected. Nothing went out. |

                      | `directLinkedIn.contactNotFound` | The contact of a
                      LinkedIn send for later was deleted, or could no longer be
                      found, before the send became due. Nothing went out. |


                      A LinkedIn send for later that is due is checked again
                      before it goes to the account's queue; a refusal found
                      then, for example a LinkedIn account no longer connected,
                      fails it with the `directLinkedIn.*` code the send route
                      answers that refusal with. Nothing went out. A failure
                      with no code of its own, such as an unexpected error, has
                      `failureCode` null and says what happened in
                      `failureReason`.
                    example: directSend.dispatchWindowMissed
                  failureReason:
                    type: string
                    nullable: true
                    description: >-
                      Why the send failed, as a sentence for people to read. Set
                      in the `failed` state only. Use `failureCode` to act on
                      the failure.
                    example: >-
                      The send was never attempted: its dispatch window passed
                      before anything picked it up.
                  missingVariables:
                    type: array
                    nullable: true
                    items:
                      type: string
                    description: >-
                      The variables the email's template uses that have no value
                      for the contact, by name without braces. Set with
                      `failureCode` `contact.missingVariables` only.
                  renderedSubject:
                    type: string
                    nullable: true
                    description: >-
                      The subject as sent, its template rendered for the
                      contact. Email, `sent` state only; null when the sent
                      message can no longer be read.
                  renderedBody:
                    type: string
                    nullable: true
                    description: >-
                      The body as sent, with the signature and the tracking -
                      its template rendered for the contact, the sending
                      account's signature added, and the links and open pixel of
                      the tracking when it is on. HTML, or text for an email
                      with no HTML part. Email, `sent` state only; null when the
                      sent message can no longer be read.
                  cancelledAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      UTC moment the send was cancelled. Set in the `cancelled`
                      state only.
              examples:
                queued_email:
                  summary: An email waiting for its moment
                  value:
                    reference: email-48213
                    channel: email
                    contactId: 42
                    state: queued
                    sendAfter: '2026-11-20T09:00:00Z'
                    estimatedSendAt: null
                    sentAt: null
                    messageId: null
                    failureCode: null
                    failureReason: null
                    missingVariables: null
                    renderedSubject: null
                    renderedBody: null
                    cancelledAt: null
                waiting_email:
                  summary: An email waiting for its schedule to open
                  value:
                    reference: email-48214
                    channel: email
                    contactId: 42
                    state: waitingForSchedule
                    sendAfter: null
                    estimatedSendAt: '2026-11-03T17:00:00Z'
                    sentAt: null
                    messageId: null
                    failureCode: null
                    failureReason: null
                    missingVariables: null
                    renderedSubject: null
                    renderedBody: null
                    cancelledAt: null
                sent_linkedin:
                  summary: A LinkedIn message that has gone out
                  value:
                    reference: linkedin-1044
                    channel: linkedIn
                    contactId: 42
                    state: sent
                    sendAfter: '2026-11-20T09:00:00Z'
                    estimatedSendAt: null
                    sentAt: '2026-11-20T09:00:41Z'
                    messageId: null
                    failureCode: null
                    failureReason: null
                    missingVariables: null
                    renderedSubject: null
                    renderedBody: null
                    cancelledAt: null
                sent_email:
                  summary: An email that has gone out
                  value:
                    reference: email-48212
                    channel: email
                    contactId: 42
                    state: sent
                    sendAfter: '2026-11-20T09:00:00Z'
                    estimatedSendAt: null
                    sentAt: '2026-11-20T09:00:12Z'
                    messageId: <CAF3b1c2d4e5@mail.example.com>
                    failureCode: null
                    failureReason: null
                    missingVariables: null
                    renderedSubject: Quick question, Ann
                    renderedBody: >-
                      <p>Hi Ann, are you the right person to talk to about
                      Acme's hiring?</p><div class="signature"><br/><p>Sam Lee,
                      Example Co</p></div>
                    cancelledAt: null
                missed_email:
                  summary: An email whose moment passed without it being sent
                  value:
                    reference: email-48214
                    channel: email
                    contactId: 42
                    state: failed
                    sendAfter: '2026-11-20T09:00:00Z'
                    estimatedSendAt: null
                    sentAt: null
                    messageId: null
                    failureCode: directSend.dispatchWindowMissed
                    failureReason: >-
                      The send was never attempted: its dispatch window passed
                      before anything picked it up.
                    missingVariables: null
                    renderedSubject: null
                    renderedBody: null
                    cancelledAt: null
                missing_variables_email:
                  summary: >-
                    An email whose template had no value for some variables when
                    it went to be sent
                  value:
                    reference: email-48216
                    channel: email
                    contactId: 42
                    state: failed
                    sendAfter: '2026-11-20T09:00:00Z'
                    estimatedSendAt: null
                    sentAt: null
                    messageId: null
                    failureCode: contact.missingVariables
                    failureReason: >-
                      One or more values for variables are missing or incorrect.
                      Please check that variables in the email correspond to
                      contact fields, including custom fields
                    missingVariables:
                      - Company
                    renderedSubject: null
                    renderedBody: null
                    cancelledAt: null
        '401':
          description: >-
            Unauthorized. The response body is empty; check the
            `WWW-Authenticate` header for the expected scheme.
          content:
            application/problem+json:
              schema:
                allOf:
                  - type: object
                    title: Problem Details
                    description: >-
                      Bare RFC 9457 problem-details envelope. Returned by
                      middleware-level errors

                      that don't carry domain context: 401 Unauthorized (auth
                      middleware),

                      429 Too Many Requests (rate-limit middleware), and
                      route-level 404 / 405 /

                      415 (framework middleware).


                      Business and validation responses extend this envelope and
                      add additional

                      fields — see `business-problem.model.yaml` (adds `code`
                      slug) and

                      `validation-problem.model.yaml` (adds `errors[]` array).
                    properties:
                      title:
                        type: string
                        description: Short, human-readable summary of the problem.
                      status:
                        type: integer
                        description: HTTP status code.
                        minimum: 100
                        maximum: 599
                      detail:
                        type: string
                        description: >-
                          Human-readable explanation specific to this
                          occurrence.
                  - example:
                      title: Unauthorized
                      status: 401
                      detail: Authentication credentials are missing or invalid.
        '403':
          description: The email send was made by a teammate you may not act for.
          content:
            application/problem+json:
              schema:
                allOf:
                  - allOf:
                      - type: object
                        title: Problem Details
                        description: >-
                          Bare RFC 9457 problem-details envelope. Returned by
                          middleware-level errors

                          that don't carry domain context: 401 Unauthorized
                          (auth middleware),

                          429 Too Many Requests (rate-limit middleware), and
                          route-level 404 / 405 /

                          415 (framework middleware).


                          Business and validation responses extend this envelope
                          and add additional

                          fields — see `business-problem.model.yaml` (adds
                          `code` slug) and

                          `validation-problem.model.yaml` (adds `errors[]`
                          array).
                        properties:
                          title:
                            type: string
                            description: Short, human-readable summary of the problem.
                          status:
                            type: integer
                            description: HTTP status code.
                            minimum: 100
                            maximum: 599
                          detail:
                            type: string
                            description: >-
                              Human-readable explanation specific to this
                              occurrence.
                      - type: object
                        properties:
                          code:
                            type: string
                            description: >-
                              Stable, machine-readable error slug in the form

                              `"<resource>.<variant>"`.


                              * `resource` is the camelCased domain — e.g.
                              `sequence`,
                                `contact`, `inboxThread`, `blacklistDomainRule`.
                              * `variant` is the camelCased specific failure
                              mode — e.g.
                                `notFound`, `forbidden`, `duplicateName`, `globalRuleReadOnly`.

                              Use `code` for programmatic error handling; use
                              `detail` for

                              user-facing messages. Slugs are stable across
                              server-side enum

                              reorderings and never change meaning under a given
                              resource.
                            pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$
                            example: sequence.notFound
                    title: Business Problem
                    description: >-
                      Domain error response carrying a stable, namespaced error
                      slug.

                      Emitted for most 4xx responses (business 400, 403, 404,
                      409, …) and

                      for 503 when a downstream dependency is unavailable.
                  - example:
                      title: Forbidden
                      status: 403
                      detail: You do not have permission to access this resource.
                      code: sequence.forbidden
              example:
                title: Forbidden
                status: 403
                detail: The send belongs to a teammate you cannot act for.
                code: directSend.notOwned
        '404':
          description: >-
            No send has this reference, the reference is not of the form
            `email-<id>`, `linkedin-<id>` or `linkedin-scheduled-<id>`, or the
            send belongs to another team.
          content:
            application/problem+json:
              schema:
                allOf:
                  - allOf:
                      - type: object
                        title: Problem Details
                        description: >-
                          Bare RFC 9457 problem-details envelope. Returned by
                          middleware-level errors

                          that don't carry domain context: 401 Unauthorized
                          (auth middleware),

                          429 Too Many Requests (rate-limit middleware), and
                          route-level 404 / 405 /

                          415 (framework middleware).


                          Business and validation responses extend this envelope
                          and add additional

                          fields — see `business-problem.model.yaml` (adds
                          `code` slug) and

                          `validation-problem.model.yaml` (adds `errors[]`
                          array).
                        properties:
                          title:
                            type: string
                            description: Short, human-readable summary of the problem.
                          status:
                            type: integer
                            description: HTTP status code.
                            minimum: 100
                            maximum: 599
                          detail:
                            type: string
                            description: >-
                              Human-readable explanation specific to this
                              occurrence.
                      - type: object
                        properties:
                          code:
                            type: string
                            description: >-
                              Stable, machine-readable error slug in the form

                              `"<resource>.<variant>"`.


                              * `resource` is the camelCased domain — e.g.
                              `sequence`,
                                `contact`, `inboxThread`, `blacklistDomainRule`.
                              * `variant` is the camelCased specific failure
                              mode — e.g.
                                `notFound`, `forbidden`, `duplicateName`, `globalRuleReadOnly`.

                              Use `code` for programmatic error handling; use
                              `detail` for

                              user-facing messages. Slugs are stable across
                              server-side enum

                              reorderings and never change meaning under a given
                              resource.
                            pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$
                            example: sequence.notFound
                    title: Business Problem
                    description: >-
                      Domain error response carrying a stable, namespaced error
                      slug.

                      Emitted for most 4xx responses (business 400, 403, 404,
                      409, …) and

                      for 503 when a downstream dependency is unavailable.
                  - example:
                      title: Not Found
                      status: 404
                      detail: The requested resource was not found.
                      code: sequence.notFound
              example:
                title: Not Found
                status: 404
                detail: The send was not found.
                code: directSend.notFound
        '429':
          description: Too Many Requests
          headers:
            Retry-After:
              description: Seconds to wait before retrying
              schema:
                type: integer
                minimum: 1
          content:
            application/problem+json:
              schema:
                allOf:
                  - type: object
                    title: Problem Details
                    description: >-
                      Bare RFC 9457 problem-details envelope. Returned by
                      middleware-level errors

                      that don't carry domain context: 401 Unauthorized (auth
                      middleware),

                      429 Too Many Requests (rate-limit middleware), and
                      route-level 404 / 405 /

                      415 (framework middleware).


                      Business and validation responses extend this envelope and
                      add additional

                      fields — see `business-problem.model.yaml` (adds `code`
                      slug) and

                      `validation-problem.model.yaml` (adds `errors[]` array).
                    properties:
                      title:
                        type: string
                        description: Short, human-readable summary of the problem.
                      status:
                        type: integer
                        description: HTTP status code.
                        minimum: 100
                        maximum: 599
                      detail:
                        type: string
                        description: >-
                          Human-readable explanation specific to this
                          occurrence.
              example:
                title: Too Many Requests
                status: 429
                detail: API calls quota exceeded! maximum admitted 100 per 1m.
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Authenticate every request with a Bearer token. Pass your Reply API key
        in the

        `Authorization` header:


        ```

        Authorization: Bearer <your-api-key>

        ```


        Get your API key from the Reply dashboard: **Settings → API Key**.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.