TBN API — Developer Documentation
Overview
The TBN 3rd Party API is a RESTful API that provides programmatic access to your transportation management data in The Bus Network. It supports reading bookings, routes, dispatch records, invoices, driver information, school and tour contracts, scheduled services, and more.
API Style: REST over HTTPS, JSON request/response bodies
OpenAPI Spec: Available at GET /docs/spec.json
Interactive Docs: Swagger UI available at GET /docs (no authentication required)
Quick Start
1. Get Your API Key

Contact TBN to request an API key. Keys are scoped to one of three access levels:
| Key Prefix | Scope Level | What You Can Access |
|---|
tbn_c_ | Company | Data for a single company |
tbn_p_ | Parent Company | Data across all companies under a parent company |
tbn_e_ | Enterprise | Data across the entire enterprise |
2. Make Your First Request
curl -H "Authorization: Bearer tbn_c_your_api_key_here" \
https://api.thebusnetwork.com/api/usage/current
The /api/usage/current endpoint is free (0 units) and is a good way to verify your key is working.3. Explore the Data
Authentication
All /api/* endpoints require a valid API key in the Authorization header using the Bearer scheme:
Authorization: Bearer <your-api-key>
Key behavior:
- Keys are validated against bcrypt hashes on the server
- Validated keys are cached for 5 minutes to reduce latency on subsequent requests
- The
lastUsedAt timestamp on your key is updated with each request
Authentication errors:
Missing or malformed header:
HTTP 401
{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid Authorization header"
}
}
Invalid key:
HTTP 401
{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
}
}
Scope & Data Access
Your API key determines what data you can access. The TBN data hierarchy is:
Enterprise
└── Parent Company
└── Company
Scope Narrowing
Higher-level keys can optionally narrow their scope using query parameters:
| Your Key Level | Can Use ?companyID= | Can Use ?parentCompanyID= |
|---|
| Company | No (already narrowest) | No |
| Parent Company | Yes | No |
| Enterprise | Yes | Yes |
Scope errors:
Invalid scope parameter (not an integer):
HTTP 400
{
"error": {
"code": "INVALID_PARAM",
"message": "Invalid companyID parameter"
}
}
Company not in your hierarchy:
HTTP 403
{
"error": {
"code": "FORBIDDEN",
"message": "Company does not belong to this hierarchy"
}
}
Query Parameters
All list endpoints accept optional scope filters:
| Parameter | Type | Description |
|---|
companyID | integer | Filter to a specific company (parent/enterprise keys only) |
parentCompanyID | integer | Filter to a specific parent company (enterprise keys only) |
Some endpoints support additional filters:
| Parameter | Type | Used On | Description |
|---|
startDate | ISO 8601 datetime | Quotes, Dispatch, Routes, Driver Actuals, Driver Availability Events, Other Assignments | Start of date range (inclusive). Defaults to current time if omitted. |
endDate | ISO 8601 datetime | Same as above | End of date range (inclusive). Defaults to startDate + 24 hours if omitted. Max 31-day window. |
includeVoided | "true" or "false" | Invoices | Include voided invoices. Defaults to "false". |
includeCancelled | "true" or "false" | Routes | Include cancelled routes. Defaults to "false". |
sourceType | string | Routes | Filter by assignment source type. |
quoteID | integer | Quote Segments, Vehicle Requests, Addon Requests, Discount Code Quotes | Required. Parent quote to retrieve children for. |
routeID | integer | Route Segments, Addon Assignments, Discount Code Routes | Required. Parent route to retrieve children for. |
schoolRouteID | integer | School Segments | Required. Parent school route. |
tourRouteID | integer | Tour Segments, Tour Vehicle Requests | Required. Parent tour route. |
ssRouteID / SSRouteID | integer | SS Segments, SS Vehicle Requests, SS Addon Requests | Required. Parent scheduled service route. |
All date parameters must be in ISO 8601 format:
startDate=2026-02-01T00:00:00Z
endDate=2026-02-28T23:59:59Z
Date range rules:
- Maximum window: 31 days between
startDate and endDate endDate must be on or after startDate- If
startDate is omitted, it defaults to the current time - If
endDate is omitted, it defaults to startDate + 24 hours
Path Parameters
Detail endpoints use a numeric id path parameter:
GET /api/bookings/{id}
GET /api/drivers/{id}
The id must be a positive integer.
Request Body
Only one endpoint accepts a request body:
POST /api/drivers/verify
{
"email": "driver@example.com",
"password": "their_password"
}

Both fields are required.
Successful Responses
List endpoints return an array wrapped in a data envelope:
HTTP 200
{
"data": [
{ "id": 1, "companyName": "Acme Transport", ... },
{ "id": 2, "companyName": "Beta Bus Co", ... }
]
}
If no records match, data is an empty array: { "data": [] }
Detail endpoints return a single object in a data envelope:
HTTP 200
{
"data": {
"id": 1,
"companyName": "Acme Transport",
...
}
}
Driver verify returns a non-enveloped response:
HTTP 200
{
"verified": true
}
Every successful response includes these headers:
| Header | Description |
|---|
X-TBN-Units-Consumed | Units consumed by this request |
X-TBN-Period-Usage | Total units consumed this billing period (including this request) |
X-TBN-Period-Allocation | Total units allocated for the billing period |
X-TBN-Period-Remaining | Units remaining in the billing period |
X-TBN-Usage-Warning | Present only when usage exceeds the soft limit threshold (e.g., "Approaching usage limit (85%)") |
Date Fields in Responses
Response fields use two date formats:
| Format | Example | Used For |
|---|
date | "2026-02-15" | Date-only fields: dob, dateEmploymentStart, invoiceDueDate, depositDue, expirationDate |
date-time | "2026-02-15T08:00:00Z" | Timestamp fields: createdAt, updatedAt, firstDeparture, driverStartTime, cancelledAt |
Some datetime fields include a separate timezone field:
{
"firstDeparture": "2026-02-15T08:00:00Z",
"firstDepartureTZ": "America/New_York"
}
Field Naming Conventions
| Pattern | Example | Meaning |
|---|
<entity>ID | driverID, companyID | Foreign key reference |
<entity>Name | driverName, companyName | Human-readable name for the referenced entity |
is<Property> | isCancelled, isEnhancedDriversLicense | Boolean flag |
<event>At | createdAt, cancelledAt, driverAcceptedAt | Timestamp of when an event occurred |
total<Type> | totalBeforeTax, totalAfterTax | Financial total |
Error Responses
All errors follow a consistent format:
{
"error": {
"code": "<ERROR_CODE>",
"message": "<Human-readable description>"
}
}
Error Code Reference
| HTTP Status | Error Code | Meaning |
|---|
| 400 | VALIDATION_ERROR | Request failed input validation (bad query params, missing required fields, invalid date range). The message field lists all validation errors separated by "; ". |
| 400 | INVALID_PARAM | A scope parameter (companyID or parentCompanyID) is not a valid integer. |
| 401 | UNAUTHORIZED | Missing, malformed, or invalid API key. |
| 403 | FORBIDDEN | The requested company or parent company does not belong to your API key's hierarchy. |
| 404 | NOT_FOUND | The requested resource does not exist (or is not visible at your scope level). |
| 429 | HARD_LIMIT_EXCEEDED | Monthly hard limit reached. No more requests until next billing period. |
| 429 | ALLOCATION_EXCEEDED | Monthly unit allocation exceeded and auto-upgrade is not enabled. |
| 429 | RATE_LIMIT_MINUTE | Per-minute rate limit exceeded. |
| 429 | RATE_LIMIT_HOUR | Per-hour rate limit exceeded. |
| 429 | RATE_LIMIT_DAY | Per-day rate limit exceeded. |
| 429 | RATE_LIMIT_WEEK | Per-week rate limit exceeded. |
| 500 | INTERNAL_ERROR | Unexpected server error. Contact TBN support if this persists. |
Handling 429 Responses
All 429 responses include a Retry-After header (in seconds) indicating when you can retry:
| Error Code | Retry-After |
|---|
RATE_LIMIT_MINUTE | 60 seconds |
RATE_LIMIT_HOUR | 3,600 seconds |
RATE_LIMIT_DAY | 86,400 seconds |
RATE_LIMIT_WEEK | 604,800 seconds |
HARD_LIMIT_EXCEEDED | 86,400 seconds |
ALLOCATION_EXCEEDED | 86,400 seconds |

Rate-limited responses also include usage headers with X-TBN-Units-Consumed: 0 (the rejected request does not consume units).
Recommended retry strategy:
- Read the
Retry-After header - Wait at least that many seconds before retrying
- For
RATE_LIMIT_MINUTE, implement exponential backoff starting at 60 seconds - For
HARD_LIMIT_EXCEEDED or ALLOCATION_EXCEEDED, stop making requests and contact TBN if you need a plan upgrade
Usage & Metering
How Units Work
Every API call consumes units from your plan's allocation. The cost of each call depends on:
- Endpoint weight — Each endpoint has a configured base unit cost
- Scope level — List endpoints called with parent company or enterprise keys cost base weight × number of active companies in scope. Detail endpoints (by ID) always cost the base weight regardless of scope.
- Zero-cost endpoints — The
/api/usage/current endpoint costs 0 units
Rate Limits
Your plan defines limits across multiple time windows:
| Window | Behavior When Exceeded |
|---|
| Per-minute | Request rejected with RATE_LIMIT_MINUTE |
| Per-hour | Request rejected with RATE_LIMIT_HOUR |
| Per-day | Request rejected with RATE_LIMIT_DAY |
| Per-week | Request rejected with RATE_LIMIT_WEEK |
| Monthly allocation | Request rejected with ALLOCATION_EXCEEDED (unless auto-upgrade is enabled) |
| Monthly hard limit | Request rejected with HARD_LIMIT_EXCEEDED (always enforced) |
Monitoring Your Usage
Check your current consumption at any time (free, 0 units):
curl -H "Authorization: Bearer tbn_c_your_key" \
https://api.thebusnetwork.com/api/usage/current
You can also read the X-TBN-* response headers on any API call to monitor usage inline.
Endpoint Reference
All data endpoints are mounted under /api and require authentication.
System
| Method | Endpoint | Auth | Units | Description |
|---|
| GET | /health | No | — | Server health check. Returns { "status": "ok" } |
| GET | /docs | No | — | Interactive Swagger UI |
| GET | /docs/spec.json | No | — | OpenAPI 3.0.3 specification (JSON) |
| GET | /api/usage/current | Yes | 0 | Current billing period usage summary |
Reference Data
Global lookup tables. Not scoped — the same data is returned regardless of your key level.
| Method | Endpoint | Description |
|---|
| GET | /api/customer-types | List all customer classification types |
| GET | /api/customer-types/{id} | Get a specific customer type by ID |
| GET | /api/employment-statuses | List all employment status types |
| GET | /api/invoice-delivery-methods | List all invoice delivery method options |
| GET | /api/invoice-format-types | List all invoice format type options |
| GET | /api/regions | List all geographic regions |
| GET | /api/school-route-types | List all school route type classifications |
Bookings
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/bookings | companyID, parentCompanyID | List bookings scoped to your access level |
| GET | /api/bookings/{id} | — | Get a specific booking by ID |
Key fields: id, bookingFormattedID, bookedQuoteID, primaryContactID, primaryContactName, organizationID, organizationName, bookingCategory, documentType, salesPerson, tripDescription, numPassengers, firstDeparture, firstDepartureTZ, totalBeforeTax, totalTax, totalAfterTax, amountPaid, amountOutstanding, depositAmount, depositDue, isCancelled, cancelledAt, companyID, companyName, parentCompanyID, parentCompanyName, enterpriseID, enterpriseName, createdAt, updatedAtQuotes
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/quotes | companyID, parentCompanyID, startDate, endDate | List quotes within a date range (default: last 24 hours) |
| GET | /api/quotes/{id} | — | Get a specific quote by ID |
Key fields: id, formattedQuoteID, contactID, contactName, operationsContactID, operationsContactName, billingContactID, billingContactName, quoteStatus, documentType, source, quoteChannel, customerStatus, bookingCategory, salesPerson, startYardID, startYardName, returnYardID, returnYardName, firstDeparture, firstDepartureTZ, firstPickUpLocation, destination, numTripDays, passengers, charterDescription, tripReference, groupName, routeDescription, priceOverride, expirationDate, dateSubmitted, createdAt, updatedAtQuote Segments
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/quote-segments | quoteID (required), companyID, parentCompanyID | List segments for a specific quote |
| GET | /api/quote-segments/{id} | — | Get a specific quote segment by ID |
Vehicle Requests
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/vehicle-requests | quoteID (required), companyID, parentCompanyID | List vehicle requests for a specific quote |
| GET | /api/vehicle-requests/{id} | — | Get a specific vehicle request by ID |
Addon Requests
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/addon-requests | quoteID (required), companyID, parentCompanyID | List addon requests for a specific quote |
| GET | /api/addon-requests/{id} | — | Get a specific addon request by ID |
Discount Code Quotes
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/discount-code-quotes | quoteID (required), companyID, parentCompanyID | List discount codes applied to a specific quote |
| GET | /api/discount-code-quotes/{id} | — | Get a specific discount code quote by ID |
Routes (Vehicle Assignments)
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/routes | companyID, parentCompanyID, startDate, endDate, includeCancelled, sourceType | List routes within a date range (default: last 24 hours) |
| GET | /api/routes/{id} | — | Get a specific route by ID |
Route Segments
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/route-segments | routeID (required), companyID, parentCompanyID | List segments for a specific route |
| GET | /api/route-segments/{id} | — | Get a specific route segment by ID |
Addon Assignments
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/addon-assignments | routeID (required), companyID, parentCompanyID | List addon assignments for a specific route |
| GET | /api/addon-assignments/{id} | — | Get a specific addon assignment by ID |
Discount Code Routes
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/discount-code-routes | routeID (required), companyID, parentCompanyID | List discount codes applied to a specific route |
| GET | /api/discount-code-routes/{id} | — | Get a specific discount code route by ID |
Dispatch
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/dispatch | companyID, parentCompanyID, startDate, endDate | List dispatch records within a date range (default: last 24 hours) |
| GET | /api/dispatch/{id} | — | Get a specific dispatch record by ID |
Key fields: id, driverStartTime, routeID, driverID, driverName, vehicleTypeName, vehicleInventoryName, driverStatusName, affiliateID, useAffiliate, affiliateRate, customerNotes, driverInstructions, invoiceNotes, price, suggestedPrice, priceAtBooking, salesTax, driverCheckIn, driverCheckOut, driverAcceptedAt, publishedAt, cancelledAt, hideFromCustomer, hideFromInvoice, isReliefAssignment, createdAt, updatedAtDrivers
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/drivers | companyID, parentCompanyID | List drivers |
| GET | /api/drivers/{id} | — | Get a specific driver by ID |
| POST | /api/drivers/verify | — | Verify driver credentials (see Request Body section) |
Key fields: id, fullName, firstName, lastName, email, mobilePhone, homePhone, employmentStatusID, employmentStatus, driverReferenceID, dob, dateEmploymentStart, dateEmploymentEnd, licenseNumber, dateLicenseExpired, available, suspended, primaryLocation, companyID, companyName, createdAt, updatedAtDriver Absence Events
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/driver-absence-events | companyID, parentCompanyID | List driver absence/time-off events |
| GET | /api/driver-absence-events/{id} | — | Get a specific absence event by ID |
Driver Availability Events
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/driver-availability-events | companyID, parentCompanyID, startDate, endDate | List driver availability events within a date range |
| GET | /api/driver-availability-events/{id} | — | Get a specific availability event by ID |
Driver Actuals
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/driver-actuals | companyID, parentCompanyID, startDate, endDate | List actual driver time/odometer records within a date range |
| GET | /api/driver-actuals/{id} | — | Get a specific driver actual by ID |
Incidents
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/incidents | companyID, parentCompanyID | List vehicle/driver incidents |
| GET | /api/incidents/{id} | — | Get a specific incident by ID |
Other Assignments
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/other-assignments | companyID, parentCompanyID, startDate, endDate | List non-dispatch driver assignments within a date range |
| GET | /api/other-assignments/{id} | — | Get a specific non-dispatch assignment by ID |
Invoices
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/invoices | companyID, parentCompanyID, includeVoided | List invoices. Voided invoices excluded by default. |
| GET | /api/invoices/{id} | — | Get a specific invoice by ID |
Key fields: id, invoiceNumber, contactID, contactName, organizationID, organizationName, bookingID, bookingFormattedID, scheduledServiceID, scheduledServiceDescription, paymentTerm, invoiceDeliveryMethod, invoiceFormatType, invoiceDueDate, date, description, totalBeforeTax, totalTax, totalAfterTax, totalDiscount, amountPaid, amountOutstanding, paidInFull, voidedAt, createdAt, updatedAtCompanies
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/companies | companyID, parentCompanyID | List companies |
| GET | /api/companies/{id} | — | Get a specific company by ID |
Key fields: id, companyName, displayName, companyShorthandCode, companyPhone, website, addressStreet1, addressStreet2, addressCity, addressState, addressZip, parentCompanyID, parentCompanyName, enterpriseID, enterpriseNameOrganizations
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/organizations | companyID, parentCompanyID | List organizations |
| GET | /api/organizations/{id} | — | Get a specific organization by ID |
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/contacts | companyID, parentCompanyID | List contacts |
| GET | /api/contacts/{id} | — | Get a specific contact by ID |
Yards
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/yards | companyID, parentCompanyID | List yards/vehicle depots |
| GET | /api/yards/{id} | — | Get a specific yard by ID |
Schools
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/schools | companyID, parentCompanyID | List schools |
| GET | /api/schools/{id} | — | Get a specific school by ID |
School Contracts
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/school-contracts | companyID, parentCompanyID | List school transportation contracts |
| GET | /api/school-contracts/{id} | — | Get a specific school contract by ID |
School Routes
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/school-routes | companyID, parentCompanyID | List school routes |
| GET | /api/school-routes/{id} | — | Get a specific school route by ID |
Key fields: id, routeName, busNumber, schoolContractID, schoolContractName, driverID, driverName, startYardID, startYardName, returnYardID, returnYardName, schoolRouteTypeID, schoolRouteType, vehicleTypeName, vehicleDisplayID, driverStartTime, departYardTime, returnYardTime, driverEndTime, sunday through saturday (booleans), additionalRouteDetails, createdAt, updatedAtSchool Segments
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/school-segments | schoolRouteID (required), companyID, parentCompanyID | List segments for a specific school route |
| GET | /api/school-segments/{id} | — | Get a specific school segment by ID |
Tour Contracts
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/tour-contracts | companyID, parentCompanyID | List tour/charter contracts |
| GET | /api/tour-contracts/{id} | — | Get a specific tour contract by ID |
Tour Routes
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/tour-routes | companyID, parentCompanyID | List tour routes |
| GET | /api/tour-routes/{id} | — | Get a specific tour route by ID |
Tour Segments
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/tour-segments | tourRouteID (required), companyID, parentCompanyID | List segments for a specific tour route |
| GET | /api/tour-segments/{id} | — | Get a specific tour segment by ID |
Tour Vehicle Requests
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/tour-vehicle-requests | tourRouteID (required), companyID, parentCompanyID | List vehicle requests for a specific tour route |
| GET | /api/tour-vehicle-requests/{id} | — | Get a specific tour vehicle request by ID |
Scheduled Services
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/scheduled-services | companyID, parentCompanyID | List recurring/scheduled services |
| GET | /api/scheduled-services/{id} | — | Get a specific scheduled service by ID |
Scheduled Service Routes
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/ss-routes | companyID, parentCompanyID | List scheduled service routes |
| GET | /api/ss-routes/{id} | — | Get a specific scheduled service route by ID |
Scheduled Service Segments
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/ss-segments | SSRouteID (required), companyID, parentCompanyID | List segments for a specific scheduled service route |
| GET | /api/ss-segments/{id} | — | Get a specific scheduled service segment by ID |
Scheduled Service Vehicle Requests
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/ss-vehicle-requests | ssRouteID (required), companyID, parentCompanyID | List vehicle requests for a scheduled service route |
| GET | /api/ss-vehicle-requests/{id} | — | Get a specific scheduled service vehicle request by ID |
Scheduled Service Addon Requests
| Method | Endpoint | Query Params | Description |
|---|
| GET | /api/ss-addon-requests | ssRouteID (required), companyID, parentCompanyID | List addon requests for a scheduled service route |
| GET | /api/ss-addon-requests/{id} | — | Get a specific scheduled service addon request by ID |
Best Practices
If you have an enterprise or parent company key but only need data for one company, always pass ?companyID=. List endpoints at higher scopes cost more units (base weight multiplied by your active company count).
Respect Date Range Defaults
Endpoints with date filtering default to a 24-hour window from the current time. If you need historical data, always specify both startDate and endDate. Keep ranges to 31 days or less per request.
Monitor Usage Proactively
Read the X-TBN-Period-Remaining header on responses to detect when you're approaching limits. Use /api/usage/current for a detailed breakdown without consuming units.
Handle 429s Gracefully
Always check the Retry-After header on 429 responses. Implement exponential backoff for rate limits. For allocation or hard limit errors, pause all requests until the next billing period or contact TBN for a plan upgrade.
Cache Reference Data
Reference data endpoints (/api/regions, /api/customer-types, /api/employment-statuses, etc.) return global lookup tables that change infrequently. Cache these responses on your side to reduce unnecessary API calls.
Use Detail Endpoints When You Know the ID
Detail endpoints (/api/bookings/{id}) always cost the base unit weight, regardless of your key's scope level. If you already have the record ID, prefer the detail endpoint over filtering a list.
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|
| 401 UNAUTHORIZED on every request | Malformed Authorization header | Ensure format is exactly Authorization: Bearer <key> with no extra whitespace |
| 403 FORBIDDEN when using ?companyID= | Company is not in your hierarchy | Verify the company ID belongs to your parent company or enterprise |
| 400 VALIDATION_ERROR on date params | Invalid ISO 8601 format or range > 31 days | Use format YYYY-MM-DDTHH:mm:ssZ and keep range within 31 days |
| 429 RATE_LIMIT_MINUTE frequently | Too many requests in short bursts | Implement request throttling; spread calls over time |
| 429 ALLOCATION_EXCEEDED | Monthly plan budget exhausted | Check /api/usage/current; contact TBN about a plan upgrade or enable auto-upgrade |
| 404 NOT_FOUND on a detail endpoint | Record doesn't exist at your scope level | The record may belong to a different company, or the ID may be incorrect |
Empty data: [] on list endpoints | No records match your scope and filters | Broaden your date range or check your scope parameters |
| Missing fields in response | Fields with null database values | Null fields are included in responses with null values — check your parsing logic |
Support

For API key requests, plan changes, or technical support, email TBN- support@tbndrives.com
For endpoint-level field documentation, use the interactive Swagger UI at /docs on your API host.