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

# Reply in a thread

> Sends from the mailbox that owns the conversation — the prospect always sees a reply from the address that emailed them. Free of credits. Attachments ride on the email (multipart form). INB-09: `channel` overrides which channel the reply goes out on when both identities are known; absent, the thread's own channel decides. A pick the thread cannot honour returns 422 with the reason. INB-10: `to` redirects the reply (first address is the To line, the rest ride as CC) and `bcc` rides blind; both are email-only. INB-12: `omit_signature` skips the mailbox signature append, for a composer whose body already carries it as visible text.



## OpenAPI

````yaml /openapi.json post /inbox/threads/{thread_id}/reply/
openapi: 3.1.0
info:
  contact:
    email: support@getoneprofile.ai
    name: Oneprofile Support
  description: >-
    REST API reference for Oneprofile, the GTM data layer for your CRM. Manage
    tables, enrichments, and integrations. Authenticate with an API key to get
    started.
  termsOfService: https://www.getoneprofile.ai/terms
  title: API Reference | Oneprofile
  version: '0.0'
servers:
  - url: https://api.getoneprofile.ai
security: []
tags:
  - description: Sender profiles, connected mailboxes, tags, and the Google connect flow.
    name: senders
  - description: The workspace do-not-contact list, enforced before every send.
    name: suppression
  - description: 'Sequence authoring: the graph, the table-backed audience, previews.'
    name: sequences
  - description: >-
      The LinkedIn channel: connecting an account to a sender, its safety limits
      and history, and the protocol the browser extension speaks.
    name: linkedin
  - description: 'The unified outreach inbox: threads, replies, labels, events.'
    name: inbox
  - description: 'The AI reply layer: workspace settings, drafts, and approval.'
    name: inbox-ai
  - description: Notification rules, per-user preferences, and the Slack connection.
    name: notifications
  - description: Endpoints for seeing all available integration types.
    name: integration-types
  - description: Endpoints for creating and managing integrations.
    name: integrations
  - description: Endpoints for the generic OAuth install/claim app-listings engine.
    name: app-listings
  - description: Endpoints for creating and managing API keys.
    name: apikey
  - description: Endpoints for managing billing and subscription information.
    name: billing
  - description: Endpoints for creating and managing tables.
    name: tables
  - description: Endpoints for table columns, formula previews, and on-demand column runs.
    name: table-columns
  - description: Endpoints for table rows and manual cell edits.
    name: table-rows
  - description: Endpoints for observing and cancelling table recompute runs.
    name: table-runs
  - description: >-
      Endpoints for org-shared per-column display preferences: hidden, pinned,
      width, and colour tint.
    name: table-ui-prefs
  - description: >-
      Endpoints for the org-shared names given to the column tint palette: what
      this organisation calls each colour. Org-level, not per-table.
    name: table-column-color-labels
  - description: >-
      Endpoints for the enrichment action catalog, model list, presets, draft
      generation, and saved agents.
    name: table-enrichments
  - description: >-
      Endpoints for teaching a saved agent from example rows: training sessions,
      per-row feedback, and the proposed prompt to approve.
    name: agent-training
  - description: >-
      The durable audit trail of a table's enrichment actions: configured,
      edited, run, cancelled, and settled cost.
    name: table-enrichment-audit-logs
  - description: Endpoints for saving and applying column templates.
    name: table-templates
  - description: Server-sent change feed for a table's grid.
    name: table-events
  - description: 'Endpoints for org-shared saved table views: sort, filters, hidden columns.'
    name: table-views
  - description: >-
      The per-table AI Assistant: named conversations, the column suggestions a
      build turn produces, and the questions an analyze turn answers.
    name: table-assistant
  - description: >-
      Endpoints for PER-USER table preferences: favourites and recently opened.
      Unlike the rest of the table surface these are personal, so two members of
      one organisation legitimately see different answers.
    name: table-user-prefs
  - description: >-
      Endpoints for building a table from an uploaded CSV: upload and preview
      the inferred columns, commit the reviewed mapping, then poll the row load.
    name: table-imports
  - description: Endpoint for downloading a table's rows as CSV.
    name: table-export
  - description: >-
      Endpoints for the integration a table imports from: attach and preview it,
      promote imported fields into columns, and run the import on demand.
    name: table-sources
  - description: >-
      Endpoints for a table's recurring import cadence: set it, pause it, and
      read the next fire times.
    name: table-schedules
  - description: >-
      Endpoints for pushing a table's rows out to a connected integration: list
      writable destinations, derive their write capabilities, and map export
      columns.
    name: table-writeback
  - description: >-
      Endpoints backing a lookup column's setup: the connections whose records a
      column could read, and the identity fields one record type can be looked
      up by.
    name: table-integration-lookup
  - description: >-
      Endpoints for sourcing leads from the lead database: count and preview
      matches, land them in a table, and keep saved searches.
    name: find-leads
  - description: >-
      Endpoints for discovering a domain's subdomains from public certificate
      logs and landing the results in a table.
    name: find-subdomains
  - description: Endpoints for the credit balance meter and usage reporting.
    name: credits
  - description: >-
      Endpoints for the workspace referral program: the shareable link, the
      friends who joined through it, and claiming a code after signup.
    name: referral
  - description: >-
      Endpoints for the design partner program's customer surface: whether this
      workspace is a design partner, the badges its feedback has earned, and
      sending and reading that feedback.
    name: design-partner
  - description: >-
      Endpoints for the org-level AI business context — company description,
      ideal customer profile, buyer personas and interest signals — plus
      domain-based generation.
    name: ai-context
