CnterDocumentationSign in

Start here

  • What Cnter is
  • Core concepts
  • Quickstart

Platform

  • Authentication
  • Conventions
  • Errors
  • Organization
  • The dashboard

Modules

  • Content Management
  • Online Ordering
  • Restaurant Ordering
  • Promotions
  • Reservations
  • Bookings
  • Contact Form

Payments

  • AgnusPAY
  • Tax

Services

  • Address autocomplete
  • Video
  • Email

Reference

  • API reference

Reference

API reference

Every endpoint an integration can call, with its method, its credentials and where it is explained.

A full brief for whoever builds against this.

The full integration surface on one page. Endpoints not listed here belong to the dashboard, take a signed-in session, and are not part of the supported API.

Base URL
The host your customer's dashboard runs on
Key header
X-API-Key
Organization header
x-organization-id

Content#

GET/api/content/itemsread_content

Published items. Send content_type, plus page, limit, search as needed.

GET/api/content/items/{id}read_content

One item, with its content type and field definitions.

GET/api/content/typesread_content

Every content type in the organization, with its fields.

GET/api/content/docsread_content

Documentation generated from this organization's own schema, as JSON.

Explained in Content Management.

Ordering and checkout#

These are the versioned contract addresses, which is what a storefront calls and what the client script names for you. Each also answers where it always did — the quote at /api/public/{organizationId}/quote, and the online checkout at /api/online-ordering/checkout — and those keep working while promising nothing about their shape.

POST/api/client/v1/{organizationId}/quotePublic

What a basket costs: items, fees, the delivery fee, discounts and tax, plus whether it can be ordered at all. The call a cart makes on every change.

POST/api/client/v1/{organizationId}/checkoutPublic

Online payment. Pass success_url and cancel_url. Returns a Stripe URL. The only checkout address a browser can reach. The client names it checkout.

POST/api/online-ordering/checkoutcreate_orders

Pay in person. Send custom_payment_method_id. Creates the order immediately as unpaid. The client names it checkoutInPerson and sends your key to it — the one ordering call it does; through checkout the same basket arrives without a key and is refused.

GET/api/public/{organizationId}/organizationPublic

Business details and opening hours. Needs no key — see Organization.

GET/api/organization-profileadmin, owner, manager

The full business profile, including unpublished fields. Dashboard only; API keys are refused.

GET/api/client/v1/{organizationId}/payment-methodsPublic

Active online methods and pay-in-person methods.

GET/api/client/v1/{organizationId}/feesPublic

Active order fees, in display order. The catalogue, including the optional and variable ones a quote does not list until they are applied.

GET/api/client/v1/{organizationId}/restaurantPublic

Fulfillment types, preparation times, the delivery area summary and the tax configuration.

POST/api/client/v1/{organizationId}/promotions/previewPublic

What a discount code is worth on the items alone. For checking a code before there is a basket to quote.

GET/api/client/v1/{organizationId}/restaurant/delivery-checkPublic

Whether one address can be delivered to, with no basket involved. For an address field that validates before a cart exists; the quote answers this and the price together once there is one.

GET/api/ordersread_orders

Orders with their line items. Filter by status and user_id.

POST/api/orderswrite_orders

Create an order directly. For back-office integrations, not storefronts.

Explained in Online Ordering, Restaurant Ordering and Promotions.

Address#

GET/api/public/{organizationId}/address/suggest?q=Public

Address suggestions, already shaped for fulfillment.address.

GET/api/public/{organizationId}/address/lookup?id=Public

The full address for a suggestion id. Optional, kept for older integrations.

Reservations#

GET/api/reservation-settingsread_reservation_settings

The six fields a booking form follows: opening hours with their exceptions, slot configuration, party size cap, capacity, whether a booking waits for approval, and calendar_timezone.

GET/api/reservation-typesread_reservation_settings

The reservation types, each with its slug, its booking limits and the fields its form asks for.

GET/api/client/v1/{organizationId}/reservations/open-slotsPublic

Which slots still have room on one day. Takes date, and optionally party_size and reservation_type_slug.

PUT/api/reservation-settingswrite_reservation_settings

Change those settings. Not something a booking widget should hold.

GET/api/reservationsread_reservations

Existing reservations. Filter by start_date, end_date, reservation_type_slug.

POST/api/reservationswrite_reservations

Create a reservation. Send booking_source: "website" from a public widget.

GET/api/reservations/{id}read_reservations

One reservation.

PATCH/api/reservations/{id}write_reservations

Update a reservation. A moved start is held to the same rules as a new one, and booking_source is ignored. A key cannot confirm, decline or cancel: its status is ignored, and so are internal_notes, rejection_reason, resource_ids and quarantined_at — those are the staff's. With nothing left to change, it changes nothing and answers the reservation as it stands.

Explained in Reservations.

Bookings#

GET/api/client/v1/{organizationId}/bookings/hoursPublic

Per day, when the venue takes a booking, and whether it takes requests at all. Not which times are free.

GET/api/client/v1/{organizationId}/bookings/open-slotsPublic

Per day, the start times still free for an appointment of duration minutes. Times only, nothing about who booked.

GET/api/bookingsread_bookings

Bookings for the organization, paginated.

GET/api/bookings/{id}read_bookings

One booking, with its status.

POST/api/bookingswrite_bookings

Create a booking and send the confirmation email.

Explained in Bookings.

Contact form#

POST/api/contact-formcontact_form_submit

Store a submission and notify the organization.

GET/api/contact-formcontact_form_manage

Submissions for the organization, paginated.

PATCH/api/contact-form/{id}contact_form_manage

Change the status: new, read, replied or archived.

DELETE/api/contact-form/{id}contact_form_manage

Delete a submission and its replies.

GET/api/contact-form/{id}/repliescontact_form_manage

The reply thread for one submission.

POST/api/contact-form/{id}/repliescontact_form_manage

Reply by email and record it. Moves the submission to replied.

Explained in Contact Form. Everything here but the submit is a back office's: not in the manifest and not in @cnter/client, so it is called by path with a contact_form_manage key from a server.

Media#

GET/api/public/video/{videoId}/thumbnailPublic

Poster frame for a video field, as an ordinary image.

GET/embed/{videoId}Public

The video player. Use in an iframe, without query parameters.

Explained in Video.

Legacy#

GET/api/v1/productsPublic

Gone. The product catalog moved into Content Management in August 2025; this endpoint answers 410 with code RESOURCE_GONE to every caller. Read the catalog at /api/content/items?content_type=<slug> instead.

Shared behaviour#

Pagination, the response envelope, date formats, unknown-field handling and CORS are the same everywhere. They are in Conventions, and the statuses are in Errors.

PreviousEmail

On this page

  • Content
  • Ordering and checkout
  • Address
  • Reservations
  • Bookings
  • Contact form
  • Media
  • Legacy
  • Shared behaviour