Skip to content

Pickup availability

Get the pickup dates and time windows a courier currently offers for a sender’s location, for example to refresh a date picker before you confirm a booking.

POST /api/v5/quotes/pickup-availability

Requires your API key in the api-key header. Send the body as JSON with Content-Type: application/json. It does not create or change a booking.

Every quote already includes the same information for each courier (pickup_dates, pickup_time, pickup_window and pickupAvailability), so you only need this call when that quote is no longer fresh, for example the next day.

FieldTypeRequiredDescription
courierstringYesThe courier id, as used for the keys of quotes, for example couriers_please or tnt_road_express.
senderobjectYesThe pickup location. Only the fields below are accepted.
sender.postcodestringNoThe sender’s postcode, used for regional lead times and public holidays.
sender.statestringNoThe sender’s state, for example NSW, used for public holidays.
sender.suburbstringNoThe sender’s suburb. Accepted, but it does not change the result today.
sender.typestringNobusiness or residential. Accepted, but it does not change the result today.
hasTailgatebooleanNoWhether a tail lift is selected. Only changes Direct Couriers windows. If you leave it out, Direct Couriers windows assume a tail lift.

Any other field inside sender, such as country, is rejected with 400. A courier value that is not a courier id is not rejected: you get a default 12:00 to 17:00 window, so take the id from the quote.

Terminal window
curl -X POST https://api.transdirect.com.au/api/v5/quotes/pickup-availability \
-H "api-key: $TD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"courier": "couriers_please",
"sender": {
"suburb": "SYDNEY",
"postcode": "2000",
"state": "NSW",
"type": "business"
}
}'
import { client, postApiV5QuotesPickupAvailability } from '@transdirect/api-sdk';
client.setConfig({ headers: { 'api-key': process.env.TD_API_KEY! } });
const { data, error } = await postApiV5QuotesPickupAvailability({
body: {
courier: 'couriers_please',
sender: { suburb: 'SYDNEY', postcode: '2000', state: 'NSW', type: 'business' },
},
});
if (!data) throw new Error(JSON.stringify(error));
console.log(data.pickupDates[0], data.pickupTimes[0]);

200 OK. Couriers Please, asked on a Friday afternoon after its 11:00 same-day cutoff, so the first date is Monday:

{
"pickupDates": [
"2026-10-19", "2026-10-20", "2026-10-21", "2026-10-22", "2026-10-23",
"2026-10-26", "2026-10-27", "2026-10-28", "2026-10-29", "2026-10-30"
],
"pickupTimes": [{ "from": "09:00", "to": "16:00" }],
"fromTime": "09:00",
"toTime": "16:00",
"earliest": "2026-10-19 09:00:00",
"minWindowMinutes": 30,
"readyFromTimes": ["09:00"],
"lastAvailableTimes": ["16:00"],
"todayReadyFromTimes": [],
"pickupWindow": {
"operatingStart": "09:00",
"operatingEnd": "16:00",
"displayStart": "09:00",
"displayEnd": "16:00",
"sameDayCutoff": "11:00",
"minWindowMinutes": 0,
"incrementMinutes": 30,
"fixed": true
}
}
FieldTypeDescription
pickupDatesstring[]Up to 10 business days you can choose, as YYYY-MM-DD, skipping public holidays at the sender. Today is included only before the courier’s same-day cutoff. Send one of these as pickup_date when you confirm.
pickupTimesobject[]Pickup windows as {"from": "HH:MM", "to": "HH:MM"}.
fromTime, toTimestringThe first window’s start and end.
earlieststring or nullThe earliest pickup, as YYYY-MM-DD HH:MM:SS. null when no date is available.
minWindowMinutesnumberThe shortest pickup window the courier accepts, in minutes.
readyFromTimes, lastAvailableTimesstring[]For couriers with a configurable window, the “ready from” and “last available” times you can offer, as HH:MM.
todayReadyFromTimesstring[]The “ready from” times still available if the first date is today. Empty otherwise.
sameDayReadyFromstringWhen the first date is today and the window is configurable, the earliest “ready from” time for a same-day pickup.
pickupWindowobjectThe courier’s window rules: operating hours, the suggested window to show (displayStart, displayEnd), the sameDayCutoff, the minimum window, the time step and whether the window is fixed.

readyFromTimes, lastAvailableTimes, todayReadyFromTimes and pickupWindow only appear for couriers with these pickup rules, such as Aramex, Couriers Please, TNT, Hunter Express, Northline, Team Global Express and Capital Transport. When pickupWindow.fixed is true, the courier only takes its standard window.

StatusBodyCause
400{"success":false,"error":{"name":"ZodError","message":"..."}}courier is missing or empty, sender is missing, or sender has a field that is not accepted.
401{"error":"missing_api_key"} or {"error":"invalid_api_key"}No key, or a key that is not active.
429{"error":"rate_limited"}More than 600 requests a minute on this key. Wait for the retry-after seconds.

Open the API Explorer, paste your API key into the authentication box, and find Get pickup availability for a courier and sender address.