Base URL
Production base URL:Authentication Model
Partner API credentials are scoped to the customer organization, allowed scopes, and key mode. After Trailflow enables test access for an organization, approved partner admins may create additionaltest keys in the authenticated partner
portal. live keys remain Trailflow-managed.
Send the key as a bearer token:
- organization-level access: not enabled, test access enabled, live access enabled, or disabled
- key-level mode:
testorlive
test keys. live keys are issued only for
approved production use.
Current supported scopes:
loads:readloads:writecustomers:readcarriers:readtracking:readwebhooks:manage
Route-to-scope mapping
GET /v1/loadsandGET /v1/loads/{id}requireloads:readPOST /v1/loads,POST /v1/loads/upsert, andPOST /v1/loads/{id}/statusrequireloads:writeGET /v1/customersrequirescustomers:readGET /v1/carriersrequirescarriers:readGET /v1/tracking/{loadId}requirestracking:readPOST /v1/webhooks,GET /v1/webhooks, andDELETE /v1/webhooks/{id}requirewebhooks:manage
Test And Live Behavior
Test and live credentials use the same base URL and contract shape.testkeys are for setup, UAT, and partner-side validation- approved partner admins may self-serve additional
testkeys after test access is enabled livekeys are for approved production traffic only- test traffic still executes against the same production API surface for the approved customer organization; Trailflow does not provide isolated sandbox data
- partners should use non-production webhook endpoints while validating with
testkeys - rate limits are configured per key and can differ by client regardless of mode
Required Request Headers
All requests:Authorization: Bearer <api key>Content-Type: application/jsonfor JSON request bodies
Idempotency-Key: <unique key>
Idempotency-Key today:
POST /v1/loadsPOST /v1/loads/upsertPOST /v1/loads/{id}/statusPOST /v1/webhooks
Idempotency Rules
Trailflow treatsIdempotency-Key as replay protection for those four POST routes.
Behavior:
- same key plus same request body: Trailflow replays the original response when the original ledger entry still exists
- same key plus different request body: Trailflow returns
409 idempotency_conflict - same key while the original request is still processing: Trailflow returns
409 idempotency_in_progress - rate limits are checked before replay lookup, so duplicate requests can still receive
429 rate_limited
24 hour idempotency replay window for those four POST
routes. Reusing the same key after that window starts a fresh request.
Rate Limits
Each API client has a server-side per-minute rate limit. Current policy:- default issuance target:
60requests per minute - allowed configured range:
1to600requests per minute - rate-limit responses use HTTP
429 - response error code:
rate_limited - rate-limited responses include
Retry-After: 60
429 responses. If sustained throughput needs differ from the initial integration posture, Trailflow must approve a higher limit explicitly.
Request Tracing
Every authenticated Partner API route returns arequestId on success and failure. The unauthenticated /health/api endpoint is the exception.
Example response envelope:
- customer organization
- request timestamp
- route called
- HTTP status code
requestId
Error Model
Errors are returned as JSON with a stable envelope:400 bad_request400 missing_idempotency_key401 unauthorized403 forbidden403 partner_access_not_enabled403 live_access_not_enabled403 partner_access_disabled404 not_found409 conflict409 idempotency_conflict409 idempotency_in_progress429 rate_limited500 internal_error