> ## 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 inbox thread

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

Returns a single thread including the ordered message history.



## OpenAPI

````yaml /api-reference/bundled.yaml get /v3/inbox/threads/{id}
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: User Account
    description: Account information and authentication verification
  - name: Accounts
    description: Manage accounts (companies/organizations)
  - 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 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, generated step types, and playbook/knowledge-base connections
  - name: AI SDR Web Search
    description: Find contacts via AI-driven web search and review past searches
  - name: Attachments
    description: >-
      Upload file attachments used across email templates, sequence steps, and
      direct emails
  - name: Account Lists
    description: Manage account lists and account membership
  - name: Background Jobs
    description: >-
      Track and cancel asynchronous background operations (e.g., email
      validation)
  - name: Custom Fields
    description: Manage custom contact fields
  - 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: Contact Blacklist Rules
    description: Manage blacklist rules for domains, emails, and email exceptions
  - name: Contact Enrichment
    description: >-
      Enrich contacts with emails, phone numbers, LinkedIn data, and AI-filled
      custom fields
  - name: Contact Lists
    description: Manage contact lists and contact membership
  - name: Contacts
    description: Manage individual contacts
  - name: Email Accounts
    description: Manage email accounts used for sending and receiving
  - name: Email Templates
    description: Manage email templates and template folders
  - name: Email Validations
    description: Estimate and schedule asynchronous email validation jobs
  - name: Holiday Calendars
    description: Manage holiday calendars for scheduling
  - name: Inbox
    description: >-
      Manage inbox threads and per-team thread categories — list/filter, read
      state, replies, category assignment, and meeting-intent flagging
  - name: LinkedIn Accounts
    description: Manage LinkedIn accounts for outreach
  - name: Live Data
    description: >-
      Find new contacts via Live Data searches and read typeahead values for the
      Live Data / Autopilot filter sidebar
  - 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 Playbooks
    description: >-
      Manage AI SDR playbooks — tone, voice, and style guides applied during
      personalized message generation
  - name: Reports
    description: >-
      Generate and access performance reports across email, calls, tasks,
      LinkedIn, and team performance
  - name: Schedules
    description: Manage email send schedules and timing
  - name: Settings
    description: Manage team and user settings
  - name: Sequence Contacts
    description: Manage contacts within sequences
  - name: Sequence Email Accounts
    description: Manage email accounts linked to sequences
  - name: Sequence Folders
    description: Organize sequences into folders
  - name: Sequence LinkedIn Accounts
    description: Manage LinkedIn accounts linked to sequences
  - 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: Sequence Steps
    description: Manage individual steps in sequences
  - name: Sequence Templates
    description: Manage sequence templates
  - name: Sequences
    description: Manage email automation sequences
  - name: AI SDR Strategist
    description: Trigger AI Strategist runs
  - name: Tasks
    description: Manage tasks and to-do items
  - name: Webhooks
    description: Manage webhook subscriptions and inspect delivery history
