People
Accounts, students, guardians, staff and the invitations that mint them.
47 endpoints
bearer driver_app beneficiary_app pass_app pass_web device credential
Response Returns { "data": [Account ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — first_namestring optional — middle_namestring | null optional — last_namestring | null optional — phonestring | null optional — emailstring | null optional — genderstring | null optional — kyc_statusstring | null optional — statusstring optional — external_refstring | null optional — created_atstring (date-time) optional — walletsWalletSummary []optional — updated_atstring (date-time) required — deletedboolean required —
bearer driver_app beneficiary_app pass_app pass_web device credential
Path parameters Response Returns { "data": AccountDetail }.
Field Type Constraints idstring (uuid) required — first_namestring required — middle_namestring | null required — last_namestring | null required — phonestring | null required — kyc_statusstring | null required — statusstring required — external_refstring | null required — studentsobject[] required — walletsobject[] required —
bearer driver_app beneficiary_app people.create device credential
Request body Field Type Constraints first_namestring required max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 phonestring | null optional max length 20 emailstring | null optional max length 254 genderstring | null optional male female unspecifiednational_idstring | null optional max length 32 external_refstring | null optional max length 64 wallet_type_idstring | null optional —
Response Returns { "data": AccountDetail }.
Field Type Constraints idstring (uuid) required — first_namestring required — middle_namestring | null required — last_namestring | null required — phonestring | null required — kyc_statusstring | null required — statusstring required — external_refstring | null required — studentsobject[] required — walletsobject[] required —
POST
/v3/app/account/{id}/student
#
bearer driver_app beneficiary_app people.create device credential
Path parameters Request body Field Type Constraints first_namestring required max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 genderstring | null optional male female unspecifieddobstring | null optional — gradestring | null optional max length 32 relationstring | null optional max length 32 external_refstring | null optional max length 64 wallet_type_idstring | null optional —
Response Returns { "data": StudentWrite }.
Field Type Constraints idstring (uuid) required — first_namestring required — last_namestring | null required — gradestring | null required — statusstring required —
bearer driver_app beneficiary_app parent_app device credential
Response Returns { "data": [Student ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — first_namestring optional — middle_namestring | null optional — last_namestring | null optional — genderstring | null optional — dobstring | null optional — gradestring | null optional — statusstring optional — external_refstring | null optional — alert_notestring | null optional — account_idstring | null optional — photoany optional — created_atstring (date-time) optional — tagsobject[] optional — guardiansGuardian []optional — dropoffany optional — updated_atstring (date-time) required — deletedboolean required —
bearer driver_app beneficiary_app device credential
Response Returns { "data": [Tag ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — namestring required — entitystring | null required — color_hexstring | null required —
POST
/v3/auth/invite/accept
#
public 10,1
token + a password → an account.
Answers ONE way for a wrong token, a used one and an expired one. Telling them apart would confirm which tokens ever existed, and this endpoint is unauthenticated by necessity.
Hands back NO session, exactly like the password reset: holding an invite link proves somebody forwarded you a message, not who you are. They sign in with the password they just chose, which proves both.
Request body Field Type Constraints tokenstring required min length 48 · max length 48 passwordstring required min length 10 · max length 255
Response Returns { "data": StaffInviteAccepted }.
Field Type Constraints acceptedboolean required — emailstring | null required — phonestring | null required —
bearer driver_app beneficiary_app admin_web device credential
Query parameters Name Type Constraints statusstring | null optional active suspended archived
Response Returns { "data": [Group ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — namestring required — is_defaultboolean required — statusstring required — member_countinteger required —
bearer pass_web device credential
GET invite — who has been asked and not yet arrived.
Response Returns { "data": [StaffInvite ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — namestring required — emailstring | null required — phonestring | null required — role_namestring | null required — staff_kindstring | null required — invited_by_namestring | null required — expires_atstring required — created_atstring required —
bearer pass_web staff.manage device credential
POST invite — ask somebody to join.
The response carries the token ONCE. It is stored hashed and can never be read again, so a console that loses it re-invites rather than recovering it — the same bargain a password makes, for the same reason: this string is a way into the tenant.
Request body Field Type Constraints first_namestring required max length 80 last_namestring | null optional max length 80 emailstring | null optional max length 160 phonestring | null optional — tenant_role_idstring | null optional — staff_kindstring | null optional max length 40
Response Returns { "data": StaffInviteMinted }.
Field Type Constraints idstring (uuid) required — tokenstring required — expires_atstring required —
DELETE
/v3/pass/invite/{id}
#
bearer pass_web staff.manage device credential
withdraw one that has not been accepted.
Path parameters Response Returns { "data": Deleted }.
Field Type Constraints deletedboolean required —
POST
/v3/portal/guardian
#
bearer admin_web people.create device credential
POST guardian — create a guardian with no student attached yet.
The console's admin directory adds a parent BEFORE any learner is linked to them (learners are attached afterwards from the child's profile). Until now the only way a guardian account came into being was [link] — via a student — so the directory's "Add parent" had nowhere to post and was aimed at the STAFF endpoint with staff_kind: "guardian", which the StaffKind enum rightly refused.
Identity is the phone, exactly as in [link]: adding a parent who is already on this tenant returns the existing account rather than minting a second one, so a retry or a double-submit cannot split one family across two records.
Request body Field Type Constraints first_namestring required max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 emailstring | null optional max length 254 phonestring required max length 20 school_idstring | null optional —
Response Returns { "data": GuardianCreated }.
Field Type Constraints account_idstring (uuid) required — already_existedboolean required —
PATCH
/v3/portal/guardian/{id}
#
bearer admin_web people.update device credential
contact AND notification edits on a guardian (§1 mask).
The mask spans TWO tables, which is the whole difficulty. Contact fields are the account's own columns; the notification switches are users columns (0062) and accounts has none of them, so they are written one hop away through accounts.user_id. The console holds an account id for a parent — it sent that id to the staff endpoint before, which resolves a users row and rightly answered "User not found".
Path parameters Request body Field Type Constraints update_maskstring[] required min items 1 · max items 9 expected_row_versioninteger required min 1 first_namestring | null optional max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 phonestring | null optional max length 20 emailstring | null optional max length 254 receive_notificationsboolean optional — receive_email_notificationsboolean optional — receive_sms_notificationsboolean optional — receive_whatsapp_notificationsboolean optional —
Response Returns { "data": WebUserDetail }.
Field Type Constraints idstring (uuid) required — kindstring optional — first_namestring required — middle_namestring | null optional — last_namestring | null optional — emailstring | null optional — phonestring | null optional — staff_kindstring | null optional — tenant_role_idstring | null optional — statusstring required — school_idstring | null optional — school_namestring | null optional — report_subscriptionsstring[] optional — receive_notificationsboolean optional — receive_email_notificationsboolean optional — receive_sms_notificationsboolean optional — receive_whatsapp_notificationsboolean optional — zonesobject[] optional — has_loginboolean optional — students_countinteger optional — subscriptionany optional — last_login_atstring | null optional — created_atstring (date-time) optional — row_versioninteger required — studentsobject[] optional —
bearer admin_web people.import device credential
Request body Field Type Constraints kindstring required students staffrowsobject[] required min items 1 · max items 500
Response Returns { "data": [ImportOutcome ] } with meta.next_cursor for the next page.
Field Type Constraints rowinteger required — okboolean required — idstring (uuid) optional — codestring optional —
POST
/v3/portal/metadata-field
#
bearer admin_web settings.manage device credential
Request body Field Type Constraints entitystring required student accountnamestring required max length 120 descriptionstring | null optional max length 255
Response Returns { "data": Written }.
Field Type Constraints idstring (uuid) required —
bearer admin_web roles.manage device credential
Request body Field Type Constraints namestring required max length 80 capabilitiesstring[] required min items 1
Response Returns { "data": WebRole }.
Field Type Constraints idstring (uuid) required — namestring required — capabilitiesCapability []required — created_atstring | null required —
DELETE
/v3/portal/role/{id}
#
bearer admin_web roles.manage device credential
Path parameters Response Returns { "data": Ack }.
Field Type Constraints okboolean required —
PATCH
/v3/portal/role/{id}
#
bearer admin_web roles.manage device credential
Path parameters Request body Field Type Constraints namestring required max length 80 capabilitiesstring[] required min items 1
Response Returns { "data": WebRole }.
Field Type Constraints idstring (uuid) required — namestring required — capabilitiesCapability []required — created_atstring | null required —
bearer admin_web device credential
Query parameters Name Type Constraints qstring | null optional max length 100 gradestring | null optional max length 20 route_idstring | null optional — schoolstring | null optional — tag_idstring | null optional — cursorstring | null optional max length 200 per_pageinteger | null optional min 1 · max 500
Response Returns { "data": [WebStudent ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — first_namestring required — middle_namestring | null required — last_namestring | null required — genderstring | null required — dobstring | null required — gradestring | null required — statusstring required — external_refstring | null required — photoany required — row_versioninteger required — school_idstring | null required — school_namestring | null required — guardiansGuardian []required — bandany required — routeany required — todayobject required — today. checked_inboolean required — today. checked_in_atstring | null required —
POST
/v3/portal/student
#
bearer admin_web people.create device credential
Request body Field Type Constraints first_namestring required max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 genderstring | null optional male female unspecifieddobstring | null optional — gradestring | null optional max length 32 external_refstring | null optional max length 64 metadataarray | null optional max items 20 parent_idstring | null optional — schoolstring | null optional —
Response Returns { "data": WebStudentDetail }.
Field Type Constraints idstring (uuid) required — first_namestring required — middle_namestring | null required — last_namestring | null required — genderstring | null required — dobstring | null required — gradestring | null required — statusstring required — external_refstring | null required — photoany required — row_versioninteger required — school_idstring | null required — school_namestring | null required — guardiansGuardian []required — bandany required — routeany required — todayobject required — today. checked_inboolean required — today. checked_in_atstring | null required — metadataobject required — tagsobject[] required — walletany required — band_historyobject[] required — trip_plansobject[] required — home_locationany required — recent_timelineTimelineEntry []required —
DELETE
/v3/portal/student/{id}
#
bearer admin_web people.delete device credential
Path parameters Response Returns { "data": Ack }.
Field Type Constraints okboolean required —
GET
/v3/portal/student/{id}
#
bearer admin_web device credential
Path parameters Response Returns { "data": WebStudentDetail }.
Field Type Constraints idstring (uuid) required — first_namestring required — middle_namestring | null required — last_namestring | null required — genderstring | null required — dobstring | null required — gradestring | null required — statusstring required — external_refstring | null required — photoany required — row_versioninteger required — school_idstring | null required — school_namestring | null required — guardiansGuardian []required — bandany required — routeany required — todayobject required — today. checked_inboolean required — today. checked_in_atstring | null required — metadataobject required — tagsobject[] required — walletany required — band_historyobject[] required — trip_plansobject[] required — home_locationany required — recent_timelineTimelineEntry []required —
PATCH
/v3/portal/student/{id}
#
bearer admin_web people.update device credential
Path parameters Request body Field Type Constraints update_maskstring[] required min items 1 · max items 9 expected_row_versioninteger required min 1 first_namestring | null optional max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 genderstring | null optional male female unspecifieddobstring | null optional — gradestring | null optional max length 32 statusstring | null optional active suspended archivedexternal_refstring | null optional max length 64 metadataarray | null optional max items 20
Response Returns { "data": WebStudentDetail }.
Field Type Constraints idstring (uuid) required — first_namestring required — middle_namestring | null required — last_namestring | null required — genderstring | null required — dobstring | null required — gradestring | null required — statusstring required — external_refstring | null required — photoany required — row_versioninteger required — school_idstring | null required — school_namestring | null required — guardiansGuardian []required — bandany required — routeany required — todayobject required — today. checked_inboolean required — today. checked_in_atstring | null required — metadataobject required — tagsobject[] required — walletany required — band_historyobject[] required — trip_plansobject[] required — home_locationany required — recent_timelineTimelineEntry []required —
POST
/v3/portal/student/{id}/guardian
#
bearer admin_web people.update device credential
link (creating the account if the phone is new).
Path parameters Request body Field Type Constraints phonestring required max length 20 namestring | null optional max length 200 relationstring | null optional max length 40 is_primaryboolean | null optional —
Response Returns { "data": GuardianLinked }.
Field Type Constraints account_idstring (uuid) required — namestring required — already_linkedboolean required —
DELETE
/v3/portal/student/{id}/guardian/{accountId}
#
bearer admin_web people.update device credential
tombstone the edge, keep the person.
Path parameters Name Type Notes idstring accountIdstring
Response Returns { "data": Deleted }.
Field Type Constraints deletedboolean required —
GET
/v3/portal/student/{id}/home-location
#
bearer admin_web device credential
the pins, default first.
Path parameters Response Returns { "data": [HomeLocation ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — labelstring | null optional — latnumber | null optional — lngnumber | null optional — is_defaultboolean required —
POST
/v3/portal/student/{id}/home-location
#
bearer admin_web people.update device credential
add a pin.
Path parameters Request body Field Type Constraints labelstring | null optional max length 120 latnumber required min -90 · max 90 lngnumber required min -180 · max 180 is_defaultboolean | null optional —
Response Returns { "data": HomeLocation }.
Field Type Constraints idstring (uuid) required — labelstring | null optional — latnumber | null optional — lngnumber | null optional — is_defaultboolean required —
DELETE
/v3/portal/student/{id}/home-location/{hid}
#
bearer admin_web people.update device credential
remove a pin.
Path parameters Name Type Notes idstring hidstring
Response Returns { "data": Deleted }.
Field Type Constraints deletedboolean required —
PATCH
/v3/portal/student/{id}/home-location/{hid}
#
bearer admin_web people.update device credential
edit label/coords.
Path parameters Name Type Notes idstring hidstring
Request body Field Type Constraints labelstring | null optional max length 120 latnumber optional min -90 · max 90 lngnumber optional min -180 · max 180
Response Returns { "data": HomeLocation }.
Field Type Constraints idstring (uuid) required — labelstring | null optional — latnumber | null optional — lngnumber | null optional — is_defaultboolean required —
PUT
/v3/portal/student/{id}/home-location/{hid}/default
#
bearer admin_web people.update device credential
make this the default pin.
Path parameters Name Type Notes idstring hidstring
Response Returns { "data": HomeLocation }.
Field Type Constraints idstring (uuid) required — labelstring | null optional — latnumber | null optional — lngnumber | null optional — is_defaultboolean required —
bearer admin_web staff.manage device credential
Request body Field Type Constraints first_namestring required max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 emailstring | null optional max length 254 phonestring required max length 20 staff_kindstring required admin zone_manager teacher driver assistant gate_agent support operator +2 more
Response Returns { "data": WebUserDetail }.
Field Type Constraints idstring (uuid) required — kindstring optional — first_namestring required — middle_namestring | null optional — last_namestring | null optional — emailstring | null optional — phonestring | null optional — staff_kindstring | null optional — tenant_role_idstring | null optional — statusstring required — school_idstring | null optional — school_namestring | null optional — report_subscriptionsstring[] optional — receive_notificationsboolean optional — receive_email_notificationsboolean optional — receive_sms_notificationsboolean optional — receive_whatsapp_notificationsboolean optional — zonesobject[] optional — has_loginboolean optional — students_countinteger optional — subscriptionany optional — last_login_atstring | null optional — created_atstring (date-time) optional — row_versioninteger required — studentsobject[] optional —
DELETE
/v3/portal/user/{id}
#
bearer admin_web staff.manage device credential
Path parameters Response Returns { "data": Ack }.
Field Type Constraints okboolean required —
PATCH
/v3/portal/user/{id}
#
bearer admin_web staff.manage device credential
Path parameters Request body Field Type Constraints update_maskstring[] required min items 1 · max items 13 expected_row_versioninteger required min 1 first_namestring | null optional max length 100 middle_namestring | null optional max length 100 last_namestring | null optional max length 100 emailstring | null optional max length 254 phonestring | null optional max length 20 staff_kindstring | null optional admin zone_manager teacher driver assistant gate_agent support operator +2 more statusstring | null optional active suspended archivedtenant_role_idstring | null optional — report_subscriptionsstring[] optional max items 20 receive_notificationsboolean | null optional — receive_email_notificationsboolean | null optional — receive_sms_notificationsboolean | null optional — receive_whatsapp_notificationsboolean | null optional —
Response Returns { "data": WebUserDetail }.
Field Type Constraints idstring (uuid) required — kindstring optional — first_namestring required — middle_namestring | null optional — last_namestring | null optional — emailstring | null optional — phonestring | null optional — staff_kindstring | null optional — tenant_role_idstring | null optional — statusstring required — school_idstring | null optional — school_namestring | null optional — report_subscriptionsstring[] optional — receive_notificationsboolean optional — receive_email_notificationsboolean optional — receive_sms_notificationsboolean optional — receive_whatsapp_notificationsboolean optional — zonesobject[] optional — has_loginboolean optional — students_countinteger optional — subscriptionany optional — last_login_atstring | null optional — created_atstring (date-time) optional — row_versioninteger required — studentsobject[] optional —
POST
/v3/portal/user/{id}/resend-welcome-email
#
bearer admin_web staff.manage device credential
the invitation again, for the colleague whose first copy never landed. Nothing about the account changes; somebody who already has a password wants reset-password, and is told so rather than sent an email describing an account they no longer have.
Path parameters Response Returns { "data": Ack }.
Field Type Constraints okboolean required —
POST
/v3/portal/user/{id}/reset-password
#
bearer admin_web staff.manage device credential
the §12.5 posture: the hash NULLs and the next login forces a set (credentials are never emailed around); every session the user held is revoked in the same call.
Path parameters Response Returns { "data": PasswordReset }.
Field Type Constraints must_set_passwordboolean required —
PUT
/v3/portal/user/{id}/zones
#
bearer admin_web staff.manage device credential
Path parameters Request body Field Type Constraints zone_idsstring (uuid) [] required max items 50
Response Returns { "data": ZoneAssignment }.
Field Type Constraints zone_idsstring (uuid) [] required —
bearer pass_web admin_web device credential
Response Returns { "data": [WebRole ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — namestring required — capabilitiesCapability []required — created_atstring | null required —
bearer pass_web admin_web roles.manage device credential
Request body Field Type Constraints namestring required max length 80 capabilitiesstring[] required min items 1
Response Returns { "data": WebRole }.
Field Type Constraints idstring (uuid) required — namestring required — capabilitiesCapability []required — created_atstring | null required —
bearer pass_web admin_web roles.manage device credential
Path parameters Response Returns { "data": Ack }.
Field Type Constraints okboolean required —
bearer pass_web admin_web roles.manage device credential
Path parameters Request body Field Type Constraints namestring required max length 80 capabilitiesstring[] required min items 1
Response Returns { "data": WebRole }.
Field Type Constraints idstring (uuid) required — namestring required — capabilitiesCapability []required — created_atstring | null required —
GET
/v3/student/{id}/timeline
#
bearer parent_app admin_web device credential
Path parameters Query parameters Name Type Constraints kindstring | null optional tap trip transactioncursorstring | null optional max length 200 per_pageinteger | null optional min 1 · max 500
Response Returns { "data": [TimelineEntry ] } with meta.next_cursor for the next page.
Field Type Constraints kindstring required tap trip_boarded trip_dropped transactionatstring required — detailTimelineDetail required —
bearer pass_web admin_web device credential
Query parameters Name Type Constraints kindstring | null optional staff guardianqstring | null optional max length 100 cursorstring | null optional max length 200 per_pageinteger | null optional min 1 · max 500
Response Returns { "data": [WebUser ] } with meta.next_cursor for the next page.
Field Type Constraints idstring (uuid) required — kindstring optional — first_namestring required — middle_namestring | null optional — last_namestring | null optional — emailstring | null optional — phonestring | null optional — staff_kindstring | null optional — tenant_role_idstring | null optional — statusstring required — school_idstring | null optional — school_namestring | null optional — report_subscriptionsstring[] optional — receive_notificationsboolean optional — receive_email_notificationsboolean optional — receive_sms_notificationsboolean optional — receive_whatsapp_notificationsboolean optional — zonesobject[] optional — has_loginboolean optional — students_countinteger optional — subscriptionany optional — last_login_atstring | null optional — created_atstring (date-time) optional — row_versioninteger required —
bearer pass_web admin_web device credential
Path parameters Response Returns { "data": WebUserDetail }.
Field Type Constraints idstring (uuid) required — kindstring optional — first_namestring required — middle_namestring | null optional — last_namestring | null optional — emailstring | null optional — phonestring | null optional — staff_kindstring | null optional — tenant_role_idstring | null optional — statusstring required — school_idstring | null optional — school_namestring | null optional — report_subscriptionsstring[] optional — receive_notificationsboolean optional — receive_email_notificationsboolean optional — receive_sms_notificationsboolean optional — receive_whatsapp_notificationsboolean optional — zonesobject[] optional — has_loginboolean optional — students_countinteger optional — subscriptionany optional — last_login_atstring | null optional — created_atstring (date-time) optional — row_versioninteger required — studentsobject[] optional —
POST
/v3/user/{id}/reset-password
#
bearer pass_web admin_web staff.manage device credential
the §12.5 posture: the hash NULLs and the next login forces a set (credentials are never emailed around); every session the user held is revoked in the same call.
Path parameters Response Returns { "data": PasswordReset }.
Field Type Constraints must_set_passwordboolean required —