EPOS Data
This section contains the REST version and Websockets version of the EPOS Data API.
The EPOS Data API offers two integration methods for connecting the EPOS system with Dojo: REST and Websockets. These methods can be used separately or in combination depending on your system architecture and data accessibility needs.
REST
The REST API is ideal for centralized architectures where the EPOS data is hosted on a centralized server. Dojo can interact with the server using standard HTTP methods to access or modify data.
Recommended for:
- Centralized EPOS data hosted on a server.
- Stateless communication, where each API request is independent.
- Asynchronous data access and batch processing.
Websockets
Visit the getting started page for instructions on establishing a WebSockets connection.
The Websockets API is best for environments where EPOS data resides locally and must be shared with Dojo in real-time. It maintains a persistent connection between the EPOS and Dojo to enable low-latency, continuous data transmission without repeated polling.
Recommended for:
- On-premise EPOS data that requires real-time synchronization.
- Persistent, low-latency communication like live transaction updates.
Dojo API Key
An API Key is required to access the EPOS Data API:
- You need a key that starts with
sk_sandbox_to access to the sandbox environment. - You need a key that starts with
sk_prod_to access the production environment.
In the following examples, {{API_KEY}} is used as a placeholder for the actual API Key.
Registering capabilities
Register your EPOS Data API endpoints as capabilities in the Dojo API so Dojo knows which functions are available. Registration is mandatory: until you register a capability, Dojo will not invoke it on your EPOS, even if your WebSocket connection is open and your REST endpoint is reachable.
- PUT /epos/integrations/rest (REST)
- PUT /epos/integrations/ws (WebSockets)
The valid capabilities[].name values are the ones documented in Core concepts — for example SearchOrders, GetOrderById, CreateOrderLock, RecordOrderPaymentById, GetOrderBillById, ListAreas. The heading text on each capability page is the exact name to send in the registration body; the version is sent alongside as "version": "v1". Appending V1 to the registration name gives the wire-level method that Dojo will invoke on your EPOS (for example SearchOrdersV1, RecordOrderPaymentByIdV1).
Event-driven capabilities are registered per event type using a colon qualifier; each registered event type maps to the same HandleEventV1 wire method:
HandleEvent:payment_intent.createdHandleEvent:payment_intent.status_updated
The full set of registerable capability names accepted today is:
| Domain | Capability names |
|---|---|
| Orders | CreateOrder, GetOrderById, CancelOrderById, SearchOrders, RecordOrderPaymentById, GetOrderBillById, AddOrderItems |
| Order locking | CreateOrderLock, DeleteOrderLock, ExtendOrderLock |
| Order and Pay (preview) | CalculateOrder, SubmitCalculatedOrder, SearchMenus |
| Parties | CreateParty, GetPartyById, UpdateParty, DeletePartyById, SearchParties |
| Reservations | CreateReservation, GetReservationById, UpdateReservation, DeleteReservationById, SearchReservations |
| Tables & areas | SearchTables, ListAreas |
| Events | HandleEvent:payment_intent.created, HandleEvent:payment_intent.status_updated |
For backwards compatibility, the registration endpoint also accepts the legacy names GetOrderBill, RecordOrderPayment, UpdatePartyById, and UpdateReservationById — they're equivalent to GetOrderBillById, RecordOrderPaymentById, UpdateParty, and UpdateReservation. New integrations should use the wire-aligned form (the one shown in the table above).
AddOrderItems, CalculateOrder, SubmitCalculatedOrder, and SearchMenus are accepted by PUT /epos/integrations/{rest,ws} today, but their request and response contracts are still being finalised. Don't register them in production until the corresponding REST/WS pages are published. If you're integrating with Order and Pay and need any of these, contact your Partnership Development Manager (PDM).
You can view the currently registered capabilities using the following API call:
curl --location 'https://api.dojo.tech/epos/integrations' \
--header 'Accept: application/json' \
--header 'software-house-id: my-place-curl' \
--header 'Authorization: Basic {{API_KEY}}'
This will return a list of registered capabilities. If no capabilities are registered, the response will be empty:
{
"restIntegrations": [],
"wsIntegrations": []
}
Once you've registered capabilities, the response includes one entry per integration with the capability list, the version Dojo will invoke, and an updatedAt timestamp:
{
"restIntegrations": [],
"wsIntegrations": [
{
"createdAt": "2026-04-27T10:08:46.421Z",
"capabilities": [
{"name": "SearchOrders", "version": "v1", "updatedAt": "2026-04-27T10:08:46.421Z"},
{"name": "GetOrderById", "version": "v1", "updatedAt": "2026-04-27T10:08:46.421Z"},
{"name": "RecordOrderPaymentById", "version": "v1", "updatedAt": "2026-04-27T10:08:46.421Z"},
{"name": "HandleEvent:payment_intent.created", "version": "v1", "updatedAt": "2026-04-27T10:08:46.421Z"},
{"name": "HandleEvent:payment_intent.status_updated", "version": "v1", "updatedAt": "2026-04-27T10:08:46.421Z"}
]
}
]
}
Example: registering GetOrderById on REST
To register a capability (e.g., GetOrderById), you can use the following command:
curl --location --request PUT 'https://api.dojo.tech/epos/integrations/rest' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'software-house-id: my-place-curl' \
--header 'Authorization: Basic {{API_KEY}}' \
--data '{
"capabilities": [
{
"name": "GetOrderById",
"version": "v1"
}
],
"auth": {
"authType": "basic",
"basic": {
"username": "dojo",
"password": "password"
}
},
"url": "https://f815-86-22-100-52.ngrok-free.app/some/path/v1/orders/{orderID}"
}'
This command registers the GetOrderById capability on the REST adapter, making it accessible through the provided URL with basic authentication.
Example: registering capabilities for WebSockets
The WebSocket variant uses the same capabilities array but does not include auth or url — Dojo invokes the methods over the WebSocket connection your EPOS opens to wss://eu.ws.dojo.tech/epos.
curl --location --request PUT 'https://api.dojo.tech/epos/integrations/ws' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'software-house-id: my-place-curl' \
--header 'Authorization: Basic {{API_KEY}}' \
--data '{
"capabilities": [
{"name": "ListAreas", "version": "v1"},
{"name": "SearchTables", "version": "v1"},
{"name": "SearchOrders", "version": "v1"},
{"name": "GetOrderById", "version": "v1"},
{"name": "GetOrderBillById", "version": "v1"},
{"name": "CreateOrderLock", "version": "v1"},
{"name": "ExtendOrderLock", "version": "v1"},
{"name": "DeleteOrderLock", "version": "v1"},
{"name": "RecordOrderPaymentById", "version": "v1"},
{"name": "HandleEvent:payment_intent.created", "version": "v1"},
{"name": "HandleEvent:payment_intent.status_updated", "version": "v1"}
]
}'
Send the full list of capabilities you implement on every PUT — capabilities omitted from the body will not be routed to your EPOS until you re-register them.
Using the EPOS tester tool
The EPOS tester tool is used to verify your partner-hosted integration. Don't have access to the EPOS tester tool? Reach out to your Partnership Development Manager.
The API reference for the EPOS tester tool can be found here.
Once you have registered your capabilities, you can test the integration using the epos-tester-tool. This service allows you to test individual API methods or entire transaction flows. It’s designed to facilitate development by letting you trigger Dojo calls programmatically and verify their correctness in real-time.
For example, to list all available flows and their parameters, use the following request:
curl --location 'https://api.dojo.tech/epos-tester-tool/flows' \
--header 'Accept: application/json' \
--header 'software-house-id: my-place-curl' \
--header 'Authorization: Basic {{API_KEY}}'
One such flow is Get Order, which you can trigger using this command:
curl --location 'https://api.dojo.tech/epos-tester-tool/flows' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'software-house-id: my-place-curl' \
--header 'Authorization: Basic {{API_KEY}}' \
--data '{
"flow": "Get Order",
"params": {
"orderId": "testOrderID"
}
}'
The response is the bare flow ID as a quoted JSON string, for example:
"d00aa12a-7fb8-46a2-a22d-f4b560298353"
To check the status, run:
curl --location 'https://api.dojo.tech/epos-tester-tool/flows/d00aa12a-7fb8-46a2-a22d-f4b560298353' \
--header 'Accept: application/json' \
--header 'software-house-id: my-place-curl' \
--header 'Authorization: Basic {{API_KEY}}'
The response will detail the status of the flow and list every step it went through. If a capability like GetOrder was not registered, the response will indicate failure and suggest registering the method:
{
"finishedAt": "2024-09-19T15:03:23.529Z",
"flowID": "d00aa12a-7fb8-46a2-a22d-f4b560298353",
"flowName": "Get Order through EPOS Data API",
"startedAt": "2024-09-19T15:03:21.226Z",
"status": "FAILURE",
"steps": [
{
"additionalInformation": [
"GetOrder method not found",
"Please register the GetOrder method on an EPOS Data API adapter"
],
"finishedAt": "2024-09-19T15:03:23.524Z",
"name": "Check whether GetOrder has been registered",
"startedAt": "2024-09-19T15:03:21.51Z",
"status": "FAILURE"
}
]
}