Skip to content

Consent again to a client card's terms

POST
/api/portal/{client_id}/consent/
curl --request POST \
--url http://localhost:8000/api/portal/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/consent/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "consent_version": "2026-10-29-draft", "confirm_adult": true }'

After the consent texts change, the portal asks again (403 consent_required); this records the new consent for the signed-in account’s access to the card. 201 for a new record, 200 when this version was already given. 404 unless the account holds active access to the card; 403 access_ended (reason: team_plan · minor) when that access no longer opens the card, as the portal answers; 409 consent_outdated for any version but the current one; 400 unless confirm_adult is true; 429 past the account’s rate (client_portal, 120/min). Answers 404 while client access is switched off on the environment.

client_id
required
string format: uuid

POST /api/portal/<client_id>/consent/ body.

object
confirm_adult
required

The person confirms they are 18 or over (or the age of majority where they live). Must be true.

boolean
consent_version
required
string
>= 1 characters <= 32 characters

Examples

ExampleTheCurrentVersion

The current version

{
"consent_version": "2026-10-29-draft",
"confirm_adult": true
}
Media typeapplication/json
object
consent_version
required
string
kinds
required
Array<string>
accepted_at
required
string format: date-time

Examples

ExampleRecorded
{
"consent_version": "2026-10-29-draft",
"kinds": [
"terms",
"privacy",
"processing",
"guardian_declaration"
],
"accepted_at": "2026-11-02T18:20:00Z"
}
Media typeapplication/json
object
consent_version
required
string
kinds
required
Array<string>
accepted_at
required
string format: date-time

Examples

ExampleRecorded
{
"consent_version": "2026-10-29-draft",
"kinds": [
"terms",
"privacy",
"processing",
"guardian_declaration"
],
"accepted_at": "2026-11-02T18:20:00Z"
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Example generated

{
"detail": "example"
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Example generated

{
"detail": "example"
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Example generated

{
"detail": "example"
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Examples

Example404—NoAccessToThisCard

404 — no access to this card

{
"detail": "access_not_found"
}
Media typeapplication/json
object
detail
required

409 — the request conflicts with current state. detail is a stable code (e.g. reanalyze_in_flight, already_on_plan, email_in_use). Some 409s carry extra context fields alongside detail; those are documented on the specific endpoint that emits them.

string

Examples

Example409—OldConsent

409 — old consent

{
"detail": "consent_outdated"
}
Media typeapplication/json
object
detail
required

429 — throttled: this account’s (or address’s) rate for the route is used up; try again after wait seconds, which Retry-After repeats. A route with a limit of its own answers its own code instead, documented there.

string
wait

With throttled: whole seconds until the next request can pass.

integer
nullable

Example generated

{
"detail": "example",
"wait": 1
}