Developers
haulplace API
Version 1 · August 11, 2026
Read your own fleet's loads, trucks and trailers, drivers and invoices from your own software. Everything you can see in haulplace, your code can read too.
It is read-only. The API answers GET and nothing else. It cannot create,
change or delete anything in your account, so a mistake in your code cannot damage your
records. If you need to write data, email us and tell us what you are building.
Get a key
In haulplace, open My Fleet → Access and scroll to API keys. Name the key after whatever will use it, and press Create a key. Only the fleet owner can do this.
The key is shown once and never again. We keep only a scrambled copy, so nobody — including us — can read it back to you. Store it somewhere safe the moment you create it. If you lose it, revoke it and make a new one.
Treat it like a password. Anyone holding it can read your fleet's records. Keep it on your server, never in a web page or a phone app, and never commit it to a code repository. If it leaks, revoke it in the same screen — that takes effect immediately.
Making a request
Send the key in the Authorization header. The base address is:
https://hrjqswmcigyfyndxcbhp.supabase.co/functions/v1/api
curl https://hrjqswmcigyfyndxcbhp.supabase.co/functions/v1/api/loads \
-H "Authorization: Bearer hp_live_your_key_here"
Every answer looks the same:
{
"data": [ ... ],
"count": 128,
"limit": 50,
"offset": 0
}
count is how many records exist in total, so you know whether to ask for more.
What you can read
| Path | Returns | Filters |
|---|---|---|
/loads | Loads — broker, reference, pickup and delivery, commodity, weight, miles, driver name, your four reference fields | status |
/vehicles | Trucks and trailers — label, plate, VIN, make, model, year, dimensions, status | kind, status |
/drivers | People — name, role, phone, email, city and state, hire and termination dates | status |
/invoices | Invoices — number, load, dates, terms, status, subtotal, total, what was paid and when | status |
What the API deliberately does not return. Driver dates of birth, CDL numbers, endorsements, pay rates, home addresses, and social security or bank details are never sent, on any request. A key is a long-lived credential and credentials leak; what never leaves cannot leak with it. Invoice PDFs are not returned either — download those from haulplace.
Paging and filtering
| Parameter | What it does |
|---|---|
limit | How many records to return. Default 50, maximum 200. |
offset | How many to skip. Use it with count to walk through everything. |
updated_since | Only records from that date onward, e.g. 2026-08-01. This is how you sync without re-reading everything. |
status | Exact match on the record's status. |
kind | On /vehicles only — truck or trailer. |
curl "https://hrjqswmcigyfyndxcbhp.supabase.co/functions/v1/api/vehicles?kind=truck&limit=200" \
-H "Authorization: Bearer hp_live_your_key_here"
When something is wrong
Errors come back as JSON with a code you can branch on:
{ "error": { "code": "bad_key", "message": "That key is not valid, or it has been revoked." } }
| Status | Code | Meaning |
|---|---|---|
| 401 | no_key | No Authorization header was sent. |
| 401 | bad_key | The key is wrong, or it was revoked. |
| 404 | not_found | No such path. The answer lists the ones that exist. |
| 400 | bad_request | A parameter could not be read — usually a date. |
| 405 | method_not_allowed | Something other than GET was sent. |
| 429 | rate_limited | Too many requests. Wait the number of seconds in Retry-After. |
| 500 | server_error | Our side. Try again; if it keeps happening, tell us. |
Limits and changes
Each key may make 60 requests per minute and 10,000 per day. The counter is per key, not per company, so one key running hot does not stop your other integrations.
Every answer carries your position in those windows, so you never have to guess:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Limit-Day: 10000
X-RateLimit-Remaining-Day: 9999
Go over and you get 429 with a Retry-After header giving the seconds
to wait. The minute window is a clock minute, not a rolling one, so it clears at the top of the
next minute. Even so, please poll every few minutes rather than every second, and use
updated_since instead of re-reading your whole history — the limits are there
to catch a runaway loop, not to ration normal use. If you need more, write to us.
New fields may be added to a record at any time, so write your code to ignore fields it does
not recognise. We will not remove a field or change what one means inside version 1 — that
would become /v2.
Questions
Write to info@haulplace.com and tell us what you are building. If you need something the API does not return yet, that is worth knowing.