Skip to content

Reservations ​

Public booking API · https://api.conciar.com/public/v1

Book a table ​

Without a deposit or guarantee the reservation is confirmed at once and the guest is emailed. With a deposit it is held for 30 minutes and payment_url points at the payment page; with a card guarantee next_step.type is guarantee and the URL is the card page. After paying, the payment provider sends the guest back through the API, which redirects (303) to your return_url, or without one to manage_url?paid=1. An Apple Pay or Google Pay deposit can be charged in this call (wallet_status).

POST/public/v1/restaurants/{organization_guid}/reservations
No key

Rate limit: 10/min per restaurant and IP

Path parameters

  • organization_guidstringrequired

    The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).

Body

  • request_idstringrequired

    Your idempotency id, 8–64 letters, digits or dashes (a UUID works). Sending the same id again returns the first result with replayed: true.

  • party_sizeintegerrequired

    Number of guests: 1 up to booking.max_party (table bookings) or 1–20 (tickets).

  • datestringrequired

    Y-m-d.

  • timestringrequired

    H:i, one of the times returned by the times endpoint.

  • first_namestringrequired

    Max 80 characters.

  • last_namestringrequired

    Max 80 characters.

  • emailstringrequired

    An email address, max 190 characters.

  • phone_country_idintegerrequired

    A country id from GET /countries.

  • phonestringrequired

    6–25 characters: digits, spaces and + ( ) . -

  • notestring

    Max 500 characters.

  • marketing_opt_inboolean

    The guest agrees to receive marketing.

  • sourcestring

    booking_page (default) or widget.

  • langstring

    en, nl, de, fr or es — the language of the emails.

  • return_urlstring

    http(s) URL, max 2000. Where the guest lands after paying; without it they land on the reservation page in the Conciar guest app.

  • guarantee_consentboolean

    Must be true when a card guarantee applies (show terms.consent_text from GET …/guarantee).

  • payment_methodobject

    The deposit payment method the guest chose: payment_id (integer), payment_service_provider_id (integer) and payment_key (max 50), all required when payment_method is sent. Must be enabled for the restaurant.

  • apple_pay_token, apple_pay_payment_dataobject

    Required when payment_method.payment_key is applepay.

  • payment_datastring

    The Google Pay token. Required when payment_method.payment_key is google_pay.

Status codes

  • 200Replay of an earlier request_id (replayed: true).
  • 404NOT_FOUND (unknown restaurant) or UNAVAILABLE.
  • 409DEPOSIT_UNAVAILABLE or GUARANTEE_UNAVAILABLE — the restaurant cannot take the payment it requires.
  • 422INVALID (with errors; also a party_size above booking.max_party), TOO_SOON, TOO_FAR, SLOT_TAKEN, TICKETS_REQUIRED, CONSENT_REQUIRED or PAYMENT_METHOD_UNAVAILABLE.
  • 502PAYMENT_FAILED — the payment could not be started.
  • 503BUSY — try again.

Good to know

  • The manage_url is the guest's own page; its last path segment is the confirmation token used by the manage, guarantee and tickets endpoints.
  • reservation.deposit is a formatted amount (e.g. "€ 20,00") or null. reservation.status is the stored status; state is pending, confirmed, cancelled or expired. payment_required stays true while a deposit or card is still due.
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "6f1c2a9e-0000-4000-8000-000000000000",
    "party_size": 2,
    "date": "2026-10-24",
    "time": "19:00",
    "first_name": "Alex",
    "last_name": "Example",
    "email": "alex@example.com",
    "phone_country_id": 150,
    "phone": "+31 6 00000000",
    "return_url": "https://www.example.com/booked"
  }'
Example response · 201
{
  "status": true,
  "replayed": false,
  "payment_required": false,
  "payment_url": null,
  "next_step": null,
  "wallet_status": null,
  "hold_minutes": 30,
  "manage_url": "https://r.conciar.com/bistro-example/reservation/0000000000000000000000000000000000000000",
  "reservation": {
    "reference": "EXAMPLE-R-0001",
    "date": "2026-10-24",
    "time": "19:00",
    "party_size": 2,
    "name": "Alex Example",
    "email": "alex@example.com",
    "status": "confirmed",
    "state": "confirmed",
    "source": "booking_page",
    "locale": "en",
    "deposit": null,
    "deposit_paid": false
  }
}

