The Lanoo API lets you find a free spot in a shared staging area, hold it for one vehicle, and check in and out. It is a JSON API over HTTPS. This page covers what every call has in common. Each resource then has its own page.
Base URL
https://api.golanoo.com/v1Live and test calls use the same URL. Your key decides which one a call is.
Authentication
Send your secret key as a bearer token in the Authorization header of every request.
curl https://api.golanoo.com/v1/staging_areas \ -H "Authorization: Bearer $LANOO_API_KEY"There are two kinds of key:
lk_test_keys work on test staging areas only. Use them while you build. Test staging areas are made up: no vehicles stand in them, and they are your account's alone. They work just as real ones do.lk_live_keys book real spots.
Keep your key secret. Use it from your servers only, never in a mobile app or a web page. A request without a valid key fails with an error of type authentication.
Versions
Versions are named by the date they were released. This one is 2026-10-30. Send the version you built against in a Lanoo-Version header:
curl https://api.golanoo.com/v1/staging_areas \ -H "Authorization: Bearer $LANOO_API_KEY" \ -H "Lanoo-Version: 2026-10-30"Without the header, a call uses the version your account was pinned to on its first call. A version never changes in a way that breaks your integration. New fields may appear in it, so ignore fields you do not know. Webhook events say which version they are written in, in api_version. Every new version is listed in the changelog.
Idempotency
Send an Idempotency-Key header on every POST and PATCH, with a unique value such as a UUID. If a call times out and you are not sure it arrived, send it again with the same key and the same body. It takes effect once, and the retry gets the first answer back.
curl -X POST https://api.golanoo.com/v1/reservations \ -H "Authorization: Bearer $LANOO_API_KEY" \ -H "Idempotency-Key: 5f0e9a1c-2d7b-4b8e-9c3a-0e6f2a7d1b44" \ -H "Content-Type: application/json" \ -d '{"vehicle_id": "rt-0417", "staging_area": "sa_norreport", "arrive_by": "2026-11-02T14:02:00Z"}'Keys are kept for 24 hours. Use a new key for each new action. The same key with a different body is refused with idempotency_key_reused.
Errors
A call that fails returns an HTTP status of 400 or above and an error object:
{ "error": { "type": "conflict", "code": "no_spot_available", "message": "The staging area is full at that time.", "alternatives": [ { "object": "availability", "staging_area": "sa_israels_plads", "name": "Israels Plads", "distance_m": 780, "free_spots": 1, "chance_free": 0.61 } ] }}typeis the broad kind of error.codeis exact and stable. Branch on it.messageis for people and may change. Do not parse it.paramnames the field at fault, if there is one.alternativescomes withno_spot_availableandstaging_area_closed: other staging areas nearby with room. Theirdistance_mis measured from the staging area you asked for.
type | HTTP status | Means |
|---|---|---|
invalid_request | 400 or 422 | The request is missing something or has a value we cannot accept. |
authentication | 401 | The key is missing or not valid. |
not_found | 404 | No such object belongs to your fleet. |
conflict | 409 | The request clashes with the current state, such as a full staging area or a hold that ran out. |
rate_limited | 429 | Too many requests. Slow down and try again. |
api_error | 500 | Something went wrong on our side. |
Each resource page lists the codes its calls can return.
Rate limits
Each account may send up to:
- 100 requests a second with a live key.
- 25 requests a second with a test key.
The limit is your account's own: other companies' requests do not count towards it. Over it, a request fails with HTTP 429 and an error of type rate_limited, and nothing is done. Wait a moment and try again, waiting a little longer each time it fails.
A large fleet stays far below this: 2,000 vehicles that each wait twice an hour make about 6 requests a second. If you need more, tell us and we will raise it.
Pagination
Calls that list objects return a page at a time:
{ "object": "list", "data": [], "has_more": true}Pass limit to set the page size, from 1 to 100; it defaults to 20. When has_more is true, ask for the next page with starting_after set to the id of the last item on this one.
curl "https://api.golanoo.com/v1/reservations?limit=50&starting_after=res_8f2c41" \ -H "Authorization: Bearer $LANOO_API_KEY"Objects and ids
Every object has an object field naming its kind. Ids start with a prefix that says what they are:
| Prefix | Object | Example |
|---|---|---|
sa_ | Staging area | sa_norreport |
res_ | Reservation | res_8f2c41 |
evt_ | Event | evt_1c7e55 |
we_ | Webhook endpoint | we_3b91d0 |
Times are RFC 3339 in UTC, such as 2026-11-02T14:02:00Z.
A reservation can carry your own metadata: up to 20 key-value pairs, keys up to 40 characters, values up to 500. We store them and return them; we never read them.
Neutrality
Many operators share the same staging areas. You only ever see your own fleet's reservations. Availability gives counts only, such as free_spots, never another operator's vehicles or bookings.
Resources
- Staging areas: the places vehicles wait, with their spots and rules.
- Availability: where there is room, now or when your vehicle arrives.
- Reservations: hold a spot, check in, check out, cancel.
- Webhooks: events we send when something changes that you did not cause.
New to the API? Start with Getting an API key.