Entwickler

API-Referenz

Alle Endpunkte der Connect API und der öffentlichen Reservierungs-API mit Parametern, Beispielanfragen und Beispielantworten.

Die technische Dokumentation ist auf Englisch.

Connect API

For your own customer app, website backend or integration: locations, the restaurant menu and takeaway orders, customer sign-in and loyalty, the store catalogue, cart and checkout, and product subscriptions.

Base URL

https://api.conciar.com/connect/v1

Every call sends X-Api-Key; every /store call also sends X-Sales-Channel. Publishable keys only open the endpoints marked for them. How authentication works

Locations and reference data

Calls an app makes before it knows which location (sales channel) to use.

GET/locations

List locations

Publishable or secret key

The organization's active sales channels (marketplace channels excluded), sorted by name. Use a location's sales_channel_token as the X-Sales-Channel header of every /store call. This endpoint itself needs no sales channel.

  • holiday_hours covers the next 14 days. is_open_now is false after the last-order cutoff.
Request
curl "https://api.conciar.com/connect/v1/locations" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key"
Response · 200
{
  "data": {
    "timezone": "Europe/Amsterdam",
    "locations": [
      {
        "sales_channel_token": "cnct_ch_your_channel_token",
        "name": "Bistro Example — Centre",
        "is_test": false,
        "address": "Example Street 1, 1000 AA Example City",
        "city": "Example City",
        "latitude": 52,
        "longitude": 4,
        "operating_hours": {
          "monday": {
            "isOpen": true,
            "is24Hours": false,
            "timeSlots": [
              {
                "openTime": "11:00",
                "closeTime": "22:00"
              }
            ]
          },
          "tuesday": {
            "isOpen": true,
            "is24Hours": false,
            "timeSlots": [
              {
                "openTime": "11:00",
                "closeTime": "22:00"
              }
            ]
          },
          "wednesday": {
            "isOpen": true,
            "is24Hours": false,
            "timeSlots": [
              {
                "openTime": "11:00",
                "closeTime": "22:00"
              }
            ]
          },
          "thursday": {
            "isOpen": true,
            "is24Hours": false,
            "timeSlots": [
              {
                "openTime": "11:00",
                "closeTime": "22:00"
              }
            ]
          },
          "friday": {
            "isOpen": true,
            "is24Hours": false,
            "timeSlots": [
              {
                "openTime": "11:00",
                "closeTime": "23:00"
              }
            ]
          },
          "saturday": {
            "isOpen": true,
            "is24Hours": false,
            "timeSlots": [
              {
                "openTime": "12:00",
                "closeTime": "23:00"
              }
            ]
          },
          "sunday": {
            "isOpen": false,
            "is24Hours": false,
            "timeSlots": []
          }
        },
        "holiday_hours": [],
        "is_open_now": true,
        "asap_enabled": true,
        "lead_time_minutes": 15,
        "slot_minutes": 15,
        "last_order_minutes_before_close": 10,
        "max_days_ahead": 0
      }
    ]
  }
}
GET/countries

List countries

Publishable or secret key

Every country with its ISO codes, calling prefix and address/phone formats, sorted by name. Use the id wherever a country_id is asked for.

  • name is a lowercase key, not a display name.
Request
curl "https://api.conciar.com/connect/v1/countries" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key"
Response · 200
{
  "countries": [
    {
      "id": 150,
      "name": "netherlands",
      "iso_code_2": "NL",
      "iso_code_3": "NLD",
      "call_prefix": 31,
      "active": true,
      "has_state": false,
      "has_zipcode": true,
      "zipcode_format": "NNNN LL",
      "phone_digits": 9,
      "…": "…"
    }
  ]
}
POST/app/init

App start-up handshake

Publishable or secret key Sales channel Customer token optional30/min

Call once per app launch or resume. Returns the server time and whether the sent bearer token belongs to a member of this organization. It never answers 401. When the merchant has app installations turned on, the install is recorded.

Parameters
installation_id
body·stringrequired
Your stable id for this install, max 64.
platform
body·stringrequired
ios, android, web, macos, windows or linux.
app_version
body·stringrequired
Max 32.
build_number
body·string
Max 32.
os_version
body·string
Max 64.
device_model
body·string
Max 100.
locale
body·string
Max 20.
timezone
body·string
Max 64.
Request
curl -X POST "https://api.conciar.com/connect/v1/app/init" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Content-Type: application/json" \
  -d '{
    "installation_id": "a1b2c3d4-example",
    "platform": "ios",
    "app_version": "1.4.0"
  }'
Response · 200
{
  "data": {
    "server_time": "2026-10-16T11:58:12+02:00",
    "authenticated": false
  }
}

Customer sign-in

Customers sign in with a one-time 6-digit code (valid 10 minutes, 5 attempts). Verifying the code returns an access token; send it as Authorization: Bearer … on the customer routes. Codes are delivered by email: type=phone is accepted, but no SMS is sent yet.

POST/auth/register

Register a customer

Publishable or secret key 5/min per IP

Emails a sign-in code. The answer is the same when the address already belongs to a member (they simply get a code).

Parameters
first_name
body·stringrequired
Max 100.
last_name
body·string
Max 100.
email
body·stringrequired
Max 255.
marketing_opt_in
body·boolean
Consent to marketing.
Responses
  • 422Validation failed: {status: false, message, errors}.
  • 429OTP_COOLDOWN — one code per minute and five per hour per address. Body has retry_after (seconds); Retry-After header too.
Request
curl -X POST "https://api.conciar.com/connect/v1/auth/register" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Alex",
    "email": "alex@example.com"
  }'
Response · 201
{
  "status": true,
  "message": "We emailed you a sign-in code.",
  "expires_in": "10 minutes"
}
POST/auth/otp/request

Request a sign-in code

Publishable or secret key 5/min per IP

Sends a code to an existing customer. The answer is the same whether or not the address belongs to an account.

Parameters
identifier
body·stringrequired
The email address.
type
body·stringrequired
email (phone is accepted but not delivered yet).
Responses
  • 429OTP_COOLDOWN, with retry_after.
Request
curl -X POST "https://api.conciar.com/connect/v1/auth/otp/request" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "Content-Type: application/json" \
  -d '{
    "identifier": "alex@example.com",
    "type": "email"
  }'
Response · 200
{
  "status": true,
  "message": "If this belongs to an account, we sent it a sign-in code.",
  "expires_in": "10 minutes"
}
POST/auth/otp/verify

Verify a code and get an access token

Publishable or secret key 20/min per IP

Returns the customer and a personal access token (valid 6 months; there is no refresh token — sign in again when it expires).

Parameters
identifier
body·stringrequired
The email address the code was sent to.
type
body·stringrequired
email or phone.
code
body·stringrequired
The 6-digit code.
Responses
  • 401{status: false, message, attempts_remaining} — wrong, expired or used-up code.
Request
curl -X POST "https://api.conciar.com/connect/v1/auth/otp/verify" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "Content-Type: application/json" \
  -d '{
    "identifier": "alex@example.com",
    "type": "email",
    "code": "123456"
  }'
Response · 200
{
  "status": true,
  "data": {
    "customer": {
      "id": 4242,
      "first_name": "Alex",
      "last_name": null,
      "email": "alex@example.com",
      "organization_customer_id": 77,
      "shipping_addresses": [],
      "phones": []
    },
    "access_token": "your_customer_access_token",
    "token_type": "Bearer",
    "linked_orders": {
      "count": 0,
      "stamps": 0,
      "points": 0,
      "queued": 0
    }
  }
}
POST/auth/otp/resend

Resend a sign-in code

Publishable or secret key 5/min per IP

Same parameters and answers as requesting a code; the previous code stops working.

Parameters
identifier
body·stringrequired
The email address.
type
body·stringrequired
email or phone.
Request
curl -X POST "https://api.conciar.com/connect/v1/auth/otp/resend" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "Content-Type: application/json" \
  -d '{
    "identifier": "alex@example.com",
    "type": "email"
  }'
Response · 200
{
  "status": true,
  "message": "If this belongs to an account, we sent it a new sign-in code.",
  "expires_in": "10 minutes"
}

Restaurant menu and takeaway orders

Ordering for pickup from a customer app. Money is {amount, minor, currency}, VAT included. Guests and signed-in members can both order; with a bearer token the order counts towards the member's stamps and points.

GET/store/restaurant/menu

Get the menu

Publishable or secret key Sales channel

The menu that applies now (or the first menu when none does), with categories, items and option groups. Items not available today or not sold on this channel are left out; items sold out on this channel stay in with out_of_stock: true. Names follow Accept-Language; translations holds the other languages.

  • Order with an item's id (not product_id) and option ids. maximum_selections 0 means no maximum.
