{
    "item": [
        {
            "name": "System",
            "description": "API discovery and service information.",
            "item": [
                {
                    "name": "Get API status",
                    "request": {
                        "name": "Get API status",
                        "description": {
                            "content": "Returns the API identity and published major version.\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `name` | string | Yes | API product name. |\n| `version` | string | Yes | Published major API version. |\n| `status` | string | Yes | `available` means the API process is reachable. Allowed: `available` |\n| `documentation_url` | uri | Yes | Developer documentation URL for this environment. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                ""
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "GET",
                        "body": {},
                        "auth": null
                    },
                    "response": [
                        {
                            "name": "API status returned successfully.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        ""
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "OK",
                            "code": 200,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                }
                            ],
                            "body": "{\n  \"name\": \"TabSync API\",\n  \"version\": \"v1\",\n  \"status\": \"available\",\n  \"documentation_url\": \"https://dev.docs.tabsync.co.uk\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        ""
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        ""
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Returns the API identity and published major version.\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `name` | string | Yes | API product name. |\n| `version` | string | Yes | Published major API version. |\n| `status` | string | Yes | `available` means the API process is reachable. Allowed: `available` |\n| `documentation_url` | uri | Yes | Developer documentation URL for this environment. |",
                        "type": "text/markdown"
                    }
                }
            ]
        },
        {
            "name": "Authentication",
            "description": "Validate a Partner-provisioned API key and inspect its fixed access boundary.",
            "item": [
                {
                    "name": "Validate an API key",
                    "request": {
                        "name": "Validate an API key",
                        "description": {
                            "content": "Validates the opaque Bearer API key and returns its server-derived Offering,\nCustomer or Location boundary plus its sandbox/production environment. Use this\nendpoint as a non-mutating connectivity check after creating a key. The response\ncontains no secret or Customer business data and must not be cached.\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `api_key_id` | uuid | Yes | Safe key identifier for support. This is not the secret API key. |\n| `environment` | string | Yes | Environment fixed to this API key. Allowed: `sandbox`, `production` |\n| `scope` | object | Yes | Maximum boundary this API key can access. |\n| `scope.type` | string | Yes | Boundary type selected when the key was provisioned. Allowed: `offering`, `customer`, `location` |\n| `scope.id` | uuid | Yes | Boundary object ID selected when the key was provisioned. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "authentication"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "GET",
                        "body": {},
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The API key is valid and its access boundary is returned.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "authentication"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "OK",
                            "code": 200,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents storage of authentication-context responses.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"api_key_id\": \"0198a8f4-6578-76bf-b689-dcac02a5bb36\",\n  \"environment\": \"sandbox\",\n  \"scope\": {\n    \"type\": \"offering\",\n    \"id\": \"0198a8e3-5384-7c58-a4b8-4a21fbf1fc65\"\n  }\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "authentication"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "authentication"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "authentication"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Validates the opaque Bearer API key and returns its server-derived Offering,\nCustomer or Location boundary plus its sandbox/production environment. Use this\nendpoint as a non-mutating connectivity check after creating a key. The response\ncontains no secret or Customer business data and must not be cached.\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `api_key_id` | uuid | Yes | Safe key identifier for support. This is not the secret API key. |\n| `environment` | string | Yes | Environment fixed to this API key. Allowed: `sandbox`, `production` |\n| `scope` | object | Yes | Maximum boundary this API key can access. |\n| `scope.type` | string | Yes | Boundary type selected when the key was provisioned. Allowed: `offering`, `customer`, `location` |\n| `scope.id` | uuid | Yes | Boundary object ID selected when the key was provisioned. |",
                        "type": "text/markdown"
                    }
                }
            ]
        },
        {
            "name": "Partner directory",
            "description": "Discover active Customers, Locations and Areas visible to a Partner API key.",
            "item": [
                {
                    "name": "List scoped Customers",
                    "request": {
                        "name": "List scoped Customers",
                        "description": {
                            "content": "Returns active Customer records visible to the authenticated Partner API\nkey. The key's Offering, Customer or Location scope is always the maximum\naccess boundary; query filters can only narrow the result set. Use this\nendpoint to discover the `customer_id` values needed when mapping EPOS\nsetup data to TabSync.\n\n### Query parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `offering_id` | uuid | No | Return only Customers with at least one active Location assigned to this Offering. |\n| `customer_id` | uuid | No | Return a specific Customer when it is already inside the API-key boundary. |\n| `location_id` | uuid | No | Return only the Customer owning this active Location when it is inside the API-key boundary. |\n| `limit` | integer | No | Maximum number of Customers returned on this page. Default: `50` Range: 1–100 |\n| `cursor` | string | No | Opaque cursor returned as `next_cursor` by the previous page. Length: 1–2048 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `data` | array<object> | Yes | Customer records for this page. |\n| `data[].id` | uuid | Yes | TabSync Customer ID. Use this as `customer_id` when filtering directory requests. |\n| `data[].name` | string | Yes | Customer name held in TabSync. |\n| `data[].external_reference` | string / null | Yes | Partner-side Customer reference, when one was supplied in the portal. |\n| `data[].default_currency` | string | Yes | Default ISO 4217 currency for this Customer's Locations. Pattern: `^[A-Z]{3}$` |\n| `data[].status` | string | Yes | Directory responses currently expose only active Customers. Allowed: `active` |\n| `data[].created_at` | date-time | Yes | Time the Customer was created in TabSync. |\n| `data[].updated_at` | date-time | Yes | Time the Customer record last changed in TabSync. |\n| `next_cursor` | string / null | Yes | Opaque cursor for the next page, or `null` when no further records are available. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "customers"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return only Customers with at least one active Location assigned to this Offering.",
                                        "type": "text/plain"
                                    },
                                    "key": "offering_id",
                                    "value": "{{offeringId}}"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return a specific Customer when it is already inside the API-key boundary.",
                                        "type": "text/plain"
                                    },
                                    "key": "customer_id",
                                    "value": "{{customerId}}"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return only the Customer owning this active Location when it is inside the API-key boundary.",
                                        "type": "text/plain"
                                    },
                                    "key": "location_id",
                                    "value": "{{locationId}}"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Maximum number of Customers returned on this page.",
                                        "type": "text/plain"
                                    },
                                    "key": "limit",
                                    "value": "50"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                        "type": "text/plain"
                                    },
                                    "key": "cursor",
                                    "value": "{{directoryCursor}}"
                                }
                            ],
                            "variable": []
                        },
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "GET",
                        "body": {},
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The visible Customer records were returned.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "customers"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Customers with at least one active Location assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Customer when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only the Customer owning this active Location when it is inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Customers returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "OK",
                            "code": 200,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"data\": [\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3000\",\n      \"name\": \"Cafe Cappuccino\",\n      \"external_reference\": \"CAFE-CAPPUCCINO\",\n      \"default_currency\": \"GBP\",\n      \"status\": \"active\",\n      \"created_at\": \"2026-08-16T09:05:00+00:00\",\n      \"updated_at\": \"2026-08-16T09:05:00+00:00\"\n    }\n  ],\n  \"next_cursor\": null\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "customers"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Customers with at least one active Location assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Customer when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only the Customer owning this active Location when it is inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Customers returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "A filter, limit or cursor failed validation.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "customers"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Customers with at least one active Location assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Customer when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only the Customer owning this active Location when it is inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Customers returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
                            "code": 422,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "customers"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Customers with at least one active Location assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Customer when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only the Customer owning this active Location when it is inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Customers returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "customers"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Customers with at least one active Location assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Customer when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only the Customer owning this active Location when it is inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Customers returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "if (pm.response.code === 200) {",
                                    "  const body = pm.response.json();",
                                    "  if (Array.isArray(body.data) && body.data[0]) {",
                                    "    pm.environment.set('customerId', body.data[0].id);",
                                    "  }",
                                    "  if (body.next_cursor) {",
                                    "    pm.environment.set('directoryCursor', body.next_cursor);",
                                    "  }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Returns active Customer records visible to the authenticated Partner API\nkey. The key's Offering, Customer or Location scope is always the maximum\naccess boundary; query filters can only narrow the result set. Use this\nendpoint to discover the `customer_id` values needed when mapping EPOS\nsetup data to TabSync.\n\n### Query parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `offering_id` | uuid | No | Return only Customers with at least one active Location assigned to this Offering. |\n| `customer_id` | uuid | No | Return a specific Customer when it is already inside the API-key boundary. |\n| `location_id` | uuid | No | Return only the Customer owning this active Location when it is inside the API-key boundary. |\n| `limit` | integer | No | Maximum number of Customers returned on this page. Default: `50` Range: 1–100 |\n| `cursor` | string | No | Opaque cursor returned as `next_cursor` by the previous page. Length: 1–2048 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `data` | array<object> | Yes | Customer records for this page. |\n| `data[].id` | uuid | Yes | TabSync Customer ID. Use this as `customer_id` when filtering directory requests. |\n| `data[].name` | string | Yes | Customer name held in TabSync. |\n| `data[].external_reference` | string / null | Yes | Partner-side Customer reference, when one was supplied in the portal. |\n| `data[].default_currency` | string | Yes | Default ISO 4217 currency for this Customer's Locations. Pattern: `^[A-Z]{3}$` |\n| `data[].status` | string | Yes | Directory responses currently expose only active Customers. Allowed: `active` |\n| `data[].created_at` | date-time | Yes | Time the Customer was created in TabSync. |\n| `data[].updated_at` | date-time | Yes | Time the Customer record last changed in TabSync. |\n| `next_cursor` | string / null | Yes | Opaque cursor for the next page, or `null` when no further records are available. |",
                        "type": "text/markdown"
                    }
                },
                {
                    "name": "List scoped Locations",
                    "request": {
                        "name": "List scoped Locations",
                        "description": {
                            "content": "Returns active Locations visible to the authenticated Partner API key.\nEach Location includes its pinned active Offering Version so the ISV can\nchoose the correct `location_id` before posting an order. Query filters\nnever expand the key's fixed boundary.\n\n### Query parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `offering_id` | uuid | No | Return only Locations assigned to this Offering. |\n| `customer_id` | uuid | No | Return only Locations belonging to this Customer. |\n| `location_id` | uuid | No | Return a specific Location when it is already inside the API-key boundary. |\n| `limit` | integer | No | Maximum number of Locations returned on this page. Default: `50` Range: 1–100 |\n| `cursor` | string | No | Opaque cursor returned as `next_cursor` by the previous page. Length: 1–2048 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `data` | array<object> | Yes | Location records for this page. |\n| `data[].id` | uuid | Yes | TabSync Location ID. Send this as `location_id` when creating or replacing an order. |\n| `data[].customer_id` | uuid | Yes | Customer that owns this Location. |\n| `data[].name` | string | Yes | Location name shown in TabSync. |\n| `data[].external_reference` | string / null | Yes | Partner-side Location reference, when one was supplied in the portal. |\n| `data[].currency` | string | Yes | ISO 4217 currency. Order and payment currency must match this value. Pattern: `^[A-Z]{3}$` |\n| `data[].time_zone` | string | Yes | IANA time zone used for local operational views at this Location. |\n| `data[].status` | string | Yes | Directory responses currently expose only active Locations. Allowed: `active` |\n| `data[].offering` | object / null | Yes | Active Offering Version pinned to this Location, or `null` until configured. |\n| `data[].offering.id` | uuid | Yes | Offering ID. Use this as `offering_id` when filtering directory requests. |\n| `data[].offering.name` | string | Yes | Partner-defined Offering name. |\n| `data[].offering.version_id` | uuid | Yes | Exact Offering Version ID assigned to the Location. |\n| `data[].offering.version` | string | Yes | Human-readable Offering Version label. |\n| `data[].created_at` | date-time | Yes | Time the Location was created in TabSync. |\n| `data[].updated_at` | date-time | Yes | Time the Location record last changed in TabSync. |\n| `next_cursor` | string / null | Yes | Opaque cursor for the next page, or `null` when no further records are available. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "locations"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return only Locations assigned to this Offering.",
                                        "type": "text/plain"
                                    },
                                    "key": "offering_id",
                                    "value": "{{offeringId}}"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return only Locations belonging to this Customer.",
                                        "type": "text/plain"
                                    },
                                    "key": "customer_id",
                                    "value": "{{customerId}}"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return a specific Location when it is already inside the API-key boundary.",
                                        "type": "text/plain"
                                    },
                                    "key": "location_id",
                                    "value": "{{locationId}}"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Maximum number of Locations returned on this page.",
                                        "type": "text/plain"
                                    },
                                    "key": "limit",
                                    "value": "50"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                        "type": "text/plain"
                                    },
                                    "key": "cursor",
                                    "value": "{{directoryCursor}}"
                                }
                            ],
                            "variable": []
                        },
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "GET",
                        "body": {},
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The visible Location records were returned.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "locations"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Location when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Locations returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "OK",
                            "code": 200,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"data\": [\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3001\",\n      \"customer_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3000\",\n      \"name\": \"Cafe Cappuccino Guilsborough\",\n      \"external_reference\": \"CAFE-GUI\",\n      \"currency\": \"GBP\",\n      \"time_zone\": \"Europe/London\",\n      \"status\": \"active\",\n      \"offering\": {\n        \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3100\",\n        \"name\": \"Cafe Connect\",\n        \"version_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3101\",\n        \"version\": \"1.0\"\n      },\n      \"created_at\": \"2026-08-16T09:06:00+00:00\",\n      \"updated_at\": \"2026-08-16T09:06:00+00:00\"\n    }\n  ],\n  \"next_cursor\": null\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "locations"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Location when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Locations returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "A filter, limit or cursor failed validation.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "locations"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Location when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Locations returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
                            "code": 422,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "locations"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Location when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Locations returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "locations"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Locations belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return a specific Location when it is already inside the API-key boundary.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Locations returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "if (pm.response.code === 200) {",
                                    "  const body = pm.response.json();",
                                    "  if (Array.isArray(body.data) && body.data[0]) {",
                                    "    pm.environment.set('locationId', body.data[0].id);",
                                    "    pm.environment.set('customerId', body.data[0].customer_id);",
                                    "    if (body.data[0].offering && body.data[0].offering.id) {",
                                    "      pm.environment.set('offeringId', body.data[0].offering.id);",
                                    "    }",
                                    "  }",
                                    "  if (body.next_cursor) {",
                                    "    pm.environment.set('directoryCursor', body.next_cursor);",
                                    "  }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Returns active Locations visible to the authenticated Partner API key.\nEach Location includes its pinned active Offering Version so the ISV can\nchoose the correct `location_id` before posting an order. Query filters\nnever expand the key's fixed boundary.\n\n### Query parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `offering_id` | uuid | No | Return only Locations assigned to this Offering. |\n| `customer_id` | uuid | No | Return only Locations belonging to this Customer. |\n| `location_id` | uuid | No | Return a specific Location when it is already inside the API-key boundary. |\n| `limit` | integer | No | Maximum number of Locations returned on this page. Default: `50` Range: 1–100 |\n| `cursor` | string | No | Opaque cursor returned as `next_cursor` by the previous page. Length: 1–2048 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `data` | array<object> | Yes | Location records for this page. |\n| `data[].id` | uuid | Yes | TabSync Location ID. Send this as `location_id` when creating or replacing an order. |\n| `data[].customer_id` | uuid | Yes | Customer that owns this Location. |\n| `data[].name` | string | Yes | Location name shown in TabSync. |\n| `data[].external_reference` | string / null | Yes | Partner-side Location reference, when one was supplied in the portal. |\n| `data[].currency` | string | Yes | ISO 4217 currency. Order and payment currency must match this value. Pattern: `^[A-Z]{3}$` |\n| `data[].time_zone` | string | Yes | IANA time zone used for local operational views at this Location. |\n| `data[].status` | string | Yes | Directory responses currently expose only active Locations. Allowed: `active` |\n| `data[].offering` | object / null | Yes | Active Offering Version pinned to this Location, or `null` until configured. |\n| `data[].offering.id` | uuid | Yes | Offering ID. Use this as `offering_id` when filtering directory requests. |\n| `data[].offering.name` | string | Yes | Partner-defined Offering name. |\n| `data[].offering.version_id` | uuid | Yes | Exact Offering Version ID assigned to the Location. |\n| `data[].offering.version` | string | Yes | Human-readable Offering Version label. |\n| `data[].created_at` | date-time | Yes | Time the Location was created in TabSync. |\n| `data[].updated_at` | date-time | Yes | Time the Location record last changed in TabSync. |\n| `next_cursor` | string / null | Yes | Opaque cursor for the next page, or `null` when no further records are available. |",
                        "type": "text/markdown"
                    }
                },
                {
                    "name": "List scoped Areas",
                    "request": {
                        "name": "List scoped Areas",
                        "description": {
                            "content": "Returns active Areas visible to the authenticated Partner API key. Areas\nare the lowest setup level used by TabSync order ingestion; `POST /orders`\nrequires an `area_id` that belongs to the submitted `location_id` and to\nthe key's fixed access boundary.\n\n### Query parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `offering_id` | uuid | No | Return only Areas under Locations assigned to this Offering. |\n| `customer_id` | uuid | No | Return only Areas belonging to this Customer. |\n| `location_id` | uuid | No | Return only Areas belonging to this Location. |\n| `limit` | integer | No | Maximum number of Areas returned on this page. Default: `50` Range: 1–100 |\n| `cursor` | string | No | Opaque cursor returned as `next_cursor` by the previous page. Length: 1–2048 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `data` | array<object> | Yes | Area records for this page. |\n| `data[].id` | uuid | Yes | TabSync Area ID. Send this as `area_id` when creating or replacing an order. |\n| `data[].customer_id` | uuid | Yes | Customer that owns this Area. |\n| `data[].location_id` | uuid | Yes | Location that contains this Area. |\n| `data[].name` | string | Yes | Area name shown in TabSync. |\n| `data[].external_reference` | string / null | Yes | Partner-side Area reference, when one was supplied in the portal. |\n| `data[].status` | string | Yes | Directory responses currently expose only active Areas. Allowed: `active` |\n| `data[].display_order` | integer | Yes | Portal/app display ordering for Areas in the same Location. Range: 0–unbounded |\n| `data[].created_at` | date-time | Yes | Time the Area was created in TabSync. |\n| `data[].updated_at` | date-time | Yes | Time the Area record last changed in TabSync. |\n| `next_cursor` | string / null | Yes | Opaque cursor for the next page, or `null` when no further records are available. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "areas"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return only Areas under Locations assigned to this Offering.",
                                        "type": "text/plain"
                                    },
                                    "key": "offering_id",
                                    "value": "{{offeringId}}"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return only Areas belonging to this Customer.",
                                        "type": "text/plain"
                                    },
                                    "key": "customer_id",
                                    "value": "{{customerId}}"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Return only Areas belonging to this Location.",
                                        "type": "text/plain"
                                    },
                                    "key": "location_id",
                                    "value": "{{locationId}}"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Maximum number of Areas returned on this page.",
                                        "type": "text/plain"
                                    },
                                    "key": "limit",
                                    "value": "50"
                                },
                                {
                                    "disabled": true,
                                    "description": {
                                        "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                        "type": "text/plain"
                                    },
                                    "key": "cursor",
                                    "value": "{{directoryCursor}}"
                                }
                            ],
                            "variable": []
                        },
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "GET",
                        "body": {},
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The visible Area records were returned.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "areas"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas under Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Location.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Areas returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "OK",
                            "code": 200,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"data\": [\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3002\",\n      \"customer_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3000\",\n      \"location_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb3001\",\n      \"name\": \"Main area\",\n      \"external_reference\": \"MAIN\",\n      \"status\": \"active\",\n      \"display_order\": 0,\n      \"created_at\": \"2026-08-16T09:07:00+00:00\",\n      \"updated_at\": \"2026-08-16T09:07:00+00:00\"\n    }\n  ],\n  \"next_cursor\": null\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "areas"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas under Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Location.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Areas returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "A filter, limit or cursor failed validation.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "areas"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas under Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Location.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Areas returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
                            "code": 422,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "areas"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas under Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Location.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Areas returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "areas"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas under Locations assigned to this Offering.",
                                                "type": "text/plain"
                                            },
                                            "key": "offering_id",
                                            "value": "{{offeringId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Customer.",
                                                "type": "text/plain"
                                            },
                                            "key": "customer_id",
                                            "value": "{{customerId}}"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Return only Areas belonging to this Location.",
                                                "type": "text/plain"
                                            },
                                            "key": "location_id",
                                            "value": "{{locationId}}"
                                        },
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "Maximum number of Areas returned on this page.",
                                                "type": "text/plain"
                                            },
                                            "key": "limit",
                                            "value": "50"
                                        },
                                        {
                                            "disabled": true,
                                            "description": {
                                                "content": "Opaque cursor returned as `next_cursor` by the previous page.",
                                                "type": "text/plain"
                                            },
                                            "key": "cursor",
                                            "value": "{{directoryCursor}}"
                                        }
                                    ],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "if (pm.response.code === 200) {",
                                    "  const body = pm.response.json();",
                                    "  if (Array.isArray(body.data) && body.data[0]) {",
                                    "    pm.environment.set('areaId', body.data[0].id);",
                                    "    pm.environment.set('locationId', body.data[0].location_id);",
                                    "    pm.environment.set('customerId', body.data[0].customer_id);",
                                    "  }",
                                    "  if (body.next_cursor) {",
                                    "    pm.environment.set('directoryCursor', body.next_cursor);",
                                    "  }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Returns active Areas visible to the authenticated Partner API key. Areas\nare the lowest setup level used by TabSync order ingestion; `POST /orders`\nrequires an `area_id` that belongs to the submitted `location_id` and to\nthe key's fixed access boundary.\n\n### Query parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `offering_id` | uuid | No | Return only Areas under Locations assigned to this Offering. |\n| `customer_id` | uuid | No | Return only Areas belonging to this Customer. |\n| `location_id` | uuid | No | Return only Areas belonging to this Location. |\n| `limit` | integer | No | Maximum number of Areas returned on this page. Default: `50` Range: 1–100 |\n| `cursor` | string | No | Opaque cursor returned as `next_cursor` by the previous page. Length: 1–2048 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `data` | array<object> | Yes | Area records for this page. |\n| `data[].id` | uuid | Yes | TabSync Area ID. Send this as `area_id` when creating or replacing an order. |\n| `data[].customer_id` | uuid | Yes | Customer that owns this Area. |\n| `data[].location_id` | uuid | Yes | Location that contains this Area. |\n| `data[].name` | string | Yes | Area name shown in TabSync. |\n| `data[].external_reference` | string / null | Yes | Partner-side Area reference, when one was supplied in the portal. |\n| `data[].status` | string | Yes | Directory responses currently expose only active Areas. Allowed: `active` |\n| `data[].display_order` | integer | Yes | Portal/app display ordering for Areas in the same Location. Range: 0–unbounded |\n| `data[].created_at` | date-time | Yes | Time the Area was created in TabSync. |\n| `data[].updated_at` | date-time | Yes | Time the Area record last changed in TabSync. |\n| `next_cursor` | string / null | Yes | Opaque cursor for the next page, or `null` when no further records are available. |",
                        "type": "text/markdown"
                    }
                }
            ]
        },
        {
            "name": "Partner orders",
            "description": "Create, replace and poll TabSync's server-authoritative order and settlement projection.",
            "item": [
                {
                    "name": "Create Partner order projection",
                    "request": {
                        "name": "Create Partner order projection",
                        "description": {
                            "content": "Creates a new TabSync order projection for a Partner-supplied EPOS order.\nThe API key supplies the maximum Offering, Customer or Location boundary;\nthe submitted `location_id` and `area_id` must resolve inside that boundary.\nPartner, Customer, environment and pinned Offering Version are derived by\nTabSync and cannot be supplied or overridden by the caller.\n\nThe request may be total-only or itemised. When item lines are present,\ntheir gross `total_amount` values must add up to the order `amounts.total`.\n`status` may be `open` or `cancelled`; callers do not close an order by\nlabel. TabSync reports `closed` only when the settlement projection has no\npayable balance, normally after TabSync Device payments or\nPartner-reported external payments.\n\nThe endpoint is idempotent by `Idempotency-Key`. Retrying the exact same\nbody with the same key returns the same order projection and does not\ncreate another order. Reusing the key with different content returns\n`409`.\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `Idempotency-Key` | string | Yes | Partner-generated retry key for this order creation request. Length: 8–128 Pattern: `^[\\x21-\\x7E]+$` |\n\n### Request body fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `external_reference` | string | Yes | Case-sensitive EPOS order/check reference, unique within the Location. Length: 1–128 |\n| `location_id` | uuid | Yes | Location returned by `GET /locations`. The API key must allow this Location. |\n| `area_id` | uuid | Yes | Area returned by `GET /areas`. It must belong to the submitted Location. |\n| `table` | object / null | No | Optional table/check information. Omit or send `null` for counter, collection or takeaway orders. |\n| `table.reference` | string | Yes | Lookup value used by the app. Keep it stable for the life of the order. Length: 1–64 |\n| `table.display_name` | string / null | No | Friendly label shown to staff. If omitted, TabSync can display the reference. Length: 0–120 |\n| `status` | string | No | Source operational state. `closed` is not accepted here; TabSync derives closure from captured settlement. Allowed: `open`, `cancelled` Default: `open` |\n| `source_version` | string | Yes | Partner source revision for optimistic diagnostics and reconciliation. Length: 1–128 |\n| `currency` | string | Yes | Must match the Location currency. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Gross order amounts in minor units. |\n| `amounts.subtotal` | integer | Yes | Net/gross subtotal before tax, service charge and discount according to the Partner's model. Range: 0–100000000 |\n| `amounts.tax` | integer | Yes | Tax amount included in the order total. Range: 0–100000000 |\n| `amounts.service_charge` | integer | No | Service charge included in the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.discount` | integer | No | Discount deducted from the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.total` | integer | Yes | Total principal amount due before TabSync records any payments. Range: 0–100000000 |\n| `lines` | array<object> | No | Optional itemised lines. When present and non-empty, line external references must be unique within the payload and line gross totals must add up to `amounts.total`. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference, unique within this order payload. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name shown in the TabSync app. Length: 1–255 |\n| `lines[].quantity` | string | Yes | Positive decimal quantity with up to three decimal places. Pattern: `^[0-9]{1,7}(\\.[0-9]{1,3})?$` |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–100000000 |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. All line totals must add up to the order total. Range: 0–100000000 |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–100000000 |\n| `lines[].category` | string / null | No | Optional category shown in the TabSync app. Length: 0–120 |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `metadata` | object | No | Optional integration hints currently understood by TabSync. |\n| `metadata.covers` | integer | No | Number of covers/guests, when the EPOS has this value. Range: 1–999 |\n| `metadata.service_type` | string | No | Partner-defined service style such as `eat_in`, `takeaway` or `collection`. Length: 1–64 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "orders"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "header": [
                            {
                                "disabled": false,
                                "description": {
                                    "content": "(Required) Partner-generated retry key for this order creation request.",
                                    "type": "text/plain"
                                },
                                "key": "Idempotency-Key",
                                "value": "{{orderWriteIdempotencyKey}}"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "POST",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                            "options": {
                                "raw": {
                                    "headerFamily": "json",
                                    "language": "json"
                                }
                            }
                        },
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The order was created, or an identical idempotent retry returned the same projection.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order creation request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Created",
                            "code": 201,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Relative path for retrieving the created order.",
                                        "type": "text/plain"
                                    },
                                    "key": "Location",
                                    "value": "/v1/orders/0198cc42-5d34-71cb-a36e-7343b2bb1010"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Entity tag derived from the order ID and current TabSync order version.",
                                        "type": "text/plain"
                                    },
                                    "key": "ETag",
                                    "value": "\"order-0198cc42-5d34-71cb-a36e-7343b2bb1010-v1\""
                                }
                            ],
                            "body": "{\n  \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb1010\",\n  \"external_reference\": \"CC-GUI-1010\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"payment_status\": \"unpaid\",\n  \"source_version\": \"epos-1\",\n  \"version\": 1,\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930,\n    \"captured_principal\": 0,\n    \"captured_tip\": 0,\n    \"refunded_principal\": 0,\n    \"refunded_tip\": 0,\n    \"balance_due\": 930\n  },\n  \"lines\": [\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2010\",\n      \"external_reference\": \"CC-GUI-1010-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": 2,\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"paid_amount\": 0,\n      \"remaining_amount\": 650,\n      \"payment_status\": \"unpaid\",\n      \"category\": \"Coffee\"\n    },\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2011\",\n      \"external_reference\": \"CC-GUI-1010-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": 1,\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"paid_amount\": 0,\n      \"remaining_amount\": 280,\n      \"payment_status\": \"unpaid\",\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"payments\": [],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"settled_at\": null,\n  \"created_at\": \"2026-08-16T12:01:18+00:00\",\n  \"updated_at\": \"2026-08-16T12:01:18+00:00\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order creation request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The supplied Location or Area does not exist inside the authenticated API-key boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order creation request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Not Found",
                            "code": 404,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The idempotency key was reused, the order reference already exists, or a domain conflict prevents creation.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order creation request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Conflict",
                            "code": 409,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/order_reference_already_exists\",\n  \"title\": \"Order reference already exists\",\n  \"status\": 409,\n  \"detail\": \"An order with this external reference already exists for the Location.\",\n  \"instance\": \"urn:tabsync:request:req_0198cc43-f586-7f47-8bc1-2023700350c1\",\n  \"code\": \"order_reference_already_exists\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The order body or idempotency header failed validation.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order creation request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
                            "code": 422,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order creation request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": []
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order creation request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-1\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "if ([200, 201].includes(pm.response.code)) {",
                                    "  const body = pm.response.json();",
                                    "  if (body.id) {",
                                    "    pm.environment.set('orderId', body.id);",
                                    "  }",
                                    "}",
                                    "",
                                    "const etag = pm.response.headers.get('ETag');",
                                    "if (etag) {",
                                    "  pm.environment.set('orderIfMatch', etag);",
                                    "  pm.environment.set('orderIfNoneMatch', etag);",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Creates a new TabSync order projection for a Partner-supplied EPOS order.\nThe API key supplies the maximum Offering, Customer or Location boundary;\nthe submitted `location_id` and `area_id` must resolve inside that boundary.\nPartner, Customer, environment and pinned Offering Version are derived by\nTabSync and cannot be supplied or overridden by the caller.\n\nThe request may be total-only or itemised. When item lines are present,\ntheir gross `total_amount` values must add up to the order `amounts.total`.\n`status` may be `open` or `cancelled`; callers do not close an order by\nlabel. TabSync reports `closed` only when the settlement projection has no\npayable balance, normally after TabSync Device payments or\nPartner-reported external payments.\n\nThe endpoint is idempotent by `Idempotency-Key`. Retrying the exact same\nbody with the same key returns the same order projection and does not\ncreate another order. Reusing the key with different content returns\n`409`.\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `Idempotency-Key` | string | Yes | Partner-generated retry key for this order creation request. Length: 8–128 Pattern: `^[\\x21-\\x7E]+$` |\n\n### Request body fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `external_reference` | string | Yes | Case-sensitive EPOS order/check reference, unique within the Location. Length: 1–128 |\n| `location_id` | uuid | Yes | Location returned by `GET /locations`. The API key must allow this Location. |\n| `area_id` | uuid | Yes | Area returned by `GET /areas`. It must belong to the submitted Location. |\n| `table` | object / null | No | Optional table/check information. Omit or send `null` for counter, collection or takeaway orders. |\n| `table.reference` | string | Yes | Lookup value used by the app. Keep it stable for the life of the order. Length: 1–64 |\n| `table.display_name` | string / null | No | Friendly label shown to staff. If omitted, TabSync can display the reference. Length: 0–120 |\n| `status` | string | No | Source operational state. `closed` is not accepted here; TabSync derives closure from captured settlement. Allowed: `open`, `cancelled` Default: `open` |\n| `source_version` | string | Yes | Partner source revision for optimistic diagnostics and reconciliation. Length: 1–128 |\n| `currency` | string | Yes | Must match the Location currency. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Gross order amounts in minor units. |\n| `amounts.subtotal` | integer | Yes | Net/gross subtotal before tax, service charge and discount according to the Partner's model. Range: 0–100000000 |\n| `amounts.tax` | integer | Yes | Tax amount included in the order total. Range: 0–100000000 |\n| `amounts.service_charge` | integer | No | Service charge included in the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.discount` | integer | No | Discount deducted from the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.total` | integer | Yes | Total principal amount due before TabSync records any payments. Range: 0–100000000 |\n| `lines` | array<object> | No | Optional itemised lines. When present and non-empty, line external references must be unique within the payload and line gross totals must add up to `amounts.total`. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference, unique within this order payload. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name shown in the TabSync app. Length: 1–255 |\n| `lines[].quantity` | string | Yes | Positive decimal quantity with up to three decimal places. Pattern: `^[0-9]{1,7}(\\.[0-9]{1,3})?$` |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–100000000 |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. All line totals must add up to the order total. Range: 0–100000000 |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–100000000 |\n| `lines[].category` | string / null | No | Optional category shown in the TabSync app. Length: 0–120 |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `metadata` | object | No | Optional integration hints currently understood by TabSync. |\n| `metadata.covers` | integer | No | Number of covers/guests, when the EPOS has this value. Range: 1–999 |\n| `metadata.service_type` | string | No | Partner-defined service style such as `eat_in`, `takeaway` or `collection`. Length: 1–64 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                        "type": "text/markdown"
                    }
                },
                {
                    "name": "Get Partner order settlement projection",
                    "request": {
                        "name": "Get Partner order settlement projection",
                        "description": {
                            "content": "Returns TabSync's current view of one order inside the authenticated\nAPI key's fixed Offering, Customer or Location scope. Unknown order IDs\nand orders outside the API-key boundary return the same `404` response\nso a caller cannot enumerate another Partner's data.\n\n`status` and `payment_status` are TabSync-derived from the order total,\ncaptured principal payments and principal refunds. A Partner cannot close\nan order by label alone. If Partner-reported till payments or TabSync app\npayments cover or exceed the amount due, this response reports the order\nas `closed` and `paid`. If a later order update adds unpaid items or\notherwise increases the amount due, the same projection reports the order\nas `open` again until the new balance is covered.\n\nUse the returned `ETag` with `If-None-Match` when polling. A matching tag\nreturns `304 Not Modified` with no response body. Responses are never\ncacheable by intermediaries.\n\n### Path parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `order_id` | uuid | Yes | Opaque TabSync UUID. Do not parse or construct it client-side. |\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `If-None-Match` | string | No | Entity tag from a previous `GET /orders/{order_id}` response. |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "orders",
                                ":order_id"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "type": "any",
                                    "value": "{{orderId}}",
                                    "key": "order_id",
                                    "disabled": false,
                                    "description": {
                                        "content": "(Required) ",
                                        "type": "text/plain"
                                    }
                                }
                            ]
                        },
                        "header": [
                            {
                                "disabled": true,
                                "description": {
                                    "content": "Entity tag from a previous `GET /orders/{order_id}` response.",
                                    "type": "text/plain"
                                },
                                "key": "If-None-Match",
                                "value": "{{orderIfNoneMatch}}"
                            },
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "GET",
                        "body": {},
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The scoped order projection was returned.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": true,
                                        "description": {
                                            "content": "Entity tag from a previous `GET /orders/{order_id}` response.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-None-Match",
                                        "value": "{{orderIfNoneMatch}}"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "OK",
                            "code": 200,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Entity tag derived from the order ID and current TabSync order version.",
                                        "type": "text/plain"
                                    },
                                    "key": "ETag",
                                    "value": "\"order-0198cc42-5d34-71cb-a36e-7343b2bb1009-v2\""
                                }
                            ],
                            "body": "{\n  \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb1009\",\n  \"external_reference\": \"CC-GUI-1009\",\n  \"table\": {\n    \"reference\": \"9\",\n    \"display_name\": \"Table 9\"\n  },\n  \"status\": \"closed\",\n  \"payment_status\": \"paid\",\n  \"source_version\": \"epos-1\",\n  \"version\": 2,\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930,\n    \"captured_principal\": 930,\n    \"captured_tip\": 0,\n    \"refunded_principal\": 0,\n    \"refunded_tip\": 0,\n    \"balance_due\": 0\n  },\n  \"lines\": [\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2001\",\n      \"external_reference\": \"CC-GUI-1009-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": 2,\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"paid_amount\": 650,\n      \"remaining_amount\": 0,\n      \"payment_status\": \"paid\",\n      \"category\": \"Coffee\"\n    },\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2002\",\n      \"external_reference\": \"CC-GUI-1009-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": 1,\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"paid_amount\": 280,\n      \"remaining_amount\": 0,\n      \"payment_status\": \"paid\",\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"payments\": [\n    {\n      \"id\": \"0198cc43-15f8-7c2a-8f4b-6290eef1f001\",\n      \"source\": \"external\",\n      \"external_reference\": \"TILL-CARD-1009\",\n      \"method\": \"card\",\n      \"status\": \"captured\",\n      \"allocation_type\": \"full\",\n      \"currency\": \"GBP\",\n      \"amounts\": {\n        \"principal\": 930,\n        \"tip\": 0,\n        \"total\": 930\n      },\n      \"trust_level\": \"partner_reported\",\n      \"device\": null,\n      \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n      \"reported_at\": \"2026-08-16T12:15:05+00:00\",\n      \"created_at\": \"2026-08-16T12:15:05+00:00\",\n      \"allocations\": [\n        {\n          \"target_type\": \"order_line\",\n          \"order_line_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2001\",\n          \"principal_amount\": 650\n        },\n        {\n          \"target_type\": \"order_line\",\n          \"order_line_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2002\",\n          \"principal_amount\": 280\n        }\n      ]\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"settled_at\": \"2026-08-16T12:15:00+00:00\",\n  \"created_at\": \"2026-08-16T11:55:00+00:00\",\n  \"updated_at\": \"2026-08-16T12:15:05+00:00\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller's cached representation is still current. The response body is empty.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": true,
                                        "description": {
                                            "content": "Entity tag from a previous `GET /orders/{order_id}` response.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-None-Match",
                                        "value": "{{orderIfNoneMatch}}"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Not Modified",
                            "code": 304,
                            "header": [
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "ETag",
                                    "value": "\"order-0198cc42-5d34-71cb-a36e-7343b2bb1009-v2\""
                                }
                            ],
                            "cookie": [],
                            "_postman_previewlanguage": "text"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": true,
                                        "description": {
                                            "content": "Entity tag from a previous `GET /orders/{order_id}` response.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-None-Match",
                                        "value": "{{orderIfNoneMatch}}"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "No order exists inside the authenticated API-key boundary with that ID.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": true,
                                        "description": {
                                            "content": "Entity tag from a previous `GET /orders/{order_id}` response.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-None-Match",
                                        "value": "{{orderIfNoneMatch}}"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Not Found",
                            "code": 404,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": true,
                                        "description": {
                                            "content": "Entity tag from a previous `GET /orders/{order_id}` response.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-None-Match",
                                        "value": "{{orderIfNoneMatch}}"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": true,
                                        "description": {
                                            "content": "Entity tag from a previous `GET /orders/{order_id}` response.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-None-Match",
                                        "value": "{{orderIfNoneMatch}}"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "GET",
                                "body": {}
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "if ([200, 201].includes(pm.response.code)) {",
                                    "  const body = pm.response.json();",
                                    "  if (body.id) {",
                                    "    pm.environment.set('orderId', body.id);",
                                    "  }",
                                    "}",
                                    "",
                                    "const etag = pm.response.headers.get('ETag');",
                                    "if (etag) {",
                                    "  pm.environment.set('orderIfMatch', etag);",
                                    "  pm.environment.set('orderIfNoneMatch', etag);",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Returns TabSync's current view of one order inside the authenticated\nAPI key's fixed Offering, Customer or Location scope. Unknown order IDs\nand orders outside the API-key boundary return the same `404` response\nso a caller cannot enumerate another Partner's data.\n\n`status` and `payment_status` are TabSync-derived from the order total,\ncaptured principal payments and principal refunds. A Partner cannot close\nan order by label alone. If Partner-reported till payments or TabSync app\npayments cover or exceed the amount due, this response reports the order\nas `closed` and `paid`. If a later order update adds unpaid items or\notherwise increases the amount due, the same projection reports the order\nas `open` again until the new balance is covered.\n\nUse the returned `ETag` with `If-None-Match` when polling. A matching tag\nreturns `304 Not Modified` with no response body. Responses are never\ncacheable by intermediaries.\n\n### Path parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `order_id` | uuid | Yes | Opaque TabSync UUID. Do not parse or construct it client-side. |\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `If-None-Match` | string | No | Entity tag from a previous `GET /orders/{order_id}` response. |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                        "type": "text/markdown"
                    }
                },
                {
                    "name": "Replace Partner order projection",
                    "request": {
                        "name": "Replace Partner order projection",
                        "description": {
                            "content": "Replaces the current EPOS projection for an existing order. The caller\nsends the complete current payable projection rather than a partial patch,\nmaking amount and line replacement explicit.\n\n`If-Match` must contain the current order `ETag` returned by `GET`,\n`POST` or a previous `PUT`. Stale values return `412` with the current\norder version and ETag. `Idempotency-Key` protects the mutation from\nduplicate retries in the same way as `POST /orders`.\n\nThe replacement cannot move an order to another Location or Area. It\ncannot remove a line that already has payment allocations in the current\ndevelopment schema; adding new lines or increasing the total is supported.\nAfter the replacement is saved, TabSync recalculates the settlement\nprojection from captured principal payments. If the new total exceeds the\ncaptured principal, a previously closed order becomes open again.\n\n### Path parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `order_id` | uuid | Yes | Opaque TabSync UUID. Do not parse or construct it client-side. |\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `Idempotency-Key` | string | Yes | Partner-generated retry key for this order replacement request. Length: 8–128 Pattern: `^[\\x21-\\x7E]+$` |\n| `If-Match` | string | Yes | Current entity tag from the latest order representation. |\n\n### Request body fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `external_reference` | string | Yes | Case-sensitive EPOS order/check reference, unique within the Location. Length: 1–128 |\n| `location_id` | uuid | Yes | Location returned by `GET /locations`. The API key must allow this Location. |\n| `area_id` | uuid | Yes | Area returned by `GET /areas`. It must belong to the submitted Location. |\n| `table` | object / null | No | Optional table/check information. Omit or send `null` for counter, collection or takeaway orders. |\n| `table.reference` | string | Yes | Lookup value used by the app. Keep it stable for the life of the order. Length: 1–64 |\n| `table.display_name` | string / null | No | Friendly label shown to staff. If omitted, TabSync can display the reference. Length: 0–120 |\n| `status` | string | No | Source operational state. `closed` is not accepted here; TabSync derives closure from captured settlement. Allowed: `open`, `cancelled` Default: `open` |\n| `source_version` | string | Yes | Partner source revision for optimistic diagnostics and reconciliation. Length: 1–128 |\n| `currency` | string | Yes | Must match the Location currency. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Gross order amounts in minor units. |\n| `amounts.subtotal` | integer | Yes | Net/gross subtotal before tax, service charge and discount according to the Partner's model. Range: 0–100000000 |\n| `amounts.tax` | integer | Yes | Tax amount included in the order total. Range: 0–100000000 |\n| `amounts.service_charge` | integer | No | Service charge included in the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.discount` | integer | No | Discount deducted from the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.total` | integer | Yes | Total principal amount due before TabSync records any payments. Range: 0–100000000 |\n| `lines` | array<object> | No | Optional itemised lines. When present and non-empty, line external references must be unique within the payload and line gross totals must add up to `amounts.total`. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference, unique within this order payload. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name shown in the TabSync app. Length: 1–255 |\n| `lines[].quantity` | string | Yes | Positive decimal quantity with up to three decimal places. Pattern: `^[0-9]{1,7}(\\.[0-9]{1,3})?$` |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–100000000 |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. All line totals must add up to the order total. Range: 0–100000000 |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–100000000 |\n| `lines[].category` | string / null | No | Optional category shown in the TabSync app. Length: 0–120 |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `metadata` | object | No | Optional integration hints currently understood by TabSync. |\n| `metadata.covers` | integer | No | Number of covers/guests, when the EPOS has this value. Range: 1–999 |\n| `metadata.service_type` | string | No | Partner-defined service style such as `eat_in`, `takeaway` or `collection`. Length: 1–64 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "orders",
                                ":order_id"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "type": "any",
                                    "value": "{{orderId}}",
                                    "key": "order_id",
                                    "disabled": false,
                                    "description": {
                                        "content": "(Required) ",
                                        "type": "text/plain"
                                    }
                                }
                            ]
                        },
                        "header": [
                            {
                                "disabled": false,
                                "description": {
                                    "content": "(Required) Partner-generated retry key for this order replacement request.",
                                    "type": "text/plain"
                                },
                                "key": "Idempotency-Key",
                                "value": "{{orderWriteIdempotencyKey}}"
                            },
                            {
                                "disabled": false,
                                "description": {
                                    "content": "(Required) Current entity tag from the latest order representation.",
                                    "type": "text/plain"
                                },
                                "key": "If-Match",
                                "value": "{{orderIfMatch}}"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "PUT",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                            "options": {
                                "raw": {
                                    "headerFamily": "json",
                                    "language": "json"
                                }
                            }
                        },
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The order projection was replaced, or an identical idempotent retry returned the same projection.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Entity tag for the updated order projection.",
                                        "type": "text/plain"
                                    },
                                    "key": "ETag",
                                    "value": "\"order-0198cc42-5d34-71cb-a36e-7343b2bb1010-v3\""
                                }
                            ],
                            "body": "{\n  \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb1010\",\n  \"external_reference\": \"CC-GUI-1010\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"payment_status\": \"unpaid\",\n  \"source_version\": \"epos-1\",\n  \"version\": 1,\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930,\n    \"captured_principal\": 0,\n    \"captured_tip\": 0,\n    \"refunded_principal\": 0,\n    \"refunded_tip\": 0,\n    \"balance_due\": 930\n  },\n  \"lines\": [\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2010\",\n      \"external_reference\": \"CC-GUI-1010-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": 2,\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"paid_amount\": 0,\n      \"remaining_amount\": 650,\n      \"payment_status\": \"unpaid\",\n      \"category\": \"Coffee\"\n    },\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2011\",\n      \"external_reference\": \"CC-GUI-1010-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": 1,\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"paid_amount\": 0,\n      \"remaining_amount\": 280,\n      \"payment_status\": \"unpaid\",\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"payments\": [],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"settled_at\": null,\n  \"created_at\": \"2026-08-16T12:01:18+00:00\",\n  \"updated_at\": \"2026-08-16T12:01:18+00:00\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "No order exists inside the authenticated API-key boundary with that ID.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Not Found",
                            "code": 404,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The idempotency key was reused, the order is locked for payment, or a line with payment allocations would be removed.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Conflict",
                            "code": 409,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/order_locked_for_payment\",\n  \"title\": \"Order is locked for payment\",\n  \"status\": 409,\n  \"detail\": \"The payable order cannot be replaced while a payment attempt is active.\",\n  \"instance\": \"urn:tabsync:request:req_0198cc43-f586-7f47-8bc1-2023700350c3\",\n  \"code\": \"order_locked_for_payment\",\n  \"retryable\": true\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The supplied `If-Match` does not match the current order version.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Precondition Failed",
                            "code": 412,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/version_conflict\",\n  \"title\": \"Order version changed\",\n  \"status\": 412,\n  \"detail\": \"Retrieve the current order projection and retry with its ETag.\",\n  \"instance\": \"urn:tabsync:request:req_0198cc43-f586-7f47-8bc1-2023700350c4\",\n  \"code\": \"version_conflict\",\n  \"order_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb1010\",\n  \"current_version\": 3,\n  \"current_etag\": \"\\\"order-0198cc42-5d34-71cb-a36e-7343b2bb1010-v3\\\"\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The replacement body, idempotency header or `If-Match` header failed validation.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
                            "code": 422,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this order replacement request.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{orderWriteIdempotencyKey}}"
                                    },
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Current entity tag from the latest order representation.",
                                            "type": "text/plain"
                                        },
                                        "key": "If-Match",
                                        "value": "{{orderIfMatch}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "PUT",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"external_reference\": \"{{orderExternalReference}}\",\n  \"location_id\": \"{{locationId}}\",\n  \"area_id\": \"{{areaId}}\",\n  \"table\": {\n    \"reference\": \"14\",\n    \"display_name\": \"Table 14\"\n  },\n  \"status\": \"open\",\n  \"source_version\": \"epos-2\",\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 1046,\n    \"tax\": 209,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 1255\n  },\n  \"lines\": [\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": \"2\",\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"category\": \"Coffee\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"category\": \"Bakery\"\n    },\n    {\n      \"external_reference\": \"{{orderExternalReference}}-L3\",\n      \"name\": \"Millionaire shortbread\",\n      \"quantity\": \"1\",\n      \"unit_amount\": 325,\n      \"total_amount\": 325,\n      \"tax_amount\": 54,\n      \"category\": \"Cake\"\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"metadata\": {\n    \"covers\": 2,\n    \"service_type\": \"eat_in\"\n  }\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "if ([200, 201].includes(pm.response.code)) {",
                                    "  const body = pm.response.json();",
                                    "  if (body.id) {",
                                    "    pm.environment.set('orderId', body.id);",
                                    "  }",
                                    "}",
                                    "",
                                    "const etag = pm.response.headers.get('ETag');",
                                    "if (etag) {",
                                    "  pm.environment.set('orderIfMatch', etag);",
                                    "  pm.environment.set('orderIfNoneMatch', etag);",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Replaces the current EPOS projection for an existing order. The caller\nsends the complete current payable projection rather than a partial patch,\nmaking amount and line replacement explicit.\n\n`If-Match` must contain the current order `ETag` returned by `GET`,\n`POST` or a previous `PUT`. Stale values return `412` with the current\norder version and ETag. `Idempotency-Key` protects the mutation from\nduplicate retries in the same way as `POST /orders`.\n\nThe replacement cannot move an order to another Location or Area. It\ncannot remove a line that already has payment allocations in the current\ndevelopment schema; adding new lines or increasing the total is supported.\nAfter the replacement is saved, TabSync recalculates the settlement\nprojection from captured principal payments. If the new total exceeds the\ncaptured principal, a previously closed order becomes open again.\n\n### Path parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `order_id` | uuid | Yes | Opaque TabSync UUID. Do not parse or construct it client-side. |\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `Idempotency-Key` | string | Yes | Partner-generated retry key for this order replacement request. Length: 8–128 Pattern: `^[\\x21-\\x7E]+$` |\n| `If-Match` | string | Yes | Current entity tag from the latest order representation. |\n\n### Request body fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `external_reference` | string | Yes | Case-sensitive EPOS order/check reference, unique within the Location. Length: 1–128 |\n| `location_id` | uuid | Yes | Location returned by `GET /locations`. The API key must allow this Location. |\n| `area_id` | uuid | Yes | Area returned by `GET /areas`. It must belong to the submitted Location. |\n| `table` | object / null | No | Optional table/check information. Omit or send `null` for counter, collection or takeaway orders. |\n| `table.reference` | string | Yes | Lookup value used by the app. Keep it stable for the life of the order. Length: 1–64 |\n| `table.display_name` | string / null | No | Friendly label shown to staff. If omitted, TabSync can display the reference. Length: 0–120 |\n| `status` | string | No | Source operational state. `closed` is not accepted here; TabSync derives closure from captured settlement. Allowed: `open`, `cancelled` Default: `open` |\n| `source_version` | string | Yes | Partner source revision for optimistic diagnostics and reconciliation. Length: 1–128 |\n| `currency` | string | Yes | Must match the Location currency. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Gross order amounts in minor units. |\n| `amounts.subtotal` | integer | Yes | Net/gross subtotal before tax, service charge and discount according to the Partner's model. Range: 0–100000000 |\n| `amounts.tax` | integer | Yes | Tax amount included in the order total. Range: 0–100000000 |\n| `amounts.service_charge` | integer | No | Service charge included in the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.discount` | integer | No | Discount deducted from the payable total. Defaults to `0`. Default: `0` Range: 0–100000000 |\n| `amounts.total` | integer | Yes | Total principal amount due before TabSync records any payments. Range: 0–100000000 |\n| `lines` | array<object> | No | Optional itemised lines. When present and non-empty, line external references must be unique within the payload and line gross totals must add up to `amounts.total`. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference, unique within this order payload. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name shown in the TabSync app. Length: 1–255 |\n| `lines[].quantity` | string | Yes | Positive decimal quantity with up to three decimal places. Pattern: `^[0-9]{1,7}(\\.[0-9]{1,3})?$` |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–100000000 |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. All line totals must add up to the order total. Range: 0–100000000 |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–100000000 |\n| `lines[].category` | string / null | No | Optional category shown in the TabSync app. Length: 0–120 |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `metadata` | object | No | Optional integration hints currently understood by TabSync. |\n| `metadata.covers` | integer | No | Number of covers/guests, when the EPOS has this value. Range: 1–999 |\n| `metadata.service_type` | string | No | Partner-defined service style such as `eat_in`, `takeaway` or `collection`. Length: 1–64 |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                        "type": "text/markdown"
                    }
                }
            ]
        },
        {
            "name": "Partner payments",
            "description": "Report settlement that happened outside a TabSync device, such as a till payment.",
            "item": [
                {
                    "name": "Record Partner-reported external payment",
                    "request": {
                        "name": "Record Partner-reported external payment",
                        "description": {
                            "content": "Records captured settlement evidence for money taken outside TabSync,\nsuch as a payment at the till. The endpoint does not accept a `closed`\nflag. TabSync adds the captured principal to the order ledger and then\nrecalculates the order status from the financial projection.\n\nThe API key must be allowed to access the order through its Offering,\nCustomer or Location scope. The request is idempotent by\n`Idempotency-Key`: retrying the same body with the same key returns the\nexisting recorded payment projection, while reusing the key with a\ndifferent body returns `409`.\n\n`principal_amount` contributes to order settlement. `tip_amount` is\nrecorded for reconciliation but does not reduce the order balance.\n\n### Path parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `order_id` | uuid | Yes | Opaque TabSync UUID. Do not parse or construct it client-side. |\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `Idempotency-Key` | string | Yes | Partner-generated retry key for this external payment report. Length: 8–128 Pattern: `^[\\x21-\\x7E]+$` |\n\n### Request body fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `payment_reference` | string | Yes | Partner-side payment identifier used for reconciliation. It is not a secret. Length: 1–128 |\n| `payment_method` | string | Yes | Payment method reported by the Partner for settlement taken outside TabSync. Allowed: `cash`, `card`, `other` |\n| `currency` | string | Yes | Must match the order currency. Pattern: `^[A-Z]{3}$` |\n| `principal_amount` | integer | Yes | Amount that settles the order balance, in the order currency's minor unit. Range: 1–100000000 |\n| `tip_amount` | integer | No | Optional gratuity amount recorded for reconciliation. It does not reduce the order balance. Default: `0` Range: 0–1000000 |\n| `captured_at` | date-time | No | Time the external system captured the payment. If omitted, TabSync records the report time. |\n| `reported_at` | date-time | No | Time the Partner system reported the payment to TabSync. Usually omit this unless replaying known historical evidence. |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                            "type": "text/markdown"
                        },
                        "url": {
                            "path": [
                                "orders",
                                ":order_id",
                                "external-payments"
                            ],
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "type": "any",
                                    "value": "{{orderId}}",
                                    "key": "order_id",
                                    "disabled": false,
                                    "description": {
                                        "content": "(Required) ",
                                        "type": "text/plain"
                                    }
                                }
                            ]
                        },
                        "header": [
                            {
                                "disabled": false,
                                "description": {
                                    "content": "(Required) Partner-generated retry key for this external payment report.",
                                    "type": "text/plain"
                                },
                                "key": "Idempotency-Key",
                                "value": "{{externalPaymentIdempotencyKey}}"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "method": "POST",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                            "options": {
                                "raw": {
                                    "headerFamily": "json",
                                    "language": "json"
                                }
                            }
                        },
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{bearerToken}}"
                                }
                            ]
                        }
                    },
                    "response": [
                        {
                            "name": "The external payment was recorded or an identical idempotent retry returned the same order projection.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id",
                                        "external-payments"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this external payment report.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{externalPaymentIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Created",
                            "code": 201,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Entity tag for the updated order projection.",
                                        "type": "text/plain"
                                    },
                                    "key": "ETag",
                                    "value": "\"order-0198cc42-5d34-71cb-a36e-7343b2bb1009-v2\""
                                }
                            ],
                            "body": "{\n  \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb1009\",\n  \"external_reference\": \"CC-GUI-1009\",\n  \"table\": {\n    \"reference\": \"9\",\n    \"display_name\": \"Table 9\"\n  },\n  \"status\": \"closed\",\n  \"payment_status\": \"paid\",\n  \"source_version\": \"epos-1\",\n  \"version\": 2,\n  \"currency\": \"GBP\",\n  \"amounts\": {\n    \"subtotal\": 775,\n    \"tax\": 155,\n    \"service_charge\": 0,\n    \"discount\": 0,\n    \"total\": 930,\n    \"captured_principal\": 930,\n    \"captured_tip\": 0,\n    \"refunded_principal\": 0,\n    \"refunded_tip\": 0,\n    \"balance_due\": 0\n  },\n  \"lines\": [\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2001\",\n      \"external_reference\": \"CC-GUI-1009-L1\",\n      \"name\": \"Flat white\",\n      \"quantity\": 2,\n      \"unit_amount\": 325,\n      \"total_amount\": 650,\n      \"tax_amount\": 108,\n      \"paid_amount\": 650,\n      \"remaining_amount\": 0,\n      \"payment_status\": \"paid\",\n      \"category\": \"Coffee\"\n    },\n    {\n      \"id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2002\",\n      \"external_reference\": \"CC-GUI-1009-L2\",\n      \"name\": \"Pain au chocolat\",\n      \"quantity\": 1,\n      \"unit_amount\": 280,\n      \"total_amount\": 280,\n      \"tax_amount\": 47,\n      \"paid_amount\": 280,\n      \"remaining_amount\": 0,\n      \"payment_status\": \"paid\",\n      \"category\": \"Bakery\"\n    }\n  ],\n  \"payments\": [\n    {\n      \"id\": \"0198cc43-15f8-7c2a-8f4b-6290eef1f001\",\n      \"source\": \"external\",\n      \"external_reference\": \"TILL-CARD-1009\",\n      \"method\": \"card\",\n      \"status\": \"captured\",\n      \"allocation_type\": \"full\",\n      \"currency\": \"GBP\",\n      \"amounts\": {\n        \"principal\": 930,\n        \"tip\": 0,\n        \"total\": 930\n      },\n      \"trust_level\": \"partner_reported\",\n      \"device\": null,\n      \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n      \"reported_at\": \"2026-08-16T12:15:05+00:00\",\n      \"created_at\": \"2026-08-16T12:15:05+00:00\",\n      \"allocations\": [\n        {\n          \"target_type\": \"order_line\",\n          \"order_line_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2001\",\n          \"principal_amount\": 650\n        },\n        {\n          \"target_type\": \"order_line\",\n          \"order_line_id\": \"0198cc42-5d34-71cb-a36e-7343b2bb2002\",\n          \"principal_amount\": 280\n        }\n      ]\n    }\n  ],\n  \"opened_at\": \"2026-08-16T11:55:00+00:00\",\n  \"settled_at\": \"2026-08-16T12:15:00+00:00\",\n  \"created_at\": \"2026-08-16T11:55:00+00:00\",\n  \"updated_at\": \"2026-08-16T12:15:05+00:00\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The API key is missing, malformed, revoked or outside its active access boundary.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id",
                                        "external-payments"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this external payment report.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{externalPaymentIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Unauthorized",
                            "code": 401,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Identifies the required bearer authentication scheme.",
                                        "type": "text/plain"
                                    },
                                    "key": "WWW-Authenticate",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/authentication_required\",\n  \"title\": \"Authentication required\",\n  \"status\": 401,\n  \"detail\": \"Provide a TabSync API key in the Authorization Bearer header.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"authentication_required\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "No order exists inside the authenticated API-key boundary with that ID.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id",
                                        "external-payments"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this external payment report.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{externalPaymentIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Not Found",
                            "code": 404,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The idempotency key was reused with different content or the order has no outstanding payable balance.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id",
                                        "external-payments"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this external payment report.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{externalPaymentIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Conflict",
                            "code": 409,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/order_not_payable\",\n  \"title\": \"Order is not payable\",\n  \"status\": 409,\n  \"detail\": \"The order has no outstanding payable balance.\",\n  \"instance\": \"urn:tabsync:request:req_0198cc43-f586-7f47-8bc1-2023700350b5\",\n  \"code\": \"order_not_payable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The payment body or idempotency header failed validation.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id",
                                        "external-payments"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this external payment report.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{externalPaymentIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
                            "code": 422,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                }
                            ],
                            "body": "{\n  \"type\": \"http://reytLNHkesBAzxcCqmjPBIXCzuC.cfcjfVFmE1ICb,7MnVIiAEXR0QRsNN--wAob0xOOOdCa+0jp6ll.gAgVUPf3BtaU3C\",\n  \"title\": \"string\",\n  \"status\": 516,\n  \"detail\": \"string\",\n  \"instance\": \"http://YDwwimKjkkGNkwlsxw.larC+qP.Ab3ZrVc5HYJt+TRBBM1af,D2L9Vg+LSDlNPoB,pr,YAJcMwC\",\n  \"code\": \"no3qxf\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "The caller exceeded an applicable request limit.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id",
                                        "external-payments"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this external payment report.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{externalPaymentIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Too Many Requests",
                            "code": 429,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/rate_limit_exceeded\",\n  \"title\": \"Rate limit exceeded\",\n  \"status\": 429,\n  \"detail\": \"Wait before trying the request again.\",\n  \"instance\": \"urn:tabsync:request:req_0198b6f0-59c0-7c12-9b92-cb6e7f6cbf07\",\n  \"code\": \"rate_limit_exceeded\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        },
                        {
                            "name": "TabSync cannot currently reach a required dependency. The request has not completed and may be retried.",
                            "originalRequest": {
                                "url": {
                                    "path": [
                                        "orders",
                                        ":order_id",
                                        "external-payments"
                                    ],
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "query": [],
                                    "variable": [
                                        {
                                            "disabled": false,
                                            "description": {
                                                "content": "(Required) ",
                                                "type": "text/plain"
                                            },
                                            "type": "any",
                                            "value": "{{orderId}}",
                                            "key": "order_id"
                                        }
                                    ]
                                },
                                "header": [
                                    {
                                        "disabled": false,
                                        "description": {
                                            "content": "(Required) Partner-generated retry key for this external payment report.",
                                            "type": "text/plain"
                                        },
                                        "key": "Idempotency-Key",
                                        "value": "{{externalPaymentIdempotencyKey}}"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Accept",
                                        "value": "application/problem+json"
                                    },
                                    {
                                        "description": {
                                            "content": "Added as a part of security scheme: bearer",
                                            "type": "text/plain"
                                        },
                                        "key": "Authorization",
                                        "value": "Bearer <token>"
                                    }
                                ],
                                "method": "POST",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n  \"payment_reference\": \"{{externalPaymentReference}}\",\n  \"payment_method\": \"card\",\n  \"currency\": \"GBP\",\n  \"principal_amount\": 930,\n  \"tip_amount\": 0,\n  \"captured_at\": \"2026-08-16T12:15:00+00:00\",\n  \"reported_at\": \"2026-08-16T12:15:05+00:00\"\n}\n",
                                    "options": {
                                        "raw": {
                                            "headerFamily": "json",
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "Service Unavailable",
                            "code": 503,
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/problem+json"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "",
                                        "type": "text/plain"
                                    },
                                    "key": "X-Request-Id",
                                    "value": ""
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Minimum number of seconds the caller should wait before retrying.",
                                        "type": "text/plain"
                                    },
                                    "key": "Retry-After",
                                    "value": "60"
                                },
                                {
                                    "disabled": false,
                                    "description": {
                                        "content": "Prevents an intermediary or client from retaining the temporary failure.",
                                        "type": "text/plain"
                                    },
                                    "key": "Cache-Control",
                                    "value": "string"
                                }
                            ],
                            "body": "{\n  \"type\": \"https://docs.tabsync.co.uk/problems/service_unavailable\",\n  \"title\": \"Service temporarily unavailable\",\n  \"status\": 503,\n  \"detail\": \"A required service is currently unavailable. Try again shortly.\",\n  \"instance\": \"urn:tabsync:request:req_0198b912-dfe8-78c7-a1b8-3d36eec1ee7c\",\n  \"code\": \"service_unavailable\"\n}",
                            "cookie": [],
                            "_postman_previewlanguage": "json"
                        }
                    ],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "if ([200, 201].includes(pm.response.code)) {",
                                    "  const body = pm.response.json();",
                                    "  if (body.id) {",
                                    "    pm.environment.set('orderId', body.id);",
                                    "  }",
                                    "}",
                                    "",
                                    "const etag = pm.response.headers.get('ETag');",
                                    "if (etag) {",
                                    "  pm.environment.set('orderIfMatch', etag);",
                                    "  pm.environment.set('orderIfNoneMatch', etag);",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "protocolProfileBehavior": {
                        "disableBodyPruning": true
                    },
                    "description": {
                        "content": "Records captured settlement evidence for money taken outside TabSync,\nsuch as a payment at the till. The endpoint does not accept a `closed`\nflag. TabSync adds the captured principal to the order ledger and then\nrecalculates the order status from the financial projection.\n\nThe API key must be allowed to access the order through its Offering,\nCustomer or Location scope. The request is idempotent by\n`Idempotency-Key`: retrying the same body with the same key returns the\nexisting recorded payment projection, while reusing the key with a\ndifferent body returns `409`.\n\n`principal_amount` contributes to order settlement. `tip_amount` is\nrecorded for reconciliation but does not reduce the order balance.\n\n### Path parameters\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `order_id` | uuid | Yes | Opaque TabSync UUID. Do not parse or construct it client-side. |\n\n### Headers\n\n| Name | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `Idempotency-Key` | string | Yes | Partner-generated retry key for this external payment report. Length: 8–128 Pattern: `^[\\x21-\\x7E]+$` |\n\n### Request body fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `payment_reference` | string | Yes | Partner-side payment identifier used for reconciliation. It is not a secret. Length: 1–128 |\n| `payment_method` | string | Yes | Payment method reported by the Partner for settlement taken outside TabSync. Allowed: `cash`, `card`, `other` |\n| `currency` | string | Yes | Must match the order currency. Pattern: `^[A-Z]{3}$` |\n| `principal_amount` | integer | Yes | Amount that settles the order balance, in the order currency's minor unit. Range: 1–100000000 |\n| `tip_amount` | integer | No | Optional gratuity amount recorded for reconciliation. It does not reduce the order balance. Default: `0` Range: 0–1000000 |\n| `captured_at` | date-time | No | Time the external system captured the payment. If omitted, TabSync records the report time. |\n| `reported_at` | date-time | No | Time the Partner system reported the payment to TabSync. Usually omit this unless replaying known historical evidence. |\n\n### Success response fields\n\n| Field | Type | Required | Notes |\n| --- | --- | --- | --- |\n| `id` | uuid | Yes | TabSync Order ID used for polling, replacement and external-payment reports. |\n| `external_reference` | string | Yes | Partner-side order/check reference supplied on the latest write. Length: 1–128 |\n| `table` | object / null | Yes | Table/check information supplied by the Partner, or `null` when none was supplied. |\n| `table.reference` | string | Yes | Partner table lookup value. Length: 1–64 |\n| `table.display_name` | string / null | Yes | Friendly table/check label shown in TabSync. Length: 0–120 |\n| `status` | string | Yes | TabSync-derived operational status. `closed` means the financial projection has no balance due. Allowed: `open`, `closed`, `cancelled` |\n| `payment_status` | string | Yes | TabSync-derived payment state based on captured principal, refunds and the current order total. Allowed: `unpaid`, `partially_paid`, `paid`, `partially_refunded`, `refunded` |\n| `source_version` | string | Yes | Latest Partner-supplied source revision held by TabSync for this order. Length: 1–128 |\n| `version` | integer | Yes | TabSync order version incremented when the held projection changes. Range: 1–unbounded |\n| `currency` | string | Yes | ISO 4217 currency for all monetary fields on this order. Pattern: `^[A-Z]{3}$` |\n| `amounts` | object | Yes | Current financial projection in minor units. |\n| `amounts.subtotal` | integer | Yes | Current order subtotal supplied by the Partner. Range: 0–unbounded |\n| `amounts.tax` | integer | Yes | Current tax amount supplied by the Partner. Range: 0–unbounded |\n| `amounts.service_charge` | integer | Yes | Current service charge supplied by the Partner. Range: 0–unbounded |\n| `amounts.discount` | integer | Yes | Current discount supplied by the Partner. Range: 0–unbounded |\n| `amounts.total` | integer | Yes | Current principal amount due before captured payments and refunds. Range: 0–unbounded |\n| `amounts.captured_principal` | integer | Yes | Captured amount that reduces the order balance. Range: 0–unbounded |\n| `amounts.captured_tip` | integer | Yes | Captured gratuity recorded for reconciliation. It does not reduce the order balance. Range: 0–unbounded |\n| `amounts.refunded_principal` | integer | Yes | Principal already refunded. Range: 0–unbounded |\n| `amounts.refunded_tip` | integer | Yes | Tip already refunded. Range: 0–unbounded |\n| `amounts.balance_due` | integer | Yes | Remaining principal due. `0` means TabSync considers the current order projection paid. Range: 0–unbounded |\n| `lines` | array<object> | Yes | Current itemised lines held by TabSync. Empty when the Partner posted a total-only order. |\n| `lines[].id` | uuid | Yes | TabSync line ID used in payment allocation responses. |\n| `lines[].external_reference` | string | Yes | Partner-side line reference supplied in the order write. Length: 1–128 |\n| `lines[].name` | string | Yes | Item name supplied by the Partner. Length: 1–255 |\n| `lines[].quantity` | number | Yes | Quantity supplied by the Partner. Range: 0.001–unbounded |\n| `lines[].unit_amount` | integer | Yes | Unit price in minor units. Range: 0–unbounded |\n| `lines[].total_amount` | integer | Yes | Gross line total in minor units. Range: 0–unbounded |\n| `lines[].tax_amount` | integer | Yes | Tax amount attributed to this line. Range: 0–unbounded |\n| `lines[].paid_amount` | integer | Yes | Captured principal presented against this line. Open orders use captured line allocations; financially closed orders present every current line as fully paid. Range: 0–unbounded |\n| `lines[].remaining_amount` | integer | Yes | Remaining principal presented for this line. This is zero for every current line once the order is financially closed. Range: 0–unbounded |\n| `lines[].payment_status` | string | Yes | Presented line payment state. Once the order is financially closed, every current line is presented as paid. Allowed: `unpaid`, `partially_paid`, `paid` |\n| `lines[].category` | string / null | Yes | Category supplied by the Partner, or `null`. Length: 0–120 |\n| `payments` | array<object> | Yes | Captured and in-flight settlement records known to TabSync. |\n| `payments[].id` | uuid | Yes | TabSync payment/attempt ID. |\n| `payments[].source` | string | Yes | `tabsync_device` was taken through the TabSync app; `external` was reported by the Partner. Allowed: `tabsync_device`, `external` |\n| `payments[].external_reference` | string / null | Yes | Partner/provider payment reference, when available. Length: 0–128 |\n| `payments[].method` | string | Yes | Payment method reported by the source. Allowed: `cash`, `card`, `other` |\n| `payments[].status` | string | Yes | Only `captured` payments reduce the order balance. Allowed: `requires_confirmation`, `captured`, `failed`, `cancelled` |\n| `payments[].allocation_type` | string | Yes | How the principal amount was allocated to the order. Allowed: `full`, `partial_amount`, `item_selection` |\n| `payments[].currency` | string | Yes | ISO 4217 currency for this payment. Pattern: `^[A-Z]{3}$` |\n| `payments[].amounts` | object | Yes | Payment amounts in minor units. |\n| `payments[].amounts.principal` | integer | Yes | Captured principal that can reduce the order balance. Range: 0–unbounded |\n| `payments[].amounts.tip` | integer | Yes | Captured gratuity. Range: 0–unbounded |\n| `payments[].amounts.total` | integer | Yes | Principal plus tip. Range: 0–unbounded |\n| `payments[].trust_level` | string / null | Yes | Evidence source for the captured result. Allowed: `client_reported`, `partner_reported`, `null` |\n| `payments[].device` | object / null | Yes | Device that recorded the payment, or `null` for Partner-reported external payments. |\n| `payments[].device.id` | uuid | Yes | TabSync Device ID. |\n| `payments[].device.name` | string | Yes | Device name shown in the Partner portal. |\n| `payments[].captured_at` | string / null | Yes | Time the payment was captured, when known. |\n| `payments[].reported_at` | string / null | Yes | Time the payment result was reported to TabSync, when different from capture time. |\n| `payments[].created_at` | date-time | Yes | Time the payment record was created in TabSync. |\n| `payments[].allocations` | array<object> | Yes | Principal allocation lines used to explain how this payment reduced the balance. |\n| `payments[].allocations[].target_type` | string | Yes | `order_line` points at a line; `order_remainder` applies to the remaining balance without a line. Allowed: `order_line`, `order_remainder` |\n| `payments[].allocations[].order_line_id` | string / null | Yes | Line ID for `order_line` allocations, otherwise `null`. |\n| `payments[].allocations[].principal_amount` | integer | Yes | Principal amount allocated to this target. Range: 0–unbounded |\n| `opened_at` | date-time | Yes | Time the order/check was opened in the EPOS. |\n| `settled_at` | string / null | Yes | Time TabSync first calculated the order as fully settled, or `null` while open/unpaid. |\n| `created_at` | date-time | Yes | Time TabSync first created this order projection. |\n| `updated_at` | date-time | Yes | Time the order projection or settlement state last changed. |",
                        "type": "text/markdown"
                    }
                }
            ]
        }
    ],
    "event": [],
    "variable": [
        {
            "key": "baseUrl",
            "value": "https://dev.api.tabsync.co.uk/v1"
        }
    ],
    "info": {
        "name": "TabSync Partner API",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
        "description": {
            "content": "Public version 1 API for EPOS providers and ISVs.\n\nThis contract intentionally contains only the Partner-facing integration surface:\nservice status, API-key validation, Partner setup-directory reads, Partner order\ncreation/replacement, Partner order polling and Partner-reported external\nsettlement. Device activation, Device registration and waiter-app payment flows\nare TabSync proprietary app estate endpoints and are documented separately.\n\n\nContact Support:\n Name: TabSync developer support",
            "type": "text/plain"
        }
    }
}
