List bookings
List the bookings on your account. Draft quotes (status new) are not included.
GET /api/v5/bookingsRequires your API key in the api-key header.
Query parameters
Section titled “Query parameters”| Parameter | Type | Description |
|---|---|---|
since | string | Only return bookings created at or after this time. Any ISO 8601 date or date-time, for example 2026-10-01 or 2026-10-01T00:00:00+10:00. |
sort | string | Column to sort by. Prefix with - for descending. One of id, booking_time, paid_date, status, cost, charged_weight, scanned_weight, connote, courier, pickup_date, pickup_time. Default: -booking_time (newest first). |
The response holds at most 100 bookings and there is no page parameter. To read more than 100, sort oldest first (sort=booking_time) with a since, then send the next request with since set to the created_at of the last booking you received. since is inclusive, so skip ids you already have. This is a capped list, not guaranteed pagination: if more than 100 bookings share the same created_at, advancing since cannot get past them.
Example request
Section titled “Example request”curl "https://api.transdirect.com.au/api/v5/bookings?since=2026-10-01&sort=-booking_time" \ -H "api-key: $TD_API_KEY"import { client, getApiV5Bookings } from '@transdirect/api-sdk';
client.setConfig({ headers: { 'api-key': process.env.TD_API_KEY! } });
const { data: bookings, response } = await getApiV5Bookings({ query: { since: '2026-10-01', sort: '-booking_time' },});
if (response.status === 404) { console.log('No bookings in this window');} else { for (const booking of bookings ?? []) { console.log(booking.id, booking.status_code, booking.connote); }}Response
Section titled “Response”200 OK with an array of bookings. Each element has the same shape as get a booking.
[ { "id": 623630, "booked_at": "2026-10-16T04:13:34.000Z", "booked_by": "sender", "created_at": "2026-10-16T04:13:34.000Z", "declared_value": 0, "insured_value": 0, "description": "Books", "items": [ { "id": 46885332, "description": "Carton", "weight": 5, "length": 40, "width": 30, "height": 20, "quantity": 1 } ], "label": "/api/v5/bookings/623630/label", "notifications": { "email": false, "sms": false }, "receiver": { "id": 69194890, "address": "200 Collins Street", "company_name": "", "email": "jordan@example.com", "name": "Jordan Lee", "postcode": "3000", "phone": "0398765432", "state": "VIC", "suburb": "MELBOURNE", "type": "residential", "country": "AU" }, "sender": { "id": 69194889, "address": "1 Martin Place", "company_name": "Example Books Pty Ltd", "email": "dispatch@example.com", "name": "Sam Taylor", "postcode": "2000", "phone": "0291234567", "state": "NSW", "suburb": "SYDNEY", "type": "business", "country": "AU" }, "pickup_window": ["2026-10-19T09:00:00.000Z", "2026-10-19T16:00:00.000Z"], "connote": "CPBV00123456789", "charged_weight": 6, "scanned_weight": 0, "special_instructions": "", "status": "Confirmed", "status_code": "confirmed", "is_paid": true, "updated_at": "2026-10-16T04:20:11.000Z", "pickup_instructions": "", "tailgate_pickup": false, "tailgate_delivery": false, "courier": "couriers_please", "cost": 28.43, "additional_charges": 0, "customer_reference": "ORDER-1042" }]Caching and conditional requests
Section titled “Caching and conditional requests”Every 200 response carries an ETag, a Last-Modified header and Cache-Control: private, max-age=30. Send the ETag back in If-None-Match on your next poll: when nothing in the list has changed you get 304 Not Modified with no body.
curl "https://api.transdirect.com.au/api/v5/bookings?since=2026-10-01" \ -H "api-key: $TD_API_KEY" \ -H 'If-None-Match: W/"5d41402abc4b2a76b9719d911017c592"'This makes the list a cheap way to watch for status, connote and cost changes across many bookings at once.
Errors
Section titled “Errors”| Status | Body | Cause |
|---|---|---|
304 | Empty | Your If-None-Match matches the current list. |
400 | {"error":"invalid_since"} | since is not a date. |
400 | {"error":"invalid_sort"} | sort names a column that is not in the list above. |
401 | {"error":"missing_api_key"} or {"error":"invalid_api_key"} | No key, or a key that is not active. |
404 | Empty | No bookings match. This is not an error in your request: treat it as an empty list. |
429 | {"error":"rate_limited"} | More than 600 requests a minute on this key. Wait for the retry-after seconds. |
Try it
Section titled “Try it”Open the API Explorer, add your key, and find List bookings.