paths:
  /inbox/threads/{thread_id}/reply/:
    post:
      tags:
        - inbox
      summary: Reply in a thread
      description: >-
        Sends from the mailbox that owns the conversation — the prospect always
        sees a reply from the address that emailed them. Free of credits.
        Attachments ride on the email (multipart form). INB-09: `channel`
        overrides which channel the reply goes out on when both identities are
        known; absent, the thread's own channel decides. A pick the thread
        cannot honour returns 422 with the reason. INB-10: `to` redirects the
        reply (first address is the To line, the rest ride as CC) and `bcc`
        rides blind; both are email-only. INB-12: `omit_signature` skips the
        mailbox signature append, for a composer whose body already carries it
        as visible text.
      operationId: reply_in_thread
      parameters:
        - in: path
          name: thread_id
          required: true
          schema:
            format: uuid
            title: Thread Id
            type: string
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/Body_reply_in_thread'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageReadSchema'
          description: Successful Response
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedResponse'
          description: Unauthorized
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenResponse'
          description: Forbidden
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundResponse'
          description: Not found.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityResponse'
          description: Validation failed.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServerErrorResponse'
          description: Internal server error.
        '502':
          description: The mailbox could not send.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServerErrorResponse'
          description: Service unavailable.
      security:
        - HTTPBearer: []
        - APIKeyHeader: []
