Conversations

Send Message

Reply in a thread.

Runs the SAME three consent gates as notify-owner, with the same arguments. A thread with no resolved contact (a parent-level thread) answers 409: consent is per (number, contact) and cannot be checked without one.

attach_snapshot sends the event's alert-frame JPEG as MMS. It requires event_id (422 at the body level without one) and answers 409 SNAPSHOT_UNAVAILABLE when that event has no snapshot — nothing is written and nothing is sent in that case.

post/conversations/{conversation_id}/messages

Request

  • Base URL
    https://api.verdun.ai (the document declares no server; this is the origin it was published from)
  • URL
    https://api.verdun.ai/conversations/{conversation_id}/messages
  • Auth
    HTTP bearer

Path parameters

conversation_idstring required

Request body

bodystring required

Message body. Links are permitted — the 10DLC campaign declares them and link shortening is disabled per message, so a URL goes out exactly as typed (see NotifyOwnerRequest.message).

event_idstring nullable

Optional incident this message is about. When given, the message ALSO appears on that event's communications timeline; the event must be in your scope AND belong to this thread's site.

attach_snapshotboolean

Attach the event's alert-frame JPEG as MMS. REQUIRES event_id — there is no snapshot without an incident to take it from, and attach_snapshot without one is a 422 at the body level. 409 SNAPSHOT_UNAVAILABLE when the event has no snapshot (no clip key, a clip key that derives none, or the object is not readable in S3); nothing is written and nothing is sent in that case. Absent or false behaves exactly as before.

snapshot_offset_msinteger nullable

WHICH moment of the clip to attach, in milliseconds from the start of the event's clip, as picked by the operator and cut earlier by POST /events/{id}/snapshot-frame. Rounded to a tenth of a second. Only meaningful with attach_snapshot (422 at the body level otherwise). Absent, attach_snapshot sends the ingestor's alert-frame poster as before. 409 SNAPSHOT_UNAVAILABLE when no frame exists at that offset.

include_clip_linkboolean

Append a login-free, expiring link to this event's clip. The URL is added by the SERVER to the end of the body; reserve share_link_reserved_chars (GET /telephony/config) characters for it. REQUIRES event_id — a clip link with no incident behind it is a 422.

Example request

{
  "body": "We have an operator reviewing the camera now.",
  "event_id": "8f14e45f-ceea-467a-9f0b-2b0a1cbd7a71",
  "snapshot_offset_ms": 7300
}

Response

Successful Response

idstring required

The message id. Also the cid echoed back by the provider.

conversation_idstring required

The thread it belongs to.

direction'outbound' | 'inbound' required

Who sent it.

bodystring required

The message text.

statusstring required

Same vocabulary and the same monotonic rank as the incident timeline's SMS rows.

error_codestring nullable

Provider failure reason, bounded at 255 characters.

event_metadata_idstring nullable

The incident this message was about, if any. Cleared rather than cascaded if that event is deleted.

notification_log_idstring nullable

The mirror row on that incident's timeline. Null for a thread-only message.

operator_idstring nullable

Who sent it. Null on inbound.

operator_namestring nullable

Snapshot of their name.

occurred_atstring date-time required

Provider timestamp inbound, send time outbound. The thread's sort key.

created_atstring date-time nullable

When we wrote the row.

Example response

{
  "status": "delivered",
  "attachments": [
    {
      "kind": "snapshot",
      "content_type": "image/jpeg",
      "offset_ms": 7300
    }
  ]
}

Changes

No recorded changes to this operation across all 2 revisions of this API.