---
title: "Notify Owner"
method: POST
path: "/events/{event_id}/notify-owner"
tags: ["telephony"]
---

# Notify Owner

`POST /events/{event_id}/notify-owner`

## 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/events/{event_id}/notify-owner`
- Auth: HTTP bearer

Text the site's property contact about this event.

LINKS ARE PERMITTED in the body (the 10DLC campaign declares them and
link shortening is disabled per message), and `attach_snapshot` sends the
event's alert-frame JPEG as MMS — 409 SNAPSHOT_UNAVAILABLE when the event
has none, with nothing written and nothing sent.

RESPONSE SHAPE (this route is `response_model=dict`, a legacy escape
hatch, so the shape lives here rather than in a typed model): the
`notification_log` row as `to_dict_frontend()` renders it, PLUS
`attachments` — `null`, or a list of `{kind, url, content_type}` where
`url` is a presigned GET valid 3600s and minted for this read. `kind` is
an open string ("snapshot" today). `null`, never `[]`, when nothing was
attached, and the S3 key behind each record is never exposed.

## Path parameters

- `event_id` string, required

## Request body

- NotifyOwnerRequest
  - `contact_id` string, required: Site contact to notify; must belong to the event's site
  - `message` string, required: Message body. AI-drafted client-side; the operator owns the final text. Links are permitted — the 10DLC campaign declares them and link shortening is disabled per message, so a URL goes out exactly as typed.
  - `number` 'primary' | 'afterhours': Which of the contact's phone numbers on file to text
  - `attach_snapshot` boolean: Attach the event's alert-frame JPEG as MMS. 409 SNAPSHOT_UNAVAILABLE when this 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_ms` integer, 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_link` boolean: 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. 503 when clip links are not configured on this deployment, 409 when the event has no clip.

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verdun/apis/verdun-api.md) - [All operations](https://skmtc.dev/verdun/apis/verdun-api/llms.txt) - [OpenAPI document](https://skmtc.dev/verdun/apis/verdun-api/revisions/35a2a6ebedda?raw)
