Core concepts
The API is small because the domain is small: six nouns cover most of it.
One key, one campground
Section titled “One key, one campground”Each campground on Grondia is a tenant: its own pitches, prices, guests, bookings and settings, walled off from every other campground. An API key belongs to exactly one tenant, and every call made with it reads and writes that campground’s data only. There is no campground parameter in the URL: the key decides. A product used by ten campgrounds holds ten keys.
The six nouns
Section titled “The six nouns”| In the API | What it is |
|---|---|
| tenant | One campground. The ARI feed (availability, rates and inventory) and webhook payloads name it by its slug in a tenant field. |
| site | Anything a guest can book: a pitch (in German, Stellplatz), a bungalow, a mobile home, a glamping tent, a room. It has a site_number such as A12, a name and a site type. The API lists only the sites the campground offers to the public. |
| site type | A category of sites that share rules and prices, such as “Motorhome pitch”. The ARI feed calls it a category and gives it a stable code. |
| customer | A guest with an account at the campground. |
| booking | One stay on one site, from a check-in date to a check-out date, with a 10-character booking_reference, a status and a total_price. |
| invoice | A bill with an invoice_number, a status and an amount. Most invoices belong to a booking (booking_id); some, such as a shop sale, do not. |
Tenant, campground
slug, for examplebeispielsee
- offers Site type
- knows Customer
Customer
Site type
- groups Site
Site, pitch
site_number, for exampleA12site_type_id
- is booked by Booking
Booking
site_idstatus
- is billed by Invoice
Invoice
booking_id, can be null
A customer is not linked to bookings in the API. A booking carries its own
guest fields (guest_first_name, guest_last_name, guest_email), and those
are redacted unless your key may see personal data (see
Personal data).
Some campgrounds sell a site type rather than a numbered pitch, and do not
show the pitch number to the guest. Their bookings come back with an empty
site_number; site_category always names the site type.
The running example
Section titled “The running example”Every guide and code sample on this site uses the same made-up campground:
Camping Beispielsee (slug beispielsee), where the guest Anna Müller
books pitch A12. It does not exist, and neither does Anna. The sandbox you
get from us looks different (see the Quickstart).
The life of a booking
Section titled “The life of a booking”A booking’s status is one of reservation_request, pending, confirmed,
cancelled, completed, no_show or abandoned. This is how a booking
usually moves between them:
- New booking
- to reservation_request, Enquiry
- to pending
- to confirmed, Confirmed at once
- reservation_request
- to pending, Accepted
- to confirmed, Accepted
- to cancelled
- pending
- to confirmed, Paid, or confirmed by operator
- to abandoned, Unpaid after 30 minutes
- to cancelled
- confirmed
- to completed, Check-out
- to no_show, Marked by operator
- to cancelled
- completed
- cancelled
- no_show
- abandoned
reservation_requestis an enquiry the operator has to accept or decline. It already blocks the pitch for its dates, so the same nights cannot be promised to two guests.pendingis a booking waiting for payment or for the operator. A booking you create through the API starts aspending, or asconfirmedwhen the campground takes payment on arrival. Apendingbooking does not wait forever: if, 30 minutes after it was created, it has no successful or still-running payment and nobody has confirmed it, Grondia releases the pitch and the booking becomesabandoned. The check runs every five minutes, so count on 30 to 35 minutes. This applies to bookings created through the API as well, so agree with the campground how yours get paid or confirmed in time (the channel manager recipe has the two questions to settle). (If a new booking for the same pitch on overlapping dates arrives after the 30 minutes but before the check has run, the old one is released ascancelledinstead.)confirmedis a firm booking. It staysconfirmedwhile the guest is on site: check-in is not a status. Grondia sends aguest.checked_inevent instead.completedfollows check-out, or automatic completion on the departure day, which records no check-out (what that changes).no_showis set by the operator by hand. Grondia may remind the operator about a guest who did not arrive, but never marks a no-show on its own.abandonedis apendingbooking that was neither paid nor confirmed in time, whether a guest left an online checkout or a partner created it through the API. It holds no pitch, the operator’s booking lists hide it by default, and the guest gets no cancellation email.cancelledfollowsreservation_request,pendingorconfirmed. Those three are also the only ones you can cancel through the API; any other status answers400withnot_cancellable.
Treat the diagram as the usual path, not a rule: operators can also set a status
by hand on the booking page. Webhooks lists the
event each change sends you. One more value can appear in a booking list:
overbooked, a channel booking that arrived when no site of its type was free,
waiting for the operator to place it.
Dates, times and money
Section titled “Dates, times and money”- Stay dates are calendar dates,
YYYY-MM-DD, with no time and no time zone:check_in_dateis the arrival day andcheck_out_datethe departure day, so a stay from2026-07-14to2026-07-17is three nights. They mean the campground’s local calendar. Its time zone is set per campground; for a Swiss campground it isEurope/Zurich. - Timestamps such as
created_atandupdated_atare ISO 8601 in UTC, for example2026-07-01T08:30:00Z. - Money is a decimal string with two decimal places, such as
"105.00". Parse it with a decimal type, not a float. Each campground prices in one currency, CHF unless it is set up with another. The ARI feed and the webhook payloads name it in acurrencyfield; on an invoice the amount istotal_chf. A booking carries no currency field: itstotal_priceis in the campground’s currency, which the ARI feed shows.
More, with the traps, in Dates, times and money.