Put Hire A Bus work into your own system
Before you start
You need an API key. An operator admin mints one in the Hire A Bus portal, chooses exactly what it may do, and hands it to you — it is shown once and stored hashed, so it cannot be read back later. Keys can be revoked from the same screen and stop working immediately.
Your first call
Every request carries the key as a bearer token. This one lists the jobs waiting for a quote — no customer contact details, exactly as the operator's own inbox shows them.
curl https://hireabus.com/api/v1/jobs \
-H "Authorization: Bearer $HIREABUS_API_KEY" \
-H "Accept: application/json"Money is always an integer in the currency's minor units, next to the currency_code it belongs to — 12550 and GBP is £125.50. We never send a float, and we never send a figure we recalculated for the API: the numbers are the stored ones the operator sees in the portal.
What you can reach
42 documented endpoints, across two surfaces: the operator API your system talks to, and the driver surface the Hire A Bus mobile app uses. Both are described in the same document.
| Area | Endpoints | Scopes needed |
|---|---|---|
| Auth | 5 | — |
| Bookings | 3 | bookings:read, drivers:write |
| Drivers | 3 | drivers:read, drivers:write |
| Jobs | 2 | jobs:read |
| Me | 1 | — |
| Payouts | 1 | payouts:read |
| Quotes | 6 | quotes:write |
| Webhooks | 4 | webhooks:manage |
The driver surface is authenticated as a driver, not as an operator key — your system does not call it, but it is documented because the same jobs and bookings flow through it.
| Driver app area | Endpoints | Scopes needed |
|---|---|---|
| DriverApp | 11 | — |
| DriverAuth | 3 | — |
| DriverPrivacy | 3 | — |
Retries that cannot double-book
Anything that creates or settles something takes an Idempotency-Key header — a value you generate for that one attempt. Replay it and you get the original response back, marked with Idempotency-Replayed: true, rather than a second quote in front of the customer. Reuse the same key with a different body and the call is refused with 409. Auto-quoting is a supported use case here, so this is the mechanism that makes a retry loop safe.
Rate limits
Counted per key, not per IP address — an estate behind one NAT is not one bucket, and one leaked key used from many hosts is. Reads and writes have separate ceilings; the write one is lower on purpose, because a runaway read costs us CPU and a runaway write puts real offers in front of real customers.
| Per minute | Per day | |
|---|---|---|
| Reads | 60 | 20,000 |
| Quote writes | 30 | 2,000 |
Over the line you get a 429 with error.code of rate_limited and a Retry-After header. Wait that long; do not spin.
Where to go next
| Guide | What it covers |
|---|---|
| Authentication | Bearer tokens, the 7 scopes and what each one unlocks, and how a refusal is shaped. |
| Webhooks | 2 events, how to verify the signature, and what happens when your endpoint is down. |
| API reference | Every endpoint, request and response, generated from the code that serves them. |