components:
  schemas:
    Body_reply_in_thread:
      properties:
        bcc:
          anyOf:
            - maxLength: 2000
              type: string
            - type: 'null'
          title: Bcc
        body_text:
          maxLength: 100000
          minLength: 1
          title: Body Text
          type: string
        cc:
          anyOf:
            - maxLength: 2000
              type: string
            - type: 'null'
          title: Cc
        channel:
          anyOf:
            - $ref: '#/components/schemas/InboxChannel'
            - type: 'null'
        files:
          anyOf:
            - items:
                format: binary
                type: string
              type: array
            - type: 'null'
          title: Files
        include_history:
          default: false
          title: Include History
          type: boolean
        mailbox_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          title: Mailbox Id
        omit_signature:
          default: false
          title: Omit Signature
          type: boolean
        reply_to_message_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          title: Reply To Message Id
        subject:
          anyOf:
            - maxLength: 998
              type: string
            - type: 'null'
          title: Subject
        to:
          anyOf:
            - maxLength: 2000
              type: string
            - type: 'null'
          title: To
      required:
        - body_text
      title: Body_reply_in_thread
      type: object
    MessageReadSchema:
      properties:
        attachments:
          items:
            $ref: '#/components/schemas/AttachmentReadSchema'
          title: Attachments
          type: array
        body_html:
          anyOf:
            - type: string
            - type: 'null'
          description: 'INB-09: the sender''s raw HTML part; sanitise before rendering.'
          title: Body Html
        body_text:
          title: Body Text
          type: string
        bounce_severity:
          anyOf:
            - $ref: '#/components/schemas/BounceSeverity'
            - type: 'null'
        channel:
          $ref: '#/components/schemas/InboxChannel'
          description: >-
            INB-25: this message's own channel. Threads merge channels, so the
            reader captions each message by what it actually is — a LinkedIn DM
            involves no email addresses.
        direction:
          $ref: '#/components/schemas/MessageDirection'
        from_address:
          title: From Address
          type: string
        id:
          format: uuid
          title: Id
          type: string
        mailbox_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          title: Mailbox Id
        message_class:
          anyOf:
            - $ref: '#/components/schemas/MessageClass'
            - type: 'null'
        send_state:
          $ref: '#/components/schemas/MessageSendState'
        sent_at:
          format: date-time
          title: Sent At
          type: string
        sequence_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          description: '§78: the sequence this message was sent from, when it came from one.'
          title: Sequence Id
        step_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          description: >-
            §78: which step sent this message — carried per-message (not just on
            the thread) because a contact re-enrolled in a different sequence
            keeps their earlier messages' own sequence/step, distinct from the
            thread's current one.
          title: Step Id
        subject:
          title: Subject
          type: string
        thread_id:
          format: uuid
          title: Thread Id
          type: string
        to_address:
          title: To Address
          type: string
      required:
        - id
        - thread_id
        - mailbox_id
        - channel
        - direction
        - send_state
        - from_address
        - to_address
        - subject
        - body_text
        - sent_at
        - message_class
        - bounce_severity
        - attachments
      title: MessageReadSchema
      type: object
    UnauthorizedResponse:
      properties:
        detail:
          description: The detail of why the request is unauthorized.
          title: Detail
          type: string
      required:
        - detail
      title: UnauthorizedResponse
      type: object
    ForbiddenResponse:
      properties:
        detail:
          description: The detail of why the request is forbidden.
          title: Detail
          type: string
      required:
        - detail
      title: ForbiddenResponse
      type: object
    NotFoundResponse:
      properties:
        detail:
          description: The detail of why the resource was not found.
          title: Detail
          type: string
      required:
        - detail
      title: NotFoundResponse
      type: object
    UnprocessableEntityResponse:
      properties:
        detail:
          description: >-
            The detail of the error. This is the error message to show to the
            user. You should also use the issues field to show more detailed
            error messages per field. Use this field for a single liner error
            message.
          title: Detail
          type: string
        issues:
          description: >-
            The issues that caused the error. There can be multiple issues. Each
            issue is a user-facing error message.
          items:
            $ref: '#/components/schemas/UnprocessableEntityIssue'
          title: Issues
          type: array
      required:
        - detail
        - issues
      title: UnprocessableEntityResponse
      type: object
    ServerErrorResponse:
      properties:
        detail:
          description: The detail of why the server returned an error.
          title: Detail
          type: string
      required:
        - detail
      title: ServerErrorResponse
      type: object
    InboxChannel:
      description: >-
        Which surface a conversation happens on.


        Threads are contact-scoped, not channel-scoped, so this says how a
        thread is

        REACHED rather than partitioning the inbox: a reply arrives, is
        classified

        and stops the cadence identically either way, and only the send path
        differs.
      enum:
        - email
        - linkedin
      title: InboxChannel
      type: string
    AttachmentReadSchema:
      properties:
        content_type:
          title: Content Type
          type: string
        filename:
          title: Filename
          type: string
        id:
          format: uuid
          title: Id
          type: string
        size_bytes:
          title: Size Bytes
          type: integer
      required:
        - id
        - filename
        - content_type
        - size_bytes
      title: AttachmentReadSchema
      type: object
    BounceSeverity:
      description: |-
        NEW-A: hard vs soft severity of a BOUNCE message.

        Only HARD marks the contact bounced (§29's condition, the enrolment
        analytics bounce rate, §57's per-message outcome) — SOFT still fills the
        Bounces view and never looks like a reply, but the address may still be
        reachable, so the cadence is left alone.
      enum:
        - hard
        - soft
      title: BounceSeverity
      type: string
    MessageDirection:
      enum:
        - outbound
        - inbound
      title: MessageDirection
      type: string
    MessageClass:
      description: >-
        What an inbound message turned out to be.


        REPLY stops the cadence; BOUNCE (a DSN) marks the contact bounced and
        never

        looks like a reply; OUT_OF_OFFICE never stops anything and defers the

        cadence to the stated return when one is parsed.
      enum:
        - reply
        - bounce
        - out_of_office
      title: MessageClass
      type: string
    MessageSendState:
      description: >-
        Whether a message has actually left.


        Only meaningful on LinkedIn. An email row is written after the provider

        accepted it, so it is ``SENT`` the moment it exists; a LinkedIn reply is

        written when it is QUEUED, and cannot become ``SENT`` until the
        customer's

        own browser has delivered it. Showing the two the same way would have
        the

        product assert a delivery it has no evidence for.
      enum:
        - sent
        - queued
        - failed
      title: MessageSendState
      type: string
    UnprocessableEntityIssue:
      properties:
        input:
          anyOf:
            - type: string
            - type: integer
            - type: number
            - type: boolean
            - items: {}
              type: array
            - additionalProperties: true
              type: object
          description: The user's input that caused the error.
          title: Input
        loc:
          description: >-
            The location of the error. Always contains 1 or 2 elements. The
            first element is the type of location (e.g. 'body', 'query', 'path',
            'header'). The second element is the name of the field that caused
            the error. If the error is not related to a specific field, the
            second element is not present.
          items:
            type: string
          title: Loc
          type: array
        msg:
          description: The message of the error. The error message to show to the user.
          title: Msg
          type: string
        type:
          description: >-
            The type of the error. Useful for frontend code to handle different
            types of errors.
          title: Type
          type: string
      required:
        - loc
        - msg
        - type
        - input
      title: UnprocessableEntityIssue
      type: object
  securitySchemes:
    HTTPBearer:
      scheme: bearer
      type: http
    APIKeyHeader:
      in: header
      name: X-API-Key
      type: apiKey

````