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

# Send inbox message

> Send a manual inbox reply through Enginy conversation routing.

Required body fields:
- contactId: contact whose thread should receive the reply.
- senderIdentityId: sender identity that owns the target thread.
- message: plain-text body of the manual reply.

Optional body fields:
- type: channel used to select the matching conversation. Allowed values are EMAIL and LINKEDIN. If omitted, Enginy falls back to the latest replyable message channel on the matched thread.
- attachment: one attachment with url, name, and MIME type.
- requestId: idempotency suffix for safely retrying the same manual reply.

    > **Required scope:** `MESSAGING_WRITE`
    >
    > **Rate limit:** 30 requests per minute



## OpenAPI

````yaml https://openapi.enginy.ai/definitions.json post /v1/inbox/messages
openapi: 3.1.0
info:
  title: Enginy API
  version: 1.0.0
  description: Public API for Enginy platform
servers:
  - url: https://openapi.enginy.ai
    description: Configured server
security: []
tags:
  - name: AI Variables
    description: >-
      Manage AI variables and discover the entity fields you can reference in
      prompts and entity requests.
  - name: Inbox
    description: >-
      Inbox endpoints for listing contact threads, reading thread messages,
      managing tags, and sending manual replies.
  - name: Workflows
    description: >-
      Build, validate, publish, run, and inspect advanced (graph) workflows,
      plus the block/condition catalog needed to author a workflow plan.
paths:
  /v1/inbox/messages:
    post:
      tags:
        - Inbox
      summary: Send inbox message
      description: >-
        Send a manual inbox reply through Enginy conversation routing.


        Required body fields:

        - contactId: contact whose thread should receive the reply.

        - senderIdentityId: sender identity that owns the target thread.

        - message: plain-text body of the manual reply.


        Optional body fields:

        - type: channel used to select the matching conversation. Allowed values
        are EMAIL and LINKEDIN. If omitted, Enginy falls back to the latest
        replyable message channel on the matched thread.

        - attachment: one attachment with url, name, and MIME type.

        - requestId: idempotency suffix for safely retrying the same manual
        reply.

            > **Required scope:** `MESSAGING_WRITE`
            >
            > **Rate limit:** 30 requests per minute
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                contactId:
                  type: integer
                  exclusiveMinimum: 0
                  description: Contact ID to reply to
                  example: 123
                senderIdentityId:
                  type: integer
                  exclusiveMinimum: 0
                  description: Sender identity ID that owns the conversation
                  example: 14
                type:
                  type: string
                  enum:
                    - EMAIL
                    - LINKEDIN
                  description: >-
                    Optional channel to use when selecting the matching
                    conversation. Defaults to the last replyable message channel
                  example: EMAIL
                message:
                  type: string
                  minLength: 1
                  description: Reply message content
                  example: >-
                    Absolutely. I just sent over our pricing breakdown and can
                    walk through it live if helpful.
                attachment:
                  type: object
                  properties:
                    url:
                      type: string
                      format: uri
                      description: Attachment URL
                      example: https://cdn.enginy.ai/files/pricing-one-pager.pdf
                    name:
                      type: string
                      minLength: 1
                      description: Attachment name
                      example: pricing-one-pager.pdf
                    type:
                      type: string
                      minLength: 1
                      description: Attachment MIME type
                      example: application/pdf
                  required:
                    - url
                    - name
                    - type
                  description: >-
                    Optional single attachment supported by the manual reply
                    flow
                requestId:
                  type: string
                  minLength: 1
                  description: Optional idempotency key suffix for the manual reply
                  example: manual-reply-20260320-001
              required:
                - contactId
                - senderIdentityId
                - message
            examples:
              basicEmailReply:
                summary: Reply on an email thread
                value:
                  contactId: 123
                  senderIdentityId: 14
                  type: EMAIL
                  message: >-
                    Absolutely. I just sent over our pricing breakdown and can
                    walk through it live if helpful.
                  requestId: manual-reply-20260320-001
              emailReplyWithAttachment:
                summary: Reply on an email thread with one attachment
                value:
                  contactId: 123
                  senderIdentityId: 14
                  type: EMAIL
                  message: Sharing the pricing one-pager here as well.
                  attachment:
                    url: https://cdn.enginy.ai/files/pricing-one-pager.pdf
                    name: pricing-one-pager.pdf
                    type: application/pdf
                  requestId: manual-reply-20260320-002
      responses:
        '200':
          description: Inbox message sent successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - success
                  message:
                    type: string
                  data:
                    type: object
                    properties:
                      contactId:
                        type: number
                        description: Contact ID
                      conversationId:
                        type: number
                        description: Conversation used for the manual reply
                      type:
                        type: string
                        enum:
                          - EMAIL
                          - LINKEDIN
                        description: Channel that was used for the reply
                      success:
                        type: boolean
                        description: >-
                          Whether the message dispatch was accepted by the
                          worker
                      message:
                        type: string
                        description: Worker response message
                    required:
                      - contactId
                      - conversationId
                      - type
                      - success
                      - message
                required:
                  - status
                  - message
                  - data
              examples:
                default:
                  summary: Manual reply accepted by the worker
                  value:
                    status: success
                    message: Inbox message sent successfully
                    data:
                      contactId: 123
                      conversationId: 456
                      type: EMAIL
                      success: true
                      message: Message queued successfully
        '400':
          description: Invalid payload or the message service was unavailable
        '404':
          description: Contact, sender identity, or matching conversation not found
      security:
        - apiKey: []
components:
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key

````