Clopos Open API (v2)¶
Info
This page is a Markdown version of the v2 API reference from the official Clopos developer docs (developer.clopos.com), which is the API this package uses. If anything differs, the original is authoritative.
Warning
Clopos marks this API (integrations.clopos.com/open-api) as deprecated: it still works and existing integrations keep running, but it no longer gets new endpoints and will eventually be retired. New integrations should use the Clopos Open API on open-api.clopos.com. See Migrating.
Authentication¶
Authenticate (v2)¶
Source: https://developer.clopos.com/docs/api-reference/v2/authentication/auth
POST /v2/auth
Exchange client credentials for a JWT access token
Purpose¶
Request a short-lived JWT that authorizes all other v2 API calls.
HTTP Request¶
POST https://integrations.clopos.com/open-api/v2/auth
Where the credentials come from¶
The four values in the request body come from two different sources:
integrator_id— issued by Clopos. Every v2 integration must send one. Request it by filling out this form: https://forms.gle/Y9P1Wnv4QFAruxny8client_id,client_secret,brand— come from the Clopos customer you are integrating with. They generate the Client ID and Client Secret themselves in their back office under Add-ons → Open API, then share both values and their brand identifier with you.
Note
See Authentication for the step-by-step back office instructions to pass on to your customer.
Request Example¶
curl --location 'https://integrations.clopos.com/open-api/v2/auth' \
--header 'Content-Type: application/json' \
--data '{
"client_id": "your_client_id_here",
"client_secret": "your_client_secret_here",
"brand": "your_brand",
"integrator_id": "your_integrator_id_here"
}'
Request body¶
| Field | Type | Required | Description |
|---|---|---|---|
client_id |
string | Yes | Generated in the customer's back office (Add-ons → Open API). |
client_secret |
string | Yes | Secret paired with the Client ID, generated at the same time. |
brand |
string | Yes | The customer's brand identifier. |
integrator_id |
string | Yes | New in v2. Identifies the integrator making the request. |
venue_id is no longer part of the authentication payload.
Response¶
200 OK — Token issued¶
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6Im9hdXRoX1lOellQZE1QV21KeU0zOFVyblQzR3hoS25TelBNTHl2clB2UGgxQnRaeVFScTVzRWJsRkl5b3MwYVIyejMwWmYiLCJicmFuZCI6Im9tZWdhIiwic3RhZ2UiOiJiZXRhIiwidmVudWVfaWQiOjEsImludGVncmF0b3JfaWQiOiJ0ZXN0X2pLc1U5NnJxMzMzYjZQb3RUWmZrZ3ciLCJpYXQiOjE3Njc4NDg3MzIsImV4cCI6MTc2Nzg1MjMzMn0.7atyo3LEPXTyIjs2BjZIcUbWeFYtr375GeDwoVnWSRs",
"token_type": "Bearer",
"expires_in": 3600,
"expires_at": 1767852332,
"message": "Authentication successful"
}
How to use the token¶
- Include only the
x-tokenheader on all other v2 endpoints:x-token: <your JWT here> - Tokens expire after
expires_inseconds;expires_atindicates the epoch timestamp when the token becomes invalid.
Integrator ID¶
Some integrations need to access Clopos Open API without an end-user logging in. For these cases, an Integrator ID is required.
Note
Request an Integrator ID by filling out this form: Request Integrator ID
Categories¶
List Categories¶
Source: https://developer.clopos.com/docs/api-reference/v2/categories/get-categories
GET /v2/categories
Retrieve product categories along with their hierarchical structure
Purpose¶
Allows you to retrieve your category tree, including subcategories, in a single call.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/categories
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
-
`` (integer): Page number for pagination (1-based).
-
`` (integer): Number of categories to return (1-999).
-
`` (integer): Filters records under a specific parent category.
-
` (string): Category type;PRODUCT,INGREDIENT,ACCOUNTING`. -
`` (boolean): Include child categories in the response.
-
`` (boolean): Return inactive categories.
Request Example¶
curl -X GET "https://integrations.clopos.com/open-api/v2/categories?page=1&limit=20&filters%5B0%5D%5B0%5D=type&filters%5B0%5D%5B1%5D=PRODUCT" \
-H "x-token: oauth_example_token" \
const params = new URLSearchParams({
page: "1",
limit: "20",
"filters[0][0]": "type",
"filters[0][1]": "PRODUCT",
include_children: "true",
});
const response = await fetch(
`https://integrations.clopos.com/open-api/v2/categories?${params}`,
{
headers: {
"x-token": "oauth_example_token",
},
},
);
const categories = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/categories"
headers = {
"x-token": "oauth_example_token",
}
params = {
"page": 1,
"limit": 20,
"filters[0][0]": "type",
"filters[0][1]": "PRODUCT",
"include_children": True,
}
response = requests.get(url, headers=headers, params=params)
result = response.json()
Response¶
200 OK — List of categories¶
{
"success": true,
"data": [
{
"id": 1,
"name": "Pizza",
"status": 1,
"hidden": false,
"type": "PRODUCT",
"position": null,
"parent_id": null,
"depth": 0,
"color": "00bcd4",
"children": [],
"media": [],
"created_at": "2026-01-28T18:23:53.000000Z",
"updated_at": "2026-01-28T18:23:53.000000Z"
},
{
"id": 2,
"name": "Drinks",
"status": 1,
"hidden": false,
"type": "PRODUCT",
"position": null,
"parent_id": null,
"depth": 0,
"color": "00bcd4",
"children": [],
"media": [
{
"uuid": "1d76f22b-c209-4fac-be3a-cfde7b8f0d74",
"mime_type": "image/jpeg",
"size": 87281,
"urls": {
"original": "https://cdn.clopos.com/omega/1d76f22b-.../original.jpg",
"extra_large": "https://cdn.clopos.com/omega/1d76f22b-.../extra_large.jpg",
"thumb": "https://cdn.clopos.com/omega/1d76f22b-.../thumb.jpg"
},
"blur_hash": "LEIpFsE%t1}TxpENEgaK0iowRktQ",
"dimensions": {
"width": 612,
"height": 459
}
}
],
"created_at": "2026-02-13T16:31:36.000000Z",
"updated_at": "2026-02-13T16:31:36.000000Z"
}
],
"total": 2
}
400 Bad Request — Parameter error¶
{
"success": false,
"error": "invalid_parameter",
"message": "type must be one of PRODUCT, INGREDIENT, ACCOUNTING"
}
Field Reference¶
Category Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique identifier. |
name |
string | Category name. |
status |
integer | 1 = active, 0 = inactive. |
type |
string | PRODUCT, INGREDIENT, or ACCOUNTING. |
position |
integer (nullable) | Display order position. |
parent_id |
integer (nullable) | Parent category ID, null for root categories. |
_lft |
integer | Left boundary in the nested-set tree. Useful for ordering and subtree queries. |
_rgt |
integer | Right boundary in the nested-set tree. A category's descendants have _lft and _rgt values between its own. |
depth |
integer | Hierarchy level (0 = root). |
color |
string | HEX color code (without # prefix). |
hidden |
boolean | Whether the category is hidden from menus. |
children |
array | Subcategories (same structure, nested recursively). |
media |
array | Image attachments. See Media object. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- With the
typeparameter, you can call different category collections (menu, ingredient, accounting) from a single endpoint. - By sending
include_children=false, you can retrieve only top-level categories; sub-branches are retrieved with separate calls. - The
depthfield indicates the hierarchy level:0for root categories,1for first-level children, and so on. - To see inactive categories, send
include_inactive=true; otherwise, they are hidden by default. - In a production environment, adjust pagination values (
page,limit) according to the brand's inventory size.
Get Category by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/categories/get-category-by-id
GET /v2/categories/{id}
Retrieve a specific menu category with its hierarchical details
Purpose¶
Returns a single category, regardless of whether it is a root or subcategory, and optionally its child nodes.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/categories/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Request Example¶
curl -X GET "https://integrations.clopos.com/open-api/v2/categories/1?include_children=true" \
-H "x-token: oauth_example_token" \
const response = await fetch('https://integrations.clopos.com/open-api/v2/categories/1?include_children=true', {
headers: {
'x-token': 'oauth_example_token',
}
});
const category = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/categories/1"
headers = {
"x-token": "oauth_example_token",
}
params = {
"include_children": True
}
response = requests.get(url, headers=headers, params=params)
category = response.json()
Response¶
200 OK — Category found¶
{
"success": true,
"data": {
"id": 1,
"name": "Pizza",
"status": 1,
"hidden": false,
"type": "PRODUCT",
"position": null,
"parent_id": null,
"depth": 0,
"color": "00bcd4",
"children": [],
"media": [
{
"uuid": "1d76f22b-c209-4fac-be3a-cfde7b8f0d74",
"mime_type": "image/jpeg",
"size": 87281,
"urls": {
"original": "https://cdn.clopos.com/omega/1d76f22b-.../original.jpg",
"extra_large": "https://cdn.clopos.com/omega/1d76f22b-.../extra_large.jpg",
"thumb": "https://cdn.clopos.com/omega/1d76f22b-.../thumb.jpg"
},
"blur_hash": "LEIpFsE%t1}TxpENEgaK0iowRktQ",
"dimensions": {
"width": 612,
"height": 459
}
}
],
"created_at": "2026-01-28T18:23:53.000000Z",
"updated_at": "2026-01-28T18:23:53.000000Z"
}
}
404 Not Found — Category does not exist¶
{
"success": false,
"error": "resource_not_found",
"message": "Category not found"
}
Field Reference¶
Category Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique identifier. |
name |
string | Category name. |
status |
integer | 1 = active, 0 = inactive. |
type |
string | PRODUCT, INGREDIENT, or ACCOUNTING. |
position |
integer (nullable) | Display order position. |
parent_id |
integer (nullable) | Parent category ID, null for root categories. |
_lft |
integer | Left boundary in the nested-set tree. Useful for ordering and subtree queries. |
_rgt |
integer | Right boundary in the nested-set tree. A category's descendants have _lft and _rgt values between its own. |
depth |
integer | Hierarchy level (0 = root). |
color |
string | HEX color code (without # prefix). |
hidden |
boolean | Whether the category is hidden from menus. |
children |
array | Subcategories (same structure, nested recursively). |
media |
array | Image attachments. See Media object. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- The
include_children=falseparameter returns only a single category record; recommended for performance in large trees. - The returned
childrenarray recursively uses the same schema; be careful when processing the tree structure repeatedly on the client side. - Based on the
typefield in the response, you can read menu, ingredient, or accounting categories from the same endpoint. - If the category is not found, it returns
404; add fallback or remapping logic on the client side.
Customers¶
Create Customer¶
Source: https://developer.clopos.com/docs/api-reference/v2/customers/create-customer
POST /v2/customers
Create a new customer with contact information and group assignment
Purpose¶
Create a new customer in the Clopos system. This endpoint allows you to register customers with their contact information, assign them to customer groups, and set up their profile details.
HTTP Request¶
POST https://integrations.clopos.com/open-api/v2/customers
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Note
The fields code, phone, and cid are unique. If you attempt to create a customer with duplicate values for any of these fields, the API will return an error.
Request Body¶
-
`` (string): Customer's full name. This field is required.
-
`` (string): Customer's email address.
-
`` (string): Customer's primary phone number. Must be unique across all customers.
-
`` (string): Customer code/identifier. Must be unique across all customers.
-
`` (string): Customer UUID identifier. Must be unique across all customers. If not provided, the system will generate one automatically.
-
`` (string): Additional notes or description about the customer.
-
`` (integer): ID of the customer group to assign this customer to.
-
` (integer): Customer's gender. Use1for male,2for female, ornull` for unspecified. -
` (string): Customer's date of birth inYYYY-MM-DD` format.
Request Examples¶
curl --location 'https://integrations.clopos.com/open-api/v2/customers' \
--header 'accept: application/json, text/plain, */*' \
--header 'x-token: oauth_example_token' \
--header 'content-type: application/json' \
--data-raw '{
"name": "John Doe",
"email": "john.doe@example.com",
"code": "CUST001",
"cid": "0f9654bc-9520-43d7-8109-317d9820f54c",
"phone": "+15551234567",
"description": "Test Customer",
"group_id": 1,
"gender": 1,
"date_of_birth": "1990-05-15"
}'
const customerData = {
name: "John Doe",
email: "john.doe@example.com",
code: "CUST001",
cid: "0f9654bc-9520-43d7-8109-317d9820f54c",
phone: "+15551234567",
description: "Test Customer",
group_id: 1,
gender: 1,
date_of_birth: "1990-05-15"
};
const response = await fetch('https://integrations.clopos.com/open-api/v2/customers', {
method: 'POST',
headers: {
'x-token': 'oauth_example_token',
'Content-Type': 'application/json'
},
body: JSON.stringify(customerData)
});
const customer = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/customers"
headers = {
"x-token": "oauth_example_token",
"Content-Type": "application/json"
}
customer_data = {
"name": "John Doe",
"email": "john.doe@example.com",
"code": "CUST001",
"cid": "0f9654bc-9520-43d7-8109-317d9820f54c",
"phone": "+15551234567",
"description": "Test Customer",
"group_id": 1,
"gender": 1,
"date_of_birth": "1990-05-15"
}
response = requests.post(url, headers=headers, json=customer_data)
customer = response.json()
Response¶
200 OK — Customer created successfully¶
{
"success": true,
"data": {
"id": 14,
"venue_id": 1,
"cid": "0f9654bc-9520-43d7-8109-317d9820f54c",
"group_id": 1,
"name": "John Doe",
"email": "john.doe@example.com",
"phone": "+15551234567",
"phones": [],
"address": null,
"address_data": [],
"description": "Test Customer",
"discount": 0,
"spent": 0,
"total_discount": 0,
"total_bonus": 0,
"receipt_count": 0,
"gender": 1,
"date_of_birth": "1990-05-15",
"code": "CUST001",
"source": null,
"reference_id": null,
"status": true,
"can_use_loyalty_system": false,
"is_verified": false,
"created_at": "2025-11-14T08:31:17.000000Z",
"updated_at": "2025-11-14T08:31:17.000000Z"
}
}
400 Bad Request — Validation error¶
{
"success": false,
"message": "Validation failed",
"error": "The name field is required."
}
409 Conflict — Duplicate unique field¶
{
"success": false,
"message": "Customer with this phone number already exists",
"error": "duplicate_phone"
}
Field Reference¶
Required Fields¶
| Field | Type | Description |
|---|---|---|
name |
string | Customer's full name. |
Optional Fields¶
| Field | Type | Description |
|---|---|---|
email |
string | Customer's email address. |
phone |
string | Primary phone number. Must be unique. |
code |
string | Customer code/identifier. Must be unique. |
cid |
string | Customer UUID. Must be unique. Auto-generated if not provided. |
description |
string | Additional notes about the customer. |
group_id |
integer | ID of the customer group. |
gender |
integer | Gender: 1 = male, 2 = female, null = unspecified. |
date_of_birth |
string | Date of birth in YYYY-MM-DD format. |
Response Fields¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique customer identifier (auto-assigned). |
venue_id |
integer | Venue the customer was created in. |
cid |
string | UUID identifier for the customer. |
status |
boolean | Account status (defaults to true). |
can_use_loyalty_system |
boolean | Loyalty enrollment status (defaults to false). |
is_verified |
boolean | Verification status (defaults to false). |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- The
namefield is required and cannot be empty. - The fields
code,phone, andcidmust be unique. Attempting to create a customer with duplicate values will result in a409 Conflicterror. - If
cidis not provided, the system will automatically generate a UUID for the customer. - The response includes the customer's group information if
group_idwas provided. - The
can_use_loyalty_systemandis_verifiedfields are set tofalseby default for new customers.
List All Customers¶
Source: https://developer.clopos.com/docs/api-reference/v2/customers/get-all-customers
GET /v2/customers
Retrieve all customers with pagination, filtering, and relationship inclusion.
This endpoint retrieves a list of all customers with support for pagination, filtering, and including related data.
Note
There is no search parameter on this endpoint. To find customers by name
or phone, use the filters parameter described below.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/customers
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
-
`` (integer): Page number for pagination (1-based).
-
`` (integer): Number of customers to return per page (1-999).
-
` (string): Include related data in the response. Supported values:group. You can include multiplewith` parameters. -
`` (array):
Filter customers by specific fields. Filters use array notation:
filters[0][0]=field_name&filters[0][1]=value. Multiple filters can be combined using different indices (e.g.,filters[0],filters[1]). Supported filter fields: -name: Filter by customer name (partial match) -phones: Filter by phone number (searches in all phone numbers) -group_id: Filter by customer group ID Filter Examples: - Filter by name:filters[0][0]=name&filters[0][1]=John- Filter by phone:filters[0][0]=phones&filters[0][1]=15551234567- Multiple filters:filters[0][0]=name&filters[0][1]=John&filters[1][0]=phones&filters[1][1]=15551234567
Request Examples¶
curl --location "https://integrations.clopos.com/open-api/v2/customers?page=1&limit=50" \
-H "x-token: oauth_example_token" \
curl --location --globoff 'https://integrations.clopos.com/open-api/v2/customers?page=1&limit=50&with[0]=group&filters[0][0]=name&filters[0][1]=John&filters[1][0]=phones&filters[1][1]=15551234567' \
-H "x-token: oauth_example_token" \
// Basic request
const params = new URLSearchParams({
page: "1",
limit: "50",
});
// With filters and relations
const paramsWithFilters = new URLSearchParams({
page: "1",
limit: "50",
"with[0]": "group",
"filters[0][0]": "name",
"filters[0][1]": "John",
"filters[1][0]": "phones",
"filters[1][1]": "15551234567",
});
const response = await fetch(
`https://integrations.clopos.com/open-api/v2/customers?${paramsWithFilters}`,
{
headers: {
"x-token": "oauth_example_token",
},
},
);
const customers = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/customers"
headers = {
"x-token": "oauth_example_token",
}
# Basic request
params = {
"page": 1,
"limit": 50
}
# With filters and relations
params_with_filters = {
"page": 1,
"limit": 50,
"with[0]": "group",
"filters[0][0]": "name",
"filters[0][1]": "John",
"filters[1][0]": "phones",
"filters[1][1]": "15551234567"
}
response = requests.get(url, headers=headers, params=params_with_filters)
customers = response.json()
Response Example¶
{
"success": true,
"data": [
{
"id": 1,
"venue_id": 1,
"cid": "1266eb42-9bdb-4e93-9fe0-3603c110f128",
"group_id": 5,
"name": "Rahid Akhundzada",
"discount": 0,
"email": null,
"phones": [],
"phone": "+994505355757",
"address": null,
"description": null,
"address_data": [],
"spent": 1162.8,
"total_discount": 1.7,
"total_bonus": 0,
"receipt_count": 9,
"gender": 1,
"date_of_birth": null,
"code": null,
"source": null,
"reference_id": null,
"status": true,
"can_use_loyalty_system": false,
"is_verified": false,
"created_at": "2026-01-31T16:23:27.000000Z",
"updated_at": "2026-03-12T16:37:15.000000Z"
},
{
"id": 2,
"venue_id": 1,
"cid": "24d7865f-f1bc-4948-be6a-e497d20bad0c",
"group_id": 1,
"name": "Reyal",
"discount": 0,
"email": null,
"phones": [],
"phone": null,
"address": null,
"description": null,
"address_data": [],
"spent": 714,
"total_discount": 0,
"total_bonus": 0,
"receipt_count": 10,
"gender": null,
"date_of_birth": null,
"code": null,
"source": null,
"reference_id": null,
"status": true,
"can_use_loyalty_system": false,
"is_verified": false,
"created_at": "2026-02-02T19:45:10.000000Z",
"updated_at": "2026-02-02T23:37:33.000000Z"
}
],
"total": 7
}
Field Reference¶
Customer Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique customer identifier. |
cid |
string | UUID identifier for the customer. |
venue_id |
integer | The venue this customer belongs to. |
group_id |
integer | The ID of the customer group they belong to. |
name |
string | Customer's full name. |
email |
string (nullable) | Customer's email address. |
phone |
string (nullable) | Primary phone number. |
phones |
array | Additional phone numbers. |
address |
string (nullable) | Customer's address. |
address_data |
array | Structured address entries with type, source, and formatted address. |
description |
string (nullable) | Additional notes about the customer. |
discount |
number | Customer-level discount value. |
spent |
number | Total amount spent by the customer. |
total_discount |
number | Total discount amount received across all receipts. |
total_bonus |
number | Total bonus amount used. |
receipt_count |
integer | Total number of receipts for the customer. |
gender |
integer (nullable) | Gender: 1 = male, 2 = female, null = unspecified. |
date_of_birth |
string (nullable) | Date of birth in YYYY-MM-DD format. |
code |
string (nullable) | Customer code/identifier. |
source |
string (nullable) | Where the customer was created from (e.g., LOYALTY). |
reference_id |
string (nullable) | External reference ID for third-party integrations. |
status |
boolean | Whether the customer account is active. |
can_use_loyalty_system |
boolean | Whether the customer is enrolled in the loyalty system. |
is_verified |
boolean | Whether the customer's identity has been verified. |
created_at |
string | Timestamp when the customer was created (ISO 8601). |
updated_at |
string | Timestamp when the customer was last updated (ISO 8601). |
Notes¶
- Filterable fields:
name(partial match),phones(searches across all phone numbers),group_id(exact match). Note: usephones(plural) — the singularphonefield is not filterable. - Sortable fields:
id,cid,group_id,name,email,address,created_at,updated_at. - The
searchquery parameter is listed in some older references but is not implemented — usefiltersinstead.
Get Customer by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/customers/get-customer
GET /v2/customers/{id}
Retrieve a specific customer by their unique identifier.
This endpoint retrieves a specific customer by their unique ID.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/customers/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
- `` (integer): The unique identifier of the customer to retrieve.
Request Example¶
curl --location 'https://integrations.clopos.com/open-api/v2/customers/1' \
-H "x-token: oauth_example_token" \
const response = await fetch('https://integrations.clopos.com/open-api/v2/customers/1', {
headers: {
'x-token': 'oauth_example_token',
}
});
const customer = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/customers/1"
headers = {
"x-token": "oauth_example_token",
}
response = requests.get(url, headers=headers)
customer = response.json()
Response¶
{
"success": true,
"data": {
"id": 1,
"venue_id": 1,
"cid": "1266eb42-9bdb-4e93-9fe0-3603c110f128",
"group_id": 5,
"name": "Rahid Akhundzada",
"discount": 0,
"email": null,
"phones": [],
"phone": "+994505355757",
"address": null,
"description": null,
"address_data": [],
"spent": 1162.8,
"total_discount": 1.7,
"total_bonus": 0,
"receipt_count": 9,
"gender": 1,
"date_of_birth": null,
"code": null,
"source": null,
"reference_id": null,
"status": true,
"can_use_loyalty_system": false,
"is_verified": false,
"created_at": "2026-01-31T16:23:27.000000Z",
"updated_at": "2026-03-12T16:37:15.000000Z"
}
}
Field Reference¶
Customer Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique customer identifier. |
cid |
string | UUID identifier for the customer. |
venue_id |
integer | The venue this customer belongs to. |
group_id |
integer | The ID of the customer group they belong to. |
name |
string | Customer's full name. |
email |
string (nullable) | Customer's email address. |
phone |
string (nullable) | Primary phone number. |
phones |
array | Additional phone numbers. |
address |
string (nullable) | Customer's address. |
address_data |
array | Structured address entries with type, source, and formatted address. |
description |
string (nullable) | Additional notes about the customer. |
discount |
number | Customer-level discount value. |
spent |
number | Total amount spent by the customer. |
total_discount |
number | Total discount amount received across all receipts. |
total_bonus |
number | Total bonus amount used. |
receipt_count |
integer | Total number of receipts for the customer. |
gender |
integer (nullable) | Gender: 1 = male, 2 = female, null = unspecified. |
date_of_birth |
string (nullable) | Date of birth in YYYY-MM-DD format. |
code |
string (nullable) | Customer code/identifier. |
source |
string (nullable) | Where the customer was created from (e.g., LOYALTY). |
reference_id |
string (nullable) | External reference ID for third-party integrations. |
status |
boolean | Whether the customer account is active. |
can_use_loyalty_system |
boolean | Whether the customer is enrolled in the loyalty system. |
is_verified |
boolean | Whether the customer's identity has been verified. |
created_at |
string | Timestamp when the customer was created (ISO 8601). |
updated_at |
string | Timestamp when the customer was last updated (ISO 8601). |
List Customer Groups¶
Source: https://developer.clopos.com/docs/api-reference/v2/customers/get-customer-groups
GET /v2/customer-groups
Retrieve a list of all customer groups with pagination support.
This endpoint retrieves a list of all customer groups.
{
"success": true,
"data": [
{
"id": 1,
"name": "My Customers",
"discount_type": null,
"discount_value": 0,
"system_type": "my_customers",
"created_at": "2025-08-16T15:21:15.000000Z",
"updated_at": "2025-08-16T15:21:15.000000Z",
"deleted_at": null
}
],
"total": 1,
"time": 71,
"timestamp": "2025-10-24 05:38:15",
"sorts": [
"id",
"name",
"discount_type",
"discount_value",
"total_amount",
"created_at",
"updated_at",
"deleted_at"
],
"unix": 1761284295
}
Customer Group Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | The unique identifier for the customer group. |
name |
string | The name of the customer group. |
discount_type |
string | null | The type of discount associated with the group. |
discount_value |
number | The value of the discount. |
system_type |
string | null | The system type of the group (e.g., 'my_customers'). |
created_at |
string | The timestamp when the group was created. |
Finance¶
Get Balance by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-balance-by-id
GET /v2/finance/balances/{id}
Retrieve a single account.
Fetch one account by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/balances/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-balances:read |
| User ability | FINANCE_BALANCE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/balances/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/balances/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/balances/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Balance Date States¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-balance-date-states
GET /v2/finance/balances/date-states
Per-date balance states.
Balance state per date across the requested range.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/balances/date-states
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-balances:read |
| User ability | FINANCE_BALANCE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/balances/date-states" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/balances/date-states', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/balances/date-states",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Balance Transactions¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-balance-transactions
GET /v2/finance/balances/transactions
Transactions grouped by account.
Transactions viewed per account.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/balances/transactions
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-balances:read |
| User ability | FINANCE_BALANCE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/balances/transactions" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/balances/transactions', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/balances/transactions",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Proxies to client-api
finance/balance/transaction.
List Balances¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-balances
GET /v2/finance/balances
Cash and bank accounts.
Accounts money is held in, each with its current amount.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/balances
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-balances:read |
| User ability | FINANCE_BALANCE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/balances" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/balances', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/balances",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Balance List¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-balances-list
GET /v2/finance/balances/list
Condensed account list.
A lighter account list intended for selectors.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/balances/list
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-balances:read |
| User ability | FINANCE_BALANCE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/balances/list" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/balances/list', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/balances/list",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Cash Shift by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-cash-shift-by-id
GET /v2/finance/cash-shifts/{id}
Retrieve a single shift.
Fetch one cash shift. The identifier is a UUID, not an integer.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/cash-shifts/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-cash-shifts:read |
| User ability | CASH_SHIFT_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/cash-shifts/9c1e7a30-4b2f-4d18-9f6a-71c0d8e4b5a2" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/cash-shifts/9c1e7a30-4b2f-4d18-9f6a-71c0d8e4b5a2', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/cash-shifts/9c1e7a30-4b2f-4d18-9f6a-71c0d8e4b5a2",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Cash shifts are the one resource in v2 keyed by a UUID; passing an integer returns
400.
Cash Shift Report¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-cash-shift-report
GET /v2/finance/cash-shifts/{id}/report
Totals for one shift.
Sales, refunds and cash in/out totals for a single shift. The identifier is a UUID.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/cash-shifts/{id}/report
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-cash-shifts:read |
| User ability | CASH_SHIFT_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/cash-shifts/9c1e7a30-4b2f-4d18-9f6a-71c0d8e4b5a2/report" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/cash-shifts/9c1e7a30-4b2f-4d18-9f6a-71c0d8e4b5a2/report', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/cash-shifts/9c1e7a30-4b2f-4d18-9f6a-71c0d8e4b5a2/report",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Cash Shifts¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-cash-shifts
GET /v2/finance/cash-shifts
Till sessions.
Till sessions opened and closed on terminals.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/cash-shifts
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-cash-shifts:read |
| User ability | CASH_SHIFT_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/cash-shifts" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/cash-shifts', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/cash-shifts",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Requires the Cash Shift module; without it the endpoint answers
403.
Customer Balances¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-customer-balances
GET /v2/finance/balances/customer
Balances held against customers.
Outstanding balances per customer.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/balances/customer
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-balances:read |
| User ability | FINANCE_BALANCE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/balances/customer" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/balances/customer', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/balances/customer",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Finance Categories¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-finance-categories
GET /v2/finance/categories
Categories money movements are classified under.
The categories transactions are filed under.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/categories
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-categories:read |
| User ability | FINANCE_CATEGORY_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/categories" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/categories', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/categories",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Finance Category by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-finance-category-by-id
GET /v2/finance/categories/{id}
Retrieve a single category.
Fetch one finance category by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/categories/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-categories:read |
| User ability | FINANCE_CATEGORY_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/categories/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/categories/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/categories/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Tax by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-tax-by-id
GET /v2/finance/taxes/{id}
Retrieve a single tax rate.
Fetch one tax rate by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/taxes/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-taxes:read |
| User ability | TAX_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/taxes/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/taxes/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/taxes/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Tax Report¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-tax-report
GET /v2/finance/taxes/report
Tax report over a period.
Tax report across the requested period.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/taxes/report
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-taxes:read |
| User ability | TAX_REPORT_SHOW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/taxes/report" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/taxes/report', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/taxes/report",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Proxies to client-api
finance/tax/report. RequiresTAX_REPORT_SHOW, notTAX_VIEW.
Tax Totals¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-tax-total
GET /v2/finance/taxes/total
Aggregate tax amounts.
Aggregate tax amounts for the current filters.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/taxes/total
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-taxes:read |
| User ability | TAX_REPORT_SHOW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/taxes/total" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/taxes/total', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/taxes/total",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Proxies to client-api
finance/tax/total. RequiresTAX_REPORT_SHOW.
Tax Types¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-tax-types
GET /v2/finance/taxes/types
The tax type vocabulary.
Returns the tax type list, so you do not have to hard-code it.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/taxes/types
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-taxes:read |
| User ability | TAX_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/taxes/types" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/taxes/types', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/taxes/types",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Proxies to client-api
finance/tax/types.
List Taxes¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-taxes
GET /v2/finance/taxes
Configured tax rates.
Tax rates configured for the brand.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/taxes
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-taxes:read |
| User ability | TAX_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/taxes" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/taxes', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/taxes",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Transaction by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-transaction-by-id
GET /v2/finance/transactions/{id}
Retrieve a single transaction.
Fetch one transaction by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/transactions/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-transactions:read |
| User ability | FINANCE_TRANSACTION_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/transactions/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/transactions/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/transactions/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Transactions¶
Source: https://developer.clopos.com/docs/api-reference/v2/finance/get-transactions
GET /v2/finance/transactions
Money movements.
Money in and out. before_amount/after_amount bracket each movement against balance_id.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/finance/transactions
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | finance-transactions:read |
| User ability | FINANCE_TRANSACTION_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/finance/transactions" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/finance/transactions', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/finance/transactions",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Transactions link back to whatever caused them:
receipt_id,operation_id,customer_idorsupplier_id.
Inventory¶
Get Operation by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-operation-by-id
GET /v2/operations/{id}
Retrieve a single document.
Fetch one inventory document by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/operations/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/operations/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/operations/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/operations/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Operation Items¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-operation-items
GET /v2/operations/{id}/items
Line items of one document.
The line items belonging to a single operation.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/operations/{id}/items
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/operations/1/items" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/operations/1/items', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/operations/1/items",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Operation Statuses¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-operation-statuses
GET /v2/operations/statuses
The status vocabulary.
Returns the status list with localised display names, so you do not have to hard-code them.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/operations/statuses
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/operations/statuses" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/operations/statuses', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/operations/statuses",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Operations¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-operations
GET /v2/operations
Inventory documents.
The documents that move stock: supply, waste, transfer, production and inventory checks. type says which; see the table below.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/operations
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/operations" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/operations', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/operations",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Operation Types¶
type |
Meaning |
|---|---|
1 |
IN — supply |
3 |
TRANSFER |
4 |
WASTE |
5 |
RETURN |
7 |
MAKE — production |
9 |
INVENTORY_CHECK |
10 |
SUPPLY_RETURN |
11 |
INITIAL_STOCK |
2 (OUT), 6 (FIXATION) and 8 (MERGE) are deprecated and only appear on historical records.
status is 1 (Published) or 2 (Draft).
Operation Totals¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-operations-total
GET /v2/operations/total
Aggregate subtotal.
Aggregate over the same filters as the list endpoint.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/operations/total
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/operations/total" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/operations/total', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/operations/total",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Stock¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock
GET /v2/stock
Current stock levels per product and storage.
Read what is currently on hand. Each row is a product in one storage, with quantity on hand and reserved held by open receipts.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Use
/v2/stock/totalfor the aggregate, and/v2/storagesto resolvestorage_id.
Get Stock by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-by-id
GET /v2/stock/{id}
Retrieve a single stock row.
Fetch one stock row by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Stock by Product¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-by-product
GET /v2/stock/product
Stock resolved per product.
Same data as /v2/stock, collapsed to one row per product instead of one per storage row.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock/product
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock/product" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock/product', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock/product",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Stock by Product Group¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-by-product-group
GET /v2/stock/product-group
Stock aggregated by product group.
Stock rolled up to product groups.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock/product-group
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock/product-group" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock/product-group', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock/product-group",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Proxies to client-api
stock/productGroup; the gateway exposes the hyphenated form.
Stock Info¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-info
GET /v2/stock/info
Summary information about stock across storages.
Summary counters used by the stock dashboard.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock/info
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock/info" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock/info', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock/info",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Stock Operation by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-operation-by-id
GET /v2/stock-operations/{id}
Retrieve a single movement.
Fetch one stock movement by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock-operations/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock-operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock-operations/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock-operations/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock-operations/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Stock Operations¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-operations
GET /v2/stock-operations
Every stock movement.
The movement ledger: supplies, waste, transfers, production and the deductions receipts cause. before_quantity/after_quantity bracket each movement.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock-operations
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock-operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock-operations" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock-operations', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock-operations",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Rows caused by a receipt carry
receipt_idandreceipt_product_id; rows caused by an inventory document carryoperation_id.
Stock Operations by Product¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-operations-by-product
GET /v2/stock-operations/products
Per-product movement view.
Movement grouped per product rather than per row.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock-operations/products
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock-operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock-operations/products" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock-operations/products', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock-operations/products",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- Proxies to client-api
stock-operations/follow/products.
Stock Operation Totals¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-operations-total
GET /v2/stock-operations/total
Aggregate quantity and cost.
Aggregate over the same filters as the list endpoint.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock-operations/total
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock-operations:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock-operations/total" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock-operations/total', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock-operations/total",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Stock Totals¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-stock-total
GET /v2/stock/total
Aggregate stock value and quantity.
Aggregate of the same rows /v2/stock returns, honouring the same filters.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stock/total
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | stock:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/stock/total" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/stock/total', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/stock/total",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Storage by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-storage-by-id
GET /v2/storages/{id}
Retrieve a single storage.
Fetch one storage by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/storages/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | storages:read |
| User ability | STOCK_STORAGE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/storages/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/storages/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/storages/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Storages¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-storages
GET /v2/storages
Storage locations.
The storages stock is tracked against. Needed to make sense of storage_id on stock rows and operations.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/storages
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | storages:read |
| User ability | STOCK_STORAGE_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/storages" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/storages', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/storages",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Get Supplier by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-supplier-by-id
GET /v2/suppliers/{id}
Retrieve a single supplier.
Fetch one supplier by its identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/suppliers/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | suppliers:read |
| User ability | STOCK_SUPPLIER_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/suppliers/1" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/suppliers/1', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/suppliers/1",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Suppliers¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-suppliers
GET /v2/suppliers
Suppliers goods are purchased from.
Suppliers referenced by supply operations, with spent and the linked finance account in balance_id.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/suppliers
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | suppliers:read |
| User ability | STOCK_SUPPLIER_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/suppliers" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/suppliers', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/suppliers",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Supplier Totals¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/get-suppliers-total
GET /v2/suppliers/total
Aggregate spend and balance.
Aggregate across suppliers matching the current filters.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/suppliers/total
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | suppliers:read |
| User ability | STOCK_SUPPLIER_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/suppliers/total" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/suppliers/total', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/suppliers/total",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
List Operation Items¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/list-operation-items
GET /v2/operation-items
Line items across documents.
Operation line items across every document, for reconciliation exports.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/operation-items
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | operation-items:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/operation-items" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/operation-items', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/operation-items",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Operation Item Totals¶
Source: https://developer.clopos.com/docs/api-reference/v2/inventory/list-operation-items-total
GET /v2/operation-items/total
Aggregate quantity and cost.
Aggregate over the same filters as the list endpoint.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/operation-items/total
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | operation-items:read |
| User ability | STOCK_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/operation-items/total" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/operation-items/total', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/operation-items/total",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Orders¶
Create Order (v2)¶
Source: https://developer.clopos.com/docs/api-reference/v2/orders/create-order
POST /v2/orders
Submit a POS order using the streamlined v2 schema
Purpose¶
Create a new order in Clopos using the simplified v2 payload. Optional fields with defaults can be omitted.
HTTP Request¶
POST https://integrations.clopos.com/open-api/v2/orders
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Request Example¶
curl --location 'https://integrations.clopos.com/open-api/v2/orders' \
--header 'x-token: <your JWT token>' \
--header 'Content-Type: application/json' \
--data '{
"auto_accept_terminal": 1,
"auto_order_accept": true,
"auto_order_sent_to_station": true,
"order_number": "A-1024",
"sale_type_id": 2,
"venue_id": 1,
"delivery_fee": 2.5,
"customer": {
"id": 9,
"phone": "+994705401040",
"address": "123 Main St",
"customer_discount_type": 1,
"name": "Rahid Akhundzada"
},
"comment": "Leave at the door",
"discount": {
"discount_type": 1,
"discount_value": 10
},
"service_charge": {
"enabled": true,
"value": 5
},
"products": [
{
"product_id": 101,
"product_name": "Pizza",
"count": 2,
"price": 8.5,
"status": "new",
"product_hash": "abc123",
"portion_size": 1,
"note": "No onions",
"modifiers": [
{
"modifier_id": 501,
"modifier_name": "Extra Cheese",
"count": 1,
"price": 0.5,
"portion_size": 1
}
]
}
]
}'
Payload fields¶
Top-level¶
auto_accept_terminal(number, optional): Terminal that auto-accepts.auto_order_accept(boolean, defaultfalse): Auto-accept the order.auto_order_sent_to_station(boolean, defaultfalse): Auto-send to stations after acceptance.order_number(string, optional, max 20 chars): Custom order number to assign to the order.sale_type_id(number, required): Sale type to use.venue_id(number, required): Venue where the order belongs.delivery_fee(number, optional): Delivery charge to apply.comment(string, optional): Free text note for the order.
Discounts¶
discount(object, optional; defaults applied if present but fields omitted)discount_type(number, default0)discount_value(number, default0)
Service charge¶
service_charge(object, optional; defaults applied if present but fields omitted)enabled(boolean, defaultfalse)value(number, default0)
Customer (required)¶
id(number)phone(string)address(string)customer_discount_type(number)name(string)
Products (array, required)¶
Each product item requires:
product_id(number)product_name(string, required) — Display name of the productcount(number)price(number)status(string)product_hash(string)portion_size(number, default1, optional)note(string, optional) — Free text note for the product (e.g., "No onions")modifiers(array, optional; defaults to[])modifier_id(number)modifier_name(string, required) — Display name of the modifiercount(number)price(number, default0, optional)portion_size(number, default1, optional)
Info
Optional fields and any values with defaults can be omitted; defaults are applied server-side .
Response (example)¶
{
"success": true,
"message": "Order created",
"data": {
"id": 295,
"venue_id": 1,
"type": "CALL_CENTER_ORDER",
"integration": "call_center_new",
"integration_uuid": null,
"integration_id": null,
"customer_ref_id": null,
"integration_status": "CREATED",
"status": "PENDING",
"created_at": "2026-01-08T06:28:23.000000Z",
"updated_at": "2026-01-08T06:28:23.000000Z",
"integration_response": null
}
}
Response Field Reference¶
| Field | Type | Description |
|---|---|---|
id |
integer | Newly created order identifier. |
venue_id |
integer | Venue where the order was placed. |
type |
string | Order type (e.g., CALL_CENTER_ORDER). |
integration |
string | Integration channel (e.g., call_center_new). |
integration_uuid |
string (nullable) | UUID from the integration source, if provided. |
integration_id |
string (nullable) | External ID from the integration source. |
customer_ref_id |
string (nullable) | External customer reference ID. |
integration_status |
string | Initial integration state (CREATED). |
status |
string | Initial order lifecycle state (PENDING). |
integration_response |
object (nullable) | Response from the integration, if any. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Get Order by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/orders/get-order-by-id
GET /v2/orders/{id}
Retrieve a single order with status, customer, and line item details.
Purpose¶
Return a specific order so you can inspect its metadata, customer, payment, and fulfillment status without fetching the entire list.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/orders/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
- `` (string): Unique identifier of the order (numeric ID).
Query Parameters¶
-
`` (string):
Include related resources in the response. Currently supported:
receipt:id,service_notification_id,status. When included, thedata.receiptfield will be present in the response (ornullif no receipt exists for the order).
Request Example¶
# Basic request
curl --location "https://integrations.clopos.com/open-api/v2/orders/1" \
-H "x-token: oauth_example_token" \
# Request including receipt (note: --globoff to avoid shell globbing)
curl --location --globoff 'https://integrations.clopos.com/open-api/v2/orders/1?with[0]=receipt%3Aid%2Cservice_notification_id%2Cstatus' \
-H "x-token: oauth_example_token" \
// Basic request
const orderId = 1;
let url = `https://integrations.clopos.com/open-api/v2/orders/${orderId}`;
// Include receipt
const params = new URLSearchParams({
'with[0]': 'receipt:id,service_notification_id,status'
});
const urlWithReceipt = `${url}?${params}`;
const response = await fetch(urlWithReceipt, {
headers: {
'x-token': 'oauth_example_token',
}
});
const order = await response.json();
import requests
order_id = 1
base = f"https://integrations.clopos.com/open-api/v2/orders/{order_id}"
params = {
'with[0]': 'receipt:id,service_notification_id,status'
}
headers = {
"x-token": "oauth_example_token",
}
response = requests.get(base, headers=headers, params=params)
order = response.json()
Response¶
200 OK — Order found¶
{
"success": true,
"data": {
"id": 1,
"venue_id": 1,
"type": "CALL_CENTER_ORDER",
"integration": "call_center_new",
"integration_uuid": null,
"integration_id": null,
"customer_ref_id": null,
"integration_status": "CREATED",
"status": "RECEIVED",
"payload": {
"auto_order_accept": false,
"auto_order_sent_to_station": false,
"delivery_fee": 2.5,
"service": {
"sale_type_id": 2,
"venue_id": 1
},
"customer": {
"id": 1,
"phone": "+994705401040",
"address": "123 Main St",
"customer_discount_type": 1,
"name": "Rahid Akhundzada"
},
"products": [
{
"product_id": 51,
"count": 2,
"product_modificators": [],
"portion_size": 1,
"meta": {
"price": 8.5,
"order_product": {
"count": 2,
"status": "new",
"product_modificators": [],
"product_hash": "abc123",
"product": {
"id": 51,
"name": "Pizza",
"price": 8.5
}
}
}
}
],
"meta": {
"comment": "Leave at the door",
"discount": {
"discount_type": 1,
"discount_value": 10
},
"apply_service_charge": true,
"customer_discount_type": 1,
"service_charge_value": 5
},
"customer_id": 1,
"sale_type_id": 2
},
"created_at": "2026-02-02T13:45:53.000000Z",
"updated_at": "2026-02-02T17:46:02.000000Z",
"integration_response": null
}
}
404 Not Found — Order does not exist¶
{
"success": false,
"error": "resource_not_found",
"message": "Order not found"
}
Field Reference¶
Order Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Order identifier. |
venue_id |
integer | Venue that owns the order. |
type |
string | Source of the order (e.g., CALL_CENTER_ORDER). |
integration |
string | Integration channel that created the order (e.g., call_center_new). |
integration_uuid |
string (nullable) | UUID assigned by the integration source. |
integration_id |
string (nullable) | External ID from the integration source. |
integration_status |
string | State reported by the upstream integration (e.g., CREATED). |
customer_ref_id |
string (nullable) | External customer reference ID from the integration. |
status |
string | Current lifecycle state: PENDING, RECEIVED, IGNORE, DELIVERED. |
payload |
object | Full order content including service, customer, products, and meta. |
payload.service |
object | Sale type and venue for the order. |
payload.customer |
object | Customer details (id, phone, address, name). |
payload.products |
array | Line items with product_id, count, modifiers, and pricing meta. |
payload.meta |
object | Order-level metadata: comment, discount, service charge settings. |
integration_response |
object (nullable) | Response data from the integration, if any. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- Returns the same structure as the list endpoint, providing parity between detail and collection responses.
- Use this endpoint after receiving webhook notifications to hydrate UI with complete order data.
- You can embed the linked receipt using the
with[0]parameter. If the order has no receipt,receiptwill benull. - Combine with the receipts endpoint when you need final settlement information once the order is delivered.
Get Orders¶
Source: https://developer.clopos.com/docs/api-reference/v2/orders/get-orders
GET /v2/orders
Retrieve orders with replicable filters and status-based searches
Purpose¶
Fetches the statuses, customer details, and line items of your multi-channel orders in a single request.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/orders
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
-
`` (integer): Page number for pagination (1-based).
-
`` (integer): Number of orders per page.
-
` (string): Lifecycle state to filter by. Allowed values:PENDING,RECEIVED,IGNORE,DELIVERED`. -
` (array[string]): Related resources to include in each order. Repeat with indexed brackets (e.g.with[0]=customer&with[1]=receipt`). -
` (string): Start date of acreated_atrange, inclusive. Format:YYYY-MM-DD. Pair withdate[1]`. -
` (string): End date of acreated_atrange, inclusive. Format:YYYY-MM-DD`. -
` (string): Field to sort by (e.g.created_at,updated_at,id`). -
` (integer): Sort direction:1= ascending,-1` = descending. -
` (array): Additional filter tuples using PHP bracket notation:filters[N][0]=field_name&filters[N][1]=value. Stack filters by incrementingN` (0-based).
Request Example¶
curl -X GET "https://integrations.clopos.com/open-api/v2/orders?limit=20&status=DELIVERED" \
-H "x-token: oauth_example_token" \
const response = await fetch('https://integrations.clopos.com/open-api/v2/orders?limit=20&status=DELIVERED', {
headers: {
'x-token': 'oauth_example_token',
}
});
const { data } = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/orders"
headers = {
"x-token": "oauth_example_token",
}
params = {
"limit": 20,
"status": "DELIVERED"
}
response = requests.get(url, headers=headers, params=params)
orders = response.json()
Response¶
200 OK — Orders list¶
{
"success": true,
"data": [
{
"id": 1,
"venue_id": 1,
"type": "CALL_CENTER_ORDER",
"integration": "call_center_new",
"integration_uuid": null,
"integration_id": null,
"customer_ref_id": null,
"integration_status": "CREATED",
"status": "RECEIVED",
"payload": {
"auto_order_accept": false,
"auto_order_sent_to_station": false,
"delivery_fee": 2.5,
"service": {
"sale_type_id": 2,
"venue_id": 1
},
"customer": {
"id": 1,
"phone": "+994705401040",
"address": "123 Main St",
"customer_discount_type": 1,
"name": "Rahid Akhundzada"
},
"products": [
{
"product_id": 51,
"count": 2,
"product_modificators": [],
"portion_size": 1,
"meta": {
"price": 8.5,
"order_product": {
"count": 2,
"status": "new",
"product_modificators": [],
"product_hash": "abc123",
"product": {
"id": 51,
"name": "Pizza",
"price": 8.5
}
}
}
}
],
"meta": {
"comment": "Leave at the door",
"discount": {
"discount_type": 1,
"discount_value": 10
},
"apply_service_charge": true,
"customer_discount_type": 1,
"service_charge_value": 5
},
"customer_id": 1,
"sale_type_id": 2
},
"created_at": "2026-02-02T13:45:53.000000Z",
"updated_at": "2026-02-02T17:46:02.000000Z",
"integration_response": null
}
],
"total": 4
}
401 Unauthorized — Authentication is missing or invalid¶
{
"success": false,
"error": "unauthorized",
"message": "Missing or invalid authentication headers"
}
Field Reference¶
Order Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Order identifier. |
venue_id |
integer | Venue that owns the order. |
type |
string | Source of the order (e.g., CALL_CENTER_ORDER). |
integration |
string | Integration channel that created the order (e.g., call_center_new). |
integration_uuid |
string (nullable) | UUID assigned by the integration source. |
integration_id |
string (nullable) | External ID from the integration source. |
integration_status |
string | State reported by the upstream integration (e.g., CREATED). |
customer_ref_id |
string (nullable) | External customer reference ID from the integration. |
status |
string | Current lifecycle state: PENDING, RECEIVED, IGNORE, DELIVERED. |
payload |
object | Full order content including service, customer, products, and meta. |
payload.service |
object | Sale type and venue for the order. |
payload.customer |
object | Customer details (id, phone, address, name). |
payload.products |
array | Line items with product_id, count, modifiers, and pricing meta. |
payload.meta |
object | Order-level metadata: comment, discount, service charge settings. |
integration_response |
object (nullable) | Response data from the integration, if any. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- When an order is created through this endpoint, the POS receives a push notification and notifies the clerk of the new order.
RECEIVEDorders automatically transition into open receipts. - Use
status=PENDINGto monitor orders awaiting POS confirmation. - Poll or subscribe to webhooks to track further status changes if your integration requires real-time updates.
Update Order¶
Source: https://developer.clopos.com/docs/api-reference/v2/orders/update-order
PUT /v2/orders/{id}
Update the status of an existing order
Purpose¶
Send a simple status update to mark an order as ignored.
HTTP Request¶
PUT https://integrations.clopos.com/open-api/v2/orders/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
- `` (string): Unique identifier of the order.
Request Body¶
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | Yes | Set to IGNORE to cancel the order. |
Request Example¶
curl --location --request PUT 'https://integrations.clopos.com/open-api/v2/orders/108' \
--header 'Content-Type: application/json' \
--header 'x-token: oauth_example_token' \
--data '{
"status": "IGNORE"
}'
const orderId = 108;
const response = await fetch(`https://integrations.clopos.com/open-api/v2/orders/${orderId}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'x-token': 'oauth_example_token',
},
body: JSON.stringify({ status: 'IGNORE' })
});
const data = await response.json();
import requests
order_id = 108
url = f"https://integrations.clopos.com/open-api/v2/orders/{order_id}"
headers = {
"Content-Type": "application/json",
"x-token": "oauth_example_token",
}
payload = {"status": "IGNORE"}
response = requests.put(url, headers=headers, json=payload)
order = response.json()
Response¶
200 OK — Order updated¶
{
"success": true,
"data": {
"id": 108,
"venue_id": 1,
"type": "CALL_CENTER_ORDER",
"integration": "call_center_new",
"integration_uuid": null,
"integration_id": null,
"customer_ref_id": null,
"integration_status": "CREATED",
"status": "IGNORE",
"created_at": "2026-02-02T13:45:53.000000Z",
"updated_at": "2026-02-02T17:46:02.000000Z",
"integration_response": null
}
}
400 Bad Request — Invalid status¶
{
"success": false,
"error": "validation_failed",
"message": "Status is not allowed"
}
Field Reference¶
| Field | Type | Description |
|---|---|---|
id |
integer | Order identifier. |
venue_id |
integer | Venue that owns the order. |
type |
string | Source of the order. |
integration |
string | Integration channel. |
integration_uuid |
string (nullable) | UUID from the integration source. |
integration_id |
string (nullable) | External ID from the integration source. |
customer_ref_id |
string (nullable) | External customer reference ID. |
integration_status |
string | State reported by the upstream integration. |
status |
string | Updated lifecycle state (e.g., IGNORE). |
integration_response |
object (nullable) | Response data from the integration, if any. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- Request body must include only the status field as shown.
- Currently, only the
IGNOREstatus transition is supported through this endpoint.
Overview¶
API Overview (v2)¶
Source: https://developer.clopos.com/docs/api-reference/v2/overview
Base URL and authentication changes for Clopos Open API v2
Note
Version 2 of the Clopos Open API introduces JWT-based authentication and
simplifies request headers. After authentication you only need to send
x-token with each call.
Base URL¶
https://integrations.clopos.com/open-api/v2
What changed in v2¶
- Endpoints live under
/open-api/v2. /authnow requires anintegrator_idalong with your existing client credentials.venue_idis not part of the auth payload.- Subsequent requests require only the
x-tokenheader; brand and venue headers are no longer needed. - Auth responses now return both
expires_inandexpires_at(epoch seconds).
Authentication flow¶
1. Collect credentials
Use your client_id, client_secret, brand, and integrator_id. Clopos issues the integrator_id; the other three come from the customer's back office (Add-ons → Open API). See Authentication.
2. Call /v2/auth
Exchange credentials for a JWT access token and note the expires_at value.
3. Call other endpoints
Include only x-token with the JWT you received.
Required header for all v2 endpoints (except /auth)¶
x-token: your_jwt_token_here
Sample authenticated request¶
curl -X GET https://integrations.clopos.com/open-api/v2/orders \
-H "x-token: your_jwt_token_here"
Price Lists¶
List Price Lists¶
Source: https://developer.clopos.com/docs/api-reference/v2/price-lists/get-price-lists
GET /v2/price-lists
Retrieve all price lists configured for the brand.
This endpoint retrieves all price lists. A price list is a named set of product prices that can be applied to specific venues or sales channels — for example, a dedicated price list for delivery orders that differs from in-store prices.
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
-
`` (integer): Maximum number of price lists to return per page (1-999).
-
` (array): Include related data in the response. Supported value:prices` — embeds the individual product prices that belong to each list. -
` (array): Sort the results. Supported fields:id,name,created_at. Use array notation, e.g.sort[0][]=name&sort[0][1]=asc`. -
` (string): Comma-separated list of fields to include in the response (e.g.id,name,status`).
Request Example¶
curl "https://integrations.clopos.com/open-api/v2/price-lists?with[]=prices" \
-H "x-token: YOUR_ACCESS_TOKEN"
const response = await fetch(
"https://integrations.clopos.com/open-api/v2/price-lists?with[]=prices",
{ headers: { "x-token": "YOUR_ACCESS_TOKEN" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/price-lists",
params={"with[]": "prices"},
headers={"x-token": "YOUR_ACCESS_TOKEN"},
)
data = response.json()
Response Example¶
{
"data": [
{
"id": 1,
"name": "Delivery Prices",
"description": "Prices applied to delivery orders",
"status": true,
"prices": [
{
"id": 10,
"list_id": 1,
"product_id": 105,
"price": 12.5
}
],
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z"
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total": 1,
"total_pages": 1
}
}
Field Reference¶
Price List Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique identifier for the price list. |
name |
string | Display name of the price list (e.g., "Delivery Prices"). |
description |
string (nullable) | Optional description of the price list, or null. |
status |
boolean | Whether the price list is active. |
prices |
array | Individual product prices in this list. Included only when requested via with[]=prices. See Price object. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
List Prices¶
Source: https://developer.clopos.com/docs/api-reference/v2/price-lists/get-prices
GET /v2/price-lists/prices
Retrieve the individual product prices that belong to price lists.
This endpoint retrieves the individual prices stored across all price lists. Each entry maps a product to its price within a specific price list, letting you read product pricing per channel without loading every list separately.
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
-
`` (integer): Maximum number of prices to return per page (1-999).
-
` (array): Filter prices by specific fields. Use array notation:filters[0][]=field_name&filters[0][1]=value. Supported fields:id,product_id,list_id`. -
` (array): Include related data in the response. Supported values:product(embeds the related product) andlist` (embeds the related price list).
Request Example¶
curl "https://integrations.clopos.com/open-api/v2/price-lists/prices?filters[0][0]=list_id&filters[0][1]=1" \
-H "x-token: YOUR_ACCESS_TOKEN"
const response = await fetch(
"https://integrations.clopos.com/open-api/v2/price-lists/prices?filters[0][0]=list_id&filters[0][1]=1",
{ headers: { "x-token": "YOUR_ACCESS_TOKEN" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/price-lists/prices",
params={"filters[0][0]": "list_id", "filters[0][1]": "1"},
headers={"x-token": "YOUR_ACCESS_TOKEN"},
)
data = response.json()
Response Example¶
{
"data": [
{
"id": 10,
"list_id": 1,
"product_id": 105,
"price": 12.5
},
{
"id": 11,
"list_id": 1,
"product_id": 106,
"price": 8.0
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total": 2,
"total_pages": 1
}
}
Field Reference¶
Price Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique identifier for the price entry. |
list_id |
integer | ID of the price list this price belongs to. |
product_id |
integer | ID of the product this price applies to. |
price |
number | The product's price within this price list. |
product |
object (nullable) | The related product. Included only when requested via with[]=product. See Product object. |
list |
object (nullable) | The related price list. Included only when requested via with[]=list. See Price List object. |
Products¶
List Products¶
Source: https://developer.clopos.com/docs/api-reference/v2/products/get-all-products
GET /v2/products
Get the product catalog with advanced filtering and pagination.
Overview¶
This endpoint allows you to retrieve your branch-based product catalog. It offers a multitude of filtering options such as type, category_id, and tags, and supports five main product types: GOODS, DISH, TIMER, PREPARATION, and INGREDIENT.
The returned data includes product variants (modifications), modifiers (modificator_groups), recipes (recipe), and all other related data.
Product Types and Behaviors¶
While all product types are fundamentally "products," each has its own specific models and behaviors:
- GOODS: These can have variants (
modifications). - With Variants: If a product has variants, only those variants can be sold. The main product acts as a parent and cannot be sold itself. Each modification behaves like a standard
GOODSproduct without variants. -
Without Variants: Standard products that can be sold directly.
-
DISH: This type can have
modificator_groups(modifiers). -
Modifiers: Modifiers (
Modificator) are used exclusively forDISHtype products. They represent add-on options like "Spice Level" or "Extra Lavash." -
TIMER: Represents time-based services (e.g., PS5 rental). Pricing is determined by rules defined in the
settingfield. -
PREPARATION: Semi-finished items that have their own recipe and are used in the production of other
DISHitems. -
INGREDIENT: Raw materials used in production.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/products
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
All parameters are standard URL query parameters. Array and filter values use PHP/Laravel bracket notation — not a JSON blob. Arrays are indexed (with[0]=category&with[1]=station), and each filter is a tuple under filters[N]: field name at filters[N][0], value at filters[N][1] (or filters[N][1][M] when the value is itself an array).
-
`` (integer): Page number for pagination.
-
`` (integer): Products per page. Maximum: 100.
-
`` (array[string]):
Related resources to include in each product. Repeat with indexed brackets. Common values:
category,station,modifications,modifications.codes,taxes,codes,modificator_groups,recipe,packages,tags. Example:with[0]=category&with[1]=station&with[2]=modifications -
`` (string):
Comma-separated list of fields to include in the response.
id,name, andtypeare always returned. Example:selects=id,name,type,price,image -
` (array): Zero or more filter tuples, whereNis a 0-based index. Each tuple is[field_name, value].valuemay be a scalar (filters[N][1]=...) or an array (filters[N][1][0]=...&filters[N][1][1]=...`). See the Filtering section for the full list of supported fields.
Filtering¶
Each filter occupies its own index under filters[]. Stack multiple filters by incrementing the outer index — for example filters[0] for type, filters[1] for inventory_behavior, and so on. The outer index order does not matter; only uniqueness does.
-
type(array[string]):Product type. Possible values:
GOODS,DISH,TIMER,PREPARATION,INGREDIENT. Example:filters[0][0]=type&filters[0][1][0]=GOODS&filters[0][1][1]=DISH -
category_id(array[integer]):Products belonging to the specified category IDs. Example:
filters[0][0]=category_id&filters[0][1][0]=1&filters[0][1][1]=3 -
station_id(array[integer]):Products assigned to the specified station IDs. Example:
filters[0][0]=station_id&filters[0][1][0]=1&filters[0][1][1]=2 -
tags(array[integer]):Products with the specified tag IDs. Example:
filters[0][0]=tags&filters[0][1][0]=1&filters[0][1][1]=2 -
giftable(string):"1"= giftable,"0"= not giftable. Example:filters[0][0]=giftable&filters[0][1]=1 -
discountable(string):"1"= discountable,"0"= not discountable. Example:filters[0][0]=discountable&filters[0][1]=1 -
inventory_behavior(string):Inventory tracking mode. Allowed values:
"0"(MINUS_INGREDIENTS— deduct recipe ingredients on sale, typical forDISH),"1"(MINUS_SELF— deduct the product itself from stock, countableGOODS/INGREDIENT),"3"(PASSIVE— no inventory tracking, uncountable). Example:filters[0][0]=inventory_behavior&filters[0][1]=0 -
haveIngredients(string):"1"= has a recipe/ingredients. Example:filters[0][0]=haveIngredients&filters[0][1]=1 -
sold_by_portion(string):"1"= sold by portion. Example:filters[0][0]=sold_by_portion&filters[0][1]=1 -
has_variants(string):"1"= has variants (modifications). Example:filters[0][0]=has_variants&filters[0][1]=1 -
has_modifiers(string):"1"= has a modifier group (modificator_groups). Example:filters[0][0]=has_modifiers&filters[0][1]=1 -
has_barcode(string):"1"= has at least one barcode. The filter still works, but the top-levelbarcodestring on the product is deprecated — requestwith[]=codesand read barcodes from thecodesarray instead. Example:filters[0][0]=has_barcode&filters[0][1]=1 -
has_service_charge(string):"1"= service charge applies. Example:filters[0][0]=has_service_charge&filters[0][1]=1
Combining filters¶
Stack filters by incrementing the outer index. Scalar and array values can be mixed freely:
?page=1&limit=50
&filters[0][0]=type&filters[0][1][0]=GOODS&filters[0][1][1]=DISH&filters[0][1][2]=TIMER
&filters[1][0]=inventory_behavior&filters[1][1]=0
(Line breaks shown only for readability — the real URL must be a single string with no whitespace. Brackets should be URL-encoded by your HTTP client; curl users can pass --globoff to avoid shell interpretation.)
Request Examples¶
# Basic request with pagination and selects
curl --globoff 'https://integrations.clopos.com/open-api/v2/products?page=1&limit=100&selects=id,name,type' \
-H "x-token: oauth_example_token"
# Relations + two filters (type IN (GOODS,DISH,TIMER) AND inventory_behavior = 0)
curl --globoff 'https://integrations.clopos.com/open-api/v2/products?with[0]=category&with[1]=station&with[2]=modifications&with[3]=modifications.codes&with[4]=taxes&with[5]=codes&page=1&limit=50&filters[0][0]=type&filters[0][1][0]=GOODS&filters[0][1][1]=DISH&filters[0][1][2]=TIMER&filters[1][0]=inventory_behavior&filters[1][1]=0' \
-H "x-token: oauth_example_token"
// URLSearchParams handles the bracket encoding for you
const params = new URLSearchParams({
page: '1',
limit: '50',
'with[0]': 'category',
'with[1]': 'station',
'with[2]': 'modifications',
'with[3]': 'modifications.codes',
'with[4]': 'taxes',
'with[5]': 'codes',
'filters[0][0]': 'type',
'filters[0][1][0]': 'GOODS',
'filters[0][1][1]': 'DISH',
'filters[0][1][2]': 'TIMER',
'filters[1][0]': 'inventory_behavior',
'filters[1][1]': '0',
});
const response = await fetch(`https://integrations.clopos.com/open-api/v2/products?${params}`, {
headers: { 'x-token': 'oauth_example_token' },
});
const result = await response.json();
console.log(result);
import requests
url = "https://integrations.clopos.com/open-api/v2/products"
headers = {"x-token": "oauth_example_token"}
params = {
"page": 1,
"limit": 50,
"with[0]": "category",
"with[1]": "station",
"with[2]": "modifications",
"with[3]": "modifications.codes",
"with[4]": "taxes",
"with[5]": "codes",
"filters[0][0]": "type",
"filters[0][1][0]": "GOODS",
"filters[0][1][1]": "DISH",
"filters[0][1][2]": "TIMER",
"filters[1][0]": "inventory_behavior",
"filters[1][1]": 0,
}
response = requests.get(url, headers=headers, params=params)
result = response.json()
Response¶
{
"success": true,
"data": [
{
"id": 1,
"parent_id": null,
"station_id": null,
"category_id": null,
"unit_id": 1,
"type": "INGREDIENT",
"name": "Test_Tomato",
"parent_name": "",
"full_name": "Test_Tomato",
"position": null,
"barcode": null,
"gov_code": null,
"status": 1,
"hidden": 0,
"sold_by_weight": false,
"discountable": true,
"giftable": false,
"has_modifications": false,
"description": null,
"price": 0,
"cost_price": 0,
"cooking_time": 0,
"inventory_behavior": 0,
"low_stock": 0,
"unit_weight": 0,
"venues": [],
"media": [],
"created_at": "2026-01-13 20:04:05",
"updated_at": "2026-01-13 20:04:05"
},
{
"id": 2,
"parent_id": null,
"station_id": null,
"category_id": null,
"unit_id": 1,
"type": "INGREDIENT",
"name": "Test_Onion",
"parent_name": "",
"full_name": "Test_Onion",
"position": null,
"barcode": null,
"gov_code": null,
"status": 1,
"hidden": 0,
"sold_by_weight": false,
"discountable": true,
"giftable": false,
"has_modifications": false,
"description": null,
"price": 0,
"cost_price": 1,
"cooking_time": 0,
"inventory_behavior": 0,
"low_stock": 0,
"unit_weight": 0,
"venues": [],
"media": [],
"created_at": "2026-01-13 20:04:06",
"updated_at": "2026-04-01 17:05:36"
}
],
"total": 284
}
Field Reference¶
Product Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique product identifier. |
parent_id |
integer (nullable) | ID of the parent product for a variant. A row with type: "MODIFICATION" is a variant of the GOODS product referenced here — "modification" and "variant" mean the same thing in this API, and a variant carries the full product schema (same fields as the parent, with its own price, cost_price, stock, barcodes, etc.). |
station_id |
integer (nullable) | ID of the preparation station assigned to this product. |
category_id |
integer (nullable) | ID of the category this product belongs to. |
unit_id |
integer | ID of the unit of measurement. |
type |
string | Product type: GOODS, DISH, TIMER, PREPARATION, INGREDIENT, MODIFICATION, MODIFIER. |
name |
string | Product name. |
parent_name |
string | Name of the parent product (empty string if none). |
full_name |
string | Full product name including variant info (e.g., "Fanta 0.5 L"). |
position |
integer (nullable) | Display order position within the category. |
barcode |
string (nullable) | Deprecated. Legacy single-barcode field, kept for backwards compatibility and not guaranteed to be populated. For current barcodes, request with[]=codes and read from the codes array. |
gov_code |
string (nullable) | Government/tax code for the product. |
status |
integer | 1 = active, 0 = inactive. |
hidden |
integer | 1 = hidden from menus, 0 = visible. |
sold_by_weight |
boolean | Whether the product is sold by weight rather than quantity. |
discountable |
boolean | Whether discounts can be applied to this product. |
giftable |
boolean | Whether this product can be given as a gift/complimentary item. |
has_modifications |
boolean | If true, the product has variants in the modifications array. |
description |
string (nullable) | Product description text. |
price |
number | Base selling price. For parent GOODS with variants, this may be 0 since variants carry their own prices. |
cost_price |
number | Cost price used for margin calculations. |
cooking_time |
integer | Estimated preparation time in minutes. |
inventory_behavior |
integer | Inventory tracking mode. 0 = MINUS_INGREDIENTS — on sale, deduct the recipe's ingredients from stock (typical for DISH). 1 = MINUS_SELF — deduct the product itself from stock (countable GOODS / INGREDIENT). 3 = PASSIVE — no inventory tracking (uncountable). |
low_stock |
integer | Low stock threshold for alerts. |
unit_weight |
number | Physical weight of a single unit, in kilograms. For example, if unit_id resolves to pcs, this is how much one piece weighs (a single packet that weighs 3 kg is stored as 3). Independent of sold_by_weight; used for logistics, shipping, and stock-by-weight calculations, not for pricing mode. |
venues |
array | Venue-specific availability and pricing overrides. |
media |
array | Image attachments. See Media object. |
created_at |
string | Creation timestamp. |
updated_at |
string | Last update timestamp. |
Variant Object (modifications)¶
Represents different versions (e.g., size, color) of a GOODS type product.
A variant has the same shape as a product — every field listed in the Product Object above (id, parent_id, category_id, unit_id, price, cost_price, unit_weight, inventory_behavior, media, venues, created_at, updated_at, …) is present on each variant. The only differences worth calling out:
typeis alwaysMODIFICATION.parent_idpoints at the parentGOODSproduct instead of beingnull.full_namecombines the parent name with the variant name (e.g."Fanta 0.5 L").- The variant carries its own
price,cost_price,barcode/codes,status, stock, etc. — the parent's values are not inherited at sale time.
Modifier Group (modificator_groups)¶
Defines groups of options that can be added to a DISH type product (e.g., "Pizza Toppings").
| Field | Type | Description |
|---|---|---|
id |
integer | The group's identifier. |
name |
string | The name of the group (e.g., "Spice Level"). |
type |
integer | Selection rule (1: Single-choice, 0: Multi-choice). |
min_select |
integer | Minimum number of selections. |
max_select |
integer | Maximum number of selections. |
modificators |
array | List of selectable items. See Modifier Object. |
Modifier Object (modificators)¶
| Field | Type | Description |
|---|---|---|
id |
integer | The modifier's identifier. |
name |
string | The name of the modifier (e.g., "Medium Hot"). |
price |
number | The additional price for the option. |
ingredient |
object (nullable) | If the modifier is linked to an ingredient, contains ingredient information. |
Timer Settings (setting)¶
Contains the time-based pricing rules for TIMER type products.
| Field | Type | Description |
|---|---|---|
interval |
integer | The pricing interval in minutes. |
prices |
array | Prices for different time periods. [{ "price": 3, "from": 120 }] |
Recipe Item (recipe)¶
| Field | Type | Description |
|---|---|---|
ingredient_id |
integer | The product ID of the recipe component. |
name |
string | The name of the component. |
gross |
string | Gross amount. |
net |
string | Net amount. |
Package Object (packages)¶
Specifies the purchasing packages defined for INGREDIENT type products.
| Field | Type | Description |
|---|---|---|
id |
integer | The package's identifier. |
name |
string | The name of the package (e.g., "Bundle 10 pcs"). |
equal |
integer | The number of base units contained in the package. |
Get Product by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/products/get-product-by-id
GET /v2/products/{id}
Retrieve a single product with type-specific details.
Purpose¶
Returns a single product from the Clopos catalog, along with related data specific to its type (variants, modifiers, recipe, timer settings, etc.). Use the with parameters to fetch only the sub-resources you need.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/products/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
- `` (string): The product ID (integer or UUID).
Query Parameters¶
` (string): Related data selector. Example:taxes,unit,modifications,modificator_groups,recipe,packages,media,tags,setting. You can include multiplewith` parameters.
Supported
withvalues may vary based on your backend version.
Request Example¶
curl -X GET "https://integrations.clopos.com/open-api/v2/products/419?with[]=modifications&with[]=taxes" \
-H "x-token: oauth_example_token" \
curl -X GET "https://integrations.clopos.com/open-api/v2/products/1?with[]=modificator_groups&with[]=recipe" \
-H "x-token: oauth_example_token" \
const params = new URLSearchParams([
['with[]', 'taxes'],
['with[]', 'unit'],
['with[]', 'modificator_groups.modificators.ingredient.unit'],
['with[]', 'recipe'],
['with[]', 'packages']
]);
const response = await fetch(`https://integrations.clopos.com/open-api/v2/products/1?${params}`, {
headers: {
'x-token': 'oauth_example_token',
}
});
const product = await response.json();
Response¶
200 OK — Product found¶
{
"success": true,
"data": {
"id": 1,
"parent_id": null,
"station_id": null,
"category_id": null,
"unit_id": 1,
"type": "INGREDIENT",
"name": "Test_Tomato",
"parent_name": "",
"full_name": "Test_Tomato",
"position": null,
"barcode": null,
"gov_code": null,
"status": 1,
"hidden": 0,
"sold_by_weight": false,
"discountable": true,
"giftable": false,
"has_modifications": false,
"description": null,
"price": 0,
"cost_price": 0,
"cooking_time": 0,
"inventory_behavior": 0,
"low_stock": 0,
"unit_weight": 0,
"venues": [],
"media": [],
"created_at": "2026-01-13 20:04:05",
"updated_at": "2026-01-13 20:04:05"
}
}
404 Not Found — Product does not exist¶
{
"success": false,
"error": "resource_not_found",
"message": "Product not found"
}
Field Reference¶
Product Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique product identifier. |
parent_id |
integer (nullable) | ID of the parent product for a variant. A row with type: "MODIFICATION" is a variant of the GOODS product referenced here — "modification" and "variant" mean the same thing in this API, and a variant carries the full product schema (same fields as the parent, with its own price, cost_price, stock, barcodes, etc.). |
station_id |
integer (nullable) | ID of the preparation station assigned to this product. |
category_id |
integer (nullable) | ID of the category this product belongs to. |
unit_id |
integer | ID of the unit of measurement. |
type |
string | Product type: GOODS, DISH, TIMER, PREPARATION, INGREDIENT, MODIFICATION, MODIFIER. |
name |
string | Product name. |
parent_name |
string | Name of the parent product (empty string if none). |
full_name |
string | Full product name including variant info (e.g., "Fanta 0.5 L"). |
position |
integer (nullable) | Display order position within the category. |
barcode |
string (nullable) | Deprecated. Legacy single-barcode field, kept for backwards compatibility and not guaranteed to be populated. For current barcodes, request with[]=codes and read from the codes array. |
gov_code |
string (nullable) | Government/tax code for the product. |
status |
integer | 1 = active, 0 = inactive. |
hidden |
integer | 1 = hidden from menus, 0 = visible. |
sold_by_weight |
boolean | Whether the product is sold by weight rather than quantity. |
discountable |
boolean | Whether discounts can be applied to this product. |
giftable |
boolean | Whether this product can be given as a gift/complimentary item. |
has_modifications |
boolean | If true, the product has variants in the modifications array. |
description |
string (nullable) | Product description text. |
price |
number | Base selling price. For parent GOODS with variants, this may be 0 since variants carry their own prices. |
cost_price |
number | Cost price used for margin calculations. |
cooking_time |
integer | Estimated preparation time in minutes. |
inventory_behavior |
integer | Inventory tracking mode. 0 = MINUS_INGREDIENTS — on sale, deduct the recipe's ingredients from stock (typical for DISH). 1 = MINUS_SELF — deduct the product itself from stock (countable GOODS / INGREDIENT). 3 = PASSIVE — no inventory tracking (uncountable). |
low_stock |
integer | Low stock threshold for alerts. |
unit_weight |
number | Physical weight of a single unit, in kilograms. For example, if unit_id resolves to pcs, this is how much one piece weighs (a single packet that weighs 3 kg is stored as 3). Independent of sold_by_weight; used for logistics, shipping, and stock-by-weight calculations, not for pricing mode. |
venues |
array | Venue-specific availability and pricing overrides. |
media |
array | Image attachments. See Media object. |
created_at |
string | Creation timestamp. |
updated_at |
string | Last update timestamp. |
Notes¶
- If the
idparameter is in the wrong format, the backend returns a400error; validate it on the client side. - Since
withparameters are evaluated sequentially, avoid using the same key more than once. - Type-specific heavy relationships (for example, large
recipeormodificator_groups) can produce large responses; request only what you need. - Some fields may be empty or null depending on the product type; use the
typefield to drive conditional rendering on the client. - For TIMER products, the
setting.pricesarray represents additional fees applied after a certain duration. - For INGREDIENT products, the
packagesfield shows the package sizes used in stock entries; if not applicable, it is an empty array.
Get Stop List¶
Source: https://developer.clopos.com/docs/api-reference/v2/products/get-stop-list
GET /v2/products/stop-list
Get stop list data for specific products
Purpose¶
Retrieve stop list data for specific products. The stop list indicates product limitations such as stock limits. If a product is not returned in the response, it means that product does not have any stop list limitations.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/products/stop-list
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
Filters¶
You can filter by product IDs to get stop list data for specific products.
| Parameter | Type | Required | Description |
|---|---|---|---|
filters[0][0] |
string | No | Filter field name. Use "id" to filter by product ID. |
filters[0][1] |
array | No | Array of product IDs to filter. |
Filter Syntax¶
To filter by product IDs, use the following format:
filters[0][0]=id&filters[0][1][0]=1&filters[0][1][1]=332
This will filter for products with IDs 1 and 332.
Request Example¶
curl --location --globoff 'https://integrations.clopos.com/open-api/v2/products/stop-list?filters[0][0]=id&filters[0][1][0]=1&filters[0][1][1]=332' \
--header 'x-token: oauth_example_token' \
const response = await fetch('https://integrations.clopos.com/open-api/v2/products/stop-list?filters[0][0]=id&filters[0][1][0]=1&filters[0][1][1]=332', {
headers: {
'x-token': 'oauth_example_token',
}
});
const data = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/products/stop-list"
headers = {
"x-token": "oauth_example_token",
}
params = {
"filters[0][0]": "id",
"filters[0][1][0]": 1,
"filters[0][1][1]": 332
}
response = requests.get(url, headers=headers, params=params)
data = response.json()
Response¶
200 OK — Success¶
Returns an array of stop list entries for the requested products. If a product does not have stop list limitations, it will not appear in the response.
{
"success": true,
"data": [
{
"id": 54,
"limit": 0,
"timestamp": 1761202010781
},
{
"id": 57,
"limit": 3,
"timestamp": 1761202001368
},
{
"id": 275,
"limit": 5,
"timestamp": 1762929390368
}
]
}
Note
When no products are on the stop list, the response returns an empty data array: {"success": true, "data": []}. This is normal and indicates no products currently have stock limitations.
400 Bad Request — Invalid Parameters¶
{
"success": false,
"error": "invalid_parameter",
"message": "Invalid filter parameters"
}
401 Unauthorized — Missing Header¶
{
"success": false,
"error": "unauthorized",
"message": "Missing authentication headers"
}
Field Reference¶
Stop List Entry Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Product ID. This corresponds to the product identifier. |
limit |
integer | Stock limit for the product. 0 means the product is out of stock or has no available quantity. |
timestamp |
integer | Unix timestamp (in milliseconds) when the stop list entry was last updated. |
Notes¶
- The
idfield in the response represents theproduct_id. - If a product is not included in the response data, it means that product does not have any stop list limitations.
- Use the
filtersparameter to query specific products by their IDs. - The
limitfield indicates the available stock limit. A value of0typically means the product is unavailable. - The
timestampfield shows when the stop list entry was last updated, useful for tracking changes.
Receipts¶
Close Receipt¶
Source: https://developer.clopos.com/docs/api-reference/v2/receipts/close-receipt
POST /v2/receipts/{id}/close
Close an existing receipt with payment methods and closing timestamp
Purpose¶
Close an existing receipt by updating its payment methods and setting the closing timestamp. This endpoint is used to finalize a receipt that was previously created but not yet closed.
HTTP Request¶
POST https://integrations.clopos.com/open-api/v2/receipts/{id}/close
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
| Parameter | Type | Description |
|---|---|---|
id |
number | Unique identifier of the receipt to close. |
Request Body¶
| Field | Type | Required | Description |
|---|---|---|---|
payment_methods |
array | Yes | List of payment methods with amounts. See Payment method. |
closed_at |
string | No | Closing timestamp (YYYY-MM-DD HH |
payment_methods[]¶
| Field | Type | Required | Description |
|---|---|---|---|
id |
number | Yes | Payment method ID. |
name |
string | Yes | Payment method name (e.g., "Cash", "Card"). |
amount |
number | Yes | Amount paid using this method. |
Request Example¶
curl --location --request POST 'https://integrations.clopos.com/open-api/v2/receipts/10950/close' \
--header 'Content-Type: application/json' \
--header 'x-token: oauth_example_token' \
--data '{
"payment_methods": [
{
"id": 2,
"name": "Cash",
"amount": 8140
}
],
"closed_at": "2026-01-20 09:59:54"
}'
const receiptId = 10950;
const response = await fetch(`https://integrations.clopos.com/open-api/v2/receipts/${receiptId}/close`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-token': 'oauth_example_token',
},
body: JSON.stringify({
payment_methods: [
{
id: 2,
name: 'Cash',
amount: 8140
}
],
closed_at: '2026-01-20 09:59:54'
})
});
const receipt = await response.json();
import requests
receipt_id = 10950
url = f"https://integrations.clopos.com/open-api/v2/receipts/{receipt_id}/close"
headers = {
"Content-Type": "application/json",
"x-token": "oauth_example_token",
}
payload = {
"payment_methods": [
{
"id": 2,
"name": "Cash",
"amount": 8140
}
],
"closed_at": "2026-01-20 09:59:54"
}
response = requests.post(url, headers=headers, json=payload)
receipt = response.json()
Response¶
200 OK — Receipt Closed¶
{
"success": true,
"message": "Receipt closed",
"data": {
"id": 10950,
"closed_at": "2026-01-20 09:59:54",
"payment_methods": [
{
"id": 2,
"name": "Cash",
"amount": 8140
}
]
}
}
400 Bad Request — Validation Error¶
{
"success": false,
"error": "validation_failed",
"message": "closed_at must be greater than created_at"
}
404 Not Found — Receipt Not Found¶
{
"success": false,
"error": "not_found",
"message": "Receipt not found"
}
Field Reference¶
Response fields¶
| Field | Type | Description |
|---|---|---|
success |
boolean | Indicates the result of the request. |
message |
string | Human-readable status message. |
data.id |
number | Receipt identifier that was closed. |
data.closed_at |
string | Closing timestamp applied to the receipt (YYYY-MM-DD HH |
data.payment_methods |
array | Payment methods recorded on the receipt. |
payment_methods[]¶
| Field | Type | Description |
|---|---|---|
id |
number | Payment method ID. |
name |
string | Payment method name (e.g., "Cash", "Card"). |
amount |
number | Amount paid using this method. |
Notes¶
- The receipt must be in an open state (
status: 1) to be closed through this endpoint. - If
closed_atis omitted, the server uses the current timestamp. - The
closed_atvalue must be later than the receipt'screated_attimestamp. - After closing, the receipt's
statuschanges to2(closed).
Get Receipt by CID¶
Source: https://developer.clopos.com/docs/api-reference/v2/receipts/get-receipt-by-cid
GET /v2/receipts/cid/{cid}
Retrieve a receipt by its cid UUID.
Terminals key receipts by a cid UUID, so integrations often hold that rather than the numeric id. Returns exactly the same payload as fetching by id.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/receipts/cid/{cid}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Access¶
| Requirement | Value |
|---|---|
| Integrator scope | receipts:read |
| User ability | RECEIPT_VIEW |
The integration user must hold the ability as well as the scope — the scope alone is not enough.
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/receipts/cid/96ab5d26-d6bb-4976-a6f8-9e8806ef6aa5" \
-H "x-token: oauth_example_token"
const response = await fetch('https://integrations.clopos.com/open-api/v2/receipts/cid/96ab5d26-d6bb-4976-a6f8-9e8806ef6aa5', {
headers: { 'x-token': 'oauth_example_token' }
});
const data = await response.json();
import requests
response = requests.get(
"https://integrations.clopos.com/open-api/v2/receipts/cid/96ab5d26-d6bb-4976-a6f8-9e8806ef6aa5",
headers={"x-token": "oauth_example_token"},
)
data = response.json()
Notes¶
- The
cidmust be a well-formed UUID; anything else returns400without reaching the API.
Get Receipt by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/receipts/get-receipt-by-id
GET /v2/receipts/{id}
Retrieve the full details of a specific receipt
Purpose¶
Fetch the final state of a single receipt, including payment breakdowns and line items.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/receipts/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
| Parameter | Type | Description |
|---|---|---|
id |
number | Unique identifier of the receipt you want to inspect. |
Query Parameters¶
-
`` (string):
Include related resources in the response. Supported values:
receipt_products— line items on the receiptreceipt_products.modificators— modifiers applied to each line item
Request Example¶
# Basic request
curl --location "https://integrations.clopos.com/open-api/v2/receipts/1" \
-H "x-token: oauth_example_token"
# With products and modifiers (note: --globoff to avoid shell globbing)
curl --location --globoff "https://integrations.clopos.com/open-api/v2/receipts/1?with[0]=receipt_products.product.unit&with[1]=receipt_products.product.station&with[2]=receipt_products.modificators.modificator_group" \
-H "x-token: oauth_example_token"
const receiptId = 1;
const headers = { 'x-token': 'oauth_example_token' };
// Basic request
const response = await fetch(
`https://integrations.clopos.com/open-api/v2/receipts/${receiptId}`,
{ headers }
);
const receipt = await response.json();
// With products and modifiers
const params = new URLSearchParams({
'with[0]': 'receipt_products.product.unit',
'with[1]': 'receipt_products.product.station',
'with[2]': 'receipt_products.modificators.modificator_group'
});
const responseWithProducts = await fetch(
`https://integrations.clopos.com/open-api/v2/receipts/${receiptId}?${params}`,
{ headers }
);
const receiptWithProducts = await responseWithProducts.json();
import requests
receipt_id = 1
url = f"https://integrations.clopos.com/open-api/v2/receipts/{receipt_id}"
headers = {
"x-token": "oauth_example_token",
}
# Basic request
response = requests.get(url, headers=headers)
receipt = response.json()
# With products and modifiers
params = {
"with[0]": "receipt_products.product.unit",
"with[1]": "receipt_products.product.station",
"with[2]": "receipt_products.modificators.modificator_group"
}
response = requests.get(url, headers=headers, params=params)
receipt_with_products = response.json()
Response¶
200 OK — Receipt¶
{
"success": true,
"data": {
"id": 1,
"venue_id": 1,
"cid": "96ab5d26-d6bb-4976-a6f8-9e8806ef6aa5",
"customer_id": null,
"sale_type_id": 2,
"source": "web",
"guests": 1,
"status": 2,
"order_status": "IN_PROGRESS",
"order_number": "006",
"lock": false,
"total": 30000,
"subtotal": 30000,
"discount_type": 0,
"discount_value": 0,
"discount_rate": 0,
"total_discount": 0,
"service_charge": 0,
"service_charge_value": 0,
"delivery_fee": 0,
"remaining": 0,
"i_tax": 0,
"e_tax": 0,
"total_tax": 0,
"payment_methods": [
{
"id": 1,
"name": "Cash",
"amount": 30000
}
],
"fiscal_id": null,
"loyalty_type": null,
"loyalty_value": null,
"address": null,
"description": null,
"created_at": "2026-01-19 14:51:33",
"updated_at": "2026-01-19 15:07:49",
"closed_at": "2026-01-19 15:07:49",
"shift_date": "2026-01-19",
"receipt_products": [
{
"id": 1,
"cid": "0fd784b1-ee5a-4745-a130-a849b4e5db2f",
"product_id": 51,
"count": 1,
"portion_size": 1,
"total": 10,
"price": 10,
"subtotal": 10,
"is_gift": false,
"discount_type": 0,
"discount_value": 0,
"discount_rate": 0,
"total_discount": 0,
"receipt_discount": 0,
"loyalty_type": null,
"loyalty_value": null,
"meta": {
"product": {
"name": "Test_Margherita Pizza",
"type": "DISH",
"price": 10,
"barcode": null
}
},
"modificators": [],
"created_at": "2026-01-19 14:51:34",
"updated_at": "2026-01-19 15:07:53"
}
]
}
}
404 Not Found — Invalid ID¶
{
"success": false,
"error": "not_found",
"message": "Receipt not found"
}
Field Reference¶
Receipt object¶
| Field | Type | Description |
|---|---|---|
id |
number | Unique receipt identifier. |
cid |
string | Client-generated UUID for the receipt. |
venue_id |
number | Venue (location) the receipt belongs to. |
customer_id |
number|null | Customer associated with the receipt. |
sale_type_id |
number | Sale type identifier (e.g., dine-in, delivery). |
source |
string | Origin of the receipt (e.g., "web", "pos"). |
guests |
number | Number of guests on the receipt. |
status |
number | Receipt status: 1 = open, 2 = closed. |
order_status |
string | Order workflow status. One of: NEW, SCHEDULED, IN_PROGRESS, READY, PICKED_UP, COMPLETED, CANCELLED. |
order_number |
string|null | External or display order number. |
lock |
boolean | Whether the receipt is locked from further changes. |
total |
number | Total amount collected. |
subtotal |
number | Subtotal before discounts, taxes, and fees. |
discount_type |
number | Discount type applied (0 = none). |
discount_value |
number | Discount amount or percentage value. |
discount_rate |
number | Effective discount rate. |
total_discount |
number | Total discount applied to the receipt. |
service_charge |
number | Service charge percentage. |
service_charge_value |
number | Calculated service charge amount. |
delivery_fee |
number | Delivery fee amount. |
remaining |
number | Outstanding balance (0 when fully paid). |
i_tax |
number | Inclusive tax amount. |
e_tax |
number | Exclusive tax amount. |
total_tax |
number | Total tax amount (inclusive + exclusive). |
payment_methods |
array | Payment breakdown. See Payment method. |
fiscal_id |
string|null | Fiscal receipt identifier for tax reporting. |
loyalty_type |
string|null | Loyalty program type applied. |
loyalty_value |
number|null | Loyalty discount or points value. |
address |
string|null | Delivery address. |
description |
string|null | Delivery or order notes. |
created_at |
string | Receipt creation time (YYYY-MM-DD HH |
updated_at |
string | Last update time (YYYY-MM-DD HH |
closed_at |
string|null | Receipt close time (YYYY-MM-DD HH |
shift_date |
string | Business day the receipt belongs to (YYYY-MM-DD). |
See Payment method for the payment_methods[] structure.
receipt_products[]¶
Included when with[]=receipt_products is passed. Each item represents one line on the receipt.
| Field | Type | Description |
|---|---|---|
id |
integer | Line item identifier. |
cid |
string | Client-generated UUID for the line item. |
product_id |
integer | Product ID from your catalog. |
count |
integer | Quantity ordered. |
portion_size |
integer | Portion size multiplier (usually 1). |
total |
number | Line total after adjustments. |
price |
number | Unit price at the time of sale. |
subtotal |
number | Subtotal before receipt-level discounts. |
is_gift |
boolean | Whether this item was given as a complimentary gift. |
discount_type |
integer | Discount type on this line item (0 = none). |
discount_value |
number | Discount amount or percentage. |
discount_rate |
number | Effective discount rate. |
total_discount |
number | Total discount on this line item. |
receipt_discount |
number | Portion of the receipt-level discount allocated to this item. |
loyalty_type |
string (nullable) | Loyalty program type applied to this item. |
loyalty_value |
number (nullable) | Loyalty points or discount value. |
meta.product.name |
string | Product name at the time of sale. |
meta.product.type |
string | Product type (DISH, GOODS, etc.). |
meta.product.price |
number | Product's catalog price at the time of sale. |
meta.product.barcode |
string (nullable) | Product barcode. |
modificators |
array | Modifiers applied to this item. Included when with[]=receipt_products.modificators is passed. Empty array if none. |
created_at |
string | When the line item was added (YYYY-MM-DD HH:mm:ss). |
updated_at |
string | Last update time (YYYY-MM-DD HH:mm:ss). |
Notes¶
- Closed receipts store the final totals; quantities and amounts cannot be edited through this endpoint.
- Use
receipt_productsfor reconciliation with inventory or accounting systems. - The response also includes
time,timestamp, andunixfields for diagnostics; these are omitted from the example for brevity. - Combine with the list endpoint when you need to cross-check totals before exporting reports.
Get Receipt Stock Operations¶
Source: https://developer.clopos.com/docs/api-reference/v2/receipts/get-receipt-stock-operations
GET /v2/receipts/{id}/stock-operations
Retrieve the stock deductions ("Çıxarılan ehtiyat") generated by a receipt
Purpose¶
Fetch the stock write-offs caused by a single receipt — the inventory deducted from your storages when the receipt's products were sold. Use it to reconcile a sale against the warehouse movements it produced ("Çıxarılan ehtiyat" / stock deduction by receipt id).
Only the deductions of the receipt itself are returned: each item has operation_id = null and a non-null receipt_product_id. Manual stock corrections or operations from other documents are excluded.
This endpoint requires the receipts:read scope.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/receipts/{id}/stock-operations
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
| Parameter | Type | Description |
|---|---|---|
id |
number | Unique identifier of the receipt whose stock deductions you want to inspect. |
Request Example¶
curl --location "https://integrations.clopos.com/open-api/v2/receipts/1/stock-operations" \
-H "x-token: oauth_example_token"
const receiptId = 1;
const headers = { 'x-token': 'oauth_example_token' };
const response = await fetch(
`https://integrations.clopos.com/open-api/v2/receipts/${receiptId}/stock-operations`,
{ headers }
);
const stockOperations = await response.json();
import requests
receipt_id = 1
url = f"https://integrations.clopos.com/open-api/v2/receipts/{receipt_id}/stock-operations"
headers = {
"x-token": "oauth_example_token",
}
response = requests.get(url, headers=headers)
stock_operations = response.json()
Response¶
200 OK — Stock operations¶
{
"data": [
{
"id": 1001,
"receipt_id": 1,
"receipt_product_id": 14,
"product_id": 31042,
"stock_id": 5001,
"storage_id": 3,
"quantity": 1,
"before_quantity": 120,
"after_quantity": 119,
"cost": 8000,
"before_cost": 8000,
"total_cost": 8000,
"operated_at": "2026-01-19 15:07:49",
"product": {
"id": 31042,
"name": "Апельсинли реване"
},
"stock": {
"id": 5001,
"storage": {
"id": 3,
"name": "Main Storage"
}
}
},
{
"id": 1002,
"receipt_id": 1,
"receipt_product_id": 15,
"product_id": 31046,
"stock_id": 5002,
"storage_id": 3,
"quantity": 2,
"before_quantity": 50,
"after_quantity": 48,
"cost": 1500,
"before_cost": 1500,
"total_cost": 3000,
"operated_at": "2026-01-19 15:07:49",
"product": {
"id": 31046,
"name": "Ачма узум жевиз"
},
"stock": {
"id": 5002,
"storage": {
"id": 3,
"name": "Main Storage"
}
}
}
]
}
404 Not Found — Invalid ID¶
{
"success": false,
"error": "not_found",
"message": "Receipt not found"
}
Field Reference¶
Stock operation object¶
| Field | Type | Description |
|---|---|---|
id |
number | Stock operation identifier. |
receipt_id |
number | Receipt the operation belongs to. |
receipt_product_id |
number | Receipt product line that produced the write-off (always set for receipt deductions). |
product_id |
number | Product whose stock was deducted. |
stock_id |
number | Stock record affected by the operation. |
storage_id |
number | Storage the stock belongs to. |
quantity |
number | Quantity deducted from stock. |
before_quantity |
number | Stock quantity before the operation. |
after_quantity |
number | Stock quantity after the operation. |
cost |
number | Unit cost applied to the deduction. |
before_cost |
number | Stock cost before the operation. |
total_cost |
number | Total cost of the deducted quantity. |
operated_at |
string | When the operation was applied (YYYY-MM-DD HH |
product |
object | Related product. Present even when the product was soft-deleted. |
stock |
object | Affected stock together with its storage. |
stock¶
| Field | Type | Description |
|---|---|---|
id |
number | Stock identifier. |
storage |
object | Storage the stock belongs to (id, name). |
Notes¶
- The endpoint returns only the receipt's own deductions (
operation_id = null,receipt_product_id != null); inventory adjustments from other documents are not included. - A
productmay be soft-deleted but is still returned so historical receipts remain fully reconcilable. - Combine with Get Receipt by ID to map each
receipt_product_idback to its sold line item.
List Receipts¶
Source: https://developer.clopos.com/docs/api-reference/v2/receipts/get-receipts
GET /v2/receipts
Retrieve all receipts with support for filters and sorting
Purpose¶
Speeds up your reconciliation flows by listing sales receipts by date, amount, or status.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/receipts
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
-
`` (integer): Page number for pagination (1-based).
-
`` (integer): Number of receipts per page.
-
` (string): Start date of acreated_atrange, inclusive. Format:YYYY-MM-DD. Pair withdate[1]`. -
` (string): End date of acreated_atrange, inclusive. Format:YYYY-MM-DD`. -
` (string): Field to sort by (e.g.created_at,updated_at,closed_at,total). Inspect thesorts` array in the response to discover all sortable fields the API currently supports. -
` (integer): Sort direction:1= ascending,-1` = descending. -
`` (array[string]):
Related resources to include in each receipt. Repeat with indexed brackets (e.g.
with[0]=receipt_products&with[1]=receipt_products.modificators). Common values:receipt_products— line items on each receiptreceipt_products.modificators— modifiers applied to each line itemreceipt_products.product.unit,receipt_products.product.station— product relations
-
` (array): Field-level filter tuples using PHP bracket notation:filters[N][0]=field_name&filters[N][1]=value. Stack filters by incrementingN(0-based). Commonly used withstatus,sale_type_id,terminal_id`.
Request Example¶
# Basic request with filters
curl --location --globoff "https://integrations.clopos.com/open-api/v2/receipts?page=1&sort[0]=created_at&sort[1]=-1&limit=50&date[0]=2026-01-19&date[1]=2026-01-19" \
-H "x-token: oauth_example_token"
# With products and modifiers
curl --location --globoff "https://integrations.clopos.com/open-api/v2/receipts?page=1&sort[0]=created_at&sort[1]=-1&limit=50&date[0]=2026-01-19&date[1]=2026-01-19&with[0]=receipt_products.product.unit&with[1]=receipt_products.product.station&with[2]=receipt_products.modificators.modificator_group" \
-H "x-token: oauth_example_token"
const headers = { 'x-token': 'oauth_example_token' };
// Basic request with filters
const params = new URLSearchParams({
'page': '1',
'sort[0]': 'created_at',
'sort[1]': '-1',
'limit': '50',
'date[0]': '2026-01-19',
'date[1]': '2026-01-19'
});
const response = await fetch(
`https://integrations.clopos.com/open-api/v2/receipts?${params}`,
{ headers }
);
const receipts = await response.json();
// With products and modifiers
const paramsWithProducts = new URLSearchParams({
'page': '1',
'sort[0]': 'created_at',
'sort[1]': '-1',
'limit': '50',
'date[0]': '2025-08-12',
'date[1]': '2025-08-18',
'with[0]': 'receipt_products.product.unit',
'with[1]': 'receipt_products.product.station',
'with[2]': 'receipt_products.modificators.modificator_group'
});
const responseWithProducts = await fetch(
`https://integrations.clopos.com/open-api/v2/receipts?${paramsWithProducts}`,
{ headers }
);
const receiptsWithProducts = await responseWithProducts.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/receipts"
headers = {
"x-token": "oauth_example_token",
}
# Basic request with filters
params = {
"page": 1,
"sort[0]": "created_at",
"sort[1]": -1,
"limit": 50,
"date[0]": "2026-01-19",
"date[1]": "2026-01-19"
}
response = requests.get(url, headers=headers, params=params)
receipts = response.json()
# With products and modifiers
params_with_products = {
"page": 1,
"sort[0]": "created_at",
"sort[1]": -1,
"limit": 50,
"date[0]": "2025-08-12",
"date[1]": "2025-08-18",
"with[0]": "receipt_products.product.unit",
"with[1]": "receipt_products.product.station",
"with[2]": "receipt_products.modificators.modificator_group"
}
response = requests.get(url, headers=headers, params=params_with_products)
receipts_with_products = response.json()
Response¶
200 OK — List of receipts¶
{
"success": true,
"data": [
{
"id": 1,
"venue_id": 1,
"cid": "96ab5d26-d6bb-4976-a6f8-9e8806ef6aa5",
"customer_id": null,
"sale_type_id": 2,
"source": "web",
"guests": 1,
"status": 2,
"order_status": "IN_PROGRESS",
"order_number": "006",
"lock": false,
"total": 33000,
"subtotal": 33000,
"discount_type": 0,
"discount_value": 0,
"discount_rate": 0,
"total_discount": 0,
"service_charge": 0,
"service_charge_value": 0,
"delivery_fee": 0,
"remaining": 0,
"i_tax": 0,
"e_tax": 0,
"total_tax": 0,
"payment_methods": [
{
"id": 1,
"name": "Cash",
"amount": 33000
}
],
"fiscal_id": null,
"loyalty_type": null,
"loyalty_value": null,
"address": null,
"description": null,
"created_at": "2026-01-19 14:51:33",
"updated_at": "2026-01-19 15:07:49",
"closed_at": "2026-01-19 15:07:49",
"shift_date": "2026-01-19"
}
],
"total": 1
}
400 Bad Request — Parameter error¶
{
"success": false,
"error": "invalid_parameter",
"message": "sort[1] must be 1 or -1"
}
401 Unauthorized — Missing header¶
{
"success": false,
"error": "unauthorized",
"message": "Missing authentication headers"
}
Field Reference¶
Receipt object¶
| Field | Type | Description |
|---|---|---|
id |
number | Unique receipt identifier. |
cid |
string | Client-generated UUID for the receipt. |
venue_id |
number | Venue (location) the receipt belongs to. |
customer_id |
number|null | Customer associated with the receipt. |
sale_type_id |
number | Sale type identifier (e.g., dine-in, delivery). |
source |
string | Origin of the receipt (e.g., "web", "pos"). |
guests |
number | Number of guests on the receipt. |
status |
number | Receipt status: 1 = open, 2 = closed. |
order_status |
string | Order workflow status. One of: NEW, SCHEDULED, IN_PROGRESS, READY, PICKED_UP, COMPLETED, CANCELLED. |
order_number |
string|null | External or display order number. |
lock |
boolean | Whether the receipt is locked from further changes. |
total |
number | Total amount collected. |
subtotal |
number | Subtotal before discounts, taxes, and fees. |
discount_type |
number | Discount type applied (0 = none). |
discount_value |
number | Discount amount or percentage value. |
discount_rate |
number | Effective discount rate. |
total_discount |
number | Total discount applied to the receipt. |
service_charge |
number | Service charge percentage. |
service_charge_value |
number | Calculated service charge amount. |
delivery_fee |
number | Delivery fee amount. |
remaining |
number | Outstanding balance (0 when fully paid). |
i_tax |
number | Inclusive tax amount. |
e_tax |
number | Exclusive tax amount. |
total_tax |
number | Total tax amount (inclusive + exclusive). |
payment_methods |
array | Payment breakdown. See Payment method. |
fiscal_id |
string|null | Fiscal receipt identifier for tax reporting. |
loyalty_type |
string|null | Loyalty program type applied. |
loyalty_value |
number|null | Loyalty discount or points value. |
address |
string|null | Delivery address. |
description |
string|null | Delivery or order notes. |
created_at |
string | Receipt creation time (YYYY-MM-DD HH |
updated_at |
string | Last update time (YYYY-MM-DD HH |
closed_at |
string|null | Receipt close time (YYYY-MM-DD HH |
shift_date |
string | Business day the receipt belongs to (YYYY-MM-DD). |
See Payment method for the payment_methods[] structure.
Notes¶
- Use the
date[0]anddate[1]filters to restrict receipts to a date range (inclusive, YYYY-MM-DD). - Sorting accepts multiple fields (
sort[0],sort[1], etc.); directions must be1(ascending) or-1(descending). - Pagination uses classic
pageandlimitsemantics; the defaultlimitis 50. - Combine
status,sale_type_id, and date filters via the OpenAPI explorer when you need more granular reporting. - The response also includes
time,timestamp,unix, andsortsfields for diagnostics and discovering sortable fields; these are omitted from examples for brevity.
Update Receipt (after close)¶
Source: https://developer.clopos.com/docs/api-reference/v2/receipts/patch-update-receipt
PATCH /v2/receipts/{id}
Update specific fields of an existing receipt
Purpose¶
Update specific fields of a receipt using the PATCH method. Only the provided fields will be updated; all other fields remain unchanged.
Important Notes:
- The PATCH method can update receipts even after they are closed (when
closed_atis not null). - Only limited fields can be updated via PATCH (see the field list below).
HTTP Request¶
PATCH https://integrations.clopos.com/open-api/v2/receipts/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
| Parameter | Type | Description |
|---|---|---|
id |
number | Unique identifier of the receipt to update. |
Request Body¶
Only the fields you want to update need to be included in the request body. Available updateable fields:
| Field | Type | Description |
|---|---|---|
order_status |
string | Order status. Valid values: "NEW", "SCHEDULED", "IN_PROGRESS", "READY", "PICKED_UP", "COMPLETED", "CANCELLED". |
order_number |
string | Order number identifier (e.g., "RPO-00001"). |
fiscal_id |
string | Fiscal receipt identifier. |
lock |
boolean | Lock status of the receipt (true or false). |
Request Example¶
curl --location --request PATCH 'https://integrations.clopos.com/open-api/v2/receipts/1' \
--header 'Content-Type: application/json' \
--header 'x-token: oauth_example_token' \
--data '{
"order_status": "NEW",
"order_number": "RPO-00001",
"fiscal_id": "Twrewr89fnscvj22",
"lock": false
}'
const receiptId = 1;
const response = await fetch(`https://integrations.clopos.com/open-api/v2/receipts/${receiptId}`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'x-token': 'oauth_example_token',
},
body: JSON.stringify({
order_status: 'NEW',
order_number: 'RPO-00001',
fiscal_id: 'Twrewr89fnscvj22',
lock: false
})
});
const receipt = await response.json();
import requests
receipt_id = 1
url = f"https://integrations.clopos.com/open-api/v2/receipts/{receipt_id}"
headers = {
"Content-Type": "application/json",
"x-token": "oauth_example_token",
}
payload = {
"order_status": "NEW",
"order_number": "RPO-00001",
"fiscal_id": "Twrewr89fnscvj22",
"lock": False
}
response = requests.patch(url, headers=headers, json=payload)
receipt = response.json()
Response¶
200 OK — Receipt Updated¶
The response returns the full receipt data with updated fields:
{
"success": true,
"data": {
"id": 1,
"venue_id": 1,
"cid": "96ab5d26-d6bb-4976-a6f8-9e8806ef6aa5",
"customer_id": null,
"sale_type_id": 2,
"source": "web",
"guests": 1,
"status": 2,
"order_status": "NEW",
"order_number": "RPO-00001",
"lock": false,
"total": 30000,
"subtotal": 30000,
"discount_type": 0,
"discount_value": 0,
"discount_rate": 0,
"total_discount": 0,
"service_charge": 0,
"service_charge_value": 0,
"delivery_fee": 0,
"remaining": 0,
"i_tax": 0,
"e_tax": 0,
"total_tax": 0,
"payment_methods": [
{
"id": 1,
"name": "Cash",
"amount": 30000
}
],
"fiscal_id": "Twrewr89fnscvj22",
"loyalty_type": null,
"loyalty_value": null,
"address": null,
"description": null,
"created_at": "2026-01-19 14:51:33",
"updated_at": "2026-01-20 12:43:07",
"closed_at": "2026-01-19 15:07:49",
"shift_date": "2026-01-19"
},
"message": "Operation completed successfully"
}
404 Not Found — Receipt Not Found¶
{
"success": false,
"error": "not_found",
"message": "Receipt not found"
}
400 Bad Request — Validation Error¶
{
"success": false,
"error": "validation_failed",
"message": "Invalid field values provided"
}
Field Reference¶
Updateable Fields¶
| Field | Type | Description |
|---|---|---|
order_status |
string | Current order status. Valid values: "NEW", "SCHEDULED", "IN_PROGRESS", "READY", "PICKED_UP", "COMPLETED", "CANCELLED". |
order_number |
string | External order number or identifier. |
fiscal_id |
string | Fiscal receipt identifier used for tax reporting. |
lock |
boolean | If true, locks the receipt to prevent further modifications. |
Notes¶
- Only the fields provided in the request body will be updated; all other fields remain unchanged.
- The response includes the complete receipt object with all integrator-relevant fields, not just the updated ones.
- Only the specified fields (
order_status,order_number,fiscal_id,lock) can be updated through this endpoint. - Other receipt fields are read-only and cannot be modified via this API.
- This method can update receipts even after they are closed (when
closed_atis not null). - The response also includes
time,timestamp, andunixfields for diagnostics; these are omitted from the example for brevity.
Sales¶
List Payment Methods¶
Source: https://developer.clopos.com/docs/api-reference/v2/sales/get-payment-methods
GET /v2/payment-methods
Retrieve a list of all configured payment methods.
This endpoint retrieves a list of all configured payment methods.
Payment methods represent tender types (e.g., cash, card, wallet). They are used when closing receipts and reconciling totals.
Note
The status object is a venue map. Its keys are venue_id strings and the
values indicate enablement at that venue: 1 = enabled, 0 = disabled.
For example, status["1"] = 1 means this payment method is enabled for
venue 1.
Used by
- Close Receipt: map each tender to
payment_methods[]
Response Example¶
{
"success": true,
"data": [
{
"id": 1,
"name": "Cash",
"status": {
"1": 1,
"2": 1,
"3": 1
},
"split": 1,
"position": 0,
"customer_required": 0,
"is_system": 0,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z",
"balance": {
"id": 1,
"system_type": "CASH",
"name": "Kassa",
"type": "CASH"
},
"service": null
},
{
"id": 2,
"name": "Card",
"status": {
"1": 1,
"2": 1,
"3": 1
},
"split": 1,
"position": 0,
"customer_required": 0,
"is_system": 0,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z",
"balance": {
"id": 2,
"system_type": "CARD",
"name": "Kart",
"type": "CARD"
},
"service": null
},
{
"id": 3,
"name": "Customer Balance",
"status": {
"1": 0,
"2": 1,
"3": 1
},
"split": 1,
"position": 0,
"customer_required": 1,
"is_system": 0,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z",
"balance": null,
"service": null
},
{
"id": 4,
"name": "Cashback",
"status": {
"1": 0,
"2": 0,
"3": 0
},
"split": 1,
"position": 0,
"customer_required": 1,
"is_system": 0,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z",
"balance": null,
"service": {
"name": "loyalty",
"check": [],
"payload": []
}
}
],
"total": 4
}
Field Reference¶
Payment Method Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique identifier for the payment method. |
name |
string | Display name of the payment method (e.g., "Cash", "Card"). |
status |
object | Map of venue_id (string) to 0/1 indicating whether this method is enabled at each venue. |
split |
integer | 1 if this payment method can be used for split payments, 0 otherwise. |
position |
integer | Display order position. |
customer_required |
integer | 1 if a customer must be attached to the transaction, 0 otherwise. |
is_system |
integer | 1 if this is a system-default payment method, 0 otherwise. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
balance |
object (nullable) | Associated balance account, or null if none. See Balance object. |
service |
object (nullable) | External service integrated with this payment method (e.g., loyalty), or null. |
Balance Object (nested in balance)¶
| Field | Type | Description |
|---|---|---|
id |
integer | Balance account identifier. |
system_type |
string | System type of the balance (e.g., CASH, CARD). |
name |
string | Display name of the balance account. |
type |
string | Balance type (e.g., CASH, CARD). |
List Sale Types¶
Source: https://developer.clopos.com/docs/api-reference/v2/sales/get-sale-types
GET /v2/sale-types
Retrieve a list of all available sale types.
This endpoint retrieves a list of all available sale types, such as In-store, Delivery, and Takeaway.
Sale types represent the fulfillment channel for an order (e.g., dine-in, delivery, takeaway) and may determine service charge behavior.
Note
The status object is a venue map. Its keys are venue_id strings and the
values indicate enablement at that venue: 1 = enabled, 0 = disabled.
For example, status["1"] = 1 means this sale type is enabled for
venue 1.
Used by
- Create Order: provide
payload.service.sale_type_idandpayload.service.venue_id
Response Example¶
{
"success": true,
"data": [
{
"id": 1,
"name": "Yerinde",
"system_type": "IN",
"channel": "IN",
"status": {
"1": 1,
"2": 1,
"3": 1
},
"service_charge_rate": null,
"position": 0,
"media": [],
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z"
},
{
"id": 2,
"name": "Catdirilma",
"system_type": "DELIVERY",
"channel": "DELIVERY",
"status": {
"1": 1,
"2": 1,
"3": 1
},
"service_charge_rate": null,
"position": 0,
"media": [
{
"urls": {
"original": "https://cdn.clopos.com/_clopos/delivery.png",
"large": "https://cdn.clopos.com/_clopos/delivery.png"
}
}
],
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z"
},
{
"id": 3,
"name": "Takeaway",
"system_type": "TAKEAWAY",
"channel": "TAKEAWAY",
"status": {
"1": 1,
"2": 1,
"3": 1
},
"service_charge_rate": null,
"position": 0,
"media": [
{
"urls": {
"original": "https://cdn.clopos.com/_clopos/takeaway.png",
"large": "https://cdn.clopos.com/_clopos/takeaway.png"
}
}
],
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T10:22:12.000000Z"
}
],
"total": 3
}
Field Reference¶
Sale Type Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique identifier for the sale type. |
name |
string | Display name of the sale type (e.g., "In-store", "Delivery"). |
system_type |
string | System-defined type identifier: IN, DELIVERY, TAKEAWAY. |
channel |
string | Sales channel this type belongs to. |
status |
object | Map of venue_id (string) to 0/1 indicating whether this sale type is enabled at each venue. |
service_charge_rate |
number (nullable) | Service charge rate associated with this sale type, or null if none. |
position |
integer | Display order position. |
media |
array | Image attachments. See Media object. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Stations¶
Get Station by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/stations/get-station-by-id
GET /v2/stations/{id}
Retrieve a specific preparation or service station
Purpose¶
Verifies the status and printing capabilities of a single station, such as a kitchen, bar, or custom station.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stations/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Request Example¶
curl -X GET "https://integrations.clopos.com/open-api/v2/stations/1" \
-H "x-token: oauth_example_token" \
const response = await fetch('https://integrations.clopos.com/open-api/v2/stations/1', {
headers: {
'x-token': 'oauth_example_token',
}
});
const station = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/stations/1"
headers = {
"x-token": "oauth_example_token",
}
response = requests.get(url, headers=headers)
station = response.json()
Response¶
200 OK — Station found¶
{
"success": true,
"data": {
"id": 1,
"name": "Kitchen",
"status": 1,
"type": 1,
"printable": 1,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T14:08:49.000000Z"
}
}
404 Not Found — Station does not exist¶
{
"success": false,
"error": "resource_not_found",
"message": "Station not found"
}
Field Reference¶
Station object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Station identifier. |
name |
string | Station name. |
status |
integer | 1 = active, 0 = inactive. |
type |
integer | Station type. 1 = kitchen, 0 = other. |
printable |
integer | 1 if the station can print tickets, 0 otherwise. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- The station ID is used for product and printer mapping on the POS side; verify the current restaurant flow before making changes.
- Stations with
printable=0are designed only for screen notifications or digital preparation processes. - If a station is not found, it returns
404; selecting a fallback station on the client side or showing a remapping screen to the user provides a good experience.
List Stations¶
Source: https://developer.clopos.com/docs/api-reference/v2/stations/get-stations
GET /v2/stations
Retrieve all preparation and service stations
Purpose¶
Allows you to check printer, reminder, and status information by retrieving all stations in your POS and kitchen flows in a single call.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/stations
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Query Parameters¶
-
` (integer): Filter by station status (1= active,0` = inactive). -
`` (boolean): Filter stations that can redirect to a printer.
-
`` (integer): Page number for pagination.
-
`` (integer): Number of stations to return (1-200).
Request Example¶
curl -X GET "https://integrations.clopos.com/open-api/v2/stations?status=1" \
-H "x-token: oauth_example_token" \
const response = await fetch('https://integrations.clopos.com/open-api/v2/stations?status=1', {
headers: {
'x-token': 'oauth_example_token',
}
});
const stations = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/stations"
headers = {
"x-token": "oauth_example_token",
}
params = {
"status": 1,
"limit": 50
}
response = requests.get(url, headers=headers, params=params)
stations = response.json()
Response¶
200 OK — List of stations¶
{
"success": true,
"data": [
{
"id": 1,
"name": "Kitchen",
"status": 1,
"type": 1,
"printable": 1,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T14:08:49.000000Z"
},
{
"id": 2,
"name": "Bar",
"status": 1,
"type": 0,
"printable": 1,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-01-13T14:08:49.000000Z"
},
{
"id": 3,
"name": "Tandir",
"status": 1,
"type": 0,
"printable": 0,
"created_at": "2026-01-13T14:36:51.000000Z",
"updated_at": "2026-01-13T14:36:51.000000Z"
}
],
"total": 3
}
401 Unauthorized — Authorization missing¶
{
"success": false,
"error": "unauthorized",
"message": "Missing authentication headers"
}
Field Reference¶
Station object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Station identifier. |
name |
string | Station name. |
status |
integer | 1 = active, 0 = inactive. |
type |
integer | Station type. 1 = kitchen, 0 = other. |
printable |
integer | 1 if the station can print tickets, 0 otherwise. |
created_at |
string | Creation timestamp (ISO 8601). |
updated_at |
string | Last update timestamp (ISO 8601). |
Notes¶
- Stations with
printable=0are designed only for screen notifications or digital preparation processes. - The active/inactive status of stations affects product routing on the POS side; inactive stations are not assigned to new orders.
- Adjust pagination parameters (
page,limit) for performance in large restaurant chains; it is generally not necessary for a single branch.
Users¶
Get User by ID¶
Source: https://developer.clopos.com/docs/api-reference/v2/users/get-user-by-id
GET /v2/users/{id}
Retrieve a specific user by their unique identifier.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/users/{id}
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Path Parameters¶
- `` (integer): The unique identifier of the user.
Request Example¶
curl --location 'https://integrations.clopos.com/open-api/v2/users/1' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
const response = await fetch('https://integrations.clopos.com/open-api/v2/users/1', {
headers: {
'Content-Type': 'application/json',
Accept: 'application/json'
}
});
import requests
url = 'https://integrations.clopos.com/open-api/v2/users/1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.get(url, headers=headers)
print(response.json())
Response¶
{
"success": true,
"data": {
"id": 1,
"email": "vitrin@clopos.com",
"username": "Clopos Test",
"first_name": "Clopos",
"last_name": "Test",
"mobile_number": null,
"owner": 1,
"status": true,
"created_at": "2026-01-13T14:08:48.000000Z",
"updated_at": "2026-02-20T15:07:02.000000Z"
}
}
Field Reference¶
User Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique user identifier. |
email |
string (nullable) | Email address associated with the user. |
username |
string | Display name shown in the POS. |
first_name |
string (nullable) | First name of the user. |
last_name |
string (nullable) | Last name of the user. |
mobile_number |
string (nullable) | Mobile phone number. |
owner |
integer | 1 if the user owns the brand, otherwise 0. |
status |
boolean | Indicates whether the user account is active. |
created_at |
string | Timestamp when the user was created (ISO 8601). |
updated_at |
string | Timestamp when the user was last updated (ISO 8601). |
List Users¶
Source: https://developer.clopos.com/docs/api-reference/v2/users/get-users
GET /v2/users
Retrieve a list of active Clopos users
Use this endpoint to inspect staff accounts, roles, and access levels across your venues.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/users
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Request Example¶
curl --location 'https://integrations.clopos.com/open-api/v2/users' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
const response = await fetch('https://integrations.clopos.com/open-api/v2/users', {
headers: {
'Content-Type': 'application/json',
Accept: 'application/json'
}
});
import requests
url = 'https://integrations.clopos.com/open-api/v2/users'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.get(url, headers=headers)
print(response.json())
Response¶
{
"success": true,
"data": [
{
"id": 1,
"email": "vitrin@clopos.com",
"username": "Clopos Test",
"first_name": "Clopos",
"last_name": "Test",
"mobile_number": null,
"owner": 1,
"status": true,
"created_at": "2026-01-13T14:08:48.000000Z",
"updated_at": "2026-02-20T15:07:02.000000Z"
},
{
"id": 3,
"email": null,
"username": "Cashier",
"first_name": null,
"last_name": null,
"mobile_number": null,
"owner": 0,
"status": true,
"created_at": "2026-01-13T14:08:49.000000Z",
"updated_at": "2026-03-12T16:32:36.000000Z"
}
],
"total": 3
}
Field Reference¶
User Object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Unique user identifier. |
email |
string (nullable) | Email address associated with the user. |
username |
string | Display name shown in the POS. |
first_name |
string (nullable) | First name of the user. |
last_name |
string (nullable) | Last name of the user. |
mobile_number |
string (nullable) | Mobile phone number. |
owner |
integer | 1 if the user owns the brand, otherwise 0. |
status |
boolean | Indicates whether the user account is active. |
created_at |
string | Timestamp when the user was created (ISO 8601). |
updated_at |
string | Timestamp when the user was last updated (ISO 8601). |
Venues¶
List Venues¶
Source: https://developer.clopos.com/docs/api-reference/v2/venues/get-venues
GET /v2/venues
Retrieve a list of all venues (locations).
Purpose¶
Allows you to quickly retrieve active branches connected to your brand to initiate location-based operations.
HTTP Request¶
GET https://integrations.clopos.com/open-api/v2/venues
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Request Example¶
curl -X GET "https://integrations.clopos.com/open-api/v2/venues" \
-H "x-token: oauth_example_token" \
const response = await fetch('https://integrations.clopos.com/open-api/v2/venues', {
headers: {
'x-token': 'oauth_example_token',
}
});
const venues = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/venues"
headers = {
"x-token": "oauth_example_token",
}
response = requests.get(url, headers=headers)
venues = response.json()
Response¶
200 OK — List of branches¶
{
"success": true,
"data": [
{
"id": 1,
"name": "Main",
"is_main": 1,
"media": []
},
{
"id": 2,
"name": "Baku",
"is_main": 0,
"media": []
},
{
"id": 3,
"name": "Masally",
"is_main": 0,
"media": []
}
]
}
401 Unauthorized — Missing header¶
{
"success": false,
"error": "unauthorized",
"message": "Missing authentication headers"
}
Field Reference¶
Branch object¶
| Field | Type | Description |
|---|---|---|
id |
integer | Branch ID. |
name |
string | Branch name. |
is_main |
integer | 1 if this is the primary branch, 0 otherwise. |
media |
array | Image attachments. See Media object. |
Notes¶
- This endpoint returns all branches you have access to; use client-side logic to filter the result set.
- Use
is_mainto identify the primary branch in multi-location setups. - Although the response size is small, client-side caching is recommended for large brands.
Waiter Call¶
Waiter Call¶
Source: https://developer.clopos.com/docs/api-reference/v2/waiter-call/waiter-call
POST /v2/waiter-call
Trigger a waiter call or a payment request for a table
Purpose¶
Allows integrators to notify restaurant staff at a specific table — either to request a waiter or to initiate a payment with a chosen payment method.
HTTP Request¶
POST https://integrations.clopos.com/open-api/v2/waiter-call
Warning
This endpoint requires authentication. Include your JWT in the x-token header. See Authentication for how to obtain a token and Errors for error responses.
Module Requirement¶
Warning
This endpoint requires the restaurant_emenu module to be enabled for your brand. Requests made without this module active will return the standard "module not available" error.
Request Body¶
-
`` (integer): The ID of the table for which the call is being triggered. Must correspond to an existing table in the venue.
-
`` (string):
The type of call to trigger. Accepted values:
WAITER— notify staff that a waiter is needed at the tablePAY— request payment for the table
-
`` (integer):
The payment method ID to use when
typeisPAY. Must be the default CASH or CARD payment method configured for the venue.
Note
payment_method is required when type is PAY and must not be sent for type WAITER.
Request Example¶
curl --location 'https://integrations.clopos.com/open-api/v2/waiter-call' \
-H 'x-token: oauth_example_token' \
-H 'Content-Type: application/json' \
-d '{
"table_id": 5,
"type": "WAITER"
}'
curl --location 'https://integrations.clopos.com/open-api/v2/waiter-call' \
-H 'x-token: oauth_example_token' \
-H 'Content-Type: application/json' \
-d '{
"table_id": 5,
"type": "PAY",
"payment_method": 1
}'
// WAITER call
const response = await fetch('https://integrations.clopos.com/open-api/v2/waiter-call', {
method: 'POST',
headers: {
'x-token': 'oauth_example_token',
'Content-Type': 'application/json'
},
body: JSON.stringify({
table_id: 5,
type: 'WAITER'
})
});
// PAY call
const payResponse = await fetch('https://integrations.clopos.com/open-api/v2/waiter-call', {
method: 'POST',
headers: {
'x-token': 'oauth_example_token',
'Content-Type': 'application/json'
},
body: JSON.stringify({
table_id: 5,
type: 'PAY',
payment_method: 1
})
});
const data = await response.json();
import requests
url = "https://integrations.clopos.com/open-api/v2/waiter-call"
headers = {
"x-token": "oauth_example_token",
"Content-Type": "application/json"
}
# WAITER call
payload = {
"table_id": 5,
"type": "WAITER"
}
# PAY call
# payload = {
# "table_id": 5,
# "type": "PAY",
# "payment_method": 1
# }
response = requests.post(url, headers=headers, json=payload)
result = response.json()
Response¶
200 OK — Call triggered successfully¶
{
"success": true
}
400 Bad Request — Validation or creation failure¶
Returned when the request body is invalid (e.g. unknown table_id, unsupported type, missing payment_method for a PAY call, or invalid payment method ID).
{
"success": false
}