Skip to content

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)
Request body
{
  "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
Request body
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "minLength": 10
    }
  },
  "required": [
    "token"
  ]
}
post/api/v1/auth/loginSign in with email and password
Request body
{
  "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
Request body
{
  "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
Request body
{
  "type": "object",
  "properties": {
    "businessId": {
      "type": "string"
    }
  },
  "required": [
    "businessId"
  ]
}
post/api/v1/auth/password/forgot
Request body
{
  "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
Request body
{
  "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
Request body
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "minLength": 6,
      "maxLength": 8
    }
  },
  "required": [
    "code"
  ]
}
post/api/v1/auth/mfa/verify
Request body
{
  "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)
ParameterInRequiredSchema
intentquerynostring (login | link)
nextquerynostring
get/api/v1/auth/google/callback
ParameterInRequiredSchema
codequerynostring
statequerynostring
errorquerynostring
post/api/v1/auth/google/unlink

Staff

get/api/v1/invitations/{token}
ParameterInRequiredSchema
tokenpathyesstring
post/api/v1/invitations/accept
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/invitations
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
patch/api/v1/businesses/{businessId}/staff/{id}Change a member's role or suspend them
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/rolesCreate a custom role
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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)
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
patch/api/v1/businesses/{businessId}
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
get/api/v1/plansPublic pricing plans

Locations

get/api/v1/businesses/{businessId}/locations
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/locations
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/registers
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring

Audit

get/api/v1/businesses/{businessId}/audit
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
actionquerynostring
entityIdquerynostring
businessIdpathyesstring

Catalogue

get/api/v1/businesses/{businessId}/categories
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/categories
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
qquerynostring
categoryIdquerynostring
includeArchivedquerynoboolean
updatedSincequeryno
businessIdpathyesstring
post/api/v1/businesses/{businessId}/productsCreate a product
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
put/api/v1/businesses/{businessId}/products/{id}Replace a product and its variants
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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)
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
patch/api/v1/businesses/{businessId}/products/{id}/availabilityMark sold out / available (food mode)
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "soldOut": {
      "type": "boolean"
    },
    "isActive": {
      "type": "boolean"
    }
  }
}
get/api/v1/businesses/{businessId}/barcodes/{code}Look up a scanned barcode or SKU
ParameterInRequiredSchema
businessIdpathyesstring
codepathyesstring
get/api/v1/businesses/{businessId}/promotions
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/promotions
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
entityTypequerynostring
externalIdquerynostring
businessIdpathyesstring
get/api/v1/businesses/{businessId}/connectionsApplications this business has connected
ParameterInRequiredSchema
businessIdpathyesstring
delete/api/v1/businesses/{businessId}/connections/{id}Disconnect an application (revokes its tokens for this business)
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
post/api/v1/businesses/{businessId}/sync-conflicts/{id}/resolve
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "resolution": {
      "type": "string",
      "enum": [
        "KEEP_LOCAL",
        "ACCEPT_REMOTE"
      ]
    }
  },
  "required": [
    "resolution"
  ]
}
get/api/v1/businesses/{businessId}/api-keys
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/api-keysCreate a business API key (shown once)
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
get/api/v1/businesses/{businessId}/webhooks
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/webhooks
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring

Inventory

get/api/v1/businesses/{businessId}/stockStock levels (on hand, reserved, available)
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
locationIdquerynostring
variantIdquerynostring
lowOnlyquerynoboolean
qquerynostring
businessIdpathyesstring
patch/api/v1/businesses/{businessId}/stock/{id}Set reorder level and quantity
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
variantIdquerynostring
locationIdquerynostring
typequerynostring
businessIdpathyesstring
post/api/v1/businesses/{businessId}/stock/transfersMove stock between locations at cost
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/stock/countsStart a full or cycle count (snapshots expected quantities)
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
patch/api/v1/businesses/{businessId}/stock/counts/{id}Record counted quantities
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring

Purchasing

get/api/v1/businesses/{businessId}/suppliers
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
qquerynostring
businessIdpathyesstring
post/api/v1/businesses/{businessId}/suppliers
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
patch/api/v1/businesses/{businessId}/suppliers/{id}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
statusquerynostring
businessIdpathyesstring
post/api/v1/businesses/{businessId}/purchase-orders
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
post/api/v1/businesses/{businessId}/purchase-orders/{id}/status
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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.

ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
statusquerynostring
supplierIdquerynostring
businessIdpathyesstring
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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
qquerynostring
groupquerynostring
withBalancequerynoboolean
businessIdpathyesstring
post/api/v1/businesses/{businessId}/customers
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
patch/api/v1/businesses/{businessId}/customers/{id}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
fromqueryno
toqueryno
businessIdpathyesstring
idpathyesstring

