API reference

API reference

How the Lanoo API works: base URL, keys, versions, idempotency, errors, pagination and ids, with a page for each resource.

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

Text
https://api.golanoo.com/v1

Live 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
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
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
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:

JSON
{
"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
}
]
}
}
  • type is the broad kind of error.
  • code is exact and stable. Branch on it.
  • message is for people and may change. Do not parse it.
  • param names the field at fault, if there is one.
  • alternatives comes with no_spot_available and staging_area_closed: other staging areas nearby with room. Their distance_m is measured from the staging area you asked for.
typeHTTP statusMeans
invalid_request400 or 422The request is missing something or has a value we cannot accept.
authentication401The key is missing or not valid.
not_found404No such object belongs to your fleet.
conflict409The request clashes with the current state, such as a full staging area or a hold that ran out.
rate_limited429Too many requests. Slow down and try again.
api_error500Something 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:

JSON
{
"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
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:

PrefixObjectExample
sa_Staging areasa_norreport
res_Reservationres_8f2c41
evt_Eventevt_1c7e55
we_Webhook endpointwe_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.