paths:
  /v3/inbox/threads/{id}:
    get:
      tags:
        - Inbox
      summary: Get inbox thread
      description: >-
        <small>_Requires the `inbox:read` scope (or a broader one that includes
        it)._</small>


        Returns a single thread including the ordered message history.
      operationId: GetInboxThread
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: integer
            minimum: 1
      responses:
        '200':
          description: Inbox thread
          content:
            application/json:
              schema:
                type: object
                title: Inbox Thread
                description: >-
                  Full inbox thread with the contact, channel-specific account
                  ids, sequence, category, meeting-intent flag, and the ordered
                  list of messages.
                required:
                  - id
                  - channel
                  - contact
                  - messages
                properties:
                  id:
                    type: integer
                  channel:
                    type: string
                    enum:
                      - unknown
                      - email
                      - linkedIn
                  isRead:
                    type: boolean
                    description: Whether the thread is marked as read by the current user.
                  contact:
                    type: object
                    title: Inbox Thread Contact
                    description: >-
                      Contact party on the other end of an inbox thread.


                      Two shapes are possible, distinguished by the `isDeleted`
                      flag:


                      - **Live contact** (`isDeleted: false`) — `id` and
                      `ownerId` reference the live contact record; `fullName`,
                      `email`, `linkedInProfileUrl`, `phone`, `companyName`,
                      `title` come from the live record (any may still be `null`
                      if the corresponding field is unset on the contact, e.g.
                      `email` is `null` for a LinkedIn-only contact).

                      - **Deleted contact** (`isDeleted: true`) — the underlying
                      contact record has been removed, so `id` and `ownerId` are
                      `null`. The remaining identifying fields (`fullName`,
                      `email`, `linkedInProfileUrl`, `phone`, `companyName`,
                      `title`) are populated from the snapshot stored on the
                      thread when it was created — typically enough for the user
                      to recognise *who* the thread was with even though the
                      contact no longer exists in their workspace.
                    required:
                      - isDeleted
                    properties:
                      id:
                        type: integer
                        nullable: true
                        description: Contact id. `null` when the contact has been deleted.
                      ownerId:
                        type: integer
                        nullable: true
                        description: >-
                          User id of the contact's owner. `null` when the
                          contact has been deleted.
                      fullName:
                        type: string
                        nullable: true
                        description: >-
                          Display name. May still be populated from the thread
                          snapshot when the contact has been deleted.
                      email:
                        type: string
                        nullable: true
                        description: >-
                          Contact email address. `null` for LinkedIn-only
                          contacts.
                      linkedInProfileUrl:
                        type: string
                        nullable: true
                        description: LinkedIn profile URL. `null` for email-only contacts.
                      phone:
                        type: string
                        nullable: true
                      companyName:
                        type: string
                        nullable: true
                      title:
                        type: string
                        nullable: true
                      isDeleted:
                        type: boolean
                        description: >-
                          `true` when the underlying contact record has been
                          deleted from the workspace. In that case `id` and
                          `ownerId` are `null` and the remaining identifying
                          fields reflect the snapshot stored on the thread when
                          the message arrived; `false` when the contact is still
                          present and `id` / `ownerId` reference the live
                          record.
                  emailAccountId:
                    type: integer
                    format: int64
                    nullable: true
                    description: >-
                      Email account that owns this thread. `null` for non-email
                      threads.
                  linkedInAccountId:
                    type: integer
                    nullable: true
                    description: >-
                      LinkedIn account that owns this thread. `null` for
                      non-LinkedIn threads.
                  sequence:
                    type: object
                    allOf:
                      - type: object
                        title: Inbox Thread Sequence
                        description: >-
                          Minimal sequence reference attached to an inbox
                          thread.
                        required:
                          - id
                          - name
                        properties:
                          id:
                            type: integer
                          name:
                            type: string
                    nullable: true
                  messages:
                    type: array
                    items:
                      title: Inbox Thread Message
                      description: >-
                        Polymorphic message variant within an inbox thread,
                        discriminated by `channel`. Email messages carry
                        recipient and subject metadata; LinkedIn messages carry
                        only the shared base fields.
                      discriminator:
                        propertyName: channel
                        mapping:
                          email:
                            $ref: '#/components/schemas/email.type-2'
                          linkedIn:
                            $ref: '#/components/schemas/linkedin.type-2'
                      oneOf:
                        - type: object
                          title: Inbox Email Message
                          description: Email message within an inbox thread.
                          required:
                            - channel
                          properties:
                            channel:
                              type: string
                              enum:
                                - email
                              description: Discriminator — always `email` for this variant.
                            messageId:
                              type: string
                              nullable: true
                              description: >-
                                Unique identifier of the message within the
                                thread. Use this value as `replyToMessageId`
                                when sending a reply to a specific message.
                            date:
                              type: string
                              format: date-time
                            body:
                              type: string
                              nullable: true
                              description: Message body. May contain HTML.
                            fromName:
                              type: string
                              nullable: true
                            isOutbound:
                              type: boolean
                              description: >-
                                True when the message was sent from this
                                account; false when received.
                            status:
                              type: object
                              allOf:
                                - type: object
                                  title: Inbox Thread Message Status
                                  description: >-
                                    Per-message status. Populated for outbound
                                    messages that surfaced a delivery error;
                                    absent (`null`) on healthy inbound or
                                    successfully delivered outbound messages.
                                  properties:
                                    state:
                                      type: string
                                      enum:
                                        - ok
                                        - needsAttention
                                      description: >-
                                        Message state, parallel to the thread
                                        state.
                                    code:
                                      type: string
                                      nullable: true
                                      enum:
                                        - linkedInAccountNotEnabled
                                        - linkedInInvalidCookie
                                        - linkedInSendingLimitExceeded
                                        - linkedInMessageSendingDisabled
                                        - >-
                                          linkedInSalesNavigatorSubscriptionMissing
                                        - linkedInMessageTooLong
                                        - linkedInRenderFailed
                                        - linkedInUnknown
                                        - linkedInProfileNotConnected
                                      description: >-
                                        Specific delivery error that put the
                                        message into `needsAttention`. `null`
                                        for healthy messages.
                                    occurredAt:
                                      type: string
                                      format: date-time
                                      nullable: true
                                      description: >-
                                        Timestamp of the most recent status
                                        transition.
                              nullable: true
                            aiSentType:
                              type: string
                              nullable: true
                              enum:
                                - aiGenerated
                                - aiGeneratedEdited
                                - autoSent
                              description: >-
                                For a sent message, identifies that it was
                                generated by AI. `null` when the message was not
                                AI-generated.
                            subject:
                              type: string
                              nullable: true
                            fromAddress:
                              type: string
                              nullable: true
                            to:
                              type: array
                              nullable: true
                              items:
                                type: string
                            cc:
                              type: array
                              nullable: true
                              items:
                                type: string
                            bcc:
                              type: array
                              nullable: true
                              items:
                                type: string
                        - type: object
                          title: Inbox LinkedIn Message
                          description: LinkedIn message within an inbox thread.
                          required:
                            - channel
                          properties:
                            channel:
                              type: string
                              enum:
                                - linkedIn
                              description: >-
                                Discriminator — always `linkedIn` for this
                                variant.
                            messageId:
                              type: string
                              nullable: true
                              description: >-
                                Unique identifier of the message within the
                                thread.
                            date:
                              type: string
                              format: date-time
                            body:
                              type: string
                              nullable: true
                            fromName:
                              type: string
                              nullable: true
                            isOutbound:
                              type: boolean
                            status:
                              type: object
                              allOf:
                                - type: object
                                  title: Inbox Thread Message Status
                                  description: >-
                                    Per-message status. Populated for outbound
                                    messages that surfaced a delivery error;
                                    absent (`null`) on healthy inbound or
                                    successfully delivered outbound messages.
                                  properties:
                                    state:
                                      type: string
                                      enum:
                                        - ok
                                        - needsAttention
                                      description: >-
                                        Message state, parallel to the thread
                                        state.
                                    code:
                                      type: string
                                      nullable: true
                                      enum:
                                        - linkedInAccountNotEnabled
                                        - linkedInInvalidCookie
                                        - linkedInSendingLimitExceeded
                                        - linkedInMessageSendingDisabled
                                        - >-
                                          linkedInSalesNavigatorSubscriptionMissing
                                        - linkedInMessageTooLong
                                        - linkedInRenderFailed
                                        - linkedInUnknown
                                        - linkedInProfileNotConnected
                                      description: >-
                                        Specific delivery error that put the
                                        message into `needsAttention`. `null`
                                        for healthy messages.
                                    occurredAt:
                                      type: string
                                      format: date-time
                                      nullable: true
                                      description: >-
                                        Timestamp of the most recent status
                                        transition.
                              nullable: true
                            aiSentType:
                              type: string
                              nullable: true
                              enum:
                                - aiGenerated
                                - aiGeneratedEdited
                                - autoSent
                              description: >-
                                For a sent message, identifies that it was
                                generated by AI. `null` when the message was not
                                AI-generated.
                  aiDraft:
                    type: object
                    allOf:
                      - type: object
                        title: Inbox Thread AI Draft
                        description: >-
                          The thread's pending AI-drafted reply, awaiting
                          review. A thread has at most one active AI draft.
                        required:
                          - message
                        properties:
                          message:
                            type: string
                            description: >-
                              The AI-generated draft reply body. May contain
                              HTML.
                          cc:
                            type: array
                            items:
                              type: string
                            description: >-
                              Draft CC recipients. Empty when the draft has
                              none.
                          bcc:
                            type: array
                            items:
                              type: string
                            description: >-
                              Draft BCC recipients. Empty when the draft has
                              none.
                          attachments:
                            type: array
                            items:
                              type: object
                              title: Attachment
                              description: >-
                                Uploaded file attachment usable across email
                                templates, sequence steps, and direct emails.
                              required:
                                - id
                                - fileName
                                - size
                              properties:
                                id:
                                  type: integer
                                  description: >-
                                    Attachment identifier — pass this in
                                    `attachmentIds` arrays on email-template,
                                    sequence-step, and inbox-message endpoints.
                                fileName:
                                  type: string
                                  description: >-
                                    Original file name as supplied by the
                                    upload.
                                size:
                                  type: integer
                                  description: File size in kilobytes (rounded up).
                            description: >-
                              Files attached to the draft. Empty when the draft
                              has none.
                    nullable: true
                    description: >-
                      The thread's single pending AI-drafted reply, if one is
                      awaiting review. `null` when the thread has no active AI
                      draft.
                  category:
                    type: object
                    allOf:
                      - type: object
                        title: Inbox Thread Category Reference
                        description: >-
                          Minimal category reference embedded in thread
                          responses.
                        required:
                          - id
                          - name
                        properties:
                          id:
                            type: integer
                          name:
                            type: string
                    nullable: true
                  hasMeetingIntent:
                    type: boolean
                    description: >-
                      Whether the thread has been flagged as carrying meeting
                      intent (manually or via AI detection).
              examples:
                live_contact_email_thread:
                  summary: Email thread with a live contact and a short reply chain
                  value:
                    id: 58217
                    channel: email
                    isRead: false
                    contact:
                      id: 9821
                      ownerId: 42
                      fullName: Daria Kovalenko
                      email: daria.kovalenko@northwind.example
                      linkedInProfileUrl: https://www.linkedin.com/in/daria-kovalenko
                      phone: '+380501234567'
                      companyName: Northwind Logistics
                      title: VP of Operations
                      isDeleted: false
                    emailAccountId: 18044
                    linkedInAccountId: null
                    sequence:
                      id: 314
                      name: Q3 Outbound — Logistics ICP
                    messages:
                      - channel: email
                        messageId: <abc123@reply.example>
                        date: '2026-05-06T08:01:42Z'
                        body: >-
                          <p>Hi Daria — quick check-in on the Q3 rollout pricing
                          we discussed last week. Are you free Tuesday at 10am
                          for a 20-min call?</p>
                        fromName: Alex Johnson
                        isOutbound: true
                        subject: Pricing for Q3 rollout
                        fromAddress: alex.johnson@reply.example
                        to:
                          - daria.kovalenko@northwind.example
                        cc: null
                        bcc: null
                      - channel: email
                        messageId: <def456@northwind.example>
                        date: '2026-05-07T14:32:11Z'
                        body: >-
                          <p>Thanks — does Tuesday at 10am work for a quick
                          call?</p><p>Daria</p>
                        fromName: Daria Kovalenko
                        isOutbound: false
                        subject: 'Re: Pricing for Q3 rollout'
                        fromAddress: daria.kovalenko@northwind.example
                        to:
                          - alex.johnson@reply.example
                        cc: null
                        bcc: null
                    aiDraft:
                      message: >-
                        <p>Hi Daria — Tuesday at 10am works for me. I'll send a
                        calendar invite shortly.</p>
                      cc: []
                      bcc: []
                      attachments: []
                    category:
                      id: 7
                      name: Hot Leads
                    hasMeetingIntent: true
                deleted_contact_linkedin_thread:
                  summary: >-
                    LinkedIn thread whose contact was deleted from the
                    workspace. `contact.id` and `contact.ownerId` are `null`,
                    but `fullName`, `linkedInProfileUrl`, `companyName`, and
                    `title` remain populated from the thread snapshot — enough
                    to recognise the conversation history.
                  value:
                    id: 58198
                    channel: linkedIn
                    isRead: true
                    contact:
                      id: null
                      ownerId: null
                      fullName: Marcus Lee
                      email: null
                      linkedInProfileUrl: https://www.linkedin.com/in/marcus-lee-rev
                      phone: null
                      companyName: Helix Robotics
                      title: Head of Revenue
                      isDeleted: true
                    emailAccountId: null
                    linkedInAccountId: 2218
                    messages:
                      - channel: linkedIn
                        messageId: null
                        date: '2026-05-06T16:48:09Z'
                        body: >-
                          Hey Marcus — saw your team is hiring AEs in EMEA.
                          Worth a quick chat next week?
                        fromName: Alex Johnson
                        isOutbound: true
                      - channel: linkedIn
                        messageId: null
                        date: '2026-05-07T09:14:02Z'
                        body: Sounds good, sending over the deck.
                        fromName: Marcus Lee
                        isOutbound: false
                    hasMeetingIntent: false
                linkedin_thread_with_send_failure:
                  summary: >-
                    LinkedIn thread where the most recent outbound message hit a
                    delivery error — the message-level `status` carries the
                    specific failure code. The thread will surface as
                    `needsAttention` in the list endpoint.
                  value:
                    id: 58155
                    channel: linkedIn
                    isRead: false
                    contact:
                      id: 9802
                      ownerId: 42
                      fullName: Priya Subramaniam
                      email: null
                      linkedInProfileUrl: https://www.linkedin.com/in/priya-subramaniam
                      phone: null
                      companyName: Lattice Analytics
                      title: Director of Sales Ops
                      isDeleted: false
                    emailAccountId: null
                    linkedInAccountId: 2218
                    messages:
                      - channel: linkedIn
                        messageId: null
                        date: '2026-05-05T11:22:00Z'
                        body: >-
                          Thanks for connecting — would you be open to a 15 min
                          chat about how teams use Lattice for pipeline
                          reporting?
                        fromName: Priya Subramaniam
                        isOutbound: false
                      - channel: linkedIn
                        messageId: null
                        date: '2026-05-06T07:04:51Z'
                        body: Hi Priya — sure, would Thursday afternoon work?
                        fromName: Alex Johnson
                        isOutbound: true
                        status:
                          state: needsAttention
                          code: linkedInInvalidCookie
                          occurredAt: '2026-05-06T07:04:53Z'
                    hasMeetingIntent: true
        '400':
          description: Invalid id parameter or a business-rule rejection.
          content:
            application/problem+json:
              schema:
                oneOf:
                  - 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:
                              errors:
                                type: array
                                description: >-
                                  List of field-level validation errors. Always
                                  non-empty when this

                                  envelope is returned. Each entry pins a single
                                  offending field

                                  via JSON Pointer plus a sanitized detail
                                  string.
                                items:
                                  type: object
                                  title: Validation Error
                                  description: A single field-level validation error.
                                  properties:
                                    pointer:
                                      type: string
                                      description: >-
                                        JSON Pointer (RFC 6901) to the offending
                                        field — e.g.

                                        `/steps/0/subject`.


                                        * An empty string (`""`) means the error
                                        applies to the whole
                                          request body (e.g. body is missing or unparseable).
                                        * For route or query parameter failures
                                        the pointer is the parameter
                                          name (e.g. `id`, `top`).
                                      example: /steps/0/subject
                                    detail:
                                      type: string
                                      description: >-
                                        Sanitized, human-readable explanation of
                                        this field's error. One of a

                                        small set of templates — `"Field is
                                        required."`, `"Value has an

                                        invalid type."`, `"Value has an invalid
                                        format."`, `"Request body is

                                        not valid JSON."`, `"The request body is
                                        required and cannot be

                                        empty."` — or a FluentValidator message
                                        on body endpoints.
                                      example: Field is required.
                        title: Validation Problem
                        description: >-
                          Input-validation error response at 400. Returned when
                          the request body

                          fails binding, FluentValidator rules, or when
                          route/query parameter

                          attribute validation (`[Range]`, `[Required]`) fails.
                          Route, query, and

                          body errors are combined into a single `errors[]`
                          array — clients should

                          not assume one error per request.
                      - example:
                          title: Validation failed
                          status: 400
                          detail: The request body contains validation errors.
                          errors:
                            - pointer: /name
                              detail: Field is required.
                  - 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: Bad Request
                          status: 400
                          detail: Pagination parameters are invalid.
                          code: sequence.invalidPagination
              examples:
                validation_failed:
                  summary: Route parameter validation failure
                  value:
                    title: Validation failed
                    status: 400
                    detail: The request contains validation errors.
                    errors:
                      - pointer: id
                        detail: '''id'' must be a positive integer.'
                business_invalid_input:
                  summary: Business-rule rejection
                  value:
                    title: Bad Request
                    status: 400
                    detail: Invalid input.
                    code: inboxThread.invalidInput
        '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: Inbox feature is not available for this user or 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: Forbidden
                      status: 403
                      detail: You do not have permission to access this resource.
                      code: sequence.forbidden
              example:
                title: Forbidden
                status: 403
                detail: Inbox feature is not available for this user.
                code: inboxThread.forbidden
        '404':
          description: Thread not found or not visible to the current user.
          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: Inbox thread not found.
                code: inboxThread.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: Rate limit exceeded. Retry after 60 seconds.
components:
  schemas:
    email.type-2:
      type: object
      title: Inbox Email Message
      description: Email message within an inbox thread.
      required:
        - channel
      properties:
        channel:
          type: string
          enum:
            - email
          description: Discriminator — always `email` for this variant.
        messageId:
          type: string
          nullable: true
          description: >-
            Unique identifier of the message within the thread. Use this value
            as `replyToMessageId` when sending a reply to a specific message.
        date:
          type: string
          format: date-time
        body:
          type: string
          nullable: true
          description: Message body. May contain HTML.
        fromName:
          type: string
          nullable: true
        isOutbound:
          type: boolean
          description: >-
            True when the message was sent from this account; false when
            received.
        status:
          type: object
          allOf:
            - type: object
              title: Inbox Thread Message Status
              description: >-
                Per-message status. Populated for outbound messages that
                surfaced a delivery error; absent (`null`) on healthy inbound or
                successfully delivered outbound messages.
              properties:
                state:
                  type: string
                  enum:
                    - ok
                    - needsAttention
                  description: Message state, parallel to the thread state.
                code:
                  type: string
                  nullable: true
                  enum:
                    - linkedInAccountNotEnabled
                    - linkedInInvalidCookie
                    - linkedInSendingLimitExceeded
                    - linkedInMessageSendingDisabled
                    - linkedInSalesNavigatorSubscriptionMissing
                    - linkedInMessageTooLong
                    - linkedInRenderFailed
                    - linkedInUnknown
                    - linkedInProfileNotConnected
                  description: >-
                    Specific delivery error that put the message into
                    `needsAttention`. `null` for healthy messages.
                occurredAt:
                  type: string
                  format: date-time
                  nullable: true
                  description: Timestamp of the most recent status transition.
          nullable: true
        aiSentType:
          type: string
          nullable: true
          enum:
            - aiGenerated
            - aiGeneratedEdited
            - autoSent
          description: >-
            For a sent message, identifies that it was generated by AI. `null`
            when the message was not AI-generated.
        subject:
          type: string
          nullable: true
        fromAddress:
          type: string
          nullable: true
        to:
          type: array
          nullable: true
          items:
            type: string
        cc:
          type: array
          nullable: true
          items:
            type: string
        bcc:
          type: array
          nullable: true
          items:
            type: string
    linkedin.type-2:
      type: object
      title: Inbox LinkedIn Message
      description: LinkedIn message within an inbox thread.
      required:
        - channel
      properties:
        channel:
          type: string
          enum:
            - linkedIn
          description: Discriminator — always `linkedIn` for this variant.
        messageId:
          type: string
          nullable: true
          description: Unique identifier of the message within the thread.
        date:
          type: string
          format: date-time
        body:
          type: string
          nullable: true
        fromName:
          type: string
          nullable: true
        isOutbound:
          type: boolean
        status:
          type: object
          allOf:
            - type: object
              title: Inbox Thread Message Status
              description: >-
                Per-message status. Populated for outbound messages that
                surfaced a delivery error; absent (`null`) on healthy inbound or
                successfully delivered outbound messages.
              properties:
                state:
                  type: string
                  enum:
                    - ok
                    - needsAttention
                  description: Message state, parallel to the thread state.
                code:
                  type: string
                  nullable: true
                  enum:
                    - linkedInAccountNotEnabled
                    - linkedInInvalidCookie
                    - linkedInSendingLimitExceeded
                    - linkedInMessageSendingDisabled
                    - linkedInSalesNavigatorSubscriptionMissing
                    - linkedInMessageTooLong
                    - linkedInRenderFailed
                    - linkedInUnknown
                    - linkedInProfileNotConnected
                  description: >-
                    Specific delivery error that put the message into
                    `needsAttention`. `null` for healthy messages.
                occurredAt:
                  type: string
                  format: date-time
                  nullable: true
                  description: Timestamp of the most recent status transition.
          nullable: true
        aiSentType:
          type: string
          nullable: true
          enum:
            - aiGenerated
            - aiGeneratedEdited
            - autoSent
          description: >-
            For a sent message, identifies that it was generated by AI. `null`
            when the message was not AI-generated.
  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**.

````