Responses
  • 404MENU_NOT_FOUND — the restaurant has no menu.
Request
curl "https://api.conciar.com/connect/v1/store/restaurant/menu" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "data": {
    "id": 3,
    "name": "All day",
    "start_at": null,
    "end_at": null,
    "categories": [
      {
        "id": 12,
        "code": "mains",
        "name": "Mains",
        "color": null,
        "translations": {},
        "items": [
          {
            "id": 101,
            "product_id": 9001,
            "sku": "EX-BURGER",
            "name": "Example burger",
            "description": null,
            "story": null,
            "translations": {},
            "image_url": null,
            "out_of_stock": false,
            "earns_stamps": true,
            "stamp_reward_eligible": true,
            "earns_points": true,
            "available_from": null,
            "available_until": null,
            "price": {
              "amount": "12.50",
              "minor": 1250,
              "currency": "EUR"
            },
            "option_groups": [
              {
                "id": 40,
                "code": "extras",
                "name": "Extras",
                "translations": {},
                "is_required": false,
                "minimum_selections": 0,
                "maximum_selections": 3,
                "included_selections": 0,
                "rank": 1,
                "options": [
                  {
                    "id": 501,
                    "name": "Extra cheese",
                    "translations": {},
                    "is_default": false,
                    "rank": 1,
                    "extra_price": {
                      "amount": "1.00",
                      "minor": 100,
                      "currency": "EUR"
                    }
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}
GET/store/restaurant/pickup-info

Get pickup hours and slots

Publishable or secret key Sales channel

Opening hours, holiday hours for the next 14 days and the pickup rules: whether ASAP is allowed, the lead time, the slot size, the last-order cutoff and how many days ahead customers may order.

Request
curl "https://api.conciar.com/connect/v1/store/restaurant/pickup-info" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "data": {
    "store": {
      "sales_channel_token": "cnct_ch_your_channel_token",
      "name": "Bistro Example",
      "address": "Example Street 1, 1000 AA Example City"
    },
    "timezone": "Europe/Amsterdam",
    "operating_hours": {
      "monday": {
        "isOpen": true,
        "is24Hours": false,
        "timeSlots": [
          {
            "openTime": "11:00",
            "closeTime": "22:00"
          }
        ]
      },
      "tuesday": {
        "isOpen": true,
        "is24Hours": false,
        "timeSlots": [
          {
            "openTime": "11:00",
            "closeTime": "22:00"
          }
        ]
      },
      "wednesday": {
        "isOpen": true,
        "is24Hours": false,
        "timeSlots": [
          {
            "openTime": "11:00",
            "closeTime": "22:00"
          }
        ]
      },
      "thursday": {
        "isOpen": true,
        "is24Hours": false,
        "timeSlots": [
          {
            "openTime": "11:00",
            "closeTime": "22:00"
          }
        ]
      },
      "friday": {
        "isOpen": true,
        "is24Hours": false,
        "timeSlots": [
          {
            "openTime": "11:00",
            "closeTime": "23:00"
          }
        ]
      },
      "saturday": {
        "isOpen": true,
        "is24Hours": false,
        "timeSlots": [
          {
            "openTime": "12:00",
            "closeTime": "23:00"
          }
        ]
      },
      "sunday": {
        "isOpen": false,
        "is24Hours": false,
        "timeSlots": []
      }
    },
    "holiday_hours": [],
    "is_open_now": true,
    "asap_enabled": true,
    "lead_time_minutes": 15,
    "slot_minutes": 15,
    "last_order_minutes_before_close": 10,
    "max_days_ahead": 0
  }
}
POST/store/restaurant/orders

Place a takeaway order

Publishable or secret key Sales channel Customer token optional10/min, 60/min per store

Creates the order and starts its payment. Redirect methods return payment.payment_url (send the customer there); Apple Pay and Google Pay return the wallet details to show the sheet, then charge with POST …/payment. An order fully paid by a reward or points needs no payment (payment: null). Unpaid orders expire after 30 minutes (the default).

  • Keep order_token: it is the guest's only way to read, pay or cancel the order (header X-Order-Token).
  • status: awaiting_payment, scheduled, received, preparing, ready, collected or cancelled. pickup_number is set once the order is paid.
Parameters
Idempotency-Key
header·string
1–64 characters. A retry with the same key and body within 24 hours returns the same order instead of a new one.
items
body·arrayrequired
1–50 lines.
items[].item_id
body·integerrequired
Menu item id.
items[].qty
body·integer
1–99, default 1.
items[].options
body·integer[]
Option ids, up to 30, no duplicates.
pickup_at
body·string
Date-time on the slot grid; leave out for as soon as possible.
customer_notes
body·string
Max 500.
customer.first_name
body·string
Required for guests (no bearer token). Max 100.
customer.last_name
body·string
Max 100.
customer.email
body·string
Required for guests. Max 255.
payment_method_key
body·stringrequired
A key from GET /store/payment-methods, e.g. ideal, applepay.
payment_service_provider_key
body·string
Pick the provider; otherwise the first enabled one.
return_url
body·string
Required except for applepay and google_pay. Where the provider sends the customer after paying. Max 2048.
redeem_reward
body·boolean
Members: spend a full stamp card.
redeem_points
body·integer
Members: spend exactly this many points.
use_points
body·boolean
Members: spend as many points as allowed.
phone, birth_date, billing_address
body·mixed
Only when the method's requires list asks for them (e.g. Klarna). billing_address: street, house_number, house_number_suffix, postcode, city, country (ISO-2).
Responses
  • 409IDEMPOTENCY_KEY_REUSED (same key, different body) or IDEMPOTENCY_KEY_IN_PROGRESS.
  • 422Validation, or a code in message: STORE_CLOSED, INVALID_PICKUP_TIME, ITEM_UNAVAILABLE, INVALID_OPTIONS, NO_REWARD_AVAILABLE, NO_ELIGIBLE_ITEM, INSUFFICIENT_POINTS, POINTS_DISABLED, BELOW_MIN_REDEMPTION, EXCEEDS_MAX, NOTHING_TO_PAY, PAYMENT_METHOD_UNAVAILABLE, PAYMENT_DETAILS_REQUIRED, PAYMENT_FAILED. errors points at the field.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/restaurant/orders" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Idempotency-Key: order-2026-10-16-0001" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "item_id": 101,
        "qty": 2,
        "options": [
          501
        ]
      }
    ],
    "customer": {
      "first_name": "Alex",
      "email": "alex@example.com"
    },
    "payment_method_key": "ideal",
    "return_url": "https://www.example.com/order/return"
  }'
Response · 201
{
  "data": {
    "order": {
      "reference": "EXAMPLE-0001",
      "pickup_number": null,
      "pickup_name": "Alex",
      "store": {
        "sales_channel_token": "cnct_ch_your_channel_token",
        "name": "Bistro Example"
      },
      "status": "awaiting_payment",
      "pickup_at": "2026-10-16T12:30:00+02:00",
      "release_at": null,
      "created_at": "2026-10-16T11:58:12+02:00",
      "customer_notes": null,
      "lines": [
        {
          "item_id": 101,
          "name": "Example burger",
          "image_url": null,
          "qty": 2,
          "selections": [
            "Extra cheese"
          ],
          "option_ids": [
            501
          ],
          "unit_price": {
            "amount": "12.50",
            "minor": 1250,
            "currency": "EUR"
          },
          "total_price": {
            "amount": "25.00",
            "minor": 2500,
            "currency": "EUR"
          }
        }
      ],
      "subtotal": {
        "amount": "25.00",
        "minor": 2500,
        "currency": "EUR"
      },
      "discount": {
        "amount": "0.00",
        "minor": 0,
        "currency": "EUR"
      },
      "total": {
        "amount": "25.00",
        "minor": 2500,
        "currency": "EUR"
      },
      "reward_redeemed": false,
      "points_redeemed": 0,
      "points_discount": {
        "amount": "0.00",
        "minor": 0,
        "currency": "EUR"
      },
      "loyalty": {
        "stamps_earned": 0,
        "points_earned": 0
      }
    },
    "order_token": "ot_example_order_token",
    "payment": {
      "type": "redirect",
      "payment_url": "https://payment-provider.example/checkout/…",
      "transaction_key": "example-transaction-key"
    }
  }
}
GET/store/restaurant/orders/{reference}

Get an order

Publishable or secret key Sales channel Customer token optional30/min

Poll this for the order status (every 5–10 seconds is plenty).

  • Send either the bearer token of the customer who placed the order or the header X-Order-Token with the order_token returned at placement. Anything else is 404 ORDER_NOT_FOUND.
Parameters
reference
path·stringrequired
The order reference.
X-Order-Token
header·string
The order_token, when there is no bearer token.
Responses
  • 404ORDER_NOT_FOUND.
Request
curl "https://api.conciar.com/connect/v1/store/restaurant/orders/EXAMPLE-0001" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "X-Order-Token: ot_example_order_token"
Response · 200
{
  "data": {
    "reference": "EXAMPLE-0001",
    "pickup_number": 17,
    "pickup_name": "Alex",
    "store": {
      "sales_channel_token": "cnct_ch_your_channel_token",
      "name": "Bistro Example"
    },
    "status": "preparing",
    "pickup_at": "2026-10-16T12:30:00+02:00",
    "release_at": null,
    "created_at": "2026-10-16T11:58:12+02:00",
    "customer_notes": null,
    "lines": [
      {
        "item_id": 101,
        "name": "Example burger",
        "image_url": null,
        "qty": 2,
        "selections": [
          "Extra cheese"
        ],
        "option_ids": [
          501
        ],
        "unit_price": {
          "amount": "12.50",
          "minor": 1250,
          "currency": "EUR"
        },
        "total_price": {
          "amount": "25.00",
          "minor": 2500,
          "currency": "EUR"
        }
      }
    ],
    "subtotal": {
      "amount": "25.00",
      "minor": 2500,
      "currency": "EUR"
    },
    "discount": {
      "amount": "0.00",
      "minor": 0,
      "currency": "EUR"
    },
    "total": {
      "amount": "25.00",
      "minor": 2500,
      "currency": "EUR"
    },
    "reward_redeemed": false,
    "points_redeemed": 0,
    "points_discount": {
      "amount": "0.00",
      "minor": 0,
      "currency": "EUR"
    },
    "loyalty": {
      "stamps_earned": 0,
      "points_earned": 0
    }
  }
}
POST/store/restaurant/orders/{reference}/payment

Pay or retry payment

Publishable or secret key Sales channel Customer token optional10/min, 120/min per store

Starts a new payment for an order awaiting payment, or charges Apple Pay / Google Pay. With apple_pay_token or google_pay_token the charge happens in this call: 200 when paid, 202 when pending, 422 PAYMENT_FAILED when declined (the order stays payable).

  • Send either the bearer token of the customer who placed the order or the header X-Order-Token with the order_token returned at placement. Anything else is 404 ORDER_NOT_FOUND.
Parameters
reference
path·stringrequired
The order reference.
payment_method_key
body·stringrequired
Payment method key.
payment_service_provider_key
body·string
Provider key.
return_url
body·string
Required except for applepay and google_pay. Max 2048.
apple_pay_token
body·object|string
The PKPaymentToken (object, JSON or base64).
google_pay_token
body·string
tokenizationData.token (JSON or base64).
Responses
  • 404ORDER_NOT_FOUND.
  • 409PAYMENT_FAILED — another payment for this order is in progress.
  • 422ORDER_NOT_PAYABLE, PAYMENT_METHOD_UNAVAILABLE, PAYMENT_DETAILS_REQUIRED, INVALID_WALLET_TOKEN or PAYMENT_FAILED.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/restaurant/orders/EXAMPLE-0001/payment" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "X-Order-Token: ot_example_order_token" \
  -H "Content-Type: application/json" \
  -d '{
    "payment_method_key": "ideal",
    "return_url": "https://www.example.com/order/return"
  }'
Response · 201
{
  "data": {
    "payment": {
      "type": "redirect",
      "payment_url": "https://payment-provider.example/checkout/…",
      "transaction_key": "example-transaction-key"
    }
  }
}
POST/store/restaurant/orders/{reference}/cancel

Cancel an unpaid order

Publishable or secret key Sales channel Customer token optional10/min, 120/min per store

Only while the order is awaiting payment. Releases any reward or points held for it.

Parameters
reference
path·stringrequired
The order reference.
Responses
  • 404ORDER_NOT_FOUND.
  • 422ORDER_NOT_CANCELLABLE — already paid or no longer awaiting payment.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/restaurant/orders/EXAMPLE-0001/cancel" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "X-Order-Token: ot_example_order_token"
Response · 200
{
  "data": {
    "reference": "EXAMPLE-0001",
    "pickup_number": null,
    "pickup_name": "Alex",
    "store": {
      "sales_channel_token": "cnct_ch_your_channel_token",
      "name": "Bistro Example"
    },
    "status": "cancelled",
    "pickup_at": "2026-10-16T12:30:00+02:00",
    "release_at": null,
    "created_at": "2026-10-16T11:58:12+02:00",
    "customer_notes": null,
    "lines": [
      {
        "item_id": 101,
        "name": "Example burger",
        "image_url": null,
        "qty": 2,
        "selections": [
          "Extra cheese"
        ],
        "option_ids": [
          501
        ],
        "unit_price": {
          "amount": "12.50",
          "minor": 1250,
          "currency": "EUR"
        },
        "total_price": {
          "amount": "25.00",
          "minor": 2500,
          "currency": "EUR"
        }
      }
    ],
    "subtotal": {
      "amount": "25.00",
      "minor": 2500,
      "currency": "EUR"
    },
    "discount": {
      "amount": "0.00",
      "minor": 0,
      "currency": "EUR"
    },
    "total": {
      "amount": "25.00",
      "minor": 2500,
      "currency": "EUR"
    },
    "reward_redeemed": false,
    "points_redeemed": 0,
    "points_discount": {
      "amount": "0.00",
      "minor": 0,
      "currency": "EUR"
    },
    "loyalty": {
      "stamps_earned": 0,
      "points_earned": 0
    }
  }
}
POST/store/restaurant/table/{token}/bill-request

Ask for the bill at a table

Publishable or secret key Sales channel 120/min per store

A guest at a table asks for the bill from their phone. The token comes from the table's QR code. Calling it again keeps the first time.

Parameters
token
path·stringrequired
The table's QR token.
Responses
  • 404Unknown table.
  • 422This table has no open visit.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/restaurant/table/12.0123456789abcdef01234567/bill-request" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "status": true,
  "bill_requested_at": "2026-10-16T21:14:03+02:00"
}

Customer account

For a signed-in customer (bearer token from /auth/otp/verify). Without a valid token: 401 Unauthenticated.

GET/store/customer/profile

Get the profile

Publishable or secret key Sales channel Customer token
  • member_reference is the value to show as the membership QR code.
Responses
  • 404NOT_A_MEMBER — the customer is not a member of this organization.
Request
curl "https://api.conciar.com/connect/v1/store/customer/profile" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "data": {
    "id": 4242,
    "first_name": "Alex",
    "last_name": "Example",
    "email": "alex@example.com",
    "member_since": "2026-03-01T10:00:00+01:00",
    "member_reference": "M-EXAM-PLE0-0000",
    "marketing_opt_in": false
  }
}
GET/store/customer/loyalty

Get points, stamps and history

Publishable or secret key Sales channel Customer token

The points balance and its value, the stamp card, the programme rules and the last 20 loyalty events.

Responses
  • 404NOT_A_MEMBER.
Request
curl "https://api.conciar.com/connect/v1/store/customer/loyalty" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "data": {
    "member_reference": "M-EXAM-PLE0-0000",
    "points": {
      "enabled": true,
      "balance": 120,
      "value": {
        "amount": "1.20",
        "minor": 120,
        "currency": "EUR"
      },
      "point_value": 0.01,
      "min_redemption": 100,
      "max_redemption_pct": 50,
      "can_redeem": true,
      "earn_rate": 1,
      "earn_on": "gross",
      "qualifying": {
        "scope": "all",
        "category_ids": [],
        "item_ids": null
      },
      "boosts": []
    },
    "stamps": {
      "enabled": true,
      "count": 4,
      "per_reward": 10,
      "rewards_available": 0,
      "title": "Coffee card",
      "description": null,
      "…": "…"
    },
    "history": [
      {
        "id": 1,
        "type": "points_earned",
        "stamps": 0,
        "points": 25,
        "order_reference": "EXAMPLE-0001",
        "created_at": "2026-10-10T12:31:00+02:00"
      }
    ]
  }
}
GET/store/customer/deals

