Students
Students (children) transported by the platform. Covers student CRUD, guardian links, home addresses, Band/Bag Tags band assignment, the pickup-authorization OTP flow (generate / validate / confirm) used at handover, route-ordering rosters, trip check-points (pickup/drop-off), and assignment of a student to trip planner(s).
GET List {{url}}/dependants ▸
Retrieves a paginated list of students filtered by optional criteria such as tags, parent ID, or phone number. This endpoint is useful for applications that need to display or manage students associated with a parent entity (such as a user or account).
Parameters
- tags (
array[string], optional): List of tag UUIDs to filter students.
- parent_id (
string, optional): UUID of the parent entity to filter students.
- phone_number (
string, optional): Phone number to filter students.
- per_page (
integer, optional): Number of results per page. Default is 10.
- page (
integer, optional): Page number to retrieve. Default is 1.
Notes
- All filter parameters are optional; omitting them returns all students.
- Ensure the
tokenenvironment variable is set with a valid bearer token.
- The endpoint may return an empty array if no students match the filters.
{
"tags": ["d4b18b8f-eaa6-44e1-8655-d75f146c0933"], // filter by tag
// "parent_id": "cf7a3821-e6be-490f-85b9-6f7ca3585aad", // filter by parent id
// "phone_number": "+254733556677", // filter by phone number
"per_page": 10,
"page": 1
}{
"data": [
{
"id": "184c32e2-878d-4e89-99c3-91dda70c03e9",
"first_name": "Simon",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "a2fce066-519c-4cba-968d-18aa70446411",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "cf7a3821-e6be-490f-85b9-6f7ca3585aad",
"name": "Kevin Kariuki",
"email": "kevin.kariuki@example.com",
"phone": "+254733556677"
},
"guardians": [
{
"uuid": "d651190e-5e68-43e0-82db-9c53426311ab",
"name": "Peter Chege"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-05 15:51:29",
"addresses": [
{
"uuid": "93d41cd9-1b01-4bb3-95ce-56175ce7f493",
"is_primary": 1,
"latitude": "-1.2921",
"longitude": "36.8219"
}
],
"tags": [
{
"id": "d4b18b8f-eaa6-44e1-8655-d75f146c0933",
"name": "PM School Tag",
"description": "PM School Tag",
"entity": "universal",
"color_code": "#EA0D8D"
}
]
},
{
"id": "0b1475e9-f811-4683-8a90-a94468dc7ef1",
"first_name": "Junior",
"middle_name": null,
"last_name": "Pm",
"phone": "",
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2005-01-05 00:00:00",
"gender": "Female",
"third_party_id": "2b8effd8-0782-4e66-b93f-d0ba8c4464c9",
"is_active": 1,
"metadata": {
"grade": "8th Grade"
},
"parent": {
"uuid": "d23b811d-368c-44fd-a031-6663bed28fc0",
"name": "Pm Parent",
"email": "Parent@gmail.com",
"phone": "+254791472893"
},
"guardians": [
{
"uuid": "41e5db5b-2ab2-4d8a-a8e2-6fe3fdaca078",
"name": "Nanny Guardian"
},
{
"uuid": "4d95c454-67aa-47ce-80c3-973f0d3750cb",
"name": "Maggy Grants"
}
],
"image": null,
"notes": null,
"created_at": "2026-01-05 14:26:56",
"addresses": [],
"tags": [
{
"id": "d4b18b8f-eaa6-44e1-8655-d75f146c0933",
"name": "PM School Tag",
"description": "PM School Tag",
"entity": "universal",
"color_code": "#EA0D8D"
},
{
"id": "0655ca5b-1c6b-437d-b38a-7f4596fb038f",
"name": "Kiota School Rongai Route",
"description": "Kiota School Rongai Route for students",
"entity": "dependant",
"color_code": null
}
]
}
],
"links": {
"first": "http://127.0.0.1:8001/api/dependants?page=1",
"last": "http://127.0.0.1:8001/api/dependants?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://127.0.0.1:8001/api/dependants?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"path": "http://127.0.0.1:8001/api/dependants",
"per_page": 10,
"to": 2,
"total": 2
},
"status": 200,
"message": "Dependants Retrieved Successfully"
}
POST Add {{url}}/dependants/add ▸
This endpoint creates a new student record associated with a parent user.
Sample Fields
first_name(string): Student's first name.
middle_name(string): Student's middle name.
last_name(string): Student's last name.
dob(string): Date of birth (format:DD-MM-YYYY).
gender(string): Gender of the student. Allowed values:MALE,FEMALE,OTHER,N/A.
parent_id(string): Unique identifier of the parent user.
Response
The created student (data) — id (uuid), names, grade, parent, guardians, addresses.
{
"first_name" : "Simon",
"middle_name": "Kimani",
"last_name" : "Chege",
"dob":"06-11-2010",
"gender": "MALE", //only use: MALE, FEMALE, OTHER, N/A
"parent_id" : "cf7a3821-e6be-490f-85b9-6f7ca3585aad",
"metadata" : {
"grade" : "Grade 6" //only use: PP1, PP2, PLAYGROUP, GRADE_1 , GRADE_2, GRADE_3, GRADE_4, GRADE_5, GRADE_6, GRADE_7, GRADE_8, GRADE_9, GRADE_10, GRADE_11, GRADE_12, COLLEGE, N/A,
},
"tags" : ["cf7a3821-e6be-490f-85b9-6f7ca3585aad", "cf7a3821-e6be-490f-85b9-6f7ca3585aad"],
"search_term": "Malaika School Thika Road" //optional for the search term used by the parent to find the dependants institution
}{
"status": 200,
"data": {
"id": "184c32e2-878d-4e89-99c3-91dda70c03e9",
"first_name": "Simon",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "a2fce066-519c-4cba-968d-18aa70446411",
"is_active": true,
"metadata": {
"grade": null
},
"image": null,
"notes": null,
"created_at": "2025-12-05 12:51:29"
},
"message": "Dependant Created Successfully"
}
PUT Update {{url}}/dependants/update/30a250fe-0cbe-4afb-bb48-606e5d8f887f ▸
This endpoint updates the details of an existing student identified by their unique ID in the URL path.
Sample Body Fields:
first_name(string, required): Student's first name. Example: "Lincoln"
middle_name(string, optional): Student's middle name. Example: "Hungi"
last_name(string, required): Student's last name. Example: "Chege"
dob(string, required): Date of birth inDD-MM-YYYYformat. Example: "06-11-2010"
gender(string, required): Gender of the student. Allowed values:MALE,FEMALE,OTHER,N/A
parent_id(string, required): UUID of the parent.
metadata(object, optional): Additional information. Example:{ "grade": "Grade 6" }
Response
The updated student (data).
{
"first_name" : "Lincoln",
"middle_name": "Hungi",
"last_name" : "Chege",
"dob":"06-11-2010",
"gender": "MALE", //only use: MALE, FEMALE, OTHER, N/A
"parent_id" : "b3b62c15-1409-4713-81b2-d4f6744039e6",
"metadata" : {
"grade" : "Grade 6" //only use: PP1, PP2, PLAYGROUP, GRADE_1 , GRADE_2, GRADE_3, GRADE_4, GRADE_5, GRADE_6, GRADE_7, GRADE_8, GRADE_9, GRADE_10, GRADE_11, GRADE_12, COLLEGE, N/A,
},
"tags" : ["cf7a3821-e6be-490f-85b9-6f7ca3585aad", "cf7a3821-e6be-490f-85b9-6f7ca3585aad"],
"search_term": "Malaika School Thika Road" //optional for the search term used by the parent to find the dependants institution
}{
"status": 200,
"data": {
"id": "30a250fe-0cbe-4afb-bb48-606e5d8f887f",
"first_name": "Lincoln",
"middle_name": "Hungi",
"last_name": "Chege",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "6e09a88f-de47-455b-a1bd-dc83a6e8efc6",
"is_active": true,
"metadata": {
"grade": "Grade 6"
},
"image": null,
"notes": null,
"created_at": "2025-11-21 11:07:08"
},
"message": "Dependant Updated Successfully"
}
GET Show {{url}}/dependants/184c32e2-878d-4e89-99c3-91dda70c03e9 ▸
Retrieve a single student (child) by UUID with their full context, enriched from the registry.
Path Parameters
- id (
stringUUID, required): The student's UUID.
Response includes
- Local relationships: parent, guardians, and addresses.
- the registry enrichment: the student's live the registry record is fetched and merged in, providing route/zone/location tags and assigned Band/Bag Tags devices (mapped onto the response).
Notes
- Returns
404if no student matches the UUID. - If the registry is unreachable the local data is still returned; the the registry-derived tags/IOTs are simply omitted.
- Requires a bearer token (
auth:api).
{
"data": {
"id": "184c32e2-878d-4e89-99c3-91dda70c03e9",
"first_name": "Simon",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "a2fce066-519c-4cba-968d-18aa70446411",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "cf7a3821-e6be-490f-85b9-6f7ca3585aad",
"name": "Kevin Kariuki",
"email": "kevin.kariuki@example.com",
"phone": "+254733556677"
},
"guardians": [
{
"uuid": "d651190e-5e68-43e0-82db-9c53426311ab",
"name": "Peter Chege"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-05 15:51:29",
"addresses": [
{
"uuid": "93d41cd9-1b01-4bb3-95ce-56175ce7f493",
"is_primary": 1,
"latitude": "-1.2921",
"longitude": "36.8219"
},
{
"uuid": "da879dcb-b062-462e-b935-5c1b879e3c0d",
"is_primary": 1,
"latitude": "-1.2921",
"longitude": "36.8219"
}
]
},
"status": 200,
"message": "Dependant Retrieved Successfully"
}
POST SyncGuardians {{url}}/dependants/sync-guardians/184c32e2-878d-4e89-99c3-91dda70c03e9 ▸
Synchronizes the list of guardians for a specific student. This endpoint updates the guardians associated with a student by replacing the current list with the provided array of guardian UUIDs.
Response
The student's resulting linked guardians (data, array).
{
"guardians": ["d651190e-5e68-43e0-82db-9c53426311ab"] // List of guardian UUIDs
}{
"status": 200,
"data": [
{
"id": "d651190e-5e68-43e0-82db-9c53426311ab",
"first_name": "Peter",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": "+254722626879",
"email": null,
"identification_document": "national_id",
"identification_number": "36898912",
"dob": "2000-11-06 00:00:00",
"gender": "Male",
"third_party_id": null,
"is_active": true,
"metadata": null,
"image": null,
"notes": null,
"created_at": "2025-12-05 13:00:23"
}
],
"message": "guardians synced Successfully"
}
POST GenerateAuthOTP {{url}}/dependants/generate-authorization-otp/0b1475e9-f811-4683-8a90-a94468dc7ef1 ▸
Generates an authorization OTP (One-Time Password) for a student using the specified guardian ID.
Required Parameters:
- Path: dependant_id (UUID) – The unique identifier of the student for whom the OTP is being generated.
- Body (JSON): guardian_id (array of UUIDs) – One or more guardian IDs associated with the student.
Response
Confirmation the OTP was generated (data). The code is delivered to the authorized person — it is not returned in the response.
{
"guardian_id": "41e5db5b-2ab2-4d8a-a8e2-6fe3fdaca078",
// "parent_id": "d651190e-5e68-43e0-82db-9c53426311ab",
"valid_minutes" : 120 //Optional: default and max is 120mins,
}{
"status": 200,
"data": {
"otp": "1492",
"expires_at": "2025-12-17 15:39:01"
},
"message": "Authorization OTP Generated Successfully"
}
POST validateAuthOTP {{url}}/dependants/validate-authorization-otp ▸
Validate an authorization OTP presented when someone (a parent or guardian) attempts to collect a child — e.g. at pickup/dropoff verification. Confirms the person is authorized for that specific child before handover.
Request Body
- authorization_otp (
string, required): The OTP code being presented. - grade (
string, required): The child's grade; must be one of the allowedStudent::GRADEkeys. - tags (
array, required): The route/zone/location tags in the current context. The OTP matches only if all of the OTP's tags are contained in this list.
Response
- Valid → returns the
student(id, names, dob, gender, metadata) and theauthorized_person(id,type=Parent/Guardian, names, phone, gender) with message "OTP valid. Person is authorized." - Invalid / expired → records a Declined entry in the authorization OTP history and returns a warning "Invalid or expired OTP, Person not authorized."
Notes
- An OTP only matches while unexpired, for the correct grade, and with matching tags.
- This is the validation/lookup step; Confirm Authorization OTP is the follow-up that records the final Verified/Declined decision.
- Requires a bearer token (
auth:api).
{
"authorization_otp": "2072",
"grade": "GRADE_8", //only use: PP1, PP2, PLAYGROUP, GRADE_1 , GRADE_2, GRADE_3, GRADE_4, GRADE_5, GRADE_6, GRADE_7, GRADE_8, GRADE_9, GRADE_10, GRADE_11, GRADE_12, COLLEGE, N/A,
"tags": ["d4b18b8f-eaa6-44e1-8655-d75f146c0933","8a6b4d09-51ba-406b-8f69-db72406d6b7f","47f17aff-fb5a-4469-9fd0-6cd379b70f7a","762aa069-510e-4732-8099-95893d5d51c9","e3ee3b73-edfc-4bba-ad1e-cf237819e774","4e703369-78d2-4646-a937-9fc8abf78be8","b8c95dde-4268-46b5-b318-3a1bb4e008ce"]
}{
"status": 200,
"data": {
"dependant": {
"id": "30a250fe-0cbe-4afb-bb48-606e5d8f887f",
"first_name": "Lincoln",
"middle_name": "Hungi",
"last_name": "Chege",
"dob": "2010-11-06",
"gender": "Male",
"metadata": {
"grade": "6th Grade"
}
},
"authorized_person": {
"id": "ba20fb10-c2c1-4951-9903-53c6fdbeabef",
"first_name": "Peter",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": "+254722626879",
"gender": "Male",
"metadata": null
}
},
"message": "OTP confirmed. Person is authorized."
}
POST Confirm Authorization OTP {{url}}/dependants/confirm-authorization-otp ▸
Final step of the guardian pickup authorization flow. Records whether the person presenting the OTP (validated via validateAuthOTP) is confirmed to pick up the child, creating a permanent audit record and invalidating the OTP so it cannot be reused.
Request Body
- status (
string, required):Verified(person is authorized to take the child) orDeclined(rejected). - authorization_otp (
string, required): The 4-digit OTP that was validated. - dependant_id (
stringUUID, required): The child's UUID. - verifiable_id (
stringUUID, required): UUID of the parent or guardian the OTP was issued to. - verifiable_type (
string, required):ParentorGuardian.
Response
A confirmation message: "OTP confirmed. Person is authorized." or "OTP declined. Person not authorized."
Notes
- This call expires the OTP (one-time use) regardless of outcome, and writes an entry to the OTP history audit trail (see OTP History).
- Fails if the OTP has already expired or doesn't match the given student/verifiable pair.
{
"status": "Verified", //Verified,Declined
"authorization_otp": "8729",
"dependant_id": "c75f2355-2f88-40b2-916b-999744d1d1f5",
"verifiable_id": "95db0ec4-83ab-4a7a-aff4-383e738e8d34",
"verifiable_type" : "Parent" //Parent,Guardian
}{
"status": 422,
"data": [],
"message": "Invalid or expired OTP, Person not authorized."
}
GET OTP History {{url}}/otp-history ▸
Retrieve a paginated audit trail of every guardian-pickup OTP attempt (both verified and declined), across all students. Use this to investigate a specific pickup or spot suspicious activity.
Query Parameters
- status (
string, optional):VerifiedorDeclined. - dependant_id (
stringUUID, optional): Filter to a specific child. - datefrom / dateto (
date, optional): Restrict to a date range. - search (
string, optional): Free-text match against the student/authorized-person name or event details. - per_page (
integer, optional, default 10, max 20)
Response
Paginated list of OTP history entries, newest first.
{
"data": [
{
"time": "09:57 AM",
"date": "12/12/2025",
"status": "Verified",
"student": {
"id": "61072d3d-92a6-4712-a9b3-9d74d2d59346",
"first_name": "Simon",
"last_name": "Chege"
},
"details": "Guardian: Peter Chege"
},
{
"time": "09:57 AM",
"date": "12/12/2025",
"status": "Declined",
"student": null,
"details": "Invalid or expired OTP"
}
],
"links": {
"first": "http://127.0.0.1:8001/api/otp-history?page=1",
"last": "http://127.0.0.1:8001/api/otp-history?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://127.0.0.1:8001/api/otp-history?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"path": "http://127.0.0.1:8001/api/otp-history",
"per_page": 15,
"to": 2,
"total": 2
}
}
GET OTP Summary {{url}}/otp-history/summary ▸
Retrieve aggregate statistics for the guardian-pickup OTP flow — useful for a security/overview dashboard.
Response
{
"total_attempts": 150,
"verified_pickups": 145,
"success_rate": "96.67%",
"declined_attempts": 5,
"security_flags": 2
}
Notes
security_flagscounts declined OTP attempts in the last 24 hours, which may indicate an attempted unauthorized pickup.
{
"status": 200,
"data": {
"total_attempts": 2,
"verified_pickups": 1,
"success_rate": "50%",
"declined_attempts": 1,
"security_flags": 0
},
"message": "OTP summary retrieved successfully."
}
POST Live Tracking Link {{url}}/dependants/live-tracking-link ▸
Generates a weblink for tracking students live trip location.
Required Parameters:
- Path: dependant_id (UUID) – The unique identifier of the student for whom the parent wishes to track
Response
A short-lived live-tracking URL (data) the parent can open to watch the child's trip on a map.
{
"dependant_id": "30a250fe-0cbe-4afb-bb48-606e5d8f887f" // Student UUID
}{
"status": 200,
"data": {
"live_tracking_link": "https://terragoui.terrasofthq.com/live-trip/772affd7-5886-4ae7-8724-c5bf64d2853a"
},
"message": "success"
}
POST Assign Band/Bag Tags {{url}}/dependants/assign-iot/184c32e2-878d-4e89-99c3-91dda70c03e9 ▸
Assign a wearable Band/Bag Tags tracking band/tag to a student (child), so the child's tap-in/tap-out events can be captured by scanners. Pulls device info from both TerraGo's local Band/Bag Tags stock and TerraGo's zone/location and tag registry.
Path Parameters
- id (
stringUUID, required): The student's UUID.
Request Body
- iotserialnumber (
string, required): Serial number printed on/embedded in the device. - iot_type (
stringUUID, required): Band/Bag Tags device type UUID (seeGET /utility/band/bag tag-types). - administrative_id (
stringUUID, optional): The school (Administrative Staff) the device belongs to. Defaults to the authenticated user's school/supervisor if omitted.
Response
The updated student record with its assigned Band/Bag Tags device(s).
Notes
- If the device already exists in local stock, it must be
AVAILABLEand belong to the same school — otherwise you'll get a400(already assigned elsewhere) or403. - If not found anywhere (neither local stock nor the registry), returns
404. - Only System Admins can assign devices across schools; other roles are restricted to their own school's stock.
{
"iot_serial_number": "b923a161-df11-4479-ae88-baf42443566", // Serial number of the band/bag tag device
"iot_type": "155c2ef7-d959-4e4b-82a6-a8035aed5a64" // Band/bag tag device-type UUID
}{
"data": {
"id": "184c32e2-878d-4e89-99c3-91dda70c03e9",
"first_name": "Simon",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "a2fce066-519c-4cba-968d-18aa70446411",
"is_active": true,
"metadata": {
"grade": null
},
"parent": {
"uuid": "cf7a3821-e6be-490f-85b9-6f7ca3585aad",
"name": "Kevin Kariuki",
"email": "kevin.kariuki@example.com",
"phone": "+254733556677"
},
"guardians": [
{
"uuid": "d651190e-5e68-43e0-82db-9c53426311ab",
"name": "Peter Chege"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-05 12:51:29",
"iots": {
"id": "44de4102-10cb-4df0-838d-ba5d7189d715",
"assignee": {
"id": "a2fce066-519c-4cba-968d-18aa70446411",
"name": "Simon Chege",
"third_party_id": "184c32e2-878d-4e89-99c3-91dda70c03e9"
},
"serial_number": "b923a161-df11-4479-ae88-baf42443566",
"account_id": "a2fce066-519c-4cba-968d-18aa70446411",
"code": "IOT-B20C4A9A46I",
"expires_at": "Mon, Jan 8, 2035 9:37 AM",
"validity": "8 years from now",
"expired": false,
"status": "Active",
"user_type": "Dependant",
"wallet_id": "a2fce066-519c-4cba-968d-18aa70446411",
"iot_type": {
"id": "155c2ef7-d959-4e4b-82a6-a8035aed5a64",
"name": "nfc wristband"
},
"tags": [],
"created_at": "Thu, Jan 8, 2026 12:37 PM"
}
},
"status": 200,
"message": "Dependant IOT Assigned Successfully"
}
POST Add Student Address {{url}}/dependants/add-address/184c32e2-878d-4e89-99c3-91dda70c03e9 ▸
Attach a saved location (typically home or school) to a student's profile, used for geofencing and the "home address auto-detection" feature.
Path Parameters
- id (
stringUUID, required): The student's UUID.
Request Body
- latitude (
number, required, range -90 to 90) - longitude (
number, required, range -180 to 180) - is_primary (
boolean, required): Marks this as the student's primary address.
Notes
- Setting
isprimary: trueautomatically un-setsisprimaryon any other address already saved for this student — a student can only have one primary address at a time.
Response
The created address (data).
{
"latitude": -1.2921,
"longitude": 36.8219,
"is_primary": true //use only: true, false
}{
"status": 200,
"data": {
"uuid": "da879dcb-b062-462e-b935-5c1b879e3c0d",
"is_primary": true,
"latitude": -1.2921,
"longitude": 36.8219
},
"message": "Address Added Successfully"
}
GET Remove Student Address {{url}}/dependants/remove-address/184c32e2-878d-4e89-99c3-91dda70c03e9/da879dcb-b062-462e-b935-5c1b879e3c0d ▸
Permanently deletes a saved address from a student's profile.
Path Parameters
- id (
stringUUID, required): The student's UUID. - address_id (
stringUUID, required): UUID of the address to remove.
⚠️ Note on HTTP method
This is implemented as a GET request even though it performs a destructive delete — that's unusual REST design carried over from the existing API and worth being careful with (e.g. don't let link-prefetching or crawlers hit this URL). It cannot be undone once called.
Response
Empty data; message confirms the address was removed.
{
"status": 200,
"data": [],
"message": "Address Removed Successfully"
}
POST Update Student Address {{url}}/dependants/update-address/184c32e2-878d-4e89-99c3-91dda70c03e9/93d41cd9-1b01-4bb3-95ce-56175ce7f493 ▸
Update the coordinates or primary flag on an existing student address.
Path Parameters
- id (
stringUUID, required): The student's UUID. - address_id (
stringUUID, required): UUID of the address to update.
Request Body
- latitude (
number, required, range -90 to 90) - longitude (
number, required, range -180 to 180) - is_primary (
boolean, required)
Notes
- Same primary-address exclusivity rule as Add Home Address: only one address per student can be primary.
Response
The updated address (data).
{
"latitude": -1.2921,
"longitude": 36.8219,
"is_primary": true //use only: true, false
}{
"status": 200,
"data": {
"uuid": "93d41cd9-1b01-4bb3-95ce-56175ce7f493",
"is_primary": true,
"latitude": -1.2921,
"longitude": 36.8219
},
"message": "Address Updated Successfully"
}
GET List Students Without AccessLogs {{url}}/dependants/without-access-logs ▸
Retrieves a paginated list of students filtered by optional criteria such as tags, parent ID, or phone number. This endpoint is useful for applications that need to display or manage students associated with a parent entity (such as a user or account).
Parameters
- tags (
array[string], optional): List of tag UUIDs to filter students.
- parent_id (
string, optional): UUID of the parent entity to filter students.
- phone_number (
string, optional): Phone number to filter students.
- per_page (
integer, optional): Number of results per page. Default is 10.
- page (
integer, optional): Page number to retrieve. Default is 1.
Notes
- All filter parameters are optional; omitting them returns all students.
- Ensure the
tokenenvironment variable is set with a valid bearer token.
- The endpoint may return an empty array if no students match the filters.
{
"tags": ["d4b18b8f-eaa6-44e1-8655-d75f146c0933"], // filter by tag
"status": "Checked Out", //Checked In, Checked Out or Denied
"date_range": "2025-04-23 14:03:21, 2025-05-23 14:03:21",
// "parent_id": "cf7a3821-e6be-490f-85b9-6f7ca3585aad", // filter by parent id
// "phone_number": "+254733556677", // filter by phone number
"per_page": 10,
"page": 1
}{
"data": [
{
"id": "184c32e2-878d-4e89-99c3-91dda70c03e9",
"first_name": "Simon",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "a2fce066-519c-4cba-968d-18aa70446411",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "cf7a3821-e6be-490f-85b9-6f7ca3585aad",
"name": "Kevin Kariuki",
"email": "kevin.kariuki@example.com",
"phone": "+254733556677"
},
"guardians": [
{
"uuid": "d651190e-5e68-43e0-82db-9c53426311ab",
"name": "Peter Chege"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-05 15:51:29",
"tags": [
{
"id": "d4b18b8f-eaa6-44e1-8655-d75f146c0933",
"name": "PM School Tag",
"description": "PM School Tag",
"entity": "universal",
"color_code": "#EA0D8D"
}
],
"iots": [
{
"id": "44de4102-10cb-4df0-838d-ba5d7189d715",
"serial_number": "b923a161-df11-4479-ae88-baf42443566",
"code": "IOT-B20C4A9A46I",
"expires_at": "Mon, Jan 8, 2035 9:37 AM",
"validity": "8 years from now",
"iot_type": {
"id": "155c2ef7-d959-4e4b-82a6-a8035aed5a64",
"name": "nfc wristband"
},
"status": "Active",
"tags": []
}
]
},
{
"id": "0b1475e9-f811-4683-8a90-a94468dc7ef1",
"first_name": "Junior",
"middle_name": null,
"last_name": "Pm",
"phone": "",
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2005-01-05 00:00:00",
"gender": "Female",
"third_party_id": "2b8effd8-0782-4e66-b93f-d0ba8c4464c9",
"is_active": 1,
"metadata": {
"grade": "8th Grade"
},
"parent": {
"uuid": "d23b811d-368c-44fd-a031-6663bed28fc0",
"name": "Pm Parent",
"email": "Parent@gmail.com",
"phone": "+254791472893"
},
"guardians": [
{
"uuid": "41e5db5b-2ab2-4d8a-a8e2-6fe3fdaca078",
"name": "Nanny Guardian"
},
{
"uuid": "4d95c454-67aa-47ce-80c3-973f0d3750cb",
"name": "Maggy Grants"
}
],
"image": null,
"notes": null,
"created_at": "2026-01-05 14:26:56",
"tags": [
{
"id": "d4b18b8f-eaa6-44e1-8655-d75f146c0933",
"name": "PM School Tag",
"description": "PM School Tag",
"entity": "universal",
"color_code": "#EA0D8D"
},
{
"id": "0655ca5b-1c6b-437d-b38a-7f4596fb038f",
"name": "Kiota School Rongai Route",
"description": "Kiota School Rongai Route for students",
"entity": "dependant",
"color_code": null
}
]
}
],
"links": {
"first": "http://terrago.test/api/dependants/without-access-logs?page=1",
"last": "http://terrago.test/api/dependants/without-access-logs?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://terrago.test/api/dependants/without-access-logs?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"path": "http://terrago.test/api/dependants/without-access-logs",
"per_page": 10,
"to": 2,
"total": 2
},
"status": 200,
"message": "Dependants Retrieved Successfully"
}
GET List Students Order By Route Ordering {{url}}/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82 ▸
Retrieves a paginated list of students filtered by optional criteria such as tags, parent ID, or phone number. This endpoint is useful for applications that need to display or manage students associated with a parent entity (such as a user or account).
Parameters
- tags (
array[string], optional): List of tag UUIDs to filter students.
- parent_id (
string, optional): UUID of the parent entity to filter students.
- phone_number (
string, optional): Phone number to filter students.
- per_page (
integer, optional): Number of results per page. Default is 10.
- page (
integer, optional): Page number to retrieve. Default is 1.
Notes
- All filter parameters are optional; omitting them returns all students.
- Ensure the
tokenenvironment variable is set with a valid bearer token.
- The endpoint may return an empty array if no students match the filters.
{
"order_by": "boarding_order", //alighting_order, boarding_order
"order_direction": "asc", //asc, desc
"trip_planner_id": "1742827f-ddf2-4894-ab72-60f0f93ba7ff",
"per_page": 10,
"page": 1
}{
"data": [
{
"id": "c75f2355-2f88-40b2-916b-999744d1d1f5",
"first_name": "Lincoln",
"middle_name": "Hungi",
"last_name": "Chege",
"phone": "+254747337463",
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "61885c23-9e9c-49dd-8603-53fc14ae1950",
"is_active": 1,
"metadata": {
"grade": "9th Grade"
},
"parent": {
"uuid": "95db0ec4-83ab-4a7a-aff4-383e738e8d34",
"name": "LaParent Ente",
"email": "laparent@gmail.com",
"phone": "+25470000001"
},
"guardians": [
{
"uuid": "d651190e-5e68-43e0-82db-9c53426311ab",
"name": "Peter Chege"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-03 04:24:46",
"addresses": [
{
"id": "c7742a50-7f51-4a27-84bf-2db8a02b289b",
"latitude": -1.2674,
"longitude": 36.8079,
"is_primary": true
},
{
"id": "de4fbf8d-b827-4842-8ab5-e52d7fbda6ff",
"latitude": -1.2698,
"longitude": 36.8102,
"is_primary": false
},
{
"id": "e183966a-4cba-4bd4-ae6d-48956db5bd96",
"latitude": -1.2651,
"longitude": 36.8055,
"is_primary": false
}
]
},
{
"id": "82bef288-61c8-4aa4-b31e-c258f0126259",
"first_name": "Kids",
"middle_name": "L",
"last_name": "Name",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2018-12-03 00:00:00",
"gender": "Female",
"third_party_id": "6d024a1a-311f-48c4-9dbd-390b2554a252",
"is_active": 1,
"metadata": null,
"parent": {
"uuid": "9dcc2d36-5297-4c26-98db-660af8e00909",
"name": "Le Parent",
"email": "ling@gmqil.com",
"phone": "+254700000111"
},
"guardians": [],
"image": null,
"notes": null,
"created_at": "2025-12-03 05:16:54",
"addresses": [
{
"id": "8bcf2bda-f422-4c88-a731-23a3836be790",
"latitude": -1.3192,
"longitude": 36.7073,
"is_primary": true
},
{
"id": "048f1644-610f-4c47-b75f-4cee7536463a",
"latitude": -1.3215,
"longitude": 36.7098,
"is_primary": false
},
{
"id": "1ed720a9-46a0-489e-aa4d-a7e361e5d09f",
"latitude": -1.3168,
"longitude": 36.7051,
"is_primary": false
}
]
},
{
"id": "184c32e2-878d-4e89-99c3-91dda70c03e9",
"first_name": "Simon",
"middle_name": "Kimani",
"last_name": "Chege",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "a2fce066-519c-4cba-968d-18aa70446411",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "cf7a3821-e6be-490f-85b9-6f7ca3585aad",
"name": "Kevin Kariuki",
"email": "kevin.kariuki@example.com",
"phone": "+254733556677"
},
"guardians": [
{
"uuid": "d651190e-5e68-43e0-82db-9c53426311ab",
"name": "Peter Chege"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-05 15:51:29",
"addresses": [
{
"id": "b83c2cfc-1e20-4264-84b6-36ef72ae1fd3",
"latitude": -1.2893,
"longitude": 36.7837,
"is_primary": true
},
{
"id": "4a0ccaf4-bfdf-4ed2-ba2d-6ff4c6c13578",
"latitude": -1.2917,
"longitude": 36.7862,
"is_primary": false
},
{
"id": "66122fc7-f104-46b9-b6ab-286ab331ca5f",
"latitude": -1.2871,
"longitude": 36.7815,
"is_primary": false
}
]
},
{
"id": "7dbdb6cc-6f7f-4cf9-884b-6b1032db8895",
"first_name": "K34Kl",
"middle_name": null,
"last_name": "Kiddds",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "039467c3-7b50-4d62-a70b-6fd98393c2ae",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "2f41e784-9fe4-4bb3-9cae-c2592d8d0d6c",
"name": "Linng Ladt",
"email": "blackling20+0011@gmail.com",
"phone": "+2547063473071"
},
"guardians": [
{
"uuid": "a42beeee-7bbe-4eca-b88c-fdb177bf36b3",
"name": "Ling L"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-10 00:54:21",
"addresses": [
{
"id": "ae65f9ea-6ad4-426a-81fb-d9d408cb9924",
"latitude": -1.2801,
"longitude": 36.7712,
"is_primary": true
},
{
"id": "02f20a65-ef29-45a4-a99b-b3a2c784f3b0",
"latitude": -1.2825,
"longitude": 36.7736,
"is_primary": false
},
{
"id": "b6b6f3e5-00de-4c31-a23b-2c991e7ab0b5",
"latitude": -1.2779,
"longitude": 36.769,
"is_primary": false
}
]
},
{
"id": "3fa67d4c-3654-45af-83e7-73ced7579d36",
"first_name": "Kiddd",
"middle_name": null,
"last_name": "Kidd",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2017-12-11 00:00:00",
"gender": "Male",
"third_party_id": "6794a7e9-3179-47f6-97f4-9e4e65a706be",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "81ed76e7-bd5c-4cba-90d9-cffa34aa8dae",
"name": "Kip Ling",
"email": "blackling20+00041@gmail.com",
"phone": "+2547942376841"
},
"guardians": [
{
"uuid": "a42beeee-7bbe-4eca-b88c-fdb177bf36b3",
"name": "Ling L"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-11 15:15:34",
"addresses": [
{
"id": "5d156185-81ab-40d7-98df-47a78ac097b9",
"latitude": -1.2573,
"longitude": 36.8198,
"is_primary": true
},
{
"id": "a83fcf5f-452f-4994-83f3-a721120fd23e",
"latitude": -1.2597,
"longitude": 36.8221,
"is_primary": false
},
{
"id": "80176d42-0c42-4a84-9698-bf0085ff0f5f",
"latitude": -1.2549,
"longitude": 36.8175,
"is_primary": false
}
]
},
{
"id": "a09b79af-552a-45d2-a020-70798466958d",
"first_name": "PM",
"middle_name": null,
"last_name": "Mdogo",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2018-12-11 00:00:00",
"gender": "Female",
"third_party_id": "cbb727fb-1fcd-42b6-a78d-c3620025e1a1",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "a92b3004-4628-4ae4-9621-35ebe372ab47",
"name": "PM Testing",
"email": "tessdufysdt@gmail.com",
"phone": "+254793453453"
},
"guardians": [],
"image": null,
"notes": null,
"created_at": "2025-12-11 17:06:39",
"addresses": [
{
"id": "a6518223-d67d-427e-81c8-81ec0ab550de",
"latitude": -1.2143,
"longitude": 36.8021,
"is_primary": true
},
{
"id": "5792ed20-1cfe-4860-a715-f4a3758adfe9",
"latitude": -1.2167,
"longitude": 36.8045,
"is_primary": false
},
{
"id": "22375995-33e0-467d-9964-58c3b48db4d3",
"latitude": -1.2119,
"longitude": 36.7998,
"is_primary": false
}
]
},
{
"id": "10f69867-18fa-4d03-a772-799b45ac9d01",
"first_name": "John",
"middle_name": null,
"last_name": "Nyaberi",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2024-12-11 00:00:00",
"gender": "Male",
"third_party_id": "b7f5a95d-f404-44ba-8955-3f77e1606f7c",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "35438f0b-b488-4ea0-b69d-73e214910ab9",
"name": "Erick Mwinyi",
"email": "mwinyierick@gmail.com",
"phone": "+254784976344"
},
"guardians": [],
"image": null,
"notes": null,
"created_at": "2025-12-11 17:27:27",
"addresses": [
{
"id": "7c513985-28b4-41d0-af69-987abcb9481f",
"latitude": -1.2489,
"longitude": 36.8312,
"is_primary": true
},
{
"id": "28989fbe-780f-4929-84e2-ede5896cc480",
"latitude": -1.2513,
"longitude": 36.8336,
"is_primary": false
},
{
"id": "e7111c10-c512-40ba-8133-b6378160e84f",
"latitude": -1.2465,
"longitude": 36.8289,
"is_primary": false
}
]
},
{
"id": "52e87b49-d8f8-4e91-a046-e3a4d4fe0a42",
"first_name": "Kid2",
"middle_name": null,
"last_name": "Kiddds",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2010-11-06 00:00:00",
"gender": "Male",
"third_party_id": "d4de3465-ed17-4cca-8d07-8847f1dc4c26",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "81ed76e7-bd5c-4cba-90d9-cffa34aa8dae",
"name": "Kip Ling",
"email": "blackling20+00041@gmail.com",
"phone": "+2547942376841"
},
"guardians": [
{
"uuid": "9d618963-792a-47a9-89a4-5d8d1ff5420a",
"name": "Guardian1 Last"
},
{
"uuid": "24636b1b-8faa-4b9a-8cdf-62011dfe984d",
"name": "Kipps Guardiasn2"
},
{
"uuid": "a42beeee-7bbe-4eca-b88c-fdb177bf36b3",
"name": "Ling L"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-12 02:47:00",
"addresses": [
{
"id": "4add55ed-2659-412c-9f46-bd14b6bade88",
"latitude": -1.2298,
"longitude": 36.8056,
"is_primary": true
},
{
"id": "7224a555-8a60-47b1-bc78-6ad3185fc632",
"latitude": -1.2321,
"longitude": 36.8079,
"is_primary": false
},
{
"id": "f6b51e02-3b56-4af6-b43c-0755eff3654b",
"latitude": -1.2274,
"longitude": 36.8033,
"is_primary": false
}
]
},
{
"id": "2788c72c-f6ed-451a-bd8f-a4aa52474eec",
"first_name": "Kid3",
"middle_name": "K",
"last_name": "Last",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2020-12-12 00:00:00",
"gender": "Female",
"third_party_id": "62ce1ba2-6286-4b32-9b6f-46f495ed7926",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "81ed76e7-bd5c-4cba-90d9-cffa34aa8dae",
"name": "Kip Ling",
"email": "blackling20+00041@gmail.com",
"phone": "+2547942376841"
},
"guardians": [
{
"uuid": "24636b1b-8faa-4b9a-8cdf-62011dfe984d",
"name": "Kipps Guardiasn2"
},
{
"uuid": "9d618963-792a-47a9-89a4-5d8d1ff5420a",
"name": "Guardian1 Last"
}
],
"image": null,
"notes": null,
"created_at": "2025-12-12 04:51:00",
"addresses": [
{
"id": "17bf4d0d-95f5-4b5f-b9d7-6cac4a3d6e7b",
"latitude": -1.3089,
"longitude": 36.8321,
"is_primary": true
},
{
"id": "d5057d8f-3df5-4873-925e-9865e557118c",
"latitude": -1.3112,
"longitude": 36.8345,
"is_primary": false
},
{
"id": "5e034d69-22ca-4b5d-a07c-35d448f82de8",
"latitude": -1.3066,
"longitude": 36.8298,
"is_primary": false
}
]
},
{
"id": "2aa12867-4100-44c7-b31d-7d60726e0811",
"first_name": "Ha",
"middle_name": "rry",
"last_name": "K",
"phone": null,
"email": null,
"identification_document": null,
"identification_number": null,
"dob": "2001-11-01 00:00:00",
"gender": "Male",
"third_party_id": "d152ba99-9c04-4ca4-abac-ba8318b616a6",
"is_active": 1,
"metadata": {
"grade": null
},
"parent": {
"uuid": "9dcc2d36-5297-4c26-98db-660af8e00909",
"name": "Le Parent",
"email": "ling@gmqil.com",
"phone": "+254700000111"
},
"guardians": [],
"image": null,
"notes": null,
"created_at": "2025-12-12 13:42:12",
"addresses": [
{
"id": "f263996a-daef-4228-bc11-66c2bc9c8e59",
"latitude": -1.2812,
"longitude": 36.7798,
"is_primary": true
},
{
"id": "cfdae4c3-e811-48e5-8941-00b05db43f5d",
"latitude": -1.2836,
"longitude": 36.7821,
"is_primary": false
},
{
"id": "92d35c2f-0194-44ac-9c10-33773ca847a4",
"latitude": -1.2789,
"longitude": 36.7775,
"is_primary": false
}
]
}
],
"links": {
"first": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=1",
"last": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=58",
"prev": null,
"next": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 58,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=2",
"label": "2",
"page": 2,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=3",
"label": "3",
"page": 3,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=4",
"label": "4",
"page": 4,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=5",
"label": "5",
"page": 5,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=6",
"label": "6",
"page": 6,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=7",
"label": "7",
"page": 7,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=8",
"label": "8",
"page": 8,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=9",
"label": "9",
"page": 9,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=10",
"label": "10",
"page": 10,
"active": false
},
{
"url": null,
"label": "...",
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=57",
"label": "57",
"page": 57,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=58",
"label": "58",
"page": 58,
"active": false
},
{
"url": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82?page=2",
"label": "Next »",
"page": 2,
"active": false
}
],
"path": "http://127.0.0.1:8000/api/dependants/route-order/2241ff88-f590-4fb1-9b99-18ecf15cfc82",
"per_page": 10,
"to": 10,
"total": 580
},
"status": 200,
"message": "Dependants Retrieved Successfully"
}
POST Record Trip Checkpoint (Pickup/Dropoff) {{url}}/trip-check-points ▸
Record the GPS location and time a student was picked up or dropped off during a specific trip. This is what powers the "actual pickup/dropoff location" feature shown to parents, separate from the scheduled route stops.
Request Body
- dependant_id (
stringUUID, required): The child being picked up/dropped off. - trip_id (
stringUUID, required): The trip this checkpoint belongs to. - latitude (
number, required, range -90 to 90) - longitude (
number, required, range -180 to 180) - type (
string, required):pickupordropoff. - occurred_at (
datetime, optional): Defaults to the current server time if omitted.
Notes
- There can only be one pickup and one dropoff checkpoint per student per trip — submitting again for the same
dependantid+tripid+typeoverwrites the previous value rather than creating a duplicate. - May trigger automatic home-address detection in the background if this looks like a recurring drop-off point.
Response
The recorded checkpoint (data) — student, trip, type (pickup/dropoff), coordinates and timestamp.
{
"dependant_id": "3c8b5dac-c2d5-4697-ae87-ecae3bcf5e42",
"trip_id": "5a766ea3-9697-4187-8458-0cc131698989", //trip uuid
"latitude": -1.2833,
"longitude": 36.8167,
"type": "pickup", //use only: pickup or dropoff
"occurred_at": "2026-05-05 19:00:00"
}{
"status": 200,
"data": {
"id": "0adab1f1-01c7-46d3-8cb5-1cee43d09697",
"type": "pickup",
"latitude": -1.286389,
"longitude": 36.817223,
"occurred_at": "Tue, May 5, 2026 8:30 AM",
"created_at": "Tue, May 5, 2026 10:20 AM",
"dependant": {
"id": "6c9c0aca-ec65-4dba-9717-f5a006d54503",
"first_name": "Pink",
"last_name": "Terra"
},
"trip": {
"id": "5a766ea3-9697-4187-8458-0cc131698989",
"waas_zone_name": "Demo Zone"
}
},
"message": "Check point recorded successfully"
}
GET Get Trip Checkpoints by Trip {{url}}/trip-check-points/trip/5a766ea3-9697-4187-8458-0cc131698989 ▸
List the recorded pickup/dropoff checkpoints for every child on a given trip.
Path Parameters
- tripId (
stringUUID, required): The trip's UUID.
Response
An array with one entry per student on the trip, each containing the student's basic info plus their pickup and dropoff checkpoint (either may be null if it hasn't happened yet).
{
"status": 200,
"data": [
{
"dependant_id": "6c9c0aca-ec65-4dba-9717-f5a006d54503",
"name": "Pink Terra",
"pickup": {
"id": "0adab1f1-01c7-46d3-8cb5-1cee43d09697",
"latitude": -1.286389,
"longitude": 36.817223,
"occurred_at": "Tue, May 5, 2026 8:30 AM"
},
"dropoff": null
}
],
"message": "Trip check points retrieved successfully"
}
GET Get Trip Checkpoints by Student {{url}}/trip-check-points/dependant/6c9c0aca-ec65-4dba-9717-f5a006d54503 ▸
List a single child's pickup/dropoff checkpoint history across all of their trips, most recent first. Useful for a parent-facing "trip history" view.
Path Parameters
- dependantId (
stringUUID, required): The student's UUID.
Response
An array with one entry per trip the student appears on, containing the trip ID, zone/location name, and the pickup/dropoff checkpoint for that trip (either may be null).
{
"status": 200,
"data": [
{
"trip_id": "5a766ea3-9697-4187-8458-0cc131698989",
"waas_zone_name": "Demo Zone",
"pickup": {
"latitude": -1.286389,
"longitude": 36.817223,
"occurred_at": "2026-05-05 08:30:00"
},
"dropoff": null
}
],
"message": "Dependant check points retrieved successfully"
}
GET List Trip Planner Assignments {{url}}/dependants/184c32e2-878d-4e89-99c3-91dda70c03e9/trip-planners ▸
List the trip planners a student is assigned to. Assignments live in the dependantrouteorders pivot (the same mapping the Save Boarding/Alighting Order screen writes), so a student can belong to several planners — e.g. a morning run and a return run — each scoped to a route.
Path Parameters
- id (
stringUUID, required): The student's UUID.
Response
Array of assignments, each: id (assignment uuid — used to unassign), boardingorder, alightingorder, tripplanner (id, label, direction, starttime, status), route (id, name).
Notes
- This mapping is what
GET /api/v2/students?tripplannerid=filters the driver-app roster by. - Requires a bearer token (
auth:api).
POST Assign Trip Planner {{url}}/dependants/184c32e2-878d-4e89-99c3-91dda70c03e9/trip-planners ▸
Assign a student to a trip planner on a specific route. Appends them to the end of that (route, planner) boarding/alighting order. Idempotent — assigning the same (student, route, planner) again returns the existing assignment instead of duplicating it. The Save Boarding/Alighting Order screen can later re-order them.
Path Parameters
- id (
stringUUID, required): The student's UUID.
Request Body
- tripplannerid (
stringUUID, required): The trip planner's UUID (exists:trip_planners,uuid). - route_id (
stringUUID, required): The route's UUID (exists:routes,uuid). The route must carry a the registry tag.
Response
{ "id": "<assignment uuid>" }.
Notes
- Boarding & alighting order default to
max + 1for that (route, planner). - Invalidates the cached the registry roster for the route's tag so the driver app re-fetches.
- Requires a bearer token (
auth:api).
{
"trip_planner_id": "da2175e7-cc4d-4c25-a8e8-4ad81300a9e1", // Trip planner UUID (which trip this belongs to)
"route_id": "643ab899-5b74-4dc1-b3a0-5b512dc11336" // Route UUID
}
DELETE Unassign Trip Planner {{url}}/dependants/184c32e2-878d-4e89-99c3-91dda70c03e9/trip-planners/{assignmentId} ▸
Remove a single trip-planner assignment (one dependantrouteorders row, identified by its assignment uuid).
Path Parameters
- id (
stringUUID, required): The student's UUID. - assignmentId (
stringUUID, required): The assignmentidreturned by List Trip Planner Assignments.
Notes
- Returns
404if the assignment doesn't exist or doesn't belong to this student. - Invalidates the cached the registry roster for the route's tag.
- Requires a bearer token (
auth:api).
DELETE Delete {{url}}/dependants/delete/c3d4e5f6-0000-4a11-8888-abcde1234567 ▸
Delete a student (dependant) record.
Notes
- Requires a bearer token (
auth:api).
{
"status": 200,
"data": [],
"message": "Dependant Deleted Successfully"
}