Set the dependent
Who the seat observes: name, birth date, relationship to the caller, phone (to be paired) and document (keys the relationship check). Re-run to correct. A change while the consent link is open withdraws it (send a new one); once the dependent said yes the details are locked (422 DEPENDENT_LOCKED). Resubmitting the same details changes nothing.
BearerAuthorizationBearer <JWT>uid*stringseat uid
uuidapplication/json- body
kind?stringminor = child under 18; adult = grown person under care
"minor""minor""adult"name*stringhow the guardian calls the dependent
1 <= length <= 120birthDate*stringYYYY-MM-DD
daterelationship*stringhow the guardian filling this in relates to the dependent: parent means the dependent is their parent
"child""grandchild""niece_nephew""sibling""parent""grandparent""aunt_uncle""spouse""parent_in_law""child_in_law""other"phone*stringE.164 — the WhatsApp that will be paired and where the consent link is sent
^\+[1-9]\d{6,14}$document*required: the relationship check keys on it; cpf is check-digit validated
The seat with its dependent
application/json- response
success*truetruedata*curl -X PUT 'http://localhost:3000/seats/497f6eca-6276-4993-bfeb-53cbbbba6f08/dependent' \ -H 'Content-Type: application/json' \ -d '{ "name": "string", "birthDate": "2019-08-24", "relationship": "child", "phone": "string", "document": { "type": "cpf", "number": "string" }}'{ "success": true, "data": { "uid": "string", "status": "pending", "price": { "uid": "string", "amountCents": 0, "currency": "string", "interval": "month", "campaignCode": "string" }, "dependent": { "kind": "minor", "name": "string", "birthDate": "2019-08-24", "relationship": "child", "phone": "string", "document": { "type": "cpf", "number": "string" } }, "attested": true, "consent": { "status": "pending", "requestedAt": "2019-08-24T14:15:22Z", "givenAt": "2019-08-24T14:15:22Z", "expiresAt": "2019-08-24T14:15:22Z", "sentAt": "2019-08-24T14:15:22Z", "deliveredAt": "2019-08-24T14:15:22Z", "openedAt": "2019-08-24T14:15:22Z", "declinedAt": "2019-08-24T14:15:22Z", "resendAvailableAt": "2019-08-24T14:15:22Z", "revokedAt": "2019-08-24T14:15:22Z", "revokedBy": "guardian", "deliveryChannel": "whatsapp", "link": "string", "needsRenewal": true }, "backgroundCheck": { "status": "pending" }, "pause": { "cause": "guardian", "since": "2019-08-24T14:15:22Z", "until": "2019-08-24T14:15:22Z", "byName": "string", "reason": "string" }, "activatedAt": "2019-08-24T14:15:22Z", "activationRequiresConsent": true, "trial": { "state": "not_started", "startsOn": "first_connection", "days": 0, "startedAt": "2019-08-24T14:15:22Z", "endsAt": "2019-08-24T14:15:22Z", "label": "string" }, "createdAt": "2019-08-24T14:15:22Z" }}Person page GET
One protected person: the same card as Início plus since when, the consent, the WhatsApp link, the pause, who receives the alerts and this person's week.
Activate the seat POST
The step after the dependent's "sim" (D2): records the guardian's attestation, opens the subscription if the account has none and activates the seat. On a seat with `activationRequiresConsent` (every seat created since 2026-10-19) it answers 422 CONSENT_REQUIRED until the consent is given — the link goes out earlier, through POST /seats/{uid}/consent-request. An older seat keeps the old order: activation first, then the consent link and the relationship check. The free week does not start here: it starts at the first WhatsApp connection (`trial.state` stays `not_started`). Each missing gate answers 422 with its own code.