List deals

Publishable or secret key Sales channel Customer token

Promotions that apply on this channel now (no code needed) and the personal coupons assigned to this member.

Responses
  • 404NOT_A_MEMBER.
Request
curl "https://api.conciar.com/connect/v1/store/customer/deals" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "data": [
    {
      "id": "promo_12",
      "title": "2 for 1 on Tuesdays",
      "description": null,
      "item_id": 101,
      "coupon_code": null,
      "valid_until": null
    },
    {
      "id": "coupon_8",
      "title": "Welcome gift",
      "description": null,
      "item_id": null,
      "coupon_code": "WELCOME-EXAMPLE",
      "valid_until": "2026-12-31T23:59:59+01:00"
    }
  ]
}
GET/store/customer/restaurant/orders

List takeaway orders

Publishable or secret key Sales channel Customer token

The customer's app and takeaway orders, newest first, paginated.

Parameters
per_page
query·integer
1–50, default 20.
page
query·integer
Page number.
Request
curl "https://api.conciar.com/connect/v1/store/customer/restaurant/orders" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "data": [
    {
      "reference": "EXAMPLE-0001",
      "pickup_number": null,
      "pickup_name": "Alex",
      "store": {
        "sales_channel_token": "cnct_ch_your_channel_token",
        "name": "Bistro Example"
      },
      "status": "awaiting_payment",
      "pickup_at": "2026-10-16T12:30:00+02:00",
      "release_at": null,
      "created_at": "2026-10-16T11:58:12+02:00",
      "customer_notes": null,
      "lines": [
        {
          "item_id": 101,
          "name": "Example burger",
          "image_url": null,
          "qty": 2,
          "selections": [
            "Extra cheese"
          ],
          "option_ids": [
            501
          ],
          "unit_price": {
            "amount": "12.50",
            "minor": 1250,
            "currency": "EUR"
          },
          "total_price": {
            "amount": "25.00",
            "minor": 2500,
            "currency": "EUR"
          }
        }
      ],
      "subtotal": {
        "amount": "25.00",
        "minor": 2500,
        "currency": "EUR"
      },
      "discount": {
        "amount": "0.00",
        "minor": 0,
        "currency": "EUR"
      },
      "total": {
        "amount": "25.00",
        "minor": 2500,
        "currency": "EUR"
      },
      "reward_redeemed": false,
      "points_redeemed": 0,
      "points_discount": {
        "amount": "0.00",
        "minor": 0,
        "currency": "EUR"
      },
      "loyalty": {
        "stamps_earned": 0,
        "points_earned": 0
      }
    }
  ],
  "links": {
    "first": "…",
    "last": "…",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "per_page": 20,
    "to": 1,
    "total": 1,
    "…": "…"
  }
}
GET/store/customer/orders

