---
title: "Submit Consent"
method: POST
path: "/sms-opt-in/consent"
tags: ["sms-opt-in"]
---

# Submit Consent

`POST /sms-opt-in/consent`

## 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/sms-opt-in/consent`
- Auth: none declared

Record an individual's affirmative SMS opt-in consent.

THE ROW IS THE RECORD NOW, not the email. This used to only email a
proof-of-consent artifact to support@ — consent existed solely in an inbox,
queryable by nobody. It now persists an `sms_consent` row as
`pending_review` (a web submission is NOT bound to a site contact and
authorizes nothing until an owner reviews and links it), commits, answers,
and only then emails.

NO-FAIL-AFTER-PERSIST, AND IT IS A DELIBERATE BEHAVIOR CHANGE: the email is
best-effort AFTER the commit, so an SES outage no longer 502s a submission
whose consent we have already durably recorded. Telling someone their
opt-in failed when it did not is worse than a missing notification email.

ALSO A BEHAVIOR CHANGE: numbers are canonicalized with the shared US-only
`to_e164`, so a non-NANP number is now a 422 instead of a stored record we
could never text. Both changes affect the live verdun.ai form.

`consent_version` is optional for exactly as long as verdun.ai does not
send it: missing means `legacy_web_v1` (the live copy), while a version we
do not recognize is a 422 — a key we cannot resolve to words looks like
evidence and isn't.

The response body is ALWAYS the same generic `{"status": "ok"}`. It never
echoes the row: an unauthenticated endpoint that reflected stored consent
details back would be an oracle for whether a number has opted in.

## Request body `application/x-www-form-urlencoded`

- BodySubmitConsentSmsOptInConsentPost
  - `full_name` string, required
  - `phone` string, required
  - `consent` string, required
  - `email` string, nullable
  - `organization` string, nullable
  - `company` string, nullable
  - `consent_version` string, nullable
  - `idempotency_key` string, nullable

## Response `200`

Successful Response

- unknown

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