Welcome to our Ordering API

Welcome to the Ordering API!

Ordering.co gives you a complete ordering back end as an API — businesses and menus, carts and checkout, orders and their lifecycle, delivery logistics, customers, loyalty, payments and reporting. You build the experience; we handle everything behind it.

This page gets you from zero to your first authenticated request. Every endpoint in the reference is live — you can call it from the browser using Try It.

Base URL

https://apiv4.ordering.co

Every URL has the same shape

This is the single most important thing to understand before your first call:

https://apiv4.ordering.co/{api_version}/{language}/{project}/{resource}
SegmentWhat it isExample
api_versionThe API version you're targetingv400
languageISO code for localized content (names, descriptions, messages)en, es
projectYour project code. Identifies your tenant — its own isolated datademo
resourceWhat you're acting onbusiness, orders, users

Put together:

https://apiv4.ordering.co/v400/en/demo/business
📘

About project

Ordering is multi-tenant. Your project code routes the request to your own data, so the same endpoint returns different results for different projects. You'll find your project code in your Ordering dashboard — replace demo in every example below with it.

Authenticate

The Ordering API supports two authentication methods. Pick based on who is calling.

Option 1 — Bearer token (for apps acting on behalf of a user)

This is the common path. Exchange credentials for a JWT, then send it on every request.

curl -X POST "https://apiv4.ordering.co/v400/en/demo/auth" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "your-password"
  }'

The token comes back inside the user object, under session:

{
  "error": false,
  "result": {
    "id": 1,
    "name": "Demo",
    "email": "[email protected]",
    "level": 0,
    "session": {
      "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
      "token_type": "bearer"
    }
  }
}

Send it as a Bearer token from then on:

curl "https://apiv4.ordering.co/v400/en/demo/business" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

You can also authenticate with cellphone instead of email, and there are dedicated endpoints for social and SMS login — see the Auth section of the reference.

Option 2 — API key (for server-to-server integrations)

For backend integrations that shouldn't hold user credentials, create a long-lived API key tied to a user and send it in the X-Api-Key header:

curl "https://apiv4.ordering.co/v400/en/demo/business" \
  -H "X-Api-Key: YOUR_API_KEY"

Create and list keys through POST and GET on /users/USER_ID/keys. The key inherits that user's permission level, so create it from a user with the access the integration actually needs — and no more.

❗️

Keep keys server-side

An API key never expires on its own and carries its user's full permissions. Never ship one in a mobile app, browser bundle, or public repository.

Your first request

With a token in hand, list the businesses in your project:

curl "https://apiv4.ordering.co/v400/en/demo/business" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
{
  "error": false,
  "result": [
    {
      "id": 7,
      "name": "Twirly Laundry",
      "slug": "thetwirlylaundry",
      "email": "[email protected]"
    }
  ]
}

Response format

Every response — success or failure — uses the same envelope:

{
  "error": false,
  "result": { }
}
  • error — boolean. Always check this first.
  • result — the payload on success; an array of human-readable messages on failure.

A failed request looks like this:

{
  "error": true,
  "result": [
    "The Email field is required when Phone / Mobile is not present.",
    "The Password field is required."
  ]
}

Because result changes shape between success and error, branch on error before you read it.

StatusMeaning
200Success — check error in the body anyway
400Validation failed; result lists what to fix
401Missing, invalid, or insufficiently privileged credentials
429Rate limited — back off and retry

Pagination

List endpoints paginate with page and page_size:

curl "https://apiv4.ordering.co/v400/en/demo/business?page=2&page_size=20" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

When you paginate, a pagination object comes back alongside your results:

{
  "error": false,
  "result": [],
  "pagination": {
    "total": 143,
    "current_page": 2,
    "page_size": 20,
    "total_pages": 8,
    "from": 21,
    "to": 40,
    "next_page": "https://apiv4.ordering.co/v400/en/demo/business?page_size=20&page=3",
    "back_page": "https://apiv4.ordering.co/v400/en/demo/business?page_size=20&page=1"
  }
}

next_page and back_page are complete URLs — follow them instead of building your own.

📘

page_size has a ceiling

Requests above the maximum page size fall back to the default rather than returning an error. Page through large collections instead of asking for everything at once.

Ask for only the fields you need

Most list endpoints accept params — a comma-separated list of fields. Responses in Ordering can be large (a business carries schedule, fees, locations, and more), so this is the cheapest performance win available to you:

curl "https://apiv4.ordering.co/v400/en/demo/business?params=id,name,slug" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Where to go next

The API is organized around these areas:

AreaWhat lives there
Auth & UsersLogin, signup, social and SMS auth, addresses, API keys, permission levels
BusinessBusinesses, menus, categories, products, options, schedules, delivery zones
CartsBuilding a cart, applying offers, validating before checkout
OrdersPlacing orders, status lifecycle, messages, order history
LogisticsDrivers, driver companies, groups, assignment
PaymentsPayment methods, gateway credentials, wallets
Loyalty & OffersLoyalty plans and levels, coupons, promotions
ReportsSales, product and business analytics
WebhooksSubscribe to events instead of polling

Every endpoint page includes runnable examples in cURL, Node, Ruby, JavaScript and Python — switch languages with the tabs above the code block, and hit Try It to call the endpoint with your own credentials.

As always, happy ordering.

www.ordering.co