List store orders

Publishable or secret key Sales channel Customer token

The customer's orders with this organization, newest first. Each order has its status, currency, lines (with prices and taxes) and order prices. Internal fields, such as staff notes, are never included.

  • A customer who is not a member gets {"orders": []}.
Parameters
per_page
query·integer
Default 10.
page
query·integer
Page number.
Request
curl "https://api.conciar.com/connect/v1/store/customer/orders" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "orders": {
    "current_page": 1,
    "data": [
      {
        "id": 1,
        "reference": "ORD-EXAMPLE00001",
        "status": {
          "name": "paid"
        },
        "currency": {
          "symbol": "EUR"
        },
        "lines": [
          "…"
        ],
        "prices": [
          "…"
        ],
        "created_at": "2026-10-10T10:00:00.000000Z",
        "…": "…"
      }
    ],
    "per_page": 10,
    "total": 1,
    "…": "…"
  }
}
GET/store/customer/orders/{reference}

Get a store order

Publishable or secret key Sales channel Customer token

One order with its addresses, lines, invoice and payment transactions (key, amount, status, method, paid_at), and credit notes.

Parameters
reference
path·stringrequired
The order reference.
Responses
  • 404Not found, or not this customer's order.
Request
curl "https://api.conciar.com/connect/v1/store/customer/orders/ORD-EXAMPLE00001" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "order": {
    "reference": "ORD-EXAMPLE00001",
    "status": {
      "name": "paid"
    },
    "shipping_address": {
      "…": "…"
    },
    "lines": [
      "…"
    ],
    "invoice": {
      "transactions": [
        "…"
      ]
    },
    "…": "…"
  }
}

Store catalogue

The webshop side: channel settings, categories and products. Prices follow X-Currency (or the channel currency); names follow Accept-Language.

GET/store/config

Get channel settings

Publishable or secret key Sales channel

The sales channel's settings, merged over the defaults: guest checkout, pricing mode (snapshot or live), coupon stacking, hide-out-of-stock, supported countries, enabled payment methods, subscription options and restaurant pickup settings. Keys are camelCase. Back-office settings (the maintenance IP allow-list, abandoned-cart timing, dynamic pricing, receipt printing, subscription fulfilment, capture policy) are not included.

Request
curl "https://api.conciar.com/connect/v1/store/config" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "config": {
    "active": true,
    "maintenanceMode": false,
    "guestCheckout": true,
    "cartPricing": "snapshot",
    "couponsStackable": false,
    "hideOutOfStock": false,
    "supportedCountries": [],
    "paymentMethodsMode": "organization",
    "…": "…"
  }
}
GET/store/categories

List categories

Publishable or secret key Sales channel

Top-level categories with their direct children and how many products in this channel each holds.

Request
curl "https://api.conciar.com/connect/v1/store/categories" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "data": [
    {
      "id": 1,
      "parent_id": null,
      "slug": "coffee",
      "name": "Coffee",
      "description": null,
      "product_count": 12,
      "children": [
        {
          "id": 2,
          "parent_id": 1,
          "slug": "beans",
          "name": "Beans",
          "description": null,
          "product_count": 8
        }
      ]
    }
  ]
}
GET/store/products

List products

Publishable or secret key Sales channel

Active products in this channel, paginated. Each product comes with its type, variants, stock, retail_price, tax breakdown and, when a currency is known, converted_retail_price. stock holds track_stock and available. Only storefront fields are returned: no cost prices and no other sales channels.

Parameters
q
query·string
Search, max 100.
category
query·integer
Category id.
type
query·string
Comma-separated product types, e.g. physical,digital.
sort
query·string
recommended, price_asc, price_desc or newest.
per_page
query·integer
1–100, default 20.
page
query·integer
Page number.
featured, subscription
query·boolean
Only featured / only subscription products.
price_min, price_max
query·number
In the request currency.
property[key]
query·string
Filter on a product property; values come from /store/products/filters.
Request
curl "https://api.conciar.com/connect/v1/store/products?q=coffee&per_page=20" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": 9001,
        "sku": "EX-BEANS-1KG",
        "type": {
          "name": "physical"
        },
        "active": true,
        "out_of_stock": false,
        "featured": false,
        "resolved_info": {
          "name": "Example beans 1 kg",
          "…": "…"
        },
        "retail_price": {
          "amount": "24.95",
          "…": "…"
        },
        "tax": {
          "net": 22.89,
          "tax_total": 2.06,
          "gross": 24.95,
          "…": "…"
        },
        "variants": [],
        "…": "…"
      }
    ],
    "per_page": 20,
    "total": 1,
    "…": "…"
  }
}
GET/store/products/filters

List product filters

Publishable or secret key Sales channel

The property filters for the current product selection, with counts. Takes the same query parameters as the product list.

Request
curl "https://api.conciar.com/connect/v1/store/products/filters" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "filters": [
    {
      "key": "roast",
      "label": "Roast",
      "options": [
        {
          "value": "dark",
          "count": 5
        },
        {
          "value": "light",
          "count": 3
        }
      ]
    }
  ]
}
GET/store/products/{id}

Get a product

Publishable or secret key Sales channel

One product with its translations, categories, price rules and variants (with their options).

Parameters
id
path·integerrequired
Product id.
Responses
  • 404Not found or inactive.
Request
curl "https://api.conciar.com/connect/v1/store/products/9001" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "data": {
    "id": 9001,
    "sku": "EX-BEANS-1KG",
    "resolved_info": {
      "name": "Example beans 1 kg",
      "…": "…"
    },
    "categories": [
      "…"
    ],
    "variants": [
      "…"
    ],
    "…": "…"
  }
}

Cart and checkout

Carts and webshop orders are secret-key calls: run them on your server. Totals in cart responses are plain numbers; cart and order responses are the stored records with their relations.

POST/store/cart/init

Create a cart

Secret key only Sales channel 30/min
Request
curl -X POST "https://api.conciar.com/connect/v1/store/cart/init" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 201
{
  "data": {
    "cart_token": "example_cart_token",
    "cart": {
      "cart_token": "example_cart_token",
      "items": [],
      "totals": {
        "subtotal": 0,
        "discount": 0,
        "promotion_discount": 0,
        "total": 0,
        "…": "…"
      },
      "…": "…"
    }
  }
}
POST/store/cart/sync

Set cart lines and coupons

Secret key only Sales channel 120/min

