Revoke a person's access
const url = 'http://localhost:8000/api/clients/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/access/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/revoke/';const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:8000/api/clients/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/access/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/revoke/ \ --header 'Authorization: Bearer <token>'Ends a grant, invited or active; the link stops working and the person loses the card on their next request. The record stays, revoked. Revoking a revoked grant answers the same record.
A coach of the team, on a card of the active team. Every route answers 404 while client access is switched off on the environment. A partner API key and a client’s own account get 403. Open on every plan: a coach on a team whose plan no longer includes client access still sees who has it and can revoke it.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”One person with access to a card, as the coach sees it
(ClientAccessRecord).
object
The address the invite went to.
The person’s name once they accepted; empty until then.
invited · active · expired · revoked. expired is an invite whose 14-day link lapsed; the coach can resend it.
invited- Invitedactive- Activeexpired- Expiredrevoked- Revoked
The invite’s language. Later e-mails to this person use it too.
en- Englishru- Русскийes- Español
Who sent the invite, for the team’s coaches: the inviting coach’s name, else their e-mail address; once their account is gone, the name it left, else “A coach” in ?lang (English by default).
When the invite link lapses — set only while the status is invited.
When the last invite or sign-in e-mail left; null when none ever did.
Whether the e-mail reached the person (false: the transport refused it — the grant stands, resend it). On an invite or resend answer: this call’s e-mail, null when the call sent nothing on purpose (a second resend within a minute). On every other answer: the latest attempt’s, null when none was ever made.
Examples
{ "id": "0b9e4d21-7a3c-4f6e-8d15-3c2a9b7e6f58", "email": "olga.lebedeva@example.com", "display_name": "Olga Lebedeva", "relation": "guardian", "level": "contribute", "status": "revoked", "language": "ru", "invited_by_name": "Kim Larsen", "invited_at": "2026-10-06T09:00:00Z", "expires_at": null, "accepted_at": "2026-10-07T18:20:00Z", "revoked_at": "2026-10-10T09:00:00Z", "last_sent_at": "2026-10-06T09:00:00Z", "email_sent": true}object
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).
Example generated
{ "detail": "example"}object
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).
Examples
403 — a client's own account
The coach side is for a coach of the team; a client uses the portal.
{ "detail": "client_account"}object
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).
Examples
404 — no such grant on the card
{ "detail": "access_not_found"}