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

# Submit a message to a lane

> Submits a message into a specific lane — the side conversation, or a subagent lane. Same 202 contract as the session-level message: a turn is accepted and its results stream over events, never on this response. One case answers 204 instead: a lane STOPPED on a question takes the message as the answer to that question, which unblocks the agent already running on it and opens no turn of its own.



## OpenAPI

````yaml /en/openapi/v3-current/narya.yaml post /v1/sessions/{sessionId}/lanes/{laneId}/messages
openapi: 3.1.0
info:
  title: Narya Host API
  version: 1.0.0
  description: >-
    The contract between the Narya host and every client. One long-lived host
    runs on your machine and serves this API over a Unix socket in your Narya
    home. Narya creates the socket owner-only, and file permissions are the
    whole authorization. There is no password, no token and no TLS. The terminal
    client and the one-shot command that Lerian ships drive this API, and a
    client you write drives the same one.


    Results never arrive on the response of the request that caused them.
    Submitting a message returns 202 with a turn id. Everything the turn
    produces streams over GET /v1/events as server-sent events with a typed
    envelope, and a stream resumes from a Last-Event-ID header.


    One error envelope: code, title, message, and fields on 422. Codes are NRY-
    followed by four digits. A paged list answers items, limit and a nextCursor
    when more remains. Cursors are opaque.
servers: []
security: []
tags:
  - name: host
    description: The host process itself — version, uptime, mode, store.
  - name: sessions
    description: Durable conversation containers. Archive, never destroy.
  - name: messages
    description: Submitting work into a session and interrupting it.
  - name: events
    description: The server-sent event stream every client consumes.
  - name: lanes
    description: Parallel tracks inside a session — main, subagent, side.
  - name: agents
    description: Named recipes — instructions, tools, model, policy. Read-only in v1.
  - name: ladder
    description: >-
      What a person can type: the skills and command files in force for one
      repository, and expanding one into text. Five origins merged, nearest
      winning a name, the repository's own rungs gated on trust.
  - name: permissions
    description: Pending permission asks, decisions, and the decision audit.
  - name: intercom
    description: Sessions on one machine finding and messaging each other.
  - name: packages
    description: The one thing a user installs — resources, Go code, or both.
  - name: workflows
    description: Deterministic multi-agent orchestration runs.
  - name: providers
    description: Model suppliers, their auth state, and the model catalogue.
  - name: monitors
    description: >-
      Long-running watchers a session keeps beside its conversation — a test
      runner in watch mode, a build, a log being followed. Started by the model
      or by the person, always listed, always killable.
  - name: records
    description: The queryable local record of everything that happened.
  - name: schedules
    description: >-
      Work the host's own clock starts with nobody present — a repository, a
      prompt, a rule and what one fire may spend. Cancel, never destroy.
paths:
  /v1/sessions/{sessionId}/lanes/{laneId}/messages:
    parameters:
      - $ref: '#/components/parameters/SessionIdParam'
      - $ref: '#/components/parameters/LaneIdParam'
    post:
      tags:
        - lanes
      summary: Submit a message to a lane
      description: >-
        Submits a message into a specific lane — the side conversation, or a
        subagent lane. Same 202 contract as the session-level message: a turn is
        accepted and its results stream over events, never on this response. One
        case answers 204 instead: a lane STOPPED on a question takes the message
        as the answer to that question, which unblocks the agent already running
        on it and opens no turn of its own.
      operationId: createLaneMessage
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MessageCreate'
      responses:
        '202':
          description: Accepted; results stream over the event stream.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TurnAccepted'
        '204':
          description: >-
            The message answered the question this lane was stopped on. The
            agent carries on inside the turn it was already running, so there is
            no new turn to correlate and no body to return.
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '413':
          description: >-
            The message's attachments together weigh more than one supplier
            request can carry (NRY-0027). Nothing was admitted; the bytes stored
            for the files earlier in the list were removed with the refusal.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    SessionIdParam:
      name: sessionId
      in: path
      required: true
      description: The session's id.
      schema:
        type: string
        format: uuid
    LaneIdParam:
      name: laneId
      in: path
      required: true
      description: The lane's id.
      schema:
        type: string
        format: uuid
  schemas:
    MessageCreate:
      type: object
      description: >-
        A user message submitted into a session or lane. Posted while work is
        running it is a steering message, queued and delivered between tool
        batches without discarding work already done.
      required:
        - content
      properties:
        content:
          type: string
          minLength: 1
          description: The message text.
        attachments:
          type: array
          maxItems: 32
          description: Absolute paths of files to attach.
          items:
            type: string
            maxLength: 4096
        queueKind:
          type: string
          enum:
            - steer
            - follow-up
          default: steer
          description: >-
            While a turn is running, steer delivers after a complete tool batch
            and follow-up starts a fresh turn after turn-finished. Defaults to
            steer. During a final stream with no subsequent tool batch, steer is
            durably converted to follow-up with the same admitted entry and turn
            id.
        agent:
          type: string
          pattern: ^[^\s/\\]+$
          maxLength: 128
          description: >-
            Named agent recipe this message runs under: its prompt replaces the
            system prompt for the turn, its model overrides the session's, and
            its tool allowlist is the only catalogue the turn can see. The
            session's own behaviour when absent. Recorded on the admitted
            message, so the transcript says which agent each turn ran under —
            there is no session-wide current agent. Ignored on a side lane,
            exactly as LaneCreate ignores it there: a side conversation always
            runs the host's read-only explorer, and that is not the caller's to
            change on any road.
      examples:
        - content: Run the ledger test suite and fix the flaky test.
          attachments:
            - /Users/dev/repos/midaz/components/ledger/test.log
    TurnAccepted:
      type: object
      description: >-
        Acknowledgement of a submitted message. Everything the turn produces
        streams over GET /v1/events, correlated by this turn id — never over the
        submitting response.
      required:
        - turnId
      properties:
        turnId:
          type: string
          format: uuid
          description: Correlates this turn's events on the stream.
      examples:
        - turnId: 4d8e2f6a-0b1c-4d3e-9f5a-7b9c1d3e5f0a
    Error:
      type: object
      description: >-
        The single error envelope every operation returns. Codes are NRY-
        followed by four digits and are catalogued in the top-level
        x-error-catalog extension. fields appears only on 422 validation errors,
        mapping each offending property to its problem.
      required:
        - code
        - title
        - message
      properties:
        code:
          type: string
          pattern: ^NRY-[0-9]{4}$
          description: Machine-readable error code from the NRY catalogue.
        title:
          type: string
          maxLength: 256
          description: Short human-readable summary of the error class.
        message:
          type: string
          maxLength: 4096
          description: Specific, actionable description of what went wrong.
        fields:
          type: object
          description: Per-field validation problems. Present on 422 only.
          additionalProperties:
            type: string
      examples:
        - code: NRY-0002
          title: Session not found
          message: >-
            No session with id 6b9f6d2e-1c3a-4f5b-9d7e-2a8c4e6f0b1d exists on
            this host.
  responses:
    BadRequest:
      description: Malformed request — invalid parameter, cursor, or JSON body.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The addressed resource does not exist on this host.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Conflict:
      description: >-
        The resource's current state rejects the request — archived session,
        busy lane, slot conflict, failed build, already-final state.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnprocessableEntity:
      description: >-
        The request was well-formed but failed validation. The error's fields
        map names each offending property.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InternalServerError:
      description: The host failed — including a store that refuses writes (NRY-0012).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'

````