Declarative: quantities are set, not added, and the coupons you send replace the current ones (send none to clear). A line's price is fixed when it is first added.

Parameters
cart_token
body·stringrequired
The cart.
items[].product_id
body·integerrequired
Product id (required when items is sent).
items[].product_variant_id
body·integer
Variant of that product.
items[].quantity
body·integerrequired
0 removes the line.
items[].purchase_type
body·string
one_time (default) or subscription.
items[].metadata
body·object
Your own data for the line.
coupon_codes
body·string[]
All coupons for the cart (or coupon_code for one).
organization_customer_id
body·integer
Link the cart to a member.
Responses
  • 404Cart not found or no longer active.
  • 422Invalid or expired coupon, or more than one coupon on a channel without stacking.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/cart/sync" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Content-Type: application/json" \
  -d '{
    "cart_token": "example_cart_token",
    "items": [
      {
        "product_id": 9001,
        "quantity": 2
      }
    ]
  }'
Response · 200
{
  "cart": {
    "cart_token": "example_cart_token",
    "items": [
      {
        "product_id": 9001,
        "quantity": 2,
        "line_total": 49.9,
        "…": "…"
      }
    ],
    "totals": {
      "subtotal": 49.9,
      "discount": 0,
      "promotion_discount": 0,
      "total": 49.9,
      "coupons": [],
      "promotions": [],
      "free_shipping": null
    },
    "…": "…"
  }
}
GET/store/cart/{cart_token}

Get a cart

Secret key only Sales channel
Parameters
cart_token
path·stringrequired
The token from POST /store/cart/init.
Responses
  • 404Unknown, converted or expired cart.
Request
curl "https://api.conciar.com/connect/v1/store/cart/example_cart_token" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "cart": {
    "cart_token": "example_cart_token",
    "items": [
      "…"
    ],
    "totals": {
      "…": "…"
    },
    "…": "…"
  }
}
GET/store/cart/{cart_token}/checkout-check

Check a cart before checkout

Secret key only Sales channel

Blocking issues per line (unavailable, not_in_channel, out_of_stock, insufficient_stock, variant_unavailable), price changes on live-pricing channels, and coupons that no longer apply.

Parameters
cart_token
path·stringrequired
The token from POST /store/cart/init.
Request
curl "https://api.conciar.com/connect/v1/store/cart/example_cart_token/checkout-check" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "can_proceed": true,
  "issues": [],
  "has_changes": false,
  "warnings": [],
  "coupon_warnings": []
}
POST/store/cart/{cart_token}/shipping-methods

Shipping methods for a cart

Secret key only Sales channel 120/min
Parameters
cart_token
path·stringrequired
The token from POST /store/cart/init.
country_code
body·stringrequired
ISO-2.
postal_code
body·string
Max 20.
province, city, district
body·string
Max 100 each.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/cart/example_cart_token/shipping-methods" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Content-Type: application/json" \
  -d '{
    "country_code": "NL",
    "postal_code": "1000 AA"
  }'
Response · 200
{
  "shipping_methods": [
    {
      "id": 3,
      "type": "flat_rate",
      "sort_order": 1,
      "is_free": false,
      "carrier": null,
      "delivery_type": "delivery",
      "resolved_info": {
        "name": "Standard",
        "description": null
      },
      "rate": {
        "amount": 4.95,
        "display_price": "€ 4,95",
        "currency": {
          "symbol": "EUR",
          "…": "…"
        }
      }
    }
  ]
}
POST/store/cart/{cart_token}/payment-methods

Payment methods for a cart

Secret key only Sales channel 120/min

Methods that accept the cart amount. A cart with subscription lines only gets methods that support recurring payments.

Parameters
cart_token
path·stringrequired
The token from POST /store/cart/init.
shipping_method_id
body·integer
Chosen shipping method.
country_id
body·integer
Country id.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/cart/example_cart_token/payment-methods" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Content-Type: application/json" \
  -d '{
    "shipping_method_id": 3
  }'
Response · 200
{
  "payment_methods": [
    {
      "id": 1,
      "key": "ideal",
      "type": "redirect",
      "name": "iDEAL",
      "logo": "…",
      "status": "live",
      "fixed_fee": null,
      "fixed_percentage": 0,
      "requires": [],
      "payment_service_provider_id": 2,
      "payment_service_provider_key": "example_psp",
      "min_amount": null,
      "max_amount": null
    }
  ]
}
GET/store/payment-methods

List payment methods

Publishable or secret key Sales channel

The channel's payment methods. type is wallet (Apple Pay, Google Pay) or redirect; requires lists the customer details a method needs (name, email, phone, billing_address, birth_date).

Parameters
amount
query·number
Drop methods whose minimum or maximum excludes this amount.
recurring
query·boolean
Only methods that support recurring payments.
Request
curl "https://api.conciar.com/connect/v1/store/payment-methods" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "payment_methods": [
    {
      "id": 1,
      "key": "ideal",
      "type": "redirect",
      "name": "iDEAL",
      "logo": "…",
      "status": "live",
      "supports_recurrent": false,
      "requires": [],
      "payment_service_provider_id": 2,
      "payment_service_provider_key": "example_psp",
      "min_amount": null,
      "max_amount": null
    }
  ],
  "currency": "EUR"
}
GET/store/shipping/locations

Find pickup points

Secret key only Sales channel

PostNL pickup points near a postcode. Only when the merchant has PostNL enabled.

Parameters
country_code
query·stringrequired
ISO-2.
postal_code
query·stringrequired
Max 16.
Responses
  • 404No shipping carrier is available.
Request
curl "https://api.conciar.com/connect/v1/store/shipping/locations?country_code=NL&postal_code=1000AA" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "locations": [
    {
      "code": "123456",
      "name": "Example pickup point",
      "distance": 350,
      "latitude": 52,
      "longitude": 4,
      "address": {
        "…": "…"
      },
      "delivery_options": [
        "PG"
      ],
      "opening_hours": {
        "Monday": [
          "09:00-18:00"
        ]
      }
    }
  ]
}
GET/store/shipping/delivery-options

Delivery timeframes

Secret key only Sales channel

PostNL daytime delivery windows from tomorrow up to seven days ahead.

Parameters
country_code
query·stringrequired
ISO-2.
postal_code
query·stringrequired
Max 16.
house_number
query·stringrequired
Max 16.
Responses
  • 404No shipping carrier is available.
Request
curl "https://api.conciar.com/connect/v1/store/shipping/delivery-options?country_code=NL&postal_code=1000AA&house_number=1" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "delivery_options": [
    {
      "date": "2026-10-17",
      "timeframes": [
        {
          "from": "09:00:00",
          "to": "12:00:00",
          "options": [
            "Daytime"
          ]
        }
      ]
    }
  ]
}
POST/store/orders

Place a webshop order

Secret key only Sales channel Customer token optional

Turns a cart into an order and starts the payment. Redirect methods return payment_url; with an Apple Pay or Google Pay token the charge happens in this call. Customer details are required unless a bearer token is sent or the channel allows guest checkout.

Parameters
cart_token
body·stringrequired
An active cart with items.
shipping_method_id
body·integerrequired
From the cart's shipping methods.
payment_method_key
body·stringrequired
Payment method key.
payment_service_provider_key
body·stringrequired
Provider key.
return_url
body·string
Required except for applepay and google_pay.
shipping_address
body·objectrequired
city and country_id required; street, house_number, apartment, zipcode, district, state optional.
billing_address
body·object
Same fields; defaults to the shipping address.
customer
body·object
email, first_name, last_name, phone {number, country_id}.
customer_notes
body·string
Max 1000.
pickup_location_code
body·string
A pickup point code. Max 32.
apple_pay_token, google_pay_token
body·object|string
Wallet token for an immediate charge.
Responses
  • 422Validation (cart, stock, coupon, shipping or payment method problems) or PAYMENT_METHOD_UNAVAILABLE / PAYMENT_FAILED / INVALID_WALLET_TOKEN.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/orders" \
  -H "Accept: application/json" \
  -H "X-Api-Key: cnct_your_secret_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Content-Type: application/json" \
  -d '{
    "cart_token": "example_cart_token",
    "shipping_method_id": 3,
    "payment_method_key": "ideal",
    "payment_service_provider_key": "example_psp",
    "return_url": "https://shop.example.com/checkout/return",
    "customer": {
      "email": "alex@example.com",
      "first_name": "Alex"
    },
    "shipping_address": {
      "street": "Example Street",
      "house_number": "1",
      "zipcode": "1000 AA",
      "city": "Example City",
      "country_id": 150
    }
  }'