Get a booking by request id ​

Look up a booking you made with request_id, e.g. after the guest returns from paying.

GET/public/v1/restaurants/{organization_guid}/reservations/{request_id}
No key

Rate limit: 120/min per restaurant and IP

Path parameters

  • organization_guidstringrequired

    The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).

  • request_idstringrequired

    The request_id you booked with.

Status codes

  • 404NOT_FOUND — unknown restaurant, or no booking (from the booking page or widget) with this request_id.

Good to know

  • tickets is {reference, quantity, event, total (formatted), status} or null; guarantee is {amount (formatted), deadline (localized text), status} or null, and stays null while the guarantee is pending or failed.
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/6f1c2a9e-0000-4000-8000-000000000000" \
  -H "Accept: application/json"
Example response · 200
{
  "status": true,
  "payment_required": false,
  "payment_url": null,
  "next_step": null,
  "manage_url": "https://r.conciar.com/bistro-example/reservation/0000000000000000000000000000000000000000",
  "reservation": {
    "reference": "EXAMPLE-R-0001",
    "date": "2026-10-24",
    "time": "19:00",
    "party_size": 2,
    "name": "Alex Example",
    "email": "alex@example.com",
    "status": "confirmed",
    "state": "confirmed",
    "source": "booking_page",
    "locale": "en",
    "deposit": null,
    "deposit_paid": false
  },
  "tickets": null,
  "guarantee": null
}

Card guarantee terms ​

Whether a no-show card guarantee applies to a date, time and party size, and its fee, deadline and the consent text to show the guest.

GET/public/v1/restaurants/{organization_guid}/guarantee
No key

Rate limit: 120/min per restaurant and IP

Path parameters

  • organization_guidstringrequired

    The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).

Query parameters

  • party_sizeintegerrequired

    1–20.

  • datestringrequired

    Y-m-d.

  • timestringrequired

    H:i.

  • langstring

    en, nl, de, fr or es (anything else is 422 INVALID). Falls back to Accept-Language, then the restaurant's language, then en.

Status codes

  • 404NOT_FOUND — unknown restaurant, or not a restaurant.
  • 422INVALID, with errors.

Good to know

  • When a guarantee applies, terms is {fee, total (money), basis, free_cancellation_hours, deadline (Y-m-d H:i), deadline_label, total_label, consent_text}. reason (NO_MOLLIE or NO_CARD_METHOD) and message explain why it is unavailable.
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/guarantee?party_size=6&date=2026-10-24&time=19%3A00" \
  -H "Accept: application/json"
Example response · 200
{
  "status": true,
  "required": false,
  "available": true,
  "reason": null,
  "message": null,
  "terms": null
}

A booking's card guarantee ​

GET/public/v1/restaurants/{organization_guid}/reservations/{token}/guarantee
No key

Rate limit: 120/min per restaurant and IP

Path parameters

  • organization_guidstringrequired

    The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).

  • tokenstringrequired

    The 40-character confirmation token from manage_url (letters and digits).

Status codes

  • 404NOT_FOUND — unknown restaurant or token.

Good to know

  • With a guarantee: guarantee_status (pending, active, failed, charging, charge_failed, charged, waived), awaits_card, card_on_file, terms ({amount, deadline, status} or null), deadline (Y-m-d H:i), deadline_passed and payment_url while a card is still needed. Unlike the manage calls, the token does not expire here.
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/guarantee" \
  -H "Accept: application/json"
Example response · 200
{
  "status": true,
  "has_guarantee": false
}

Get the card page ​

The page where the guest registers the card for the guarantee.

POST/public/v1/restaurants/{organization_guid}/reservations/{token}/guarantee/card
No key

Rate limit: 10/min per restaurant and IP

Path parameters

  • organization_guidstringrequired

    The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).

  • tokenstringrequired

    The 40-character confirmation token from manage_url (letters and digits).

Status codes

  • 404NOT_FOUND — unknown restaurant or token.
  • 409NO_CARD_DUE — no card is needed, or a card payment could not be started.
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/guarantee/card" \
  -H "Accept: application/json"
Example response · 200
{
  "status": true,
  "payment_url": "https://payment-provider.example/card/…"
}