---
title: "Log Attempt"
method: POST
path: "/events/{event_id}/log-attempt"
tags: ["telephony"]
---

# Log Attempt

`POST /events/{event_id}/log-attempt`

## 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}/log-attempt`
- Auth: HTTP bearer

Record an owner-contact attempt the operator made OFF-SYSTEM.

SAME DEPENDENCY OBJECT as `/notify-owner`, `/call-owner` and `/email-owner`
— not a re-derived `require_permission(...)` call — so the four
owner-contact actions on this event cannot drift apart in what they allow.

NOTHING IS SENT. This writes one `notification_log` row with
`provider_sid NULL` and `entered_manually=true`, and it is deliberately
NOT gated on consent or on telephony configuration; `log_attempt`'s
docstring carries the argument. It is a WRITE, so it gets no
`READ_ONLY_WRITE_ALLOWLIST` entry — read-only operators must not reach it.

## Path parameters

- `event_id` string, required

## Request body

- LogAttemptRequest: Record an owner-contact attempt an operator made OFF-SYSTEM. NOTHING IS SENT BY THIS REQUEST. It records that a human already made contact from a desk phone or a personal handset — which is why the service applies neither the consent gates nor the telephony-config gate that its siblings `/notify-owner` and `/call-owner` do. See `log_attempt` for the argument; it is a deliberate divergence, not an oversight. FIELD NAME AND ERROR CODES FOLLOW THE SIBLINGS, not the brief's first draft (round-0 ruling OQ-4). `NotifyOwnerRequest` and `CallOwnerRequest` both take `contact_id`, and both treat a contact from another site as a 403 — `dispatch_service._resolve_owner_contact`'s docstring says in as many words that the sibling actions must not diverge. A third action on the same object behaving differently is the drift, not the fix.
  - `contact_id` string, required: Site contact that was contacted; must belong to the event's site
  - `channel` 'call' | 'text', required: How the operator reached out. E-mail is not offered: the console's own Email tab is the only path that produces one.
  - `result` 'answered' | 'voicemail' | 'no_answer' | 'busy' | 'wrong_number' | 'delivered' | 'not_delivered' | 'failed', required: What happened. Call results: answered, voicemail, no_answer, busy, wrong_number. Text results: delivered, not_delivered, failed.
  - `at` string, date-time, nullable: When the attempt happened. Defaults to now; clamped server-side to [event.created_at, now] — an attempt cannot predate the event it is about, and cannot be in the future.

## 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)