Response · 201
{
  "order": {
    "reference": "ORD-EXAMPLE00001",
    "…": "…"
  },
  "invoice": {
    "…": "…"
  },
  "transaction": {
    "…": "…"
  },
  "payment_url": "https://payment-provider.example/checkout/…",
  "transaction_key": "example-transaction-key",
  "payment": {
    "type": "redirect",
    "payment_url": "https://payment-provider.example/checkout/…",
    "transaction_key": "example-transaction-key"
  }
}
GET/store/payment/{transaction_key}/status

Check a payment

Publishable or secret key Sales channel 60/min

Call this when the customer comes back on your return_url. A pending payment is checked live with the provider.

Parameters
transaction_key
path·stringrequired
From the order response.
Responses
  • 404Unknown transaction.
Request
curl "https://api.conciar.com/connect/v1/store/payment/example-transaction-key/status" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token"
Response · 200
{
  "transaction_key": "example-transaction-key",
  "status": "paid",
  "is_paid": true,
  "is_pending": false,
  "is_failed": false,
  "amount": "49.90",
  "order_reference": "ORD-EXAMPLE00001"
}

Customer subscriptions

Let a signed-in customer manage their product subscriptions. Responses carry the subscription with its product, price, payment method (card or IBAN last four digits, provider and method; never mandate references) and addresses. Skip, pause and cancel are refused (422) while a minimum commitment is still running.

GET/store/customer/subscriptions

List subscriptions

Publishable or secret key Sales channel Customer token
Request
curl "https://api.conciar.com/connect/v1/store/customer/subscriptions" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "subscriptions": [
    {
      "id": 31,
      "status": {
        "name": "active"
      },
      "quantity": 1,
      "next_billing_at": "2026-11-01T00:00:00.000000Z",
      "skip_count": 0,
      "product": {
        "…": "…"
      },
      "cycles_count": 4,
      "…": "…"
    }
  ]
}
GET/store/customer/subscriptions/{id}

Get a subscription

Publishable or secret key Sales channel Customer token
Parameters
id
path·integerrequired
The subscription id.
Responses
  • 404Not found for this customer.
Request
curl "https://api.conciar.com/connect/v1/store/customer/subscriptions/31" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "subscription": {
    "id": 31,
    "status": {
      "name": "active"
    },
    "…": "…"
  }
}
POST/store/customer/subscriptions/{id}/skip

Skip renewals

Publishable or secret key Sales channel Customer token
Parameters
id
path·integerrequired
The subscription id.
times
body·integerrequired
1–12 renewals to skip. Active subscriptions only.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/skip" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token" \
  -H "Content-Type: application/json" \
  -d '{
    "times": 1
  }'
Response · 200
{
  "subscription": {
    "…": "…"
  },
  "message": "The next 1 renewal(s) will be skipped."
}
POST/store/customer/subscriptions/{id}/unskip

Undo skips

Publishable or secret key Sales channel Customer token
Parameters
id
path·integerrequired
The subscription id.
times
body·integer
How many to remove; all when left out.
Responses
  • 422This subscription has no pending skips.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/unskip" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "subscription": {
    "…": "…"
  },
  "message": "All pending skips have been removed."
}
POST/store/customer/subscriptions/{id}/pause

Pause

Publishable or secret key Sales channel Customer token
Parameters
id
path·integerrequired
The subscription id.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/pause" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "subscription": {
    "…": "…"
  },
  "message": "Your subscription has been paused."
}
POST/store/customer/subscriptions/{id}/resume

Resume

Publishable or secret key Sales channel Customer token

A new period starts today; nothing is charged now.

Parameters
id
path·integerrequired
The subscription id.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/resume" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "subscription": {
    "…": "…"
  },
  "message": "Your subscription has been resumed. Next billing on 2026-11-16."
}
POST/store/customer/subscriptions/{id}/cancel

Cancel

Publishable or secret key Sales channel Customer token
Parameters
id
path·integerrequired
The subscription id.
cancellation_reason
body·string
Max 500.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/cancel" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "subscription": {
    "…": "…"
  },
  "message": "Your subscription has been cancelled."
}
GET/store/customer/subscriptions/{id}/swap-options

Products to swap to

Publishable or secret key Sales channel Customer token

Other subscription products in this channel, or other variants of the same product when the channel only allows variant swaps. Needs product swapping turned on for the channel.

Parameters
id
path·integerrequired
The subscription id.
Responses
  • 422Product swap is not enabled for this channel.
Request
curl "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/swap-options" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token"
Response · 200
{
  "products": [
    {
      "id": 9002,
      "…": "…"
    }
  ]
}
POST/store/customer/subscriptions/{id}/swap

Swap product

Publishable or secret key Sales channel Customer token
Parameters
id
path·integerrequired
The subscription id.
product_id
body·integer
The new product (product swaps).
product_variant_id
body·integer
The new variant (required for variant-only swaps).
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/swap" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": 9002
  }'
Response · 200
{
  "subscription": {
    "…": "…"
  },
  "message": "Your subscription product has been updated."
}
POST/store/customer/subscriptions/{id}/payment-method

Change payment method

Publishable or secret key Sales channel Customer token

Starts a mandate payment of the smallest unit of the currency (e.g. € 0.01). Send the customer to payment_url.

Parameters
id
path·integerrequired
The subscription id.
payment_service_provider_id
body·integerrequired
Provider id.
payment_method_id
body·integerrequired
Method id.
return_url
body·stringrequired
URL.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/payment-method" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token" \
  -H "Content-Type: application/json" \
  -d '{
    "payment_service_provider_id": 2,
    "payment_method_id": 1,
    "return_url": "https://shop.example.com/account"
  }'
Response · 200
{
  "payment_url": "https://payment-provider.example/checkout/…",
  "transaction_key": "example-transaction-key",
  "transaction": {
    "…": "…"
  }
}
POST/store/customer/subscriptions/{id}/shipping-methods

Shipping methods for a subscription

Publishable or secret key Sales channel Customer token
Parameters
id
path·integerrequired
The subscription id.
country_code
body·stringrequired
ISO-2.
postal_code
body·string
Max 20.
province, city, district
body·string
Max 100 each.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/shipping-methods" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token" \
  -H "Content-Type: application/json" \
  -d '{
    "country_code": "NL"
  }'
Response · 200
{
  "shipping_methods": [
    {
      "id": 3,
      "type": "flat_rate",
      "is_free": false,
      "…": "…"
    }
  ]
}
POST/store/customer/subscriptions/{id}/shipping

Change shipping

Publishable or secret key Sales channel Customer token

Replaces the shipping method and addresses for future renewals.

Parameters
id
path·integerrequired
The subscription id.
shipping_method_id
body·integerrequired
Shipping method.
shipping_address
body·objectrequired
street, house_number, city, zipcode and country_id required; apartment, district, state optional.
billing_address
body·object
Defaults to the shipping address.
Responses
  • 422The selected shipping method is not available for this address.
Request
curl -X POST "https://api.conciar.com/connect/v1/store/customer/subscriptions/31/shipping" \
  -H "Accept: application/json" \
  -H "X-Api-Key: pk_your_publishable_key" \
  -H "X-Sales-Channel: cnct_ch_your_channel_token" \
  -H "Authorization: Bearer your_customer_access_token" \
  -H "Content-Type: application/json" \
  -d '{
    "shipping_method_id": 3,
    "shipping_address": {
      "street": "Example Street",
      "house_number": "1",
      "city": "Example City",
      "zipcode": "1000 AA",
      "country_id": 150
    }
  }'
Response · 200
{
  "subscription": {
    "…": "…"
  }
}

Public booking API

The guest side of Conciar reservations, without an API key: a restaurant's booking settings, availability, booking a table (with deposit or card guarantee), the guest's own reservation, ticketed events and gift cards. It is what the Conciar booking widget and guest app use.

Base URL

https://api.conciar.com/public/v1

No key. {restaurant} is the restaurant's guid or handle. Limits are per restaurant and IP address. Errors are {"status": false, "code": "…"}.

Restaurant and countries

GET/restaurants/{restaurant}

Get booking settings

No key 120/min

