taxiID Integration API

This is the reference for developers building an integration into a company's taxiID account — quoting, creating and tracking rides, and receiving webhook events. All requests are made to integrations.taxiid.nl; you never call api.taxiid.nl directly. All money is integer cents, all timestamps are ISO-8601 UTC.

Pick the tab that matches what you're building — each only shows the calls you actually need. The Objects section below is shared reference material and always stays visible, whichever tab you pick — it documents the full shape of the data the calls further down (in Administration, Dispatch and Ride creation) send and receive, so it isn't repeated endpoint by endpoint.

Objects

The JSON shown next to each call below is trimmed to what that call is about — this section is the full shape of every object type, so you know what else you can read (and, where noted, write) that isn't shown inline everywhere.

Ride

A ride is the central object; every call above either creates one, reads one, or reports a change to one. Most fields are set by taxiID as the ride progresses (arrival ETA, assigned driver, computed price) — you only send the fields marked input when creating one via POST /v1/rides.

Property Type Input? Description
id string no taxiID's ride identifier. Use this in every later call about the ride.
status string enum no requestedofferedacceptedarrivedstartedcompleted, or cancelled/rejected at any point before completed. See Verifying a webhook for how you're told about changes.
requestedDate ISO-8601 datetime yes When the ride should start. Omit for an immediate/ASAP ride.
passenger Passenger yes Who's riding. Required even for a ride you book on someone else's behalf.
origin / destination Address yes Pickup and drop-off. destination is optional for some vehicle types (e.g. a driver-at-disposal booking) — check the quote response.
price Price no Computed by taxiID, normally from a prior POST /v1/quotes. Never send your own price on create.
paymentMeta PaymentMeta optional How the ride is paid for. Defaults to invoicing the company's account if omitted.
vehicleType string optional e.g. sedan, van, wheelchair-accessible. Defaults to the company's standard vehicle type.
language string (ISO 639-1) optional Passenger's language, used for any SMS/driver-app messaging about the ride. Defaults to the account's own language.
flightNumber string optional For airport pickups — enables flight-tracked pickup timing.
note string optional Free-text instruction shown to the driver (e.g. "call on arrival"). Not shown to the passenger.
debtorCode string optional Overrides which of the company's debtors is billed for this ride, if the company bills multiple debtors.
foreignBookingId string optional, echoed back Your own booking reference. Not interpreted by taxiID — round-tripped as-is onto every webhook so you can match events back to your system without maintaining a separate id map.
meta object, freeform optional Your own key/value data, stored and returned untouched. Not shown to the driver or passenger — use note for that.
foreignMeta object, freeform no The equivalent bag the other side (driver app / dispatch) attaches; read-only to you.
driverId / vehicleId string no Set once a driver is assigned (from status:'offered' onward). Absent before that.
eta ISO-8601 datetime no Live estimate for pickup arrival; only present once a driver is en route.
events array of {status, at} no Full status history with timestamps — the audit trail behind the current status.
companyId string no The company account the ride belongs to — always your own; present for completeness.

Address

Used for both origin and destination. lat/lng is what taxiID actually routes on; address is a display string shown to the driver and is not geocoded by taxiID — resolve it to coordinates yourself before sending.

Property Type Input? Description
address string yes Free-text display address shown to the driver/passenger.
lat / lng number yes WGS-84 coordinates. This is what's actually used for routing and pricing.
countryCode string (ISO 3166-1 alpha-2) optional Used for local address-format rules (e.g. Dutch postal formatting) and duty/VAT handling.
airportCode string (IATA) optional Set instead of a street address for an airport pickup, alongside flightNumber on the ride.

Passenger

Property Type Input? Description
name string yes Shown to the driver.
phone string (E.164) yes Used for driver-arrival SMS and driver contact. Always include the country code.
email string optional Used only if you enable passenger email receipts on the account.
passengerCount integer optional Defaults to 1. Affects vehicle-type eligibility for larger groups.

Price

Always computed by taxiID (from POST /v1/quotes or on ride completion) — never sent by you.

Property Type Description
total integer Total price, in cents (matches the workspace-wide money convention).
currency string (ISO 4217) Almost always EUR.
breakdown object Optional itemisation (base, distance, waiting, …) — present on completed rides, may be absent on a fresh quote.

PaymentMeta

Property Type Input? Description
method string enum optional invoice (bill the company, default), cash, or card.
reference string optional Your own payment/reference note, echoed back untouched — same pattern as foreignBookingId.

Webhook envelope

Every webhook delivery (see Dispatch → Verifying a webhook) shares this outer shape; data's contents depend on event.

Property Type Description
event string enum ride.created, ride.status_changed, or ride.updated (opt-in).
data object For ride.created/ride.updated, the Ride fields that changed plus id. For ride.status_changed, {id, status, previousStatus}.

Administration

Setup and account calls. Every integration needs these first, regardless of what it does.

Authentication

Subject: send Authorization: Bearer <api-key> on every request. Get your key from the portal under Booking channels → Developer API; it is shown once at creation/rotation time.

GET /v1/me

Subject: your account's status — company name, entitlement, enabled webhook events, and your current rate limit.

Rate limits

Subject: 120 requests/minute per API key by default. A 429 response carries Retry-After in seconds; back off and retry.

Errors

Subject: every error is {"error":{"statusCode","code","message"}}. 401 unknown/rotated-out key, 402 not entitled (contract product not attached), 429 rate limited.

Webhooks setup

Subject: webhook URL, secret, and subscribed events are configured in the portal, not via the API. Each delivery is signed — see Dispatch for verifying the signature.

Dispatch

Calls for integrations that monitor or hand off rides to drivers/fleets, rather than creating them.

GET /v1/rides

Subject: list your rides, filterable by status and date range.

GET /v1/rides/{id}

Subject: retrieve a single ride's current state.

POST /v1/rides/{id}/offer

Subject: offer a ride to a driver or company for dispatch.

Webhook: ride.status_changed

Subject: delivered whenever a ride you created or were offered changes status.

Verifying a webhook

Subject: header X-TaxiID-Signature: t=<unix>,v1=<hex hmac> — HMAC-SHA256 over ${t}.${rawBody} using your webhook secret. Reject stale timestamps.

Ride creation

Calls for integrations that book rides on behalf of a passenger or company.

POST /v1/quotes

Subject: get a price quote for a route before booking.

POST /v1/rides

Subject: create a new ride booking.

POST /v1/rides/{id}/cancel

Subject: cancel an existing ride.

Webhook: ride.created

Subject: delivered when a ride you created is accepted into the system.

Webhook: ride.updated

Subject: delivered on other ride field changes. Off by default — enable it in the portal if you need it; it is noisier than ride.status_changed.

Generated from the source Markdown · run ./generate.sh to rebuild.