Download OpenAPI specification:
Machine-readable binding of the Transactional Data Specification (TCRP Report 210, 2020).
Request/response operations for booking demand-response trips between a requester (broker, coordinator tool or provider) and a provider: the core profile (SPEC.md §6–§8) and the transfer profile's tenders and holds (SPEC.md §10, operations marked x-profile: transfer). Events are delivered by signed webhook; see spec/asyncapi.yaml. Every mutating call requires an Idempotency-Key header.
Ask a provider to serve a trip. A provider that decides synchronously returns 201 with the trip OFFERED (or CONFIRMED, skipping the offer step). One that decides later returns 202 with the trip REQUESTED and reports the decision by event. Both are conformant. A synchronous refusal is a 422 whose code says why; the trip is then REJECTED.
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. Same as trip.trip_id. |
| requester_id required | string Identifier of the party requesting the trip. Must match the authenticated client. |
| provider_id required | string Identifier of the provider asked to serve the trip. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The requested leg. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes. Must not contain health or diagnosis information. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. |
| provider_trip_id | string Identifier assigned by the provider once it accepts the trip. |
| requester_id required | string Identifier of the party requesting the trip. |
| provider_id required | string Identifier of the party asked to serve the trip. |
| status required | string (trip-status) Enum: "REQUESTED" "OFFERED" "CONFIRMED" "SCHEDULED" "IN_PROGRESS" "COMPLETED" "FAILED" "REJECTED" "EXPIRED" "CANCELLED" "NO_SHOW" Current lifecycle state. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The trip's legs. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes, e.g. "call on arrival". Must not contain health or diagnosis information. |
| offer_expires_at | string <date-time> While the trip is OFFERED: the offer lapses (status EXPIRED) unless the requester confirms by then. Absent when offers don't expire. |
object (cancellation) Present when status is CANCELLED. | |
| created_at required | string <date-time> When the trip was created, RFC 3339 with offset. |
| updated_at required | string <date-time> When the trip last changed, RFC 3339 with offset. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. |
| provider_trip_id | string Identifier assigned by the provider once it accepts the trip. |
| requester_id required | string Identifier of the party requesting the trip. |
| provider_id required | string Identifier of the party asked to serve the trip. |
| status required | string (trip-status) Enum: "REQUESTED" "OFFERED" "CONFIRMED" "SCHEDULED" "IN_PROGRESS" "COMPLETED" "FAILED" "REJECTED" "EXPIRED" "CANCELLED" "NO_SHOW" Current lifecycle state. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The trip's legs. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes, e.g. "call on arrival". Must not contain health or diagnosis information. |
| offer_expires_at | string <date-time> While the trip is OFFERED: the offer lapses (status EXPIRED) unless the requester confirms by then. Absent when offers don't expire. |
object (cancellation) Present when status is CANCELLED. | |
| created_at required | string <date-time> When the trip was created, RFC 3339 with offset. |
| updated_at required | string <date-time> When the trip last changed, RFC 3339 with offset. |
{- "trip_id": "tr-20261103-0001",
- "requester_id": "throughride-demo",
- "provider_id": "aaata-a-ride",
- "rider_ref": {
- "rider_ref_id": "r-7f3a",
- "display_name": "Dana K.",
- "language": "en",
- "eligibility": [
- {
- "program": "ADA_PARATRANSIT",
- "attested_by": "aaata",
- "valid_until": "2027-06-30",
- "verification_method": "AGENCY_DETERMINATION",
- "verified_at": "2025-07-01"
}
]
}, - "party": {
- "companions": 0,
- "attendants": 1,
- "service_animals": 0
}, - "legs": [
- {
- "leg_id": "leg-1",
- "pickup": {
- "lat": 42.2808,
- "lon": -83.743,
- "name": "Blake Transit Center",
- "gtfs_stop_id": "BTC"
}, - "dropoff": {
- "lat": 42.6064,
- "lon": -83.1498,
- "name": "Corewell Health Troy",
- "access_notes": "Main entrance, Dequindre Rd side"
}, - "dropoff_window": {
- "earliest": "2026-11-03T10:15:00-05:00",
- "latest": "2026-11-03T10:45:00-05:00"
}, - "service_requirements": [
- "WHEELCHAIR_LIFT"
]
}
], - "fare_funding": {
- "fare": {
- "amount": "0.00",
- "currency": "USD"
}, - "funding_source": "SPONSOR",
- "sponsor_ref": "jfs-washtenaw"
}, - "notes_to_driver": "Call on arrival."
}{- "trip_id": "tr-20261103-0001",
- "provider_trip_id": "AR-558812",
- "requester_id": "throughride-demo",
- "provider_id": "aaata-a-ride",
- "status": "OFFERED",
- "rider_ref": {
- "rider_ref_id": "r-7f3a",
- "display_name": "Dana K.",
- "language": "en",
- "eligibility": [
- {
- "program": "ADA_PARATRANSIT",
- "attested_by": "aaata",
- "valid_until": "2027-06-30",
- "verification_method": "AGENCY_DETERMINATION",
- "verified_at": "2025-07-01"
}
]
}, - "party": {
- "companions": 0,
- "attendants": 1,
- "service_animals": 0
}, - "legs": [
- {
- "leg_id": "leg-1",
- "pickup": {
- "lat": 42.2808,
- "lon": -83.743,
- "name": "Blake Transit Center",
- "gtfs_stop_id": "BTC"
}, - "dropoff": {
- "lat": 42.6064,
- "lon": -83.1498,
- "name": "Corewell Health Troy",
- "access_notes": "Main entrance, Dequindre Rd side"
}, - "dropoff_window": {
- "earliest": "2026-11-03T10:15:00-05:00",
- "latest": "2026-11-03T10:45:00-05:00"
}, - "scheduled_pickup": "2026-11-03T09:20:00-05:00",
- "scheduled_dropoff": "2026-11-03T10:30:00-05:00",
- "service_requirements": [
- "WHEELCHAIR_LIFT"
]
}
], - "fare_funding": {
- "fare": {
- "amount": "0.00",
- "currency": "USD"
}, - "funding_source": "SPONSOR",
- "sponsor_ref": "jfs-washtenaw"
}, - "notes_to_driver": "Call on arrival.",
- "created_at": "2026-10-30T14:02:11-04:00",
- "updated_at": "2026-10-30T14:02:12-04:00"
}Current state of a trip, including scheduled times and vehicle once known.
| trip_id required | string The requester-assigned trip_id. Scoped to the authenticated requester. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. |
| provider_trip_id | string Identifier assigned by the provider once it accepts the trip. |
| requester_id required | string Identifier of the party requesting the trip. |
| provider_id required | string Identifier of the party asked to serve the trip. |
| status required | string (trip-status) Enum: "REQUESTED" "OFFERED" "CONFIRMED" "SCHEDULED" "IN_PROGRESS" "COMPLETED" "FAILED" "REJECTED" "EXPIRED" "CANCELLED" "NO_SHOW" Current lifecycle state. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The trip's legs. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes, e.g. "call on arrival". Must not contain health or diagnosis information. |
| offer_expires_at | string <date-time> While the trip is OFFERED: the offer lapses (status EXPIRED) unless the requester confirms by then. Absent when offers don't expire. |
object (cancellation) Present when status is CANCELLED. | |
| created_at required | string <date-time> When the trip was created, RFC 3339 with offset. |
| updated_at required | string <date-time> When the trip last changed, RFC 3339 with offset. |
{- "trip_id": "tr-20261103-0001",
- "provider_trip_id": "AR-558812",
- "requester_id": "throughride-demo",
- "provider_id": "aaata-a-ride",
- "status": "SCHEDULED",
- "rider_ref": {
- "rider_ref_id": "r-7f3a",
- "display_name": "Dana K.",
- "language": "en",
- "eligibility": [
- {
- "program": "ADA_PARATRANSIT",
- "attested_by": "aaata",
- "valid_until": "2027-06-30",
- "verification_method": "AGENCY_DETERMINATION",
- "verified_at": "2025-07-01"
}
]
}, - "party": {
- "companions": 0,
- "attendants": 1,
- "service_animals": 0
}, - "legs": [
- {
- "leg_id": "leg-1",
- "pickup": {
- "lat": 42.2808,
- "lon": -83.743,
- "name": "Blake Transit Center",
- "gtfs_stop_id": "BTC"
}, - "dropoff": {
- "lat": 42.6064,
- "lon": -83.1498,
- "name": "Corewell Health Troy",
- "access_notes": "Main entrance, Dequindre Rd side"
}, - "dropoff_window": {
- "earliest": "2026-11-03T10:15:00-05:00",
- "latest": "2026-11-03T10:45:00-05:00"
}, - "scheduled_pickup": "2026-11-03T09:20:00-05:00",
- "scheduled_dropoff": "2026-11-03T10:30:00-05:00",
- "service_requirements": [
- "WHEELCHAIR_LIFT"
], - "vehicle_ref": {
- "vehicle_id": "veh-214",
- "description": "White Ford Transit, #214",
- "plate": "ABC1234"
}
}
], - "fare_funding": {
- "fare": {
- "amount": "0.00",
- "currency": "USD"
}, - "funding_source": "SPONSOR",
- "sponsor_ref": "jfs-washtenaw"
}, - "notes_to_driver": "Call on arrival.",
- "created_at": "2026-10-30T14:02:11-04:00",
- "updated_at": "2026-11-02T16:40:05-05:00"
}Change windows, party or driver notes. The provider may accept (200, status unchanged or CONFIRMED), re-offer (200, status OFFERED), or decide later (202). If it refuses, the trip keeps its previous terms and the response is 422.
| trip_id required | string The requester-assigned trip_id. Scoped to the authenticated requester. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
object (time-window) New requested pickup window. | |
object (time-window) New requested dropoff window. | |
object (party) New party counts; replaces the previous party object. | |
| notes_to_driver | string <= 500 characters Replacement driver notes. Must not contain health or diagnosis information. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. |
| provider_trip_id | string Identifier assigned by the provider once it accepts the trip. |
| requester_id required | string Identifier of the party requesting the trip. |
| provider_id required | string Identifier of the party asked to serve the trip. |
| status required | string (trip-status) Enum: "REQUESTED" "OFFERED" "CONFIRMED" "SCHEDULED" "IN_PROGRESS" "COMPLETED" "FAILED" "REJECTED" "EXPIRED" "CANCELLED" "NO_SHOW" Current lifecycle state. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The trip's legs. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes, e.g. "call on arrival". Must not contain health or diagnosis information. |
| offer_expires_at | string <date-time> While the trip is OFFERED: the offer lapses (status EXPIRED) unless the requester confirms by then. Absent when offers don't expire. |
object (cancellation) Present when status is CANCELLED. | |
| created_at required | string <date-time> When the trip was created, RFC 3339 with offset. |
| updated_at required | string <date-time> When the trip last changed, RFC 3339 with offset. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. |
| provider_trip_id | string Identifier assigned by the provider once it accepts the trip. |
| requester_id required | string Identifier of the party requesting the trip. |
| provider_id required | string Identifier of the party asked to serve the trip. |
| status required | string (trip-status) Enum: "REQUESTED" "OFFERED" "CONFIRMED" "SCHEDULED" "IN_PROGRESS" "COMPLETED" "FAILED" "REJECTED" "EXPIRED" "CANCELLED" "NO_SHOW" Current lifecycle state. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The trip's legs. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes, e.g. "call on arrival". Must not contain health or diagnosis information. |
| offer_expires_at | string <date-time> While the trip is OFFERED: the offer lapses (status EXPIRED) unless the requester confirms by then. Absent when offers don't expire. |
object (cancellation) Present when status is CANCELLED. | |
| created_at required | string <date-time> When the trip was created, RFC 3339 with offset. |
| updated_at required | string <date-time> When the trip last changed, RFC 3339 with offset. |
{- "pickup_window": {
- "earliest": "2019-08-24T14:15:22Z",
- "latest": "2019-08-24T14:15:22Z",
- "preferred": "2019-08-24T14:15:22Z"
}, - "dropoff_window": {
- "earliest": "2019-08-24T14:15:22Z",
- "latest": "2019-08-24T14:15:22Z",
- "preferred": "2019-08-24T14:15:22Z"
}, - "party": {
- "companions": 0,
- "attendants": 0,
- "service_animals": 0
}, - "notes_to_driver": "string"
}{- "trip_id": "string",
- "provider_trip_id": "string",
- "requester_id": "string",
- "provider_id": "string",
- "status": "REQUESTED",
- "rider_ref": {
- "rider_ref_id": "string",
- "display_name": "string",
- "contact": {
- "phone": "string"
}, - "contact_consent": false,
- "language": "string",
- "eligibility": [
- {
- "program": "string",
- "attested_by": "string",
- "valid_until": "2019-08-24",
- "verification_method": "STAFF_VERIFIED",
- "verified_at": "2019-08-24",
- "verifier_ref": "string"
}
]
}, - "party": {
- "companions": 0,
- "attendants": 0,
- "service_animals": 0
}, - "legs": [
- {
- "leg_id": "string",
- "pickup": {
- "lat": -90,
- "lon": -180,
- "name": "string",
- "address": {
- "street": "string",
- "city": "string",
- "region": "string",
- "postal_code": "string",
- "country": "string"
}, - "gtfs_stop_id": "string",
- "flex_location_id": "string",
- "access_notes": "string"
}, - "dropoff": {
- "lat": -90,
- "lon": -180,
- "name": "string",
- "address": {
- "street": "string",
- "city": "string",
- "region": "string",
- "postal_code": "string",
- "country": "string"
}, - "gtfs_stop_id": "string",
- "flex_location_id": "string",
- "access_notes": "string"
}, - "pickup_window": {
- "earliest": "2019-08-24T14:15:22Z",
- "latest": "2019-08-24T14:15:22Z",
- "preferred": "2019-08-24T14:15:22Z"
}, - "dropoff_window": {
- "earliest": "2019-08-24T14:15:22Z",
- "latest": "2019-08-24T14:15:22Z",
- "preferred": "2019-08-24T14:15:22Z"
}, - "scheduled_pickup": "2019-08-24T14:15:22Z",
- "scheduled_dropoff": "2019-08-24T14:15:22Z",
- "service_requirements": [
- "WHEELCHAIR_LIFT"
], - "vehicle_ref": {
- "vehicle_id": "string",
- "description": "string",
- "plate": "string"
}
}
], - "fare_funding": {
- "fare": {
- "amount": "string",
- "currency": "string"
}, - "funding_source": "RIDER",
- "sponsor_ref": "string",
- "authorization_ref": "string"
}, - "notes_to_driver": "string",
- "offer_expires_at": "2019-08-24T14:15:22Z",
- "cancellation": {
- "reason": "RIDER_REQUEST",
- "cancelled_by": "REQUESTER",
- "detail": "string",
- "cancelled_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Accept the provider's offer. Only valid while the trip is OFFERED.
| trip_id required | string The requester-assigned trip_id. Scoped to the authenticated requester. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. |
| provider_trip_id | string Identifier assigned by the provider once it accepts the trip. |
| requester_id required | string Identifier of the party requesting the trip. |
| provider_id required | string Identifier of the party asked to serve the trip. |
| status required | string (trip-status) Enum: "REQUESTED" "OFFERED" "CONFIRMED" "SCHEDULED" "IN_PROGRESS" "COMPLETED" "FAILED" "REJECTED" "EXPIRED" "CANCELLED" "NO_SHOW" Current lifecycle state. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The trip's legs. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes, e.g. "call on arrival". Must not contain health or diagnosis information. |
| offer_expires_at | string <date-time> While the trip is OFFERED: the offer lapses (status EXPIRED) unless the requester confirms by then. Absent when offers don't expire. |
object (cancellation) Present when status is CANCELLED. | |
| created_at required | string <date-time> When the trip was created, RFC 3339 with offset. |
| updated_at required | string <date-time> When the trip last changed, RFC 3339 with offset. |
{- "trip_id": "tr-20261103-0001",
- "provider_trip_id": "AR-558812",
- "requester_id": "throughride-demo",
- "provider_id": "aaata-a-ride",
- "status": "CONFIRMED",
- "rider_ref": {
- "rider_ref_id": "r-7f3a",
- "display_name": "Dana K.",
- "language": "en",
- "eligibility": [
- {
- "program": "ADA_PARATRANSIT",
- "attested_by": "aaata",
- "valid_until": "2027-06-30",
- "verification_method": "AGENCY_DETERMINATION",
- "verified_at": "2025-07-01"
}
]
}, - "party": {
- "companions": 0,
- "attendants": 1,
- "service_animals": 0
}, - "legs": [
- {
- "leg_id": "leg-1",
- "pickup": {
- "lat": 42.2808,
- "lon": -83.743,
- "name": "Blake Transit Center",
- "gtfs_stop_id": "BTC"
}, - "dropoff": {
- "lat": 42.6064,
- "lon": -83.1498,
- "name": "Corewell Health Troy",
- "access_notes": "Main entrance, Dequindre Rd side"
}, - "dropoff_window": {
- "earliest": "2026-11-03T10:15:00-05:00",
- "latest": "2026-11-03T10:45:00-05:00"
}, - "scheduled_pickup": "2026-11-03T09:20:00-05:00",
- "scheduled_dropoff": "2026-11-03T10:30:00-05:00",
- "service_requirements": [
- "WHEELCHAIR_LIFT"
]
}
], - "fare_funding": {
- "fare": {
- "amount": "0.00",
- "currency": "USD"
}, - "funding_source": "SPONSOR",
- "sponsor_ref": "jfs-washtenaw"
}, - "notes_to_driver": "Call on arrival.",
- "created_at": "2026-10-30T14:02:11-04:00",
- "updated_at": "2026-10-30T14:05:40-04:00"
}Cancel a trip that has not reached a terminal state. The response carries the trip with status CANCELLED and a cancellation record.
| trip_id required | string The requester-assigned trip_id. Scoped to the authenticated requester. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| reason required | string (cancel-reason) Enum: "RIDER_REQUEST" "PROVIDER_UNABLE" "DUPLICATE" "MISSED_CONNECTION" "OTHER" Why the trip is cancelled. |
| detail | string <= 500 characters Optional free-text explanation. Must not contain health or diagnosis information. |
| trip_id required | string Identifier assigned by the requester; unique per requester_id. |
| provider_trip_id | string Identifier assigned by the provider once it accepts the trip. |
| requester_id required | string Identifier of the party requesting the trip. |
| provider_id required | string Identifier of the party asked to serve the trip. |
| status required | string (trip-status) Enum: "REQUESTED" "OFFERED" "CONFIRMED" "SCHEDULED" "IN_PROGRESS" "COMPLETED" "FAILED" "REJECTED" "EXPIRED" "CANCELLED" "NO_SHOW" Current lifecycle state. |
required | object (rider) The rider, by reference. |
object (party) Others travelling with the rider. | |
required | Array of Leg (object) or Leg (object) (Leg) = 1 items The trip's legs. Core requires exactly one. |
object (fare-funding) Fare and funding details for settlement. | |
| notes_to_driver | string <= 500 characters Free-text operational notes, e.g. "call on arrival". Must not contain health or diagnosis information. |
| offer_expires_at | string <date-time> While the trip is OFFERED: the offer lapses (status EXPIRED) unless the requester confirms by then. Absent when offers don't expire. |
object (cancellation) Present when status is CANCELLED. | |
| created_at required | string <date-time> When the trip was created, RFC 3339 with offset. |
| updated_at required | string <date-time> When the trip last changed, RFC 3339 with offset. |
{- "reason": "RIDER_REQUEST"
}{- "trip_id": "tr-20261105-0007",
- "requester_id": "throughride-demo",
- "provider_id": "aaata-a-ride",
- "rider_ref": {
- "rider_ref_id": "r-91c2",
- "display_name": "Luis",
- "contact": {
- "phone": "+17345550123"
}, - "contact_consent": true,
- "language": "es"
}, - "legs": [
- {
- "leg_id": "leg-1",
- "pickup": {
- "lat": 42.2459,
- "lon": -83.6157,
- "name": "Ypsilanti Transit Center",
- "gtfs_stop_id": "YTC"
}, - "dropoff": {
- "lat": 42.277,
- "lon": -83.7382,
- "name": "Ann Arbor District Library, Downtown"
}, - "pickup_window": {
- "earliest": "2026-11-05T13:00:00-05:00",
- "preferred": "2026-11-05T13:15:00-05:00",
- "latest": "2026-11-05T13:30:00-05:00"
}
}
], - "fare_funding": {
- "fare": {
- "amount": "2.50",
- "currency": "USD"
}, - "funding_source": "RIDER"
}, - "status": "CANCELLED",
- "created_at": "2026-11-02T17:40:00-05:00",
- "updated_at": "2026-11-02T18:05:00-05:00",
- "cancellation": {
- "reason": "RIDER_REQUEST",
- "cancelled_by": "REQUESTER",
- "cancelled_at": "2026-11-02T18:05:00-05:00"
}
}The authenticated requester's current subscriptions, oldest first, without signing secrets (SPEC.md §9.3). Use it to find subscriptions to change or end, e.g. duplicates made before PATCH was available. Optional for providers: those that implement it declare subscription_management: true on /health.
required | Array of objects (Subscription) The requester's current subscriptions, oldest first; empty if it has none. |
{- "subscriptions": [
- {
- "subscription_id": "sub-12",
- "event_types": [
- "TRIP_STATUS_CHANGED",
- "TRIP_SCHEDULED",
- "TRIP_CANCELLED",
- "TENDER_RESPONSE",
- "HOLD_RESPONSE",
- "MILESTONE",
- "ETA_UPDATE"
], - "signing_secret_id": "sec-1",
- "created_at": "2026-10-30T13:00:00-04:00",
- "updated_at": "2026-11-09T09:00:00-05:00"
}
]
}Register a callback URL for trip events. The response carries the signing secret once; events are signed with Standard Webhooks headers (webhook-signature) and the deprecated X-TDS-Signature (SPEC.md §9, §12). With cloudevents: true, deliveries also carry CloudEvents binary-mode ce-* headers (SPEC.md §9.1). Providers that declare secret_rotation: true on /health also return signing_secret_id and mint later secrets with POST /subscriptions/{subscription_id}/secrets (SPEC.md §12.1). Providers that declare subscription_management: true let the subscriber change the event types or callback later with PATCH /subscriptions/{subscription_id} instead of subscribing again (SPEC.md §9.3).
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| callback_url required | string <uri> ^(https://|http://(localhost|127\.0\.0\.1)(:[... HTTPS URL the provider POSTs events to. Plain http is allowed only for loopback addresses (localhost, 127.0.0.1), for development and the conformance kit's local receiver. |
| event_types required | Array of strings (event-types) non-empty unique Items Enum: "TRIP_STATUS_CHANGED" "TRIP_SCHEDULED" "TRIP_CANCELLED" "TENDER_RESPONSE" "HOLD_RESPONSE" "MILESTONE" "ETA_UPDATE" "CUSTODY_HANDOFF" "EXCEPTION_RAISED" "EXCEPTION_RESOLVED" Event types to deliver. |
| cloudevents | boolean Default: false Ask for CloudEvents 1.0 binary-mode |
| subscription_id required | string Provider-assigned identifier of the subscription. |
| callback_url required | string <uri> HTTPS URL the provider POSTs events to. |
| event_types required | Array of strings (event-types) non-empty unique Items Enum: "TRIP_STATUS_CHANGED" "TRIP_SCHEDULED" "TRIP_CANCELLED" "TENDER_RESPONSE" "HOLD_RESPONSE" "MILESTONE" "ETA_UPDATE" "CUSTODY_HANDOFF" "EXCEPTION_RAISED" "EXCEPTION_RESOLVED" Event types delivered to this subscription. |
| signing_secret | string >= 32 characters Shared secret for the webhook signatures (SPEC.md §12). Returned only in the response that creates the subscription (and its replay under the same Idempotency-Key), never by GET, PATCH or DELETE (SPEC.md §9.3). Providers SHOULD issue it as a Standard Webhooks secret: |
| signing_secret_id | string non-empty Identifier of signing_secret among the subscription's secrets (SPEC.md §12.1), for providers that support rotating secrets with |
| cloudevents | boolean Default: false True if every delivery carries CloudEvents 1.0 binary-mode |
| created_at required | string <date-time> When the subscription was created, RFC 3339 with offset. |
| updated_at | string <date-time> When the subscription was last changed with |
{- "event_types": [
- "TRIP_STATUS_CHANGED",
- "TRIP_SCHEDULED",
- "TRIP_CANCELLED"
]
}{- "subscription_id": "sub-01",
- "event_types": [
- "TRIP_STATUS_CHANGED",
- "TRIP_SCHEDULED",
- "TRIP_CANCELLED"
], - "signing_secret": "whsec_demo_9f8b2c4e1a7d6f3b5c0e8a2d4f6b1c3e",
- "created_at": "2026-10-30T13:00:00-04:00"
}The subscription's callback, event types and settings (SPEC.md §9.3), without its signing secret. Optional for providers: those that implement it declare subscription_management: true on /health.
| subscription_id required | string The provider-assigned subscription_id. Scoped to the authenticated requester: another client's subscription is NOT_FOUND. |
| subscription_id required | string Provider-assigned identifier of the subscription. |
| callback_url required | string <uri> HTTPS URL the provider POSTs events to. |
| event_types required | Array of strings (event-types) non-empty unique Items Enum: "TRIP_STATUS_CHANGED" "TRIP_SCHEDULED" "TRIP_CANCELLED" "TENDER_RESPONSE" "HOLD_RESPONSE" "MILESTONE" "ETA_UPDATE" "CUSTODY_HANDOFF" "EXCEPTION_RAISED" "EXCEPTION_RESOLVED" Event types delivered to this subscription. |
| signing_secret | string >= 32 characters Shared secret for the webhook signatures (SPEC.md §12). Returned only in the response that creates the subscription (and its replay under the same Idempotency-Key), never by GET, PATCH or DELETE (SPEC.md §9.3). Providers SHOULD issue it as a Standard Webhooks secret: |
| signing_secret_id | string non-empty Identifier of signing_secret among the subscription's secrets (SPEC.md §12.1), for providers that support rotating secrets with |
| cloudevents | boolean Default: false True if every delivery carries CloudEvents 1.0 binary-mode |
| created_at required | string <date-time> When the subscription was created, RFC 3339 with offset. |
| updated_at | string <date-time> When the subscription was last changed with |
{- "subscription_id": "sub-12",
- "event_types": [
- "TRIP_STATUS_CHANGED",
- "TRIP_SCHEDULED",
- "TRIP_CANCELLED",
- "TENDER_RESPONSE",
- "HOLD_RESPONSE",
- "MILESTONE"
], - "signing_secret_id": "sec-1",
- "created_at": "2026-10-30T13:00:00-04:00"
}Replace the subscription's event types, callback URL or CloudEvents setting (SPEC.md §9.3); fields left out keep their values, and event_types is replaced as a whole. The subscription_id, signing secrets and secret ids do not change, so deliveries keep verifying with the secret the subscriber already holds. Events raised after the response follow the new settings. A retry with the same Idempotency-Key returns the same answer. Optional for providers: those that implement it declare subscription_management: true on /health.
| subscription_id required | string The provider-assigned subscription_id. Scoped to the authenticated requester: another client's subscription is NOT_FOUND. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| callback_url required | string <uri> ^(https://|http://(localhost|127\.0\.0\.1)(:[... New HTTPS URL to POST events to, with the same rules as on |
| event_types | Array of strings (event-types) non-empty unique Items Enum: "TRIP_STATUS_CHANGED" "TRIP_SCHEDULED" "TRIP_CANCELLED" "TENDER_RESPONSE" "HOLD_RESPONSE" "MILESTONE" "ETA_UPDATE" "CUSTODY_HANDOFF" "EXCEPTION_RAISED" "EXCEPTION_RESOLVED" The complete new set of event types to deliver. It replaces the current set as a whole, so to add one type send the current types plus the new one (read them with |
| cloudevents | boolean Ask for (true) or stop asking for (false) CloudEvents binary-mode |
| subscription_id required | string Provider-assigned identifier of the subscription. |
| callback_url required | string <uri> HTTPS URL the provider POSTs events to. |
| event_types required | Array of strings (event-types) non-empty unique Items Enum: "TRIP_STATUS_CHANGED" "TRIP_SCHEDULED" "TRIP_CANCELLED" "TENDER_RESPONSE" "HOLD_RESPONSE" "MILESTONE" "ETA_UPDATE" "CUSTODY_HANDOFF" "EXCEPTION_RAISED" "EXCEPTION_RESOLVED" Event types delivered to this subscription. |
| signing_secret | string >= 32 characters Shared secret for the webhook signatures (SPEC.md §12). Returned only in the response that creates the subscription (and its replay under the same Idempotency-Key), never by GET, PATCH or DELETE (SPEC.md §9.3). Providers SHOULD issue it as a Standard Webhooks secret: |
| signing_secret_id | string non-empty Identifier of signing_secret among the subscription's secrets (SPEC.md §12.1), for providers that support rotating secrets with |
| cloudevents | boolean Default: false True if every delivery carries CloudEvents 1.0 binary-mode |
| created_at required | string <date-time> When the subscription was created, RFC 3339 with offset. |
| updated_at | string <date-time> When the subscription was last changed with |
{- "event_types": [
- "TRIP_STATUS_CHANGED",
- "TRIP_SCHEDULED",
- "TRIP_CANCELLED",
- "TENDER_RESPONSE",
- "HOLD_RESPONSE",
- "MILESTONE",
- "ETA_UPDATE"
]
}{- "subscription_id": "sub-12",
- "event_types": [
- "TRIP_STATUS_CHANGED",
- "TRIP_SCHEDULED",
- "TRIP_CANCELLED",
- "TENDER_RESPONSE",
- "HOLD_RESPONSE",
- "MILESTONE",
- "ETA_UPDATE"
], - "signing_secret_id": "sec-1",
- "created_at": "2026-10-30T13:00:00-04:00",
- "updated_at": "2026-11-09T09:00:00-05:00"
}End the subscription (SPEC.md §9.3): no delivery attempt to it starts after the response, retries of earlier events included, and its signing secrets stop being used. Reading, changing or ending it again is NOT_FOUND; a retry with the same Idempotency-Key returns the same answer. Optional for providers: those that implement it declare subscription_management: true on /health.
| subscription_id required | string The provider-assigned subscription_id. Scoped to the authenticated requester: another client's subscription is NOT_FOUND. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| subscription_id required | string Provider-assigned identifier of the subscription. |
| callback_url required | string <uri> HTTPS URL the provider POSTs events to. |
| event_types required | Array of strings (event-types) non-empty unique Items Enum: "TRIP_STATUS_CHANGED" "TRIP_SCHEDULED" "TRIP_CANCELLED" "TENDER_RESPONSE" "HOLD_RESPONSE" "MILESTONE" "ETA_UPDATE" "CUSTODY_HANDOFF" "EXCEPTION_RAISED" "EXCEPTION_RESOLVED" Event types delivered to this subscription. |
| signing_secret | string >= 32 characters Shared secret for the webhook signatures (SPEC.md §12). Returned only in the response that creates the subscription (and its replay under the same Idempotency-Key), never by GET, PATCH or DELETE (SPEC.md §9.3). Providers SHOULD issue it as a Standard Webhooks secret: |
| signing_secret_id | string non-empty Identifier of signing_secret among the subscription's secrets (SPEC.md §12.1), for providers that support rotating secrets with |
| cloudevents | boolean Default: false True if every delivery carries CloudEvents 1.0 binary-mode |
| created_at required | string <date-time> When the subscription was created, RFC 3339 with offset. |
| updated_at | string <date-time> When the subscription was last changed with |
{- "subscription_id": "sub-12",
- "event_types": [
- "TRIP_STATUS_CHANGED",
- "TRIP_SCHEDULED",
- "TRIP_CANCELLED",
- "TENDER_RESPONSE",
- "HOLD_RESPONSE",
- "MILESTONE",
- "ETA_UPDATE"
], - "signing_secret_id": "sec-1",
- "created_at": "2026-10-30T13:00:00-04:00",
- "updated_at": "2026-11-09T09:00:00-05:00"
}Mint a new signing secret for the subscription (SPEC.md §12.1). The response carries the new value once, as the first entry; older secrets stay valid until their expires_at (now + overlap_s, or the provider's default overlap), and until then every delivery carries a webhook-signature entry for each active secret, newest first, while X-TDS-Signature uses the newest. A retry with the same Idempotency-Key returns the same new secret. Optional for providers: those that implement it declare secret_rotation: true on /health.
| subscription_id required | string The provider-assigned subscription_id. Scoped to the authenticated requester: another client's subscription is NOT_FOUND. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| overlap_s | integer [ 0 .. 2592000 ] How long, in seconds from now, the subscription's older secrets stay valid alongside the new one. 0 retires them at once (for a leaked secret). Absent: the provider's default, which SHOULD be 86400 (24 hours). A provider MAY shorten it to its own maximum, which SHOULD be at least 86400; it never lengthens it, and never extends an older secret's existing expires_at. The response's expires_at values say what applies. |
| subscription_id required | string The subscription these secrets sign for. |
required | Array of objects (SubscriptionSecret) non-empty Active secrets, newest first. The first has no expires_at; every other one has. The sender signs each delivery with all of them. |
{- "overlap_s": 86400
}{- "subscription_id": "sub-07",
- "secrets": [
- {
- "secret_id": "sec-02",
- "signing_secret": "whsec_1WNy36llSMlCdz1DmnU4LvvPLdPydBGDi759pN8lE9I=",
- "created_at": "2026-11-02T09:00:00-05:00"
}, - {
- "secret_id": "sec-01",
- "created_at": "2026-10-30T13:00:00-04:00",
- "expires_at": "2026-11-03T09:00:00-05:00"
}
]
}The subscription's active secrets, newest first, with ids and expiry times but never their values (SPEC.md §12.1).
| subscription_id required | string The provider-assigned subscription_id. Scoped to the authenticated requester: another client's subscription is NOT_FOUND. |
| subscription_id required | string The subscription these secrets sign for. |
required | Array of objects (SubscriptionSecret) non-empty Active secrets, newest first. The first has no expires_at; every other one has. The sender signs each delivery with all of them. |
{- "subscription_id": "sub-07",
- "secrets": [
- {
- "secret_id": "sec-02",
- "created_at": "2026-11-02T09:00:00-05:00"
}, - {
- "secret_id": "sec-01",
- "created_at": "2026-10-30T13:00:00-04:00",
- "expires_at": "2026-11-03T09:00:00-05:00"
}
]
}Stop signing with an older secret now, before its expires_at, once the receiver verifies with the newer one (SPEC.md §12.1). The newest secret cannot be retired; rotate first. Retiring a secret that has already expired changes nothing and returns it.
| subscription_id required | string The provider-assigned subscription_id. Scoped to the authenticated requester: another client's subscription is NOT_FOUND. |
| secret_id required | string The provider-assigned secret_id of one of the subscription's signing secrets. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| secret_id required | string non-empty Provider-assigned identifier of the secret, unique within the subscription. Not secret; use it to retire the secret early. |
| signing_secret | string >= 32 characters The secret value, in the same form as the subscription's signing_secret ( |
| created_at required | string <date-time> When the secret was created, RFC 3339 with offset. |
| expires_at | string <date-time> When the sender stops signing with this secret, RFC 3339 with offset. Absent on the newest secret, which does not expire until another one replaces it. Deliveries sent at or after this moment carry no signature made with this secret. |
{- "secret_id": "sec-01",
- "created_at": "2026-10-30T13:00:00-04:00",
- "expires_at": "2026-11-02T12:00:00-05:00"
}Sent to the outbound provider when the inbound leg's ETA threatens the connection (SPEC.md §10.5). Answered at once (201: GRANTED, PARTIAL or DENIED) or later (202 PENDING, then a HOLD_RESPONSE event); unanswered by respond_by, the hold is EXPIRED. GRANTED and PARTIAL also update the trip's scheduled_pickup and emit TRIP_SCHEDULED.
| trip_id required | string The requester-assigned trip_id. Scoped to the authenticated requester. |
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| hold_id required | string Broker-assigned identifier, unique per requester. |
| interchange_id required | string The interchange whose outbound leg is this trip. |
| action required | string Enum: "HOLD" "RETIME" HOLD (wait) or RETIME (move the pickup). |
| requested_until required | string <date-time> HOLD: wait until this time. RETIME: the proposed new pickup time. |
| respond_by required | string <date-time> Deadline for an answer. Unanswered by then, the hold is EXPIRED. |
object (eta-band) The inbound leg's latest ETA band, so the provider can judge the request. |
| hold_id required | string Broker-assigned hold identifier. |
| trip_id required | string The outbound trip. |
| interchange_id required | string The interchange being protected. |
| action required | string Enum: "HOLD" "RETIME" What was asked. |
| requested_until required | string <date-time> As in the request. |
| respond_by required | string <date-time> As in the request. |
| status required | string Enum: "PENDING" "GRANTED" "PARTIAL" "DENIED" "EXPIRED" Hold lifecycle state. |
| scheduled_pickup | string <date-time> Outbound pickup time after the decision (GRANTED or PARTIAL). |
| held_until | string <date-time> Latest time the vehicle will wait at the transfer point, if different from scheduled_pickup. |
| reason | string Enum: "EXCEEDS_MAX_HOLD" "DOWNSTREAM_COMMITMENT" "DRIVER_HOURS" "OTHER" Why the hold was denied or only partly granted. |
| created_at required | string <date-time> When the provider received the request. |
| responded_at | string <date-time> When the provider answered or the hold expired. |
| hold_id required | string Broker-assigned hold identifier. |
| trip_id required | string The outbound trip. |
| interchange_id required | string The interchange being protected. |
| action required | string Enum: "HOLD" "RETIME" What was asked. |
| requested_until required | string <date-time> As in the request. |
| respond_by required | string <date-time> As in the request. |
| status required | string Enum: "PENDING" "GRANTED" "PARTIAL" "DENIED" "EXPIRED" Hold lifecycle state. |
| scheduled_pickup | string <date-time> Outbound pickup time after the decision (GRANTED or PARTIAL). |
| held_until | string <date-time> Latest time the vehicle will wait at the transfer point, if different from scheduled_pickup. |
| reason | string Enum: "EXCEEDS_MAX_HOLD" "DOWNSTREAM_COMMITMENT" "DRIVER_HOURS" "OTHER" Why the hold was denied or only partly granted. |
| created_at required | string <date-time> When the provider received the request. |
| responded_at | string <date-time> When the provider answered or the hold expired. |
{- "hold_id": "hd-hold-1",
- "interchange_id": "ix-hold",
- "action": "HOLD",
- "requested_until": "2026-11-10T09:50:00-05:00",
- "respond_by": "2026-11-10T09:11:00-05:00",
- "inbound_eta": {
- "target": "DROPOFF",
- "earliest": "2026-11-10T09:42:00-05:00",
- "likely": "2026-11-10T09:45:00-05:00",
- "latest": "2026-11-10T09:57:30-05:00",
- "confidence": 0.7,
- "computed_at": "2026-11-10T09:05:00-05:00",
- "source": "VEHICLE_POSITION",
- "delay_cause": "TRAFFIC"
}
}{- "hold_id": "hd-hold-1",
- "trip_id": "tr-hold-b",
- "interchange_id": "ix-hold",
- "action": "HOLD",
- "requested_until": "2026-11-10T09:50:00-05:00",
- "respond_by": "2026-11-10T09:11:00-05:00",
- "status": "GRANTED",
- "created_at": "2026-11-10T09:06:00-05:00",
- "scheduled_pickup": "2026-11-10T09:50:00-05:00",
- "held_until": "2026-11-10T09:50:00-05:00",
- "responded_at": "2026-11-10T09:06:00-05:00"
}Current state of a hold request.
| trip_id required | string The requester-assigned trip_id. Scoped to the authenticated requester. |
| hold_id required | string The broker-assigned hold_id. Scoped to the authenticated requester. |
| hold_id required | string Broker-assigned hold identifier. |
| trip_id required | string The outbound trip. |
| interchange_id required | string The interchange being protected. |
| action required | string Enum: "HOLD" "RETIME" What was asked. |
| requested_until required | string <date-time> As in the request. |
| respond_by required | string <date-time> As in the request. |
| status required | string Enum: "PENDING" "GRANTED" "PARTIAL" "DENIED" "EXPIRED" Hold lifecycle state. |
| scheduled_pickup | string <date-time> Outbound pickup time after the decision (GRANTED or PARTIAL). |
| held_until | string <date-time> Latest time the vehicle will wait at the transfer point, if different from scheduled_pickup. |
| reason | string Enum: "EXCEEDS_MAX_HOLD" "DOWNSTREAM_COMMITMENT" "DRIVER_HOURS" "OTHER" Why the hold was denied or only partly granted. |
| created_at required | string <date-time> When the provider received the request. |
| responded_at | string <date-time> When the provider answered or the hold expired. |
{- "hold_id": "hd-hold-1",
- "trip_id": "tr-hold-b",
- "interchange_id": "ix-hold",
- "action": "HOLD",
- "requested_until": "2026-11-10T09:50:00-05:00",
- "respond_by": "2026-11-10T09:11:00-05:00",
- "status": "GRANTED",
- "created_at": "2026-11-10T09:06:00-05:00",
- "scheduled_pickup": "2026-11-10T09:50:00-05:00",
- "held_until": "2026-11-10T09:50:00-05:00",
- "responded_at": "2026-11-10T09:06:00-05:00"
}Offer this provider one leg of a linked journey with the interchange terms and a deadline (SPEC.md §10.2). A provider that decides at once returns 201 with the tender ACCEPTED (the trip now exists, CONFIRMED, under trip.trip_id) or REJECTED. One that decides later returns 202 OFFERED and reports the answer in a TENDER_RESPONSE event; unanswered by respond_by, the tender becomes EXPIRED. Both are conformant.
| Idempotency-Key required | string [ 8 .. 128 ] characters Client-generated key (e.g. a UUID) making the request safe to retry. A repeat with the same key and body returns the original response; the same key with a different body is rejected with IDEMPOTENCY_KEY_REUSED. Keys are scoped to the authenticated requester and kept for at least 24 hours. |
| tender_id required | string Broker-assigned identifier, unique per requester. |
required | object (trip-request) The trip being offered. Its leg must be the interchange's from or to leg for this provider. |
required | object (interchange) The connection this leg is part of, including the terms the provider is asked to commit to. |
| respond_by required | string <date-time> Deadline for the provider's answer. Unanswered by then, the tender is EXPIRED. |
| tender_id required | string Broker-assigned tender identifier. |
| trip_id required | string The offered trip's trip_id; on ACCEPTED, the trip exists under this id. |
| interchange_id required | string The interchange the leg belongs to. |
| respond_by required | string <date-time> Deadline for the provider's answer. |
| status required | string Enum: "OFFERED" "ACCEPTED" "REJECTED" "EXPIRED" Tender lifecycle state. |
| reason | string (refusal-reason) Enum: "NO_CAPACITY" "OUTSIDE_SERVICE_AREA" "OUTSIDE_SERVICE_HOURS" "ELIGIBILITY_REQUIRED" "ELIGIBILITY_NOT_ACCEPTED" "OUTSIDE_BOOKING_WINDOW" "INVALID_WINDOW" "UNSUPPORTED_REQUIREMENT" Why the tender was rejected. |
object (accepted-terms) Present when ACCEPTED. | |
| provider_trip_id | string Provider's own id for the created trip, when ACCEPTED. |
| created_at required | string <date-time> When the provider received the tender. |
| responded_at | string <date-time> When the provider answered or the tender expired. |
| tender_id required | string Broker-assigned tender identifier. |
| trip_id required | string The offered trip's trip_id; on ACCEPTED, the trip exists under this id. |
| interchange_id required | string The interchange the leg belongs to. |
| respond_by required | string <date-time> Deadline for the provider's answer. |
| status required | string Enum: "OFFERED" "ACCEPTED" "REJECTED" "EXPIRED" Tender lifecycle state. |
| reason | string (refusal-reason) Enum: "NO_CAPACITY" "OUTSIDE_SERVICE_AREA" "OUTSIDE_SERVICE_HOURS" "ELIGIBILITY_REQUIRED" "ELIGIBILITY_NOT_ACCEPTED" "OUTSIDE_BOOKING_WINDOW" "INVALID_WINDOW" "UNSUPPORTED_REQUIREMENT" Why the tender was rejected. |
object (accepted-terms) Present when ACCEPTED. | |
| provider_trip_id | string Provider's own id for the created trip, when ACCEPTED. |
| created_at required | string <date-time> When the provider received the tender. |
| responded_at | string <date-time> When the provider answered or the tender expired. |
{- "tender_id": "tn-tpt-a",
- "trip": {
- "trip_id": "tr-tpt-a",
- "requester_id": "throughride-demo",
- "provider_id": "aaata-a-ride",
- "rider_ref": {
- "rider_ref_id": "r-aaat-55e1",
- "display_name": "Dana K.",
- "language": "en"
}, - "legs": [
- {
- "leg_id": "leg-1",
- "pickup": {
- "lat": 42.2459,
- "lon": -83.6157,
- "name": "Rider's home (Ypsilanti)",
- "access_notes": "Side door, ramp"
}, - "dropoff": {
- "lat": 42.4802,
- "lon": -83.4755,
- "name": "County-line transfer hub",
- "access_notes": "Covered bay 2"
}, - "pickup_window": {
- "earliest": "2026-11-10T08:50:00-05:00",
- "latest": "2026-11-10T09:05:00-05:00"
}, - "service_requirements": [
- "WHEELCHAIR_LIFT"
]
}
]
}, - "interchange": {
- "interchange_id": "ix-tpt",
- "from": {
- "provider_id": "aaata-a-ride",
- "trip_id": "tr-tpt-a",
- "leg_id": "leg-1"
}, - "to": {
- "provider_id": "oakland-go",
- "trip_id": "tr-tpt-b",
- "leg_id": "leg-1"
}, - "transfer_location": {
- "lat": 42.4802,
- "lon": -83.4755,
- "name": "County-line transfer hub",
- "access_notes": "Covered bay 2"
}, - "min_connection_s": 300,
- "max_hold_s": 900,
- "auto_hold_s": 300,
- "accessibility_buffer_s": 300,
- "protection": "PROTECTED",
- "supervision_required": false,
- "heartbeat_s": 300
}, - "respond_by": "2026-11-10T08:10:00-05:00"
}{- "tender_id": "tn-tpt-a",
- "trip_id": "tr-tpt-a",
- "interchange_id": "ix-tpt",
- "respond_by": "2026-11-10T08:10:00-05:00",
- "status": "ACCEPTED",
- "created_at": "2026-11-10T07:55:00-05:00",
- "accepted_terms": {
- "auto_hold_s": 300,
- "max_hold_s": 900
}, - "provider_trip_id": "aaata-a-ride-0004",
- "responded_at": "2026-11-10T07:55:00-05:00"
}Current state of a tender, for brokers that poll instead of (or as well as) receiving events.
| tender_id required | string The broker-assigned tender_id. Scoped to the authenticated requester. |
| tender_id required | string Broker-assigned tender identifier. |
| trip_id required | string The offered trip's trip_id; on ACCEPTED, the trip exists under this id. |
| interchange_id required | string The interchange the leg belongs to. |
| respond_by required | string <date-time> Deadline for the provider's answer. |
| status required | string Enum: "OFFERED" "ACCEPTED" "REJECTED" "EXPIRED" Tender lifecycle state. |
| reason | string (refusal-reason) Enum: "NO_CAPACITY" "OUTSIDE_SERVICE_AREA" "OUTSIDE_SERVICE_HOURS" "ELIGIBILITY_REQUIRED" "ELIGIBILITY_NOT_ACCEPTED" "OUTSIDE_BOOKING_WINDOW" "INVALID_WINDOW" "UNSUPPORTED_REQUIREMENT" Why the tender was rejected. |
object (accepted-terms) Present when ACCEPTED. | |
| provider_trip_id | string Provider's own id for the created trip, when ACCEPTED. |
| created_at required | string <date-time> When the provider received the tender. |
| responded_at | string <date-time> When the provider answered or the tender expired. |
{- "tender_id": "tn-rt-b",
- "trip_id": "tr-rt-b",
- "interchange_id": "ix-rt",
- "respond_by": "2026-11-10T08:00:00-05:00",
- "status": "EXPIRED",
- "created_at": "2026-11-10T07:55:00-05:00",
- "responded_at": "2026-11-10T08:01:00-05:00"
}Liveness, supported spec versions and profiles, how the endpoint is operated, and the booking windows within which it accepts requests (SPEC.md §7.1). No authentication required.
| status required | string Enum: "OK" "DEGRADED" OK when accepting requests normally; DEGRADED when up but slow or partially available. |
| spec_versions required | Array of strings non-empty [ items^[0-9]+\.[0-9]+\.[0-9]+$ ] Versions of this binding the endpoint implements (SemVer). |
| profiles required | Array of strings non-empty unique Items Enum: "CORE" "TRANSFER" "PARATRANSIT" "NEMT" Profiles implemented. CORE is always present. |
| operated_via required | string Enum: "DIRECT" "BROKER_PROXY" DIRECT when the provider runs this endpoint itself; BROKER_PROXY when a broker exposes it on the provider's behalf and relays requests to staff. |
| typical_response_s | integer >= 0 Typical seconds from a request to an asynchronous decision. 0 or absent means decisions are synchronous. |
object (booking-window) When this provider accepts requests, relative to the trip time (SPEC.md §7.1). Applies to every request unless booking_window_by_profile has an entry for the request's profile. Absent: the provider states no limit (it may still refuse with OUTSIDE_BOOKING_WINDOW, but SHOULD advertise it). | |
object Booking windows that replace booking_window (not merged with it) for requests of one profile: | |
| secret_rotation | boolean Default: false True if this endpoint implements the subscription secret operations ( |
| subscription_management | boolean Default: false True if this endpoint implements reading, changing and ending webhook subscriptions ( |
{- "status": "OK",
- "spec_versions": [
- "0.4.0"
], - "profiles": [
- "CORE"
], - "operated_via": "DIRECT"
}