Whether the restaurant takes online bookings (available, and a reason when not: NO_RESTAURANT, RESERVATIONS_OFF or NO_TABLES), the restaurant details, the booking window and party limits, deposit and no-show settings, and links to the hosted booking page. Also returns the booking page texts (t, tp) in the chosen language.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Responses
  • 404NOT_FOUND — no such restaurant.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "available": true,
  "reason": null,
  "locale": "en",
  "locales": [
    "en",
    "nl",
    "de",
    "fr",
    "es"
  ],
  "restaurant": {
    "guid": "00000000000000000",
    "handle": "bistro-example",
    "name": "Bistro Example",
    "logo": null,
    "accent": "#1f6f5c",
    "address": "Example Street 1, 1000 AA Example City",
    "phone": null,
    "email": "hello@example.com",
    "country_id": 150
  },
  "booking": {
    "max_party": 8,
    "party_cap": 20,
    "first_day": "2026-10-16",
    "last_day": "2027-01-14",
    "hold_minutes": 30,
    "deposit_per_person": null,
    "no_show_protection": "none",
    "free_cancellation_hours": 24
  },
  "links": {
    "booking_page": "https://r.conciar.com/bistro-example?lang=en",
    "events": null
  },
  "gift_cards": {
    "enabled": false,
    "url": null
  },
  "t": {
    "…": "…"
  },
  "tp": {
    "…": "…"
  }
}
GET/countries

List countries

No key 60/min

Countries with localized names and calling prefixes, for the phone field. Cached for a day.

Parameters
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Request
curl "https://api.conciar.com/public/v1/countries?lang=en" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "locale": "en",
  "countries": [
    {
      "id": 150,
      "name": "Netherlands",
      "iso": "NL",
      "prefix": 31
    }
  ]
}

Availability

GET/restaurants/{restaurant}/calendar

Days of a month

No key 120/min

Every day of the month as open, closed, full or unavailable (outside the booking window) for a party size.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
party_size
query·integerrequired
Guests, 1 up to booking.max_party from GET /restaurants/{restaurant} (never more than 20).
month
query·stringrequired
Y-m.
Responses
  • 404UNAVAILABLE — the restaurant takes no online bookings.
  • 422INVALID, with errors.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/calendar?party_size=2&month=2026-10" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "month": "2026-10",
  "days": {
    "2026-10-16": "open",
    "2026-10-17": "full",
    "2026-10-18": "closed",
    "…": "…"
  }
}
GET/restaurants/{restaurant}/times

Times on a day

No key 120/min

The bookable times for a date and party size, each with the deposit or card guarantee that applies, plus the ticketed events that day (their times are not bookable as a normal table).

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
party_size
query·integerrequired
Guests, 1 up to booking.max_party from GET /restaurants/{restaurant} (never more than 20).
date
query·stringrequired
Y-m-d.
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Responses
  • 404UNAVAILABLE.
  • 422INVALID.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/times?party_size=2&date=2026-10-24" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "date": "2026-10-24",
  "times": [
    {
      "time": "18:00",
      "deposit": null,
      "guarantee": null
    },
    {
      "time": "19:00",
      "deposit": null,
      "guarantee": null
    }
  ],
  "events": []
}

Reservations

POST/restaurants/{restaurant}/reservations

Book a table

No key 10/min

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 guest returns to your return_url.

  • 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.
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
request_id
body·stringrequired
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_size
body·integerrequired
Number of guests.
date
body·stringrequired
Y-m-d.
time
body·stringrequired
H:i, one of the times returned by the times endpoint.
first_name
body·stringrequired
Max 80 characters.
last_name
body·stringrequired
Max 80 characters.
email
body·stringrequired
Max 190 characters.
phone_country_id
body·integerrequired
A country id from GET /countries.
phone
body·stringrequired
6–25 characters: digits, spaces and + ( ) . -
note
body·string
Max 500 characters.
marketing_opt_in
body·boolean
The guest agrees to receive marketing.
source
body·string
booking_page (default) or widget.
lang
body·string
en, nl, de, fr or es — the language of the emails.
return_url
body·string
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_consent
body·boolean
Must be true when a card guarantee applies (show terms.consent_text from GET …/guarantee).
Responses
  • 200Replay of an earlier request_id (replayed: true).
  • 404UNAVAILABLE.
  • 409DEPOSIT_UNAVAILABLE or GUARANTEE_UNAVAILABLE — the restaurant cannot take the payment it requires.
  • 422INVALID, INVALID_PARTY_SIZE, 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.
Request
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"
  }'
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/restaurants/{restaurant}/reservations/{request_id}

Get a booking by request id

No key 120/min

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

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
request_id
path·stringrequired
The request_id you booked with.
Responses
  • 404NOT_FOUND.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/6f1c2a9e-0000-4000-8000-000000000000" \
  -H "Accept: application/json"
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
}
GET/restaurants/{restaurant}/guarantee

Card guarantee terms

No key 120/min

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.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
party_size
query·integerrequired
1–20.
date
query·stringrequired
Y-m-d.
time
query·stringrequired
H:i.
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Request
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"
Response · 200
{
  "status": true,
  "required": false,
  "available": true,
  "reason": null,
  "message": null,
  "terms": null
}
GET/restaurants/{restaurant}/reservations/{token}/guarantee

A booking's card guarantee

No key 120/min
  • With a guarantee: guarantee_status (pending, active, failed, charging, charge_failed, charged, waived), awaits_card, card_on_file, terms, deadline, deadline_passed and payment_url while a card is still needed.
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The 40-character confirmation token from manage_url.
Responses
  • 404NOT_FOUND.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/guarantee" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "has_guarantee": false
}
POST/restaurants/{restaurant}/reservations/{token}/guarantee/card

Get the card page

No key 10/min

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

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The 40-character confirmation token from manage_url.
Responses
  • 404NOT_FOUND.
  • 409NO_CARD_DUE.
Request
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/guarantee/card" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "payment_url": "https://payment-provider.example/card/…"
}

The guest's reservation

What the guest can do with the confirmation token. The token works until a day after the reservation; unknown and expired tokens both answer 404 NOT_FOUND.

GET/restaurants/{restaurant}/reservations/{token}/manage

Get the reservation

No key 120/min
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The 40-character confirmation token from manage_url.
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/manage" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "locale": "en",
  "handle": "bistro-example",
  "reservation": {
    "reference": "EXAMPLE-R-0001",
    "date": "2026-10-24",
    "time": "19:00",
    "party_size": 2,
    "name": "Alex Example",
    "email": "alex@example.com",
    "note": null
  },
  "state": "confirmed",
  "expired": false,
  "deposit": null,
  "deposit_paid": false,
  "payment_url": null,
  "awaits_card": false,
  "guarantee": null,
  "tickets": null,
  "can_cancel": true,
  "address": "Example Street 1, 1000 AA Example City",
  "sms": {
    "available": true,
    "opted_out": false
  }
}
POST/restaurants/{restaurant}/reservations/{token}/cancel

Cancel the reservation

No key 10/min

The guest is emailed and the restaurant notified. Returns the same fields as the manage call plus outcome: cancelled, already or not_cancellable.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The 40-character confirmation token from manage_url.
Responses
  • 422outcome not_cancellable — past, or has paid tickets.
Request
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/cancel" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "outcome": "cancelled",
  "state": "cancelled",
  "can_cancel": false,
  "…": "…"
}
POST/restaurants/{restaurant}/reservations/{token}/sms-stop

Stop text messages

No key 10/min
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The 40-character confirmation token from manage_url.
Responses
  • 422The guest has no valid mobile number.
Request
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/sms-stop" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "sms": {
    "available": true,
    "opted_out": true
  }
}
POST/restaurants/{restaurant}/reservations/{token}/sms-start

Resume text messages

No key 10/min
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The 40-character confirmation token from manage_url.
Responses
  • 422The guest has no valid mobile number.
Request
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/sms-start" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "sms": {
    "available": true,
    "opted_out": false
  }
}

Ticketed events

Special events sold with tickets, paid in full when booked (held 30 minutes).

GET/restaurants/{restaurant}/events

List events

No key 120/min

Ticketed events that are on sale or not on sale yet.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/events" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "events": [
    {
      "id": 7,
      "name": "Example wine dinner",
      "description": "Five courses with matching wines.",
      "url": "https://r.conciar.com/bistro-example/events/example-wine-dinner",
      "slug": "example-wine-dinner",
      "when": "Fri 30 Oct, 19:00 – 23:00",
      "start_date": "2026-10-30",
      "end_date": "2026-10-30",
      "start_time": "19:00",
      "end_time": "23:00",
      "start_iso": "2026-10-30T19:00:00+01:00",
      "seating": "tables",
      "unit": {
        "amount": "65.00",
        "minor": 6500,
        "currency": "EUR"
      },
      "unit_label": "€ 65,00 per person",
      "vat_rate": 9,
      "max_per_booking": 8,
      "state": "open",
      "remaining": 24,
      "sold_out": false,
      "sale_opens": null
    }
  ]
}
GET/restaurants/{restaurant}/events/{event}

Get an event

