Skip to content

Core concepts

The API is small because the domain is small: six nouns cover most of it.

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.

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 example beispielsee
  • Customer

  • Site type

  • Site, pitch

    • site_number, for example A12
    • site_type_id
  • Booking

    • site_id
    • status
  • 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.

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).

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_request is 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.
  • pending is a booking waiting for payment or for the operator. A booking you create through the API starts as pending, or as confirmed when the campground takes payment on arrival. A pending booking 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 becomes abandoned. 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 as cancelled instead.)
  • confirmed is a firm booking. It stays confirmed while the guest is on site: check-in is not a status. Grondia sends a guest.checked_in event instead.
  • completed follows check-out, or automatic completion on the departure day, which records no check-out (what that changes).
  • no_show is 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.
  • abandoned is a pending booking 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.
  • cancelled follows reservation_request, pending or confirmed. Those three are also the only ones you can cancel through the API; any other status answers 400 with not_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.

  • Stay dates are calendar dates, YYYY-MM-DD, with no time and no time zone: check_in_date is the arrival day and check_out_date the departure day, so a stay from 2026-07-14 to 2026-07-17 is three nights. They mean the campground’s local calendar. Its time zone is set per campground; for a Swiss campground it is Europe/Zurich.
  • Timestamps such as created_at and updated_at are ISO 8601 in UTC, for example 2026-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 a currency field; on an invoice the amount is total_chf. A booking carries no currency field: its total_price is in the campground’s currency, which the ARI feed shows.

More, with the traps, in Dates, times and money.