A valid request URL is required to generate request examples{
"success": true,
"data": {
"phoneNumber": "+14155551234",
"consent": "express",
"consentRecordId": "3d6f9a1c-2b4e-4f80-9c1d-5e6f7a8b9c0d",
"source": "web_form",
"capturedAt": "2026-09-20T14:03:00.000Z",
"recordedAt": "2026-09-24T16:12:45.000Z",
"optedOut": false
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Record a contact's express SMS consent captured outside a text
Record that a person gave your business EXPRESS consent to receive text messages somewhere other than a text — a booking or web form, at the point of sale, verbally, on paper, or in an import from your own system — so that sendSMSMessage (POST /sms/messages) can text them. WHY IT EXISTS. Texting a person first requires a recorded consent basis. The platform records one automatically in two cases: conversational when the person texts one of your numbers first, and express when they agree during a call or chat with your agent. Consent your business collected anywhere else is invisible to the platform until you record it here. WHAT IT WRITES. One append-only consent-ledger record (the evidence: when, how, the disclosure the person agreed to, and an optional link to your own proof), the contact’s consent tier set to express (visible on listSMSContacts and in the consent export), and a compliance-trail entry naming the API key or user that attested it. The ledger stores the capture method as api:<source> (e.g. api:web_form), so the record shows it was attested through the API — that is the consentSource listSMSContacts and the export report; this response’s source is the bare method you sent. Recording consent never lowers a contact’s tier and is safe to repeat — each call appends one more ledger record. basis must be express. conversational cannot be asserted: it is stamped by the platform only when the person actually texts you. YOU ARE ATTESTING. The record states that your business holds this consent, and it appears in the consent export (exportSMSContacts) as part of your proof. Keep the underlying evidence yourself — evidenceUrl and reference should point at it. OPT-OUTS STILL WIN. If the person replied STOP, recording consent does NOT re-enable them — the response is still 200 with optedOut: true, and sends stay refused 409 sms_suppressed until they text START or you re-enable them with DELETE /sms/suppressions/ (which requires fresh, documented consent).
A valid request URL is required to generate request examples{
"success": true,
"data": {
"phoneNumber": "+14155551234",
"consent": "express",
"consentRecordId": "3d6f9a1c-2b4e-4f80-9c1d-5e6f7a8b9c0d",
"source": "web_form",
"capturedAt": "2026-09-20T14:03:00.000Z",
"recordedAt": "2026-09-24T16:12:45.000Z",
"optedOut": false
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Authorizations
Flowyte secret API key (Authorization: Bearer flowyte_sk_live_…). Scope-gated; is scoped to your organization — a key can never reach another tenant. The listed scopes in each operation's apiKey requirement are the scopes that key must hold. The tokenUrl is nominal: keys are minted in the dashboard.
Path Parameters
The contact's number in E.164 format (e.g. +14155551234).
Body
Evidence of express consent your business captured outside a text message.
The consent basis being recorded. Only express can be asserted — conversational is recorded by the platform when the person texts you first.
express Where the person gave consent.
web_form, point_of_sale, verbal, paper, import, other When the person gave consent (RFC 3339). Defaults to now. Must not be in the future or more than four years ago.
The exact wording the person agreed to. Strongly recommended — it is the core of your consent proof. When omitted, the record says exactly: "Express consent to receive text messages from the business, attested by the workspace through the API (capture method:
2000An https:// link to your own record of the consent (the signed form, the booking, the recording).
512Your own identifier for the consent event (a booking, order or form-submission id).
200