API reference
Versioned REST API for TechTur POS. Money is a decimal string in ZAR unless stated. Every business-scoped route lives under `/api/v1/businesses/{businessId}`. Authenticate with an OAuth 2.0 access token (`Authorization: Bearer …`); dashboard routes also accept the browser session cookie. See https://pos.techtursolutions.com/developers.
199 operations · Download openapi.json (OpenAPI 3.1.0) · import it into Postman, Insomnia or any code generator.
Health
get/api/v1/healthLiveness
get/api/v1/health/readyReadiness: database and worker heartbeat
Auth
post/api/v1/auth/registerCreate an account (email verification required)
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"password": {
"type": "string",
"minLength": 10,
"maxLength": 200
}
},
"required": [
"name",
"email",
"password"
]
}post/api/v1/auth/verify-emailConfirm an email address and sign in
{
"type": "object",
"properties": {
"token": {
"type": "string",
"minLength": 10
}
},
"required": [
"token"
]
}post/api/v1/auth/loginSign in with email and password
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"password": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"email",
"password"
]
}post/api/v1/auth/resend-verification
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"required": [
"email"
]
}post/api/v1/auth/logout
get/api/v1/auth/meThe signed-in user, their businesses and MFA state
post/api/v1/auth/switch-business
{
"type": "object",
"properties": {
"businessId": {
"type": "string"
}
},
"required": [
"businessId"
]
}post/api/v1/auth/password/forgot
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"required": [
"email"
]
}post/api/v1/auth/password/reset
{
"type": "object",
"properties": {
"token": {
"type": "string",
"minLength": 10
},
"password": {
"type": "string",
"minLength": 10,
"maxLength": 200
}
},
"required": [
"token",
"password"
]
}post/api/v1/auth/mfa/setupStart TOTP enrolment
post/api/v1/auth/mfa/enable
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 6,
"maxLength": 8
}
},
"required": [
"code"
]
}post/api/v1/auth/mfa/verify
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 6,
"maxLength": 8
}
},
"required": [
"code"
]
}get/api/v1/auth/sessions
post/api/v1/auth/sessions/revoke-others
get/api/v1/auth/providersSign-in methods available
get/api/v1/auth/google/startBegin Google sign-in (browser redirect)
| Parameter | In | Required | Schema |
|---|---|---|---|
intent | query | no | string (login | link) |
next | query | no | string |
get/api/v1/auth/google/callback
| Parameter | In | Required | Schema |
|---|---|---|---|
code | query | no | string |
state | query | no | string |
error | query | no | string |
post/api/v1/auth/google/unlink
Staff
get/api/v1/invitations/{token}
| Parameter | In | Required | Schema |
|---|---|---|---|
token | path | yes | string |
post/api/v1/invitations/accept
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"password": {
"type": "string",
"minLength": 10,
"maxLength": 200
}
},
"required": [
"token"
]
}get/api/v1/businesses/{businessId}/staff
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/invitations
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"roleId": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"required": [
"email",
"roleId"
]
}delete/api/v1/businesses/{businessId}/invitations/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
patch/api/v1/businesses/{businessId}/staff/{id}Change a member's role or suspend them
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"roleId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"SUSPENDED"
]
},
"pin": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4,6}$"
},
{
"type": "null"
}
]
}
}
}get/api/v1/businesses/{businessId}/roles
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/rolesCreate a custom role
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": {
"type": "string",
"maxLength": 200
},
"permissions": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"name",
"permissions"
]
}patch/api/v1/businesses/{businessId}/roles/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": {
"type": "string",
"maxLength": 200
},
"permissions": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
}
}
}Businesses
post/api/v1/businessesCreate a business (you become its owner)
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"type": {
"type": "string",
"enum": [
"RETAIL",
"FOOD",
"SERVICES",
"MIXED"
]
},
"vatRegistered": {
"default": false,
"type": "boolean"
},
"vatNumber": {
"type": "string",
"pattern": "^4\\d{9}$"
},
"pricesIncludeTax": {
"default": true,
"type": "boolean"
},
"city": {
"type": "string",
"maxLength": 80
}
},
"required": [
"name",
"type"
]
}get/api/v1/businesses/{businessId}Business profile
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
patch/api/v1/businesses/{businessId}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"legalName": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"type": {
"type": "string",
"enum": [
"RETAIL",
"FOOD",
"SERVICES",
"MIXED"
]
},
"registrationNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"vatRegistered": {
"type": "boolean"
},
"vatNumber": {
"anyOf": [
{
"type": "string",
"pattern": "^4\\d{9}$"
},
{
"type": "null"
}
]
},
"pricesIncludeTax": {
"type": "boolean"
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"addressLine1": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"addressLine2": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"province": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"postalCode": {
"anyOf": [
{
"type": "string",
"maxLength": 10
},
{
"type": "null"
}
]
},
"receiptHeader": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
]
},
"receiptFooter": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
]
},
"logoUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"fiscalYearStartMonth": {
"type": "integer",
"minimum": 1,
"maximum": 12
}
}
}post/api/v1/businesses/{businessId}/onboardingRecord onboarding progress
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"step": {
"type": "string",
"enum": [
"profile",
"tax",
"store",
"register",
"staff",
"products",
"payments",
"hardware",
"receipts",
"stock",
"float",
"review",
"done"
]
},
"completed": {
"type": "array",
"items": {
"type": "string",
"enum": [
"profile",
"tax",
"store",
"register",
"staff",
"products",
"payments",
"hardware",
"receipts",
"stock",
"float",
"review",
"done"
]
}
}
},
"required": [
"step"
]
}get/api/v1/businesses/{businessId}/readiness
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
get/api/v1/plansPublic pricing plans
Locations
get/api/v1/businesses/{businessId}/locations
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/locations
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"type": {
"default": "STORE",
"type": "string",
"enum": [
"STORE",
"WAREHOUSE"
]
},
"addressLine1": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"isActive": {
"default": true,
"type": "boolean"
}
},
"required": [
"name"
]
}patch/api/v1/businesses/{businessId}/locations/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"type": {
"default": "STORE",
"type": "string",
"enum": [
"STORE",
"WAREHOUSE"
]
},
"addressLine1": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"isActive": {
"default": true,
"type": "boolean"
}
}
}Registers
get/api/v1/businesses/{businessId}/registers
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/registers
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"mode": {
"default": "RETAIL",
"type": "string",
"enum": [
"RETAIL",
"FOOD"
]
},
"isActive": {
"default": true,
"type": "boolean"
}
},
"required": [
"name",
"locationId"
]
}patch/api/v1/businesses/{businessId}/registers/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"mode": {
"default": "RETAIL",
"type": "string",
"enum": [
"RETAIL",
"FOOD"
]
},
"isActive": {
"default": true,
"type": "boolean"
}
}
}get/api/v1/businesses/{businessId}/registers/{id}/catalogueOffline catalogue snapshot for a register
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
Audit
get/api/v1/businesses/{businessId}/audit
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
action | query | no | string |
entityId | query | no | string |
businessId | path | yes | string |
Catalogue
get/api/v1/businesses/{businessId}/categories
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/categories
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"parentId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "null"
}
]
},
"sortOrder": {
"default": 0,
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"name"
]
}patch/api/v1/businesses/{businessId}/categories/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"parentId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "null"
}
]
},
"sortOrder": {
"default": 0,
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"archived": {
"type": "boolean"
}
}
}get/api/v1/businesses/{businessId}/productsList products with variants and barcodes
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
q | query | no | string |
categoryId | query | no | string |
includeArchived | query | no | boolean |
updatedSince | query | no | |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/productsCreate a product
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"anyOf": [
{
"type": "string",
"maxLength": 5000
},
{
"type": "null"
}
]
},
"brand": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
]
},
"categoryId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "null"
}
]
},
"type": {
"default": "STANDARD",
"type": "string",
"enum": [
"STANDARD",
"SERVICE",
"NON_STOCK",
"BUNDLE",
"COMPOSITE"
]
},
"taxClass": {
"default": "STANDARD",
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"unit": {
"default": "each",
"type": "string",
"maxLength": 20
},
"trackStock": {
"default": true,
"type": "boolean"
},
"isActive": {
"default": true,
"type": "boolean"
},
"imageUrl": {
"anyOf": [
{
"type": "string",
"maxLength": 1000,
"format": "uri"
},
{
"type": "null"
}
]
},
"prepNotes": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
]
},
"kitchenStation": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"variants": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"name": {
"default": "Default",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"sku": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
]
},
"attributes": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"price": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"costPrice": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
},
"wholesalePrice": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
},
"barcodes": {
"default": [],
"type": "array",
"items": {
"type": "string",
"minLength": 3,
"maxLength": 64
}
},
"isDefault": {
"type": "boolean"
},
"components": {
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"variantId",
"quantity"
]
}
},
"reorderLevel": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"price"
]
}
},
"modifierGroups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"minSelect": {
"default": 0,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"maxSelect": {
"default": 1,
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"modifiers": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"priceDelta": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"consumesVariantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"consumesQuantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"isDefault": {
"type": "boolean"
}
},
"required": [
"name"
]
}
}
},
"required": [
"name",
"modifiers"
]
}
}
},
"required": [
"name",
"variants"
]
}get/api/v1/businesses/{businessId}/products/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
put/api/v1/businesses/{businessId}/products/{id}Replace a product and its variants
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"anyOf": [
{
"type": "string",
"maxLength": 5000
},
{
"type": "null"
}
]
},
"brand": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
]
},
"categoryId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "null"
}
]
},
"type": {
"default": "STANDARD",
"type": "string",
"enum": [
"STANDARD",
"SERVICE",
"NON_STOCK",
"BUNDLE",
"COMPOSITE"
]
},
"taxClass": {
"default": "STANDARD",
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"unit": {
"default": "each",
"type": "string",
"maxLength": 20
},
"trackStock": {
"default": true,
"type": "boolean"
},
"isActive": {
"default": true,
"type": "boolean"
},
"imageUrl": {
"anyOf": [
{
"type": "string",
"maxLength": 1000,
"format": "uri"
},
{
"type": "null"
}
]
},
"prepNotes": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
]
},
"kitchenStation": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"variants": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"name": {
"default": "Default",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"sku": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
]
},
"attributes": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"price": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"costPrice": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
},
"wholesalePrice": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
},
"barcodes": {
"default": [],
"type": "array",
"items": {
"type": "string",
"minLength": 3,
"maxLength": 64
}
},
"isDefault": {
"type": "boolean"
},
"components": {
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"variantId",
"quantity"
]
}
},
"reorderLevel": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"price"
]
}
},
"modifierGroups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"minSelect": {
"default": 0,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"maxSelect": {
"default": 1,
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"modifiers": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"priceDelta": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"consumesVariantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"consumesQuantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"isDefault": {
"type": "boolean"
}
},
"required": [
"name"
]
}
}
},
"required": [
"name",
"modifiers"
]
}
}
},
"required": [
"name",
"variants"
]
}delete/api/v1/businesses/{businessId}/products/{id}Archive a product (history is kept)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
patch/api/v1/businesses/{businessId}/products/{id}/availabilityMark sold out / available (food mode)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"soldOut": {
"type": "boolean"
},
"isActive": {
"type": "boolean"
}
}
}get/api/v1/businesses/{businessId}/barcodes/{code}Look up a scanned barcode or SKU
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
code | path | yes | string |
get/api/v1/businesses/{businessId}/promotions
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/promotions
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"code": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"minSpend": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
},
"startsAt": {
"anyOf": [
{},
{
"type": "null"
}
]
},
"endsAt": {
"anyOf": [
{},
{
"type": "null"
}
]
},
"maxUses": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"isActive": {
"default": true,
"type": "boolean"
}
},
"required": [
"name",
"kind",
"value"
]
}patch/api/v1/businesses/{businessId}/promotions/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"code": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"minSpend": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
},
"startsAt": {
"anyOf": [
{},
{
"type": "null"
}
]
},
"endsAt": {
"anyOf": [
{},
{
"type": "null"
}
]
},
"maxUses": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"isActive": {
"default": true,
"type": "boolean"
}
}
}Integrations
put/api/v1/businesses/{businessId}/sync/productsUpsert products from a connected platform (by external ID)
Idempotent bulk upsert. External IDs are mapped to POS IDs; unchanged items are skipped; fields POS owns are never overwritten and differing values are recorded as conflicts. Requires an application token with products:write.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"products": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"anyOf": [
{
"type": "string",
"maxLength": 5000
},
{
"type": "null"
}
]
},
"category": {
"anyOf": [
{
"type": "object",
"properties": {
"externalId": {
"type": "string",
"maxLength": 128
},
"name": {
"type": "string",
"maxLength": 120
}
},
"required": [
"externalId",
"name"
]
},
{
"type": "null"
}
]
},
"imageUrl": {
"anyOf": [
{
"type": "string",
"maxLength": 1000,
"format": "uri"
},
{
"type": "null"
}
]
},
"taxClass": {
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"type": {
"type": "string",
"enum": [
"STANDARD",
"SERVICE",
"NON_STOCK"
]
},
"trackStock": {
"type": "boolean"
},
"isActive": {
"default": true,
"type": "boolean"
},
"variants": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"name": {
"default": "Default",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"sku": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
]
},
"attributes": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"price": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"barcodes": {
"default": [],
"type": "array",
"items": {
"type": "string",
"minLength": 3,
"maxLength": 64
}
}
},
"required": [
"externalId",
"price"
]
}
},
"modifierGroups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"minSelect": {
"default": 0,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"maxSelect": {
"default": 1,
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"modifiers": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"priceDelta": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"consumesVariantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"consumesQuantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"isDefault": {
"type": "boolean"
}
},
"required": [
"name"
]
}
}
},
"required": [
"name",
"modifiers"
]
}
}
},
"required": [
"externalId",
"name",
"variants"
]
}
}
},
"required": [
"products"
]
}get/api/v1/businesses/{businessId}/mappingsExternal ID mappings for the calling application
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
entityType | query | no | string |
externalId | query | no | string |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/connectionsApplications this business has connected
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
delete/api/v1/businesses/{businessId}/connections/{id}Disconnect an application (revokes its tokens for this business)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
post/api/v1/businesses/{businessId}/sync-conflicts/{id}/resolve
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"resolution": {
"type": "string",
"enum": [
"KEEP_LOCAL",
"ACCEPT_REMOTE"
]
}
},
"required": [
"resolution"
]
}get/api/v1/businesses/{businessId}/api-keys
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/api-keysCreate a business API key (shown once)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 60
},
"scopes": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"expiresInDays": {
"type": "integer",
"minimum": 1,
"maximum": 730
}
},
"required": [
"name",
"scopes"
]
}delete/api/v1/businesses/{businessId}/api-keys/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
get/api/v1/businesses/{businessId}/webhooks
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/webhooks
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 500,
"format": "uri"
},
"events": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"maxLength": 200
}
},
"required": [
"url",
"events"
]
}delete/api/v1/businesses/{businessId}/webhooks/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
Inventory
get/api/v1/businesses/{businessId}/stockStock levels (on hand, reserved, available)
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
locationId | query | no | string |
variantId | query | no | string |
lowOnly | query | no | boolean |
q | query | no | string |
businessId | path | yes | string |
patch/api/v1/businesses/{businessId}/stock/{id}Set reorder level and quantity
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"reorderLevel": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
},
"reorderQty": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
{
"type": "null"
}
]
}
}
}post/api/v1/businesses/{businessId}/stock/adjustmentsAdjust stock: opening stock, corrections, damage
Positive quantities add stock (OPENING requires unitCost). The value change posts to the ledger: opening stock against opening balance equity, corrections and damage against stock adjustments.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"type": {
"type": "string",
"enum": [
"OPENING",
"ADJUSTMENT",
"DAMAGE"
]
},
"note": {
"type": "string",
"maxLength": 300
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitCost": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"lotNumber": {
"type": "string",
"maxLength": 60
},
"expiryDate": {},
"serialNumber": {
"type": "string",
"maxLength": 80
}
},
"required": [
"variantId",
"quantity"
]
}
}
},
"required": [
"locationId",
"type",
"lines"
]
}get/api/v1/businesses/{businessId}/stock/movementsThe stock ledger
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
variantId | query | no | string |
locationId | query | no | string |
type | query | no | string |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/stock/transfersMove stock between locations at cost
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"fromLocationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"toLocationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"note": {
"type": "string",
"maxLength": 300
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"variantId",
"quantity"
]
}
}
},
"required": [
"fromLocationId",
"toLocationId",
"lines"
]
}get/api/v1/businesses/{businessId}/stock/counts
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/stock/countsStart a full or cycle count (snapshots expected quantities)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"variantIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"categoryId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"locationId"
]
}get/api/v1/businesses/{businessId}/stock/counts/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
patch/api/v1/businesses/{businessId}/stock/counts/{id}Record counted quantities
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"counts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"counted": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"variantId",
"counted"
]
}
}
},
"required": [
"counts"
]
}post/api/v1/businesses/{businessId}/stock/counts/{id}/completeFinalise a count: post variances as adjustments
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
Purchasing
get/api/v1/businesses/{businessId}/suppliers
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
q | query | no | string |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/suppliers
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"contactName": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"vatNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
]
},
"addressLine1": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"paymentTermsDays": {
"default": 30,
"type": "integer",
"minimum": 0,
"maximum": 365
},
"notes": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
}
},
"required": [
"name"
]
}get/api/v1/businesses/{businessId}/suppliers/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
patch/api/v1/businesses/{businessId}/suppliers/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"contactName": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"vatNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
]
},
"addressLine1": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"paymentTermsDays": {
"default": 30,
"type": "integer",
"minimum": 0,
"maximum": 365
},
"notes": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"archived": {
"type": "boolean"
}
}
}get/api/v1/businesses/{businessId}/purchase-orders
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
status | query | no | string |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/purchase-orders
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"supplierId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"expectedAt": {},
"notes": {
"type": "string",
"maxLength": 1000
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitCost": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"taxClass": {
"default": "STANDARD",
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
}
},
"required": [
"variantId",
"quantity",
"unitCost"
]
}
}
},
"required": [
"supplierId",
"locationId",
"lines"
]
}get/api/v1/businesses/{businessId}/purchase-orders/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
post/api/v1/businesses/{businessId}/purchase-orders/{id}/status
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"SENT",
"CANCELLED"
]
}
},
"required": [
"status"
]
}post/api/v1/businesses/{businessId}/purchase-orders/{id}/receiveReceive goods (full or partial)
Adds stock at the ordered cost and posts Dr Inventory / Cr Goods received not invoiced.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"lines": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"lineId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitCost": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"lotNumber": {
"type": "string",
"maxLength": 60
},
"expiryDate": {}
},
"required": [
"lineId",
"quantity"
]
}
}
},
"required": [
"lines"
]
}post/api/v1/businesses/{businessId}/purchase-orders/{id}/returnReturn received goods to the supplier
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"lines": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"lineId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"lineId",
"quantity"
]
}
}
},
"required": [
"reason",
"lines"
]
}get/api/v1/businesses/{businessId}/bills
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
status | query | no | string |
supplierId | query | no | string |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/billsCapture a supplier invoice
Against a purchase order the net clears goods-received-not-invoiced; otherwise give an expense account. VAT is claimable input tax only when the business is VAT registered.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"supplierId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"purchaseOrderId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"reference": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"issueDate": {},
"dueDate": {},
"netAmount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"taxAmount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"expenseAccountId": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"required": [
"supplierId",
"reference",
"issueDate",
"netAmount"
]
}post/api/v1/businesses/{businessId}/bills/{id}/paymentsPay a supplier invoice
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"paidFrom": {
"default": "BANK",
"type": "string",
"enum": [
"BANK",
"CASH"
]
},
"date": {},
"reference": {
"type": "string",
"maxLength": 60
}
},
"required": [
"amount"
]
}Customers
get/api/v1/businesses/{businessId}/customers
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
q | query | no | string |
group | query | no | string |
withBalance | query | no | boolean |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/customers
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"vatNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
]
},
"addressLine1": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"marketingConsent": {
"default": false,
"type": "boolean"
}
},
"required": [
"name"
]
}get/api/v1/businesses/{businessId}/customers/{id}Customer profile with purchase history
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
patch/api/v1/businesses/{businessId}/customers/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"vatNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
]
},
"addressLine1": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"marketingConsent": {
"default": false,
"type": "boolean"
},
"archived": {
"type": "boolean"
}
}
}post/api/v1/businesses/{businessId}/customers/{id}/paymentsReceive a payment against a customer's account balance
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"method": {
"type": "string",
"enum": [
"CASH",
"CARD",
"EFT"
]
},
"reference": {
"type": "string",
"maxLength": 60
}
},
"required": [
"amount",
"method"
]
}get/api/v1/businesses/{businessId}/customers/{id}/statementAccount statement
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | no | |
to | query | no | |
businessId | path | yes | string |
id | path | yes | string |
Sales
post/api/v1/businesses/{businessId}/sales/pricePrice a basket without saving it
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"customerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"description": {
"type": "string",
"maxLength": 200
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitPrice": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"taxClass": {
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"modifierIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"quantity"
]
}
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"promotionCode": {
"type": "string",
"maxLength": 40
},
"note": {
"type": "string",
"maxLength": 500
},
"clientCreatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
}
},
"required": [
"locationId",
"lines"
]
}post/api/v1/businesses/{businessId}/salesRing up a sale: complete, park, or save as a quotation
Idempotent with `idempotencyKey` (or the Idempotency-Key header): a replay returns the original sale with `replayed: true`. Card and EFT payments must be confirmed (`confirmed: true`) unless an integrated provider reports the result; an unconfirmed payment never completes a sale.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"customerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"description": {
"type": "string",
"maxLength": 200
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitPrice": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"taxClass": {
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"modifierIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"quantity"
]
}
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"promotionCode": {
"type": "string",
"maxLength": 40
},
"note": {
"type": "string",
"maxLength": 500
},
"clientCreatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"action": {
"default": "complete",
"type": "string",
"enum": [
"complete",
"park",
"quote"
]
},
"payments": {
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": [
"CASH",
"CARD",
"EFT",
"STORE_CREDIT",
"ACCOUNT",
"OTHER"
]
},
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"tendered": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"provider": {
"type": "string",
"maxLength": 60
},
"providerRef": {
"type": "string",
"maxLength": 120
},
"cardSummary": {
"type": "string",
"maxLength": 40,
"pattern": "^[^0-9]*(\\d{0,4})$"
},
"confirmed": {
"type": "boolean"
},
"fee": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"method",
"amount"
]
}
},
"allowBalanceDue": {
"default": false,
"type": "boolean"
},
"idempotencyKey": {
"type": "string",
"minLength": 8,
"maxLength": 100
}
},
"required": [
"locationId",
"lines"
]
}get/api/v1/businesses/{businessId}/salesList sales and orders
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
status | query | no | string |
channel | query | no | string |
registerId | query | no | string |
customerId | query | no | string |
from | query | no | |
to | query | no | |
q | query | no | string |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/sales/batchUpload sales captured offline
Each sale must carry an idempotencyKey. Results are per sale, so one rejected sale does not block the rest.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"sales": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"customerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"description": {
"type": "string",
"maxLength": 200
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitPrice": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"taxClass": {
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"modifierIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"quantity"
]
}
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"promotionCode": {
"type": "string",
"maxLength": 40
},
"note": {
"type": "string",
"maxLength": 500
},
"clientCreatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"action": {
"default": "complete",
"type": "string",
"enum": [
"complete",
"park",
"quote"
]
},
"payments": {
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": [
"CASH",
"CARD",
"EFT",
"STORE_CREDIT",
"ACCOUNT",
"OTHER"
]
},
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"tendered": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"provider": {
"type": "string",
"maxLength": 60
},
"providerRef": {
"type": "string",
"maxLength": 120
},
"cardSummary": {
"type": "string",
"maxLength": 40,
"pattern": "^[^0-9]*(\\d{0,4})$"
},
"confirmed": {
"type": "boolean"
},
"fee": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"method",
"amount"
]
}
},
"allowBalanceDue": {
"default": false,
"type": "boolean"
},
"idempotencyKey": {
"type": "string",
"minLength": 8,
"maxLength": 100
}
},
"required": [
"locationId",
"lines",
"idempotencyKey"
]
}
}
},
"required": [
"sales"
]
}get/api/v1/businesses/{businessId}/sales/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
put/api/v1/businesses/{businessId}/sales/{id}Update a parked sale or quotation
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"customerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"description": {
"type": "string",
"maxLength": 200
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitPrice": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"taxClass": {
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"modifierIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"quantity"
]
}
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"promotionCode": {
"type": "string",
"maxLength": 40
},
"note": {
"type": "string",
"maxLength": 500
},
"clientCreatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"action": {
"default": "park",
"type": "string",
"enum": [
"park",
"quote"
]
}
},
"required": [
"locationId",
"lines"
]
}get/api/v1/businesses/{businessId}/sales/{id}/receiptReceipt / tax invoice document
| Parameter | In | Required | Schema |
|---|---|---|---|
format | query | no | string (json | text) |
reprint | query | no | boolean |
businessId | path | yes | string |
id | path | yes | string |
post/api/v1/businesses/{businessId}/sales/{id}/completeResume a parked sale or convert a quotation, and take payment
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"customerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"lines": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"description": {
"type": "string",
"maxLength": 200
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitPrice": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"taxClass": {
"type": "string",
"enum": [
"STANDARD",
"ZERO_RATED",
"EXEMPT"
]
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"modifierIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"quantity"
]
}
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"promotionCode": {
"type": "string",
"maxLength": 40
},
"note": {
"type": "string",
"maxLength": 500
},
"clientCreatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"payments": {
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": [
"CASH",
"CARD",
"EFT",
"STORE_CREDIT",
"ACCOUNT",
"OTHER"
]
},
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"tendered": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"provider": {
"type": "string",
"maxLength": 60
},
"providerRef": {
"type": "string",
"maxLength": 120
},
"cardSummary": {
"type": "string",
"maxLength": 40,
"pattern": "^[^0-9]*(\\d{0,4})$"
},
"confirmed": {
"type": "boolean"
},
"fee": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"method",
"amount"
]
}
},
"allowBalanceDue": {
"default": false,
"type": "boolean"
}
},
"required": [
"locationId",
"lines",
"payments"
]
}post/api/v1/businesses/{businessId}/sales/{id}/void
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"reason": {
"type": "string",
"minLength": 3,
"maxLength": 300
}
},
"required": [
"reason"
]
}post/api/v1/businesses/{businessId}/sales/{id}/refundsRefund some or all of a completed sale
Restocks at the original cost when `restock` is true. Card/EFT refunds must be confirmed as processed. Posts reversing ledger entries; the original sale is never edited.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"lines": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"saleLineId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"saleLineId",
"quantity"
]
}
},
"reason": {
"type": "string",
"minLength": 3,
"maxLength": 300
},
"restock": {
"default": true,
"type": "boolean"
},
"method": {
"type": "string",
"enum": [
"CASH",
"CARD",
"EFT",
"STORE_CREDIT",
"ACCOUNT",
"OTHER"
]
},
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"providerRef": {
"type": "string",
"maxLength": 120
},
"confirmed": {
"type": "boolean"
},
"idempotencyKey": {
"type": "string",
"minLength": 8,
"maxLength": 100
}
},
"required": [
"lines",
"reason",
"method"
]
}Orders
post/api/v1/businesses/{businessId}/ordersSubmit an online or platform order
Idempotent on `externalRef` per application: resubmitting returns the existing order. A paid order (with `payment`) completes immediately and deducts stock once; an unpaid order reserves stock until it is marked paid or cancelled. POS is the authority for physical stock, so the platform must not also decrement its own count.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"externalRef": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"customer": {
"type": "object",
"properties": {
"externalId": {
"type": "string",
"maxLength": 128
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"phone": {
"type": "string",
"maxLength": 30
}
},
"required": [
"name"
]
},
"lines": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"variantId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"externalVariantId": {
"type": "string",
"maxLength": 128
},
"quantity": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"unitPrice": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"modifierIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"quantity"
]
}
},
"payment": {
"type": "object",
"properties": {
"method": {
"default": "OTHER",
"type": "string",
"enum": [
"CARD",
"EFT",
"OTHER"
]
},
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"provider": {
"type": "string",
"maxLength": 60
},
"reference": {
"type": "string",
"maxLength": 120
}
},
"required": [
"amount",
"provider",
"reference"
]
},
"discount": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"PERCENT",
"FIXED"
]
},
"value": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"kind",
"value"
]
},
"fulfilment": {
"default": "pickup",
"type": "string",
"enum": [
"pickup",
"delivery",
"dine_in"
]
},
"note": {
"type": "string",
"maxLength": 1000
}
},
"required": [
"externalRef",
"lines"
]
}get/api/v1/businesses/{businessId}/orders/{id}Get an order by POS id or by your externalRef (prefix `ext:`)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
patch/api/v1/businesses/{businessId}/orders/{id}Mark paid, cancel, or move fulfilment status
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"pay",
"cancel",
"fulfil"
]
},
"payment": {
"type": "object",
"properties": {
"method": {
"default": "OTHER",
"type": "string",
"enum": [
"CARD",
"EFT",
"OTHER"
]
},
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"provider": {
"type": "string",
"maxLength": 60
},
"reference": {
"type": "string",
"maxLength": 120
}
},
"required": [
"amount",
"provider",
"reference"
]
},
"fulfilmentStatus": {
"type": "string",
"enum": [
"received",
"accepted",
"preparing",
"ready",
"out_for_delivery",
"delivered",
"collected"
]
},
"reason": {
"type": "string",
"maxLength": 300
}
},
"required": [
"action"
]
}Shifts
post/api/v1/businesses/{businessId}/shiftsOpen a register shift with a cash float
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"openingFloat": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"registerId",
"openingFloat"
]
}get/api/v1/businesses/{businessId}/shifts
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
registerId | query | no | string |
status | query | no | string (OPEN | CLOSED) |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/shifts/{id}Shift summary (X report while open, Z report once closed)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
post/api/v1/businesses/{businessId}/shifts/{id}/cashCash in, cash out, or open the drawer without a sale
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"CASH_IN",
"CASH_OUT",
"DRAWER_OPEN"
]
},
"amount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"reason": {
"type": "string",
"minLength": 2,
"maxLength": 200
},
"accountId": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"required": [
"type",
"reason"
]
}post/api/v1/businesses/{businessId}/shifts/{id}/closeCash-up: count the drawer and close the shift
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"countedCash": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"denominations": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^\\d+(\\.\\d+)?$"
},
"additionalProperties": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"note": {
"type": "string",
"maxLength": 500
}
},
"required": [
"countedCash"
]
}Accounting
get/api/v1/businesses/{businessId}/accountsChart of accounts
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/accounts
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"code": {
"type": "string",
"pattern": "^\\d{3,6}$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"type": {
"type": "string",
"enum": [
"ASSET",
"LIABILITY",
"EQUITY",
"INCOME",
"EXPENSE"
]
}
},
"required": [
"code",
"name",
"type"
]
}patch/api/v1/businesses/{businessId}/accounts/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"isActive": {
"type": "boolean"
}
}
}get/api/v1/businesses/{businessId}/journals
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
sourceType | query | no | string |
from | query | no | |
to | query | no | |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/journalsPost a manual journal
Must balance. Use for opening balances, accruals and corrections. Posted entries are never edited; reverse them instead.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"date": {},
"description": {
"type": "string",
"minLength": 3,
"maxLength": 300
},
"kind": {
"default": "MANUAL",
"type": "string",
"enum": [
"MANUAL",
"OPENING_BALANCE"
]
},
"lines": {
"minItems": 2,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"accountId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"debit": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"credit": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"description": {
"type": "string",
"maxLength": 200
}
},
"required": [
"accountId"
]
}
}
},
"required": [
"date",
"description",
"lines"
]
}post/api/v1/businesses/{businessId}/journals/{id}/reverseReverse a posted entry
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"reason": {
"type": "string",
"minLength": 3,
"maxLength": 300
},
"date": {}
},
"required": [
"reason"
]
}get/api/v1/businesses/{businessId}/reports/trial-balance
| Parameter | In | Required | Schema |
|---|---|---|---|
asOf | query | no | |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/profit-and-loss
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | yes | |
to | query | yes | |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/balance-sheet
| Parameter | In | Required | Schema |
|---|---|---|---|
asOf | query | no | |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/cash-flow
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | yes | |
to | query | yes | |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/vatVAT summary for VAT201 preparation
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | yes | |
to | query | yes | |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/accounts/{id}/ledgerGeneral ledger for one account
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | yes | |
to | query | yes | |
businessId | path | yes | string |
id | path | yes | string |
get/api/v1/businesses/{businessId}/expenses
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
from | query | no | |
to | query | no | |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/expensesRecord an expense
Give the total; VAT is extracted at the standard rate when `includesVat` and the business is VAT registered.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"date": {},
"accountId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"paidFromAccountId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"supplierId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"description": {
"type": "string",
"minLength": 2,
"maxLength": 300
},
"total": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
},
"includesVat": {
"default": true,
"type": "boolean"
},
"reference": {
"type": "string",
"maxLength": 60
}
},
"required": [
"date",
"accountId",
"paidFromAccountId",
"description",
"total"
]
}get/api/v1/businesses/{businessId}/periods
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/periods/closeClose a period: nothing can post into it afterwards
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"startDate": {},
"endDate": {}
},
"required": [
"startDate",
"endDate"
]
}post/api/v1/businesses/{businessId}/periods/{id}/reopen
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"reason": {
"type": "string",
"minLength": 5,
"maxLength": 300
}
},
"required": [
"reason"
]
}Reconciliation
post/api/v1/businesses/{businessId}/reconciliation/importsImport a bank or provider statement (CSV)
CSV with a header row containing date, description, amount (positive = money in), and optionally reference. Returns row-level errors; nothing is saved if any row is invalid.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"accountId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"fileName": {
"type": "string",
"maxLength": 200
},
"csv": {
"type": "string",
"minLength": 1,
"maxLength": 5000000
},
"source": {
"default": "csv",
"type": "string",
"maxLength": 40
}
},
"required": [
"accountId",
"fileName",
"csv"
]
}get/api/v1/businesses/{businessId}/reconciliation/lines
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
status | query | no | string (UNMATCHED | MATCHED | IGNORED) |
importId | query | no | string |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/reconciliation/lines/{id}/settleRecord a card/EFT settlement into the bank, net of provider fees
Posts Dr Bank (the statement amount), Dr Payment provider fees, Cr the clearing account (gross).
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"clearing": {
"type": "string",
"enum": [
"CARD_CLEARING",
"EFT_CLEARING",
"OTHER_CLEARING"
]
},
"feeAmount": {
"anyOf": [
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
},
{
"type": "number"
}
]
}
},
"required": [
"clearing"
]
}post/api/v1/businesses/{businessId}/reconciliation/lines/{id}/matchMatch a statement line to an existing journal entry, or ignore it
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"journalEntryId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"ignore": {
"type": "boolean"
}
}
}Reports
get/api/v1/businesses/{businessId}/reports/overviewBusiness dashboard figures
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/salesSales over time
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | yes | |
to | query | yes | |
groupBy | query | no | string (day | week | month) |
locationId | query | no | string |
channel | query | no | string |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/sales-bySales broken down by product, category, payment method, cashier, register, channel or location
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | yes | |
to | query | yes | |
dimension | query | yes | string (product | category | payment_method | cashier | register | channel | location) |
limit | query | no | integer |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/inventoryValuation, low stock, slow movers, dead stock and reorder suggestions
| Parameter | In | Required | Schema |
|---|---|---|---|
kind | query | yes | string (valuation | low_stock | slow_moving | dead_stock | reorder | turnover) |
days | query | no | integer |
locationId | query | no | string |
businessId | path | yes | string |
get/api/v1/businesses/{businessId}/reports/customersRetention and repeat purchasing
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | yes | |
to | query | yes | |
businessId | path | yes | string |
Developer
get/api/v1/developer/catalogueScopes and webhook events you can use
get/api/v1/developer/applications
post/api/v1/developer/applicationsRegister an application (the secret is shown once)
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 80
},
"description": {
"type": "string",
"maxLength": 1000
},
"websiteUrl": {
"type": "string",
"maxLength": 300,
"format": "uri"
},
"redirectUris": {
"default": [],
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 500,
"format": "uri"
}
},
"requestedScopes": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"environment": {
"default": "SANDBOX",
"type": "string",
"enum": [
"SANDBOX",
"LIVE"
]
}
},
"required": [
"name",
"requestedScopes"
]
}get/api/v1/developer/applications/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
patch/api/v1/developer/applications/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 80
},
"description": {
"type": "string",
"maxLength": 1000
},
"websiteUrl": {
"type": "string",
"maxLength": 300,
"format": "uri"
},
"redirectUris": {
"default": [],
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 500,
"format": "uri"
}
},
"requestedScopes": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
}
}
}delete/api/v1/developer/applications/{id}Revoke the application and every token it holds
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
post/api/v1/developer/applications/{id}/rotate-secretIssue a new client secret (the old one stops working)
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
post/api/v1/developer/applications/{id}/manifestValidate and attach a techtur-pos.connector.json manifest
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"manifest": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"manifest"
]
}post/api/v1/developer/applications/{id}/webhooksAdd a webhook endpoint (signing secret shown once)
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 500,
"format": "uri"
},
"events": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"maxLength": 200
}
},
"required": [
"url",
"events"
]
}patch/api/v1/developer/applications/{id}/webhooks/{webhookId}
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
webhookId | path | yes | string |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 500,
"format": "uri"
},
"events": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"maxLength": 200
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"DISABLED"
]
}
}
}delete/api/v1/developer/applications/{id}/webhooks/{webhookId}
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
webhookId | path | yes | string |
post/api/v1/developer/applications/{id}/webhooks/{webhookId}/testSend a signed webhook.test event now
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
webhookId | path | yes | string |
get/api/v1/developer/applications/{id}/deliveries
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
status | query | no | string (PENDING | SUCCEEDED | FAILED | DEAD) |
id | path | yes | string |
post/api/v1/developer/deliveries/{id}/retryRedeliver an event now
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
get/api/v1/developer/applications/{id}/requestsAPI request log
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
errorsOnly | query | no | boolean |
id | path | yes | string |
post/api/v1/developer/sandboxCreate a sandbox business with test data
{
"type": "object",
"properties": {
"name": {
"default": "Sandbox Store",
"type": "string",
"minLength": 2,
"maxLength": 80
},
"type": {
"default": "RETAIL",
"type": "string",
"enum": [
"RETAIL",
"FOOD"
]
}
}
}post/api/v1/developer/applications/{id}/sandbox-tokenConnect a sandbox app to your sandbox business and mint a 24h test token
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"businessId": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"required": [
"businessId"
]
}Platform
get/api/v1/platform/meWho this connector token belongs to
post/api/v1/platform/launch-ticketsMint a one-time launch link for a signed-in platform user
Called server-to-server by a TechTur platform. Returns a single-use code valid for five minutes; redirect the user's browser to `launchUrl`. Never put access tokens in URLs.
{
"type": "object",
"properties": {
"externalUserId": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"displayName": {
"type": "string",
"maxLength": 120
},
"externalBusinessId": {
"type": "string",
"maxLength": 128
},
"businessName": {
"type": "string",
"maxLength": 120
},
"businessRole": {
"type": "string",
"enum": [
"owner",
"manager",
"staff"
]
},
"returnUrl": {
"type": "string",
"format": "uri"
}
},
"required": [
"externalUserId"
]
}post/api/v1/platform/launch/exchangeBrowser: redeem a launch code
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 20
}
},
"required": [
"code"
]
}post/api/v1/platform/launch/linkSigned in: link this platform identity to your existing account
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 20
}
},
"required": [
"code"
]
}post/api/v1/platform/launch/consentOwner consents to creating and linking a POS business for their platform business
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 20
},
"type": {
"default": "RETAIL",
"type": "string",
"enum": [
"RETAIL",
"FOOD",
"SERVICES",
"MIXED"
]
}
},
"required": [
"code"
]
}get/api/v1/platform/businessesBusinesses linked to this platform
get/api/v1/platform/businesses/{externalBusinessId}Resolve one platform business to its POS business
| Parameter | In | Required | Schema |
|---|---|---|---|
externalBusinessId | path | yes | string |
post/api/v1/platform/metricsReport platform metrics for the Control Centre
Idempotent per (key, periodStart, periodEnd). Only reported metrics are shown; nothing is estimated.
{
"type": "object",
"properties": {
"metrics": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"pattern": "^[a-z][a-z0-9_.]{1,60}$"
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?$"
}
]
},
"unit": {
"type": "string",
"maxLength": 20
},
"periodStart": {},
"periodEnd": {},
"dimensions": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
},
"required": [
"key",
"value",
"periodStart",
"periodEnd"
]
}
}
},
"required": [
"metrics"
]
}Control Centre
get/api/v1/admin/overviewEcosystem overview
get/api/v1/admin/financeTechTur revenue vs merchant GMV
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | no | |
to | query | no | |
get/api/v1/admin/platforms
post/api/v1/admin/platforms
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9-]{2,40}$"
},
"name": {
"type": "string",
"minLength": 2,
"maxLength": 80
},
"kind": {
"default": "TECHTUR",
"type": "string",
"enum": [
"TECHTUR",
"THIRD_PARTY"
]
},
"status": {
"default": "ACTIVE",
"type": "string",
"enum": [
"ACTIVE",
"PLANNED",
"SUSPENDED"
]
},
"description": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "null"
}
]
},
"websiteUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"adminUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"healthUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"capabilities": {
"default": [],
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
}
},
"required": [
"slug",
"name"
]
}patch/api/v1/admin/platforms/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9-]{2,40}$"
},
"name": {
"type": "string",
"minLength": 2,
"maxLength": 80
},
"kind": {
"default": "TECHTUR",
"type": "string",
"enum": [
"TECHTUR",
"THIRD_PARTY"
]
},
"status": {
"default": "ACTIVE",
"type": "string",
"enum": [
"ACTIVE",
"PLANNED",
"SUSPENDED"
]
},
"description": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "null"
}
]
},
"websiteUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"adminUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"healthUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"capabilities": {
"default": [],
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
}
}
}get/api/v1/admin/platforms/{id}Platform management view
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
get/api/v1/admin/businesses
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
q | query | no | string |
status | query | no | string |
platformId | query | no | string |
environment | query | no | string (LIVE | SANDBOX) |
get/api/v1/admin/businesses/{id}One business, aggregated (support access is audited)
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
post/api/v1/admin/businesses/{id}/status
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ACTIVE",
"SUSPENDED"
]
},
"reason": {
"type": "string",
"minLength": 5,
"maxLength": 500
}
},
"required": [
"status",
"reason"
]
}get/api/v1/admin/applications
| Parameter | In | Required | Schema |
|---|---|---|---|
status | query | no | string (PENDING_REVIEW | ACTIVE | SUSPENDED | REVOKED) |
post/api/v1/admin/applications/{id}/reviewApprove or suspend an application and set its scopes
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"decision": {
"type": "string",
"enum": [
"approve",
"suspend"
]
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"platformId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "null"
}
]
},
"note": {
"type": "string",
"maxLength": 500
}
},
"required": [
"decision"
]
}get/api/v1/admin/integrations/healthIntegration diagnostics across the ecosystem
get/api/v1/admin/audit
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
action | query | no | string |
businessId | query | no | string |
post/api/v1/admin/users/{id}/platform-role
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"role": {
"anyOf": [
{
"type": "string",
"enum": [
"SUPER_ADMIN",
"PLATFORM_ADMIN",
"SUPPORT_ADMIN",
"FINANCE_ADMIN",
"OPERATIONS_ADMIN",
"INTEGRATION_ADMIN"
]
},
{
"type": "null"
}
]
}
},
"required": [
"role"
]
}get/api/v1/admin/users
| Parameter | In | Required | Schema |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
q | query | no | string |
platformOnly | query | no | boolean |
Hardware
get/api/v1/businesses/{businessId}/devices
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/devicesRegister a device. A bridge gets a one-time pairing code.
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"BRIDGE",
"RECEIPT_PRINTER",
"KITCHEN_PRINTER",
"LABEL_PRINTER",
"CASH_DRAWER",
"SCANNER",
"CARD_TERMINAL",
"CUSTOMER_DISPLAY",
"SCALE"
]
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"registerId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"bridgeId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"config": {
"default": {},
"type": "object",
"properties": {
"transport": {
"type": "string",
"enum": [
"network",
"usb",
"bluetooth",
"browser",
"keyboard"
]
},
"host": {
"type": "string",
"maxLength": 255
},
"port": {
"type": "integer",
"minimum": 1,
"maximum": 65535
},
"devicePath": {
"type": "string",
"maxLength": 255
},
"paperWidth": {
"type": "string",
"enum": [
"58",
"80"
]
},
"codepage": {
"type": "string",
"maxLength": 20
},
"drawerPin": {
"type": "string",
"enum": [
"2",
"5"
]
},
"provider": {
"type": "string",
"maxLength": 40
}
},
"additionalProperties": {}
}
},
"required": [
"kind",
"name"
]
}patch/api/v1/businesses/{businessId}/devices/{id}
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 80
},
"registerId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "null"
}
]
},
"bridgeId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "null"
}
]
},
"config": {
"type": "object",
"properties": {
"transport": {
"type": "string",
"enum": [
"network",
"usb",
"bluetooth",
"browser",
"keyboard"
]
},
"host": {
"type": "string",
"maxLength": 255
},
"port": {
"type": "integer",
"minimum": 1,
"maximum": 65535
},
"devicePath": {
"type": "string",
"maxLength": 255
},
"paperWidth": {
"type": "string",
"enum": [
"58",
"80"
]
},
"codepage": {
"type": "string",
"maxLength": 20
},
"drawerPin": {
"type": "string",
"enum": [
"2",
"5"
]
},
"provider": {
"type": "string",
"maxLength": 40
}
},
"additionalProperties": {}
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"DISABLED"
]
}
}
}post/api/v1/businesses/{businessId}/devices/{id}/printQueue a receipt, kitchen ticket or test page for a printer behind a bridge
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
id | path | yes | string |
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"receipt",
"kitchen",
"test",
"drawer"
]
},
"saleId": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"required": [
"kind"
]
}post/api/v1/devices/pairBridge: exchange a pairing code for a device token
{
"type": "object",
"properties": {
"pairingCode": {
"type": "string",
"minLength": 6,
"maxLength": 40
},
"agentVersion": {
"type": "string",
"maxLength": 40
},
"hostname": {
"type": "string",
"maxLength": 120
}
},
"required": [
"pairingCode"
]
}post/api/v1/devices/heartbeatBridge: report status and collect print jobs
{
"type": "object",
"properties": {
"devices": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"deviceId": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"ok": {
"type": "boolean"
},
"error": {
"type": "string",
"maxLength": 300
}
},
"required": [
"deviceId",
"ok"
]
}
}
}
}post/api/v1/devices/jobs/{id}/result
| Parameter | In | Required | Schema |
|---|---|---|---|
id | path | yes | string |
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"PRINTED",
"FAILED"
]
},
"error": {
"type": "string",
"maxLength": 300
}
},
"required": [
"status"
]
}Notifications
get/api/v1/businesses/{businessId}/notifications
| Parameter | In | Required | Schema |
|---|---|---|---|
unreadOnly | query | no | boolean |
businessId | path | yes | string |
post/api/v1/businesses/{businessId}/notifications/read
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
{
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
},
"all": {
"type": "boolean"
}
}
}Data
get/api/v1/businesses/{businessId}/imports/{kind}/template
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
kind | path | yes | string (products | customers | suppliers | stock) |
post/api/v1/businesses/{businessId}/imports/{kind}/previewValidate an import and show what it would change
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
kind | path | yes | string (products | customers | suppliers | stock) |
{
"type": "object",
"properties": {
"csv": {
"type": "string",
"minLength": 1,
"maxLength": 5000000
}
},
"required": [
"csv"
]
}post/api/v1/businesses/{businessId}/imports/{kind}/commitApply a validated import (all or nothing)
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
kind | path | yes | string (products | customers | suppliers | stock) |
{
"type": "object",
"properties": {
"csv": {
"type": "string",
"minLength": 1,
"maxLength": 5000000
},
"locationId": {
"type": "string"
}
},
"required": [
"csv"
]
}get/api/v1/businesses/{businessId}/exports/{kind}Download a CSV export
| Parameter | In | Required | Schema |
|---|---|---|---|
from | query | no | |
to | query | no | |
businessId | path | yes | string |
kind | path | yes | string (products | customers | suppliers | stock | sales | sale_lines | payments | journal_lines | audit) |
get/api/v1/businesses/{businessId}/exports/fullComplete business data export (JSON) for portability and backup
| Parameter | In | Required | Schema |
|---|---|---|---|
businessId | path | yes | string |
Support
post/api/v1/support/contactSend a message to TechTur support
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"topic": {
"default": "general",
"type": "string",
"enum": [
"general",
"billing",
"technical",
"integrations",
"hardware",
"account"
]
},
"subject": {
"type": "string",
"minLength": 3,
"maxLength": 150
},
"message": {
"type": "string",
"minLength": 10,
"maxLength": 5000
},
"businessId": {
"type": "string",
"maxLength": 64
},
"website": {
"type": "string",
"maxLength": 0
}
},
"required": [
"name",
"email",
"subject",
"message"
]
}OAuth
get/api/oauth/authorizeValidate an authorization request (used by the consent screen)
| Parameter | In | Required | Schema |
|---|---|---|---|
client_id | query | yes | string |
redirect_uri | query | yes | string |
response_type | query | yes | string (code) |
scope | query | no | string |
state | query | no | string |
code_challenge | query | yes | string |
code_challenge_method | query | yes | string (S256) |
post/api/oauth/authorizeGrant access for one business and receive the redirect
{
"type": "object",
"properties": {
"client_id": {
"type": "string"
},
"redirect_uri": {
"type": "string",
"format": "uri"
},
"response_type": {
"type": "string",
"enum": [
"code"
]
},
"scope": {
"default": "",
"type": "string"
},
"state": {
"type": "string",
"maxLength": 500
},
"code_challenge": {
"type": "string",
"minLength": 43,
"maxLength": 128
},
"code_challenge_method": {
"type": "string",
"enum": [
"S256"
]
},
"businessId": {
"type": "string"
},
"decision": {
"type": "string",
"enum": [
"allow",
"deny"
]
}
},
"required": [
"client_id",
"redirect_uri",
"response_type",
"code_challenge",
"code_challenge_method",
"businessId",
"decision"
]
}post/api/oauth/tokenExchange a code, refresh a token, or use client credentials
{
"type": "object",
"properties": {
"grant_type": {
"type": "string",
"enum": [
"authorization_code",
"refresh_token",
"client_credentials"
]
},
"code": {
"type": "string"
},
"redirect_uri": {
"type": "string"
},
"code_verifier": {
"type": "string"
},
"refresh_token": {
"type": "string"
},
"client_id": {
"type": "string"
},
"client_secret": {
"type": "string"
},
"scope": {
"type": "string"
}
},
"required": [
"grant_type"
]
}post/api/oauth/revokeRevoke an access or refresh token (RFC 7009)
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"client_id": {
"type": "string"
},
"client_secret": {
"type": "string"
}
},
"required": [
"token"
]
}