No key 120/min
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
event
path·integerrequired
Event id.
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Responses
  • 404NOT_FOUND.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/events/7" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "event": {
    "id": 7,
    "name": "Example wine dinner",
    "description": "Five courses with matching wines.",
    "url": "https://r.conciar.com/bistro-example/events/example-wine-dinner",
    "slug": "example-wine-dinner",
    "when": "Fri 30 Oct, 19:00 – 23:00",
    "start_date": "2026-10-30",
    "end_date": "2026-10-30",
    "start_time": "19:00",
    "end_time": "23:00",
    "start_iso": "2026-10-30T19:00:00+01:00",
    "seating": "tables",
    "unit": {
      "amount": "65.00",
      "minor": 6500,
      "currency": "EUR"
    },
    "unit_label": "€ 65,00 per person",
    "vat_rate": 9,
    "max_per_booking": 8,
    "state": "open",
    "remaining": 24,
    "sold_out": false,
    "sale_opens": null
  },
  "on_sale": true,
  "max_tickets": 8,
  "hold_minutes": 30,
  "t": {
    "…": "…"
  }
}
GET/restaurants/{restaurant}/events/{event}/dates

Event dates

No key 120/min
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
event
path·integerrequired
Event id.
party_size
query·integerrequired
1–20.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/events/7/dates?party_size=2" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "dates": [
    {
      "date": "2026-10-30",
      "status": "open"
    }
  ]
}
GET/restaurants/{restaurant}/events/{event}/times

Event times and price

No key 120/min
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
event
path·integerrequired
Event id.
party_size
query·integerrequired
1–20.
date
query·stringrequired
Y-m-d.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/events/7/times?party_size=2&date=2026-10-30" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "date": "2026-10-30",
  "times": [
    "19:00"
  ],
  "total": {
    "amount": "130.00",
    "minor": 13000,
    "currency": "EUR"
  },
  "tax": {
    "amount": "10.73",
    "minor": 1073,
    "currency": "EUR"
  },
  "vat_rate": 9
}
POST/restaurants/{restaurant}/events/{event}/tickets

Buy tickets

No key 10/min

Books the tickets and returns the payment page; the booking is held for 30 minutes until paid.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
event
path·integerrequired
Event id.
request_id
body·stringrequired
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_size
body·integerrequired
Number of guests.
date
body·stringrequired
Y-m-d.
time
body·stringrequired
H:i, one of the times returned by the times endpoint.
first_name
body·stringrequired
Max 80 characters.
last_name
body·stringrequired
Max 80 characters.
email
body·stringrequired
Max 190 characters.
phone_country_id
body·integerrequired
A country id from GET /countries.
phone
body·stringrequired
6–25 characters: digits, spaces and + ( ) . -
note
body·string
Max 500 characters.
marketing_opt_in
body·boolean
The guest agrees to receive marketing.
source
body·string
booking_page (default) or widget.
lang
body·string
en, nl, de, fr or es — the language of the emails.
return_url
body·string
http(s) URL, max 2000. Where the guest lands after paying; without it they land on the reservation page in the Conciar guest app.
Responses
  • 409TICKETS_UNAVAILABLE, SALE_CLOSED or SOLD_OUT.
  • 422INVALID, TOO_MANY or SLOT_TAKEN.
  • 502PAYMENT_FAILED.
  • 503BUSY.
Request
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/events/7/tickets" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "0b7d4c1e-0000-4000-8000-000000000000",
    "party_size": 2,
    "date": "2026-10-30",
    "time": "19:00",
    "first_name": "Alex",
    "last_name": "Example",
    "email": "alex@example.com",
    "phone_country_id": 150,
    "phone": "+31 6 00000000"
  }'
Response · 201
{
  "status": true,
  "replayed": false,
  "payment_url": "https://payment-provider.example/checkout/…",
  "hold_minutes": 30,
  "manage_url": "https://r.conciar.com/bistro-example/reservation/0000000000000000000000000000000000000000",
  "token": "0000000000000000000000000000000000000000",
  "tickets": {
    "reference": "EXAMPLE-T-0001",
    "quantity": 2,
    "date": "2026-10-30",
    "time": "19:00",
    "status": "pending"
  }
}
GET/restaurants/{restaurant}/reservations/{token}/tickets

A booking's tickets

No key 120/min
Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The 40-character confirmation token from manage_url.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/reservations/0000000000000000000000000000000000000000/tickets" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "tickets": {
    "reference": "EXAMPLE-T-0001",
    "quantity": 2,
    "event": "Example wine dinner",
    "total": "€ 130,00",
    "status": "paid"
  },
  "payment_url": null
}

Gift cards

Selling the restaurant's gift cards online. Separate limits: 60 reads and 6 purchases per minute. Here the restaurant is matched on its exact guid or current handle.

GET/restaurants/{restaurant}/gift-cards

Gift card settings

No key 60/min

Whether gift cards are on sale (reason when not: NO_RESTAURANT, DISABLED or NO_ONLINE_PAYMENTS), the preset amounts, the custom amount range and how long cards stay valid.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
lang
query·string
en, nl, de, fr or es. Falls back to Accept-Language, then the restaurant's language, then en.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/gift-cards" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "available": true,
  "reason": null,
  "locale": "en",
  "locales": [
    "en",
    "nl",
    "de",
    "fr",
    "es"
  ],
  "restaurant": {
    "name": "Bistro Example",
    "guid": "00000000000000000",
    "handle": "bistro-example",
    "logo": null,
    "accent": "#1f6f5c",
    "email": "hello@example.com",
    "website": null
  },
  "page_url": "https://r.conciar.com/bistro-example/gift-card",
  "currency": "EUR",
  "presets": [
    {
      "amount": "25.00",
      "minor": 2500,
      "currency": "EUR"
    },
    {
      "amount": "50.00",
      "minor": 5000,
      "currency": "EUR"
    }
  ],
  "allow_custom_amount": true,
  "min_amount": {
    "amount": "10.00",
    "minor": 1000,
    "currency": "EUR"
  },
  "max_amount": {
    "amount": "500.00",
    "minor": 50000,
    "currency": "EUR"
  },
  "validity_months": 24,
  "validity_text": "…"
}
POST/restaurants/{restaurant}/gift-cards/purchase

Buy a gift card

No key 6/min

Returns the payment page. After paying, the buyer lands on status_url in the Conciar guest app; the card is emailed to the buyer or the recipient.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
request_id
body·stringrequired
Your idempotency id, 8–64 letters, digits or dashes.
amount
body·numberrequired
A preset, or within the custom range when allowed.
purchaser_name
body·stringrequired
Max 160.
purchaser_email
body·stringrequired
Max 190.
deliver_to
body·stringrequired
recipient or buyer.
recipient_name
body·string
Max 160.
recipient_email
body·string
Required when deliver_to is recipient.
message
body·string
Max 500.
marketing_opt_in
body·boolean
Consent to marketing.
lang
body·string
en, nl, de, fr or es.
Responses
  • 404UNAVAILABLE — the restaurant does not sell gift cards online.
  • 409UNAVAILABLE — online payments are not available.
  • 422INVALID or INVALID_AMOUNT.
  • 502PAYMENT_FAILED.
  • 503BUSY.
Request
curl -X POST "https://api.conciar.com/public/v1/restaurants/bistro-example/gift-cards/purchase" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "3a9e5f20-0000-4000-8000-000000000000",
    "amount": 50,
    "purchaser_name": "Alex Example",
    "purchaser_email": "alex@example.com",
    "deliver_to": "buyer"
  }'
Response · 201
{
  "status": true,
  "replayed": false,
  "payment_url": "https://payment-provider.example/checkout/…",
  "token": "example_gift_card_token",
  "status_url": "https://r.conciar.com/bistro-example/gift-card/order/example_gift_card_token"
}
GET/restaurants/{restaurant}/gift-cards/purchase/{token}

Purchase status

No key 60/min

paid, pending or failed (a payment still pending after two hours counts as failed). card_url when paid, payment_url while pending.

Parameters
restaurant
path·stringrequired
The restaurant's guid or its handle (any case, a leading @ is ignored; former handles still resolve).
token
path·stringrequired
The token from the purchase.
Request
curl "https://api.conciar.com/public/v1/restaurants/bistro-example/gift-cards/purchase/example_gift_card_token" \
  -H "Accept: application/json"
Response · 200
{
  "status": true,
  "state": "paid",
  "locale": "en",
  "restaurant": {
    "…": "…"
  },
  "amount": {
    "amount": "50.00",
    "minor": 5000,
    "currency": "EUR"
  },
  "to_recipient": false,
  "sent_to": "alex@example.com",
  "card_url": "…",
  "payment_url": null,
  "page_url": "https://r.conciar.com/bistro-example/gift-card"
}