Quickstart
From nothing to a list of bookings in a few minutes. You need a terminal and one of curl, Python 3 or Node 18 or later.
-
Ask us for a sandbox.
Write to Felix, felix@grondia.com, or to Siro, siro@grondia.com, and say in a sentence what you are building. Grondia staff set up the sandbox; there is no sign-up form.
What you get today is small:
- A read-only key with the scopes
bookings:read,sites:read,invoices:readandcustomers:read. It cannot create, change or cancel anything, and it cannot register webhooks. - A sandbox campground called “Developer Sandbox” on the production API,
which other developers may share. It has five pitches, “Pitch 1” to
“Pitch 5”, of one site type, “Standard”, at 35.00 a night, and three
confirmed bookings of three nights each, arriving 7, 8 and 9 days after
the sandbox was set up. The guests are called “Sandbox Guest 1” to “Sandbox
Guest 3”, but you will not see those names: the API redacts guest names
and email unless a key may see personal data. Setting the sandbox up
creates no customers, so
GET customers/most likely answers with an empty list. It writes no invoices itself, but it creates the three bookings as confirmed, which normally makes Grondia write an invoice for each, soGET invoices/may list three or nothing. Do not build a test on either list.
So the sandbox does not look like Camping Beispielsee, the example campground in the rest of these docs. If you need to try writes, webhooks or the till endpoints, tell Felix, felix@grondia.com, or Siro, siro@grondia.com, what you need.
- A read-only key with the scopes
-
Store the key.
We send the key once. Keep it out of your code and your repository, for example in an environment variable:
Terminal window export GRONDIA_API_KEY=ck_a1b2cXXXXXXXXXXXXXXXXXXXXXXXX(That is the placeholder used on this site. Yours is 32 characters too, and starts with
ck_.) -
Make your first call.
List the campground’s bookings. The key goes in the
Authorizationheader as a bearer token.Terminal window curl https://api.campone.ch/api/v1/public/bookings/ \-H "Authorization: Bearer $GRONDIA_API_KEY"# pip install requestsimport osimport requestskey = os.environ["GRONDIA_API_KEY"]response = requests.get("https://api.campone.ch/api/v1/public/bookings/",headers={"Authorization": f"Bearer {key}"},timeout=10,)response.raise_for_status()page = response.json()print(page["count"], "bookings")for booking in page["results"]:print(booking["booking_reference"], booking["site_number"],booking["check_in_date"], booking["status"])// first-call.mjs, run with: node first-call.mjsconst url = "https://api.campone.ch/api/v1/public/bookings/";const key = process.env.GRONDIA_API_KEY;const response = await fetch(url, {headers: { Authorization: `Bearer ${key}` },});if (!response.ok) throw new Error(`HTTP ${response.status}`);const page = await response.json();console.log(page.count, "bookings");for (const booking of page.results) {console.log(booking.booking_reference, booking.site_number,booking.check_in_date, booking.status);} -
Read the answer.
The lists of bookings, sites, customers, invoices and till products all come in pages of the same shape: the total
count, links to thenextandpreviouspage (nullwhen there is none) and theresults. A page holds 50 items; ask for up to 200 with?page_size=200. Bookings come newest first. From the sandbox you get something like this, shortened here to the first of the three bookings (your IDs, references and dates differ):{"count": 3,"next": null,"previous": null,"results": [{"id": 48213,"booking_reference": "7F3A9C21DE","guest_first_name": "","guest_last_name": "","guest_email": "[redacted]","site_id": 9061,"site_number": "3","site_category": "Standard","check_in_date": "2026-10-28","check_out_date": "2026-10-31","num_adults": 2,"num_youth": 0,"num_children": 0,"status": "confirmed","total_price": "105.00","created_at": "2026-10-19T09:12:44.104837Z","updated_at": "2026-10-19T09:12:44.104837Z","external_reference": "","channel": ""}]}Empty names and
[redacted]are the API protecting the guest, not a bug in your code (what each call returns).external_referenceandchannelare empty because nobody created these bookings through the API.
Next steps
Section titled “Next steps”- What you can build: the two ways to connect, and the recipe for your kind of product.
- Core concepts: what a site, a booking and an invoice are, and how a booking’s status changes.
- Credentials: which scopes your product needs, and who creates the key for a real campground.
- Webhooks: let Grondia tell you when a booking changes, instead of polling, and verify each delivery.
- Syncing changes: page through the lists, catch
the changes a webhook missed with
updated_since, and see what neither of them reports. - Errors: the status codes and the four shapes of an error body.
- Retrying safely, Rate limits, Dates, times and money and Personal data: the rest of the guides.
- Partner program: when your product works, the review, the pilot with one campground and the App Store listing.
- The API reference lists every endpoint with its fields, and the webhook events Grondia can send you.