---
title: "Relay an operator message on a handed-off conversation"
method: POST
path: "/v1/hitl/handoffs/{handoff_id}/messages"
tags: ["hitl"]
---

# Relay an operator message on a handed-off conversation

`POST /v1/hitl/handoffs/{handoff_id}/messages`

Persist an OUTBOUND operator message (§6.4.1) then deliver it.

Persists a ``role='assistant'`` ``ConvMessage`` attributed to the relaying
operator (``authored_by='human_operator'`` + ``operator_actor_id``),
soft-claims the handoff if unassigned, then hands the already-persisted row
to the channel delivery adapter (the adapter never mints a new message).

## Path parameters

- `handoff_id` string, uuid, required

## Request body

- HandoffRelayRequest — Body for the operator-relay mutation (``POST …/messages``). The relaying operator's identity comes from auth, not the body — only the message text the operator wants to send the end-user.
  - `content` string, required

## Response `200`

Successful Response

- HandoffMessageRead — The persisted operator-relay ``conv_messages`` row (HITL-04 §6.4.1). Returned by the relay endpoint so the operator UI can immediately render the message it just sent (with its allocated ``seq`` watermark) without a follow-up poll.
  - `id` string, uuid, required
  - `conversation_id` string, uuid, required
  - `seq` integer, required
  - `role` string, required
  - `content` string, nullable, required
  - `authored_by` string, required
  - `operator_actor_id` string, nullable, required
  - `created_at` string, date-time, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/oneloop-hq/apis/feather-api.md) · [All operations](https://skmtc.net/oneloop-hq/apis/feather-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/oneloop-hq/feather-api/revisions/9cd7291d4228/schema)