Sales

post/api/v1/businesses/{businessId}/sales/pricePrice a basket without saving it
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
statusquerynostring
channelquerynostring
registerIdquerynostring
customerIdquerynostring
fromqueryno
toqueryno
qquerynostring
businessIdpathyesstring
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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
put/api/v1/businesses/{businessId}/sales/{id}Update a parked sale or quotation
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
formatquerynostring (json | text)
reprintquerynoboolean
businessIdpathyesstring
idpathyesstring
post/api/v1/businesses/{businessId}/sales/{id}/completeResume a parked sale or convert a quotation, and take payment
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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.

ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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:`)
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
patch/api/v1/businesses/{businessId}/orders/{id}Mark paid, cancel, or move fulfilment status
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
registerIdquerynostring
statusquerynostring (OPEN | CLOSED)
businessIdpathyesstring
get/api/v1/businesses/{businessId}/shifts/{id}Shift summary (X report while open, Z report once closed)
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
post/api/v1/businesses/{businessId}/shifts/{id}/cashCash in, cash out, or open the drawer without a sale
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/accounts
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "isActive": {
      "type": "boolean"
    }
  }
}
get/api/v1/businesses/{businessId}/journals
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
sourceTypequerynostring
fromqueryno
toqueryno
businessIdpathyesstring
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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string",
      "minLength": 3,
      "maxLength": 300
    },
    "date": {}
  },
  "required": [
    "reason"
  ]
}
get/api/v1/businesses/{businessId}/reports/trial-balance
ParameterInRequiredSchema
asOfqueryno
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/profit-and-loss
ParameterInRequiredSchema
fromqueryyes
toqueryyes
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/balance-sheet
ParameterInRequiredSchema
asOfqueryno
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/cash-flow
ParameterInRequiredSchema
fromqueryyes
toqueryyes
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/vatVAT summary for VAT201 preparation
ParameterInRequiredSchema
fromqueryyes
toqueryyes
businessIdpathyesstring
get/api/v1/businesses/{businessId}/accounts/{id}/ledgerGeneral ledger for one account
ParameterInRequiredSchema
fromqueryyes
toqueryyes
businessIdpathyesstring
idpathyesstring
get/api/v1/businesses/{businessId}/expenses
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
fromqueryno
toqueryno
businessIdpathyesstring
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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/periods/closeClose a period: nothing can post into it afterwards
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "startDate": {},
    "endDate": {}
  },
  "required": [
    "startDate",
    "endDate"
  ]
}
post/api/v1/businesses/{businessId}/periods/{id}/reopen
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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.

ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
statusquerynostring (UNMATCHED | MATCHED | IGNORED)
importIdquerynostring
businessIdpathyesstring
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).

ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "journalEntryId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "ignore": {
      "type": "boolean"
    }
  }
}

Reports

get/api/v1/businesses/{businessId}/reports/overviewBusiness dashboard figures
ParameterInRequiredSchema
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/salesSales over time
ParameterInRequiredSchema
fromqueryyes
toqueryyes
groupByquerynostring (day | week | month)
locationIdquerynostring
channelquerynostring
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/sales-bySales broken down by product, category, payment method, cashier, register, channel or location
ParameterInRequiredSchema
fromqueryyes
toqueryyes
dimensionqueryyesstring (product | category | payment_method | cashier | register | channel | location)
limitquerynointeger
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/inventoryValuation, low stock, slow movers, dead stock and reorder suggestions
ParameterInRequiredSchema
kindqueryyesstring (valuation | low_stock | slow_moving | dead_stock | reorder | turnover)
daysquerynointeger
locationIdquerynostring
businessIdpathyesstring
get/api/v1/businesses/{businessId}/reports/customersRetention and repeat purchasing
ParameterInRequiredSchema
fromqueryyes
toqueryyes
businessIdpathyesstring

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)
Request body
{
  "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}
ParameterInRequiredSchema
idpathyesstring
patch/api/v1/developer/applications/{id}
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
idpathyesstring
post/api/v1/developer/applications/{id}/rotate-secretIssue a new client secret (the old one stops working)
ParameterInRequiredSchema
idpathyesstring
post/api/v1/developer/applications/{id}/manifestValidate and attach a techtur-pos.connector.json manifest
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "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)
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
idpathyesstring
webhookIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
idpathyesstring
webhookIdpathyesstring
post/api/v1/developer/applications/{id}/webhooks/{webhookId}/testSend a signed webhook.test event now
ParameterInRequiredSchema
idpathyesstring
webhookIdpathyesstring
get/api/v1/developer/applications/{id}/deliveries
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
statusquerynostring (PENDING | SUCCEEDED | FAILED | DEAD)
idpathyesstring
post/api/v1/developer/deliveries/{id}/retryRedeliver an event now
ParameterInRequiredSchema
idpathyesstring
get/api/v1/developer/applications/{id}/requestsAPI request log
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
errorsOnlyquerynoboolean
idpathyesstring
post/api/v1/developer/sandboxCreate a sandbox business with test data
Request body
{
  "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
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "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.

Request body
{
  "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
Request body
{
  "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
Request body
{
  "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
Request body
{
  "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
ParameterInRequiredSchema
externalBusinessIdpathyesstring
post/api/v1/platform/metricsReport platform metrics for the Control Centre

Idempotent per (key, periodStart, periodEnd). Only reported metrics are shown; nothing is estimated.

Request body
{
  "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
ParameterInRequiredSchema
fromqueryno
toqueryno
get/api/v1/admin/platforms
post/api/v1/admin/platforms
Request body
{
  "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}
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
idpathyesstring
get/api/v1/admin/businesses
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
qquerynostring
statusquerynostring
platformIdquerynostring
environmentquerynostring (LIVE | SANDBOX)
get/api/v1/admin/businesses/{id}One business, aggregated (support access is audited)
ParameterInRequiredSchema
idpathyesstring
post/api/v1/admin/businesses/{id}/status
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "ACTIVE",
        "SUSPENDED"
      ]
    },
    "reason": {
      "type": "string",
      "minLength": 5,
      "maxLength": 500
    }
  },
  "required": [
    "status",
    "reason"
  ]
}
get/api/v1/admin/applications
ParameterInRequiredSchema
statusquerynostring (PENDING_REVIEW | ACTIVE | SUSPENDED | REVOKED)
post/api/v1/admin/applications/{id}/reviewApprove or suspend an application and set its scopes
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
actionquerynostring
businessIdquerynostring
post/api/v1/admin/users/{id}/platform-role
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
limitquerynointeger
cursorquerynostring
qquerynostring
platformOnlyquerynoboolean

Hardware

get/api/v1/businesses/{businessId}/devices
ParameterInRequiredSchema
businessIdpathyesstring
post/api/v1/businesses/{businessId}/devicesRegister a device. A bridge gets a one-time pairing code.
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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}
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
idpathyesstring
Request body
{
  "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
Request body
{
  "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
Request body
{
  "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
ParameterInRequiredSchema
idpathyesstring
Request body
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "PRINTED",
        "FAILED"
      ]
    },
    "error": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "status"
  ]
}

Notifications

get/api/v1/businesses/{businessId}/notifications
ParameterInRequiredSchema
unreadOnlyquerynoboolean
businessIdpathyesstring
post/api/v1/businesses/{businessId}/notifications/read
ParameterInRequiredSchema
businessIdpathyesstring
Request body
{
  "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
ParameterInRequiredSchema
businessIdpathyesstring
kindpathyesstring (products | customers | suppliers | stock)
post/api/v1/businesses/{businessId}/imports/{kind}/previewValidate an import and show what it would change
ParameterInRequiredSchema
businessIdpathyesstring
kindpathyesstring (products | customers | suppliers | stock)
Request body
{
  "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)
ParameterInRequiredSchema
businessIdpathyesstring
kindpathyesstring (products | customers | suppliers | stock)
Request body
{
  "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
ParameterInRequiredSchema
fromqueryno
toqueryno
businessIdpathyesstring
kindpathyesstring (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
ParameterInRequiredSchema
businessIdpathyesstring

Support

post/api/v1/support/contactSend a message to TechTur support
Request body
{
  "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)
ParameterInRequiredSchema
client_idqueryyesstring
redirect_uriqueryyesstring
response_typequeryyesstring (code)
scopequerynostring
statequerynostring
code_challengequeryyesstring
code_challenge_methodqueryyesstring (S256)
post/api/oauth/authorizeGrant access for one business and receive the redirect
Request body
{
  "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
Request body
{
  "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)
Request body
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string"
    },
    "client_id": {
      "type": "string"
    },
    "client_secret": {
      "type": "string"
    }
  },
  "required": [
    "token"
  ]
}