Sandbox Data
Test Data
Pre-configured sandbox fixtures for testing all supported workflows. All data is synthetic — no production records.
Sandbox Products
Returned by GET /api/v1/pos/products when the sandbox backend has these draws configured.
| product_id | product_name | price (AED) | Series | Draw Date | Promotion | Max Qty |
|---|---|---|---|---|---|---|
251 | Grand Lucky Draw | 35.00 | GLD-2025-A | 2025-01-15 | Buy 2 Get 1 Free | 10 |
252 | Car Draw | 150.00 | CAR-2025-A | 2025-02-01 | None | 5 |
253 | Daily Cash Draw | 10.00 | DCD-2025-A | 2025-01-10 | None | 20 |
Synthetic Test Customers
Use these synthetic identities for testing the customer upsert workflow. No real persons. Never use real passport numbers or Emirates ID values.
| vendor_customer_id | Name | Nationality | Document Type | Expected Result |
|---|---|---|---|---|
CUST-SANDBOX-001 | Sandbox User Alpha | AE | PASSPORT | Linked (profile_complete) |
CUST-SANDBOX-002 | Sandbox User Beta | IN | PASSPORT | Linked (profile_complete) |
CUST-SANDBOX-003 | Sandbox User Gamma | PK | EMIRATES_ID | Review required |
⚠️ KYC Security: Document numbers in the table above are synthetic fixtures. Real passport/Emirates ID numbers must never appear in logs, code, screenshots or support tickets.
Payment Scenarios
| Scenario | payment.method | payment.result | payment.collected_by | Expected outcome |
|---|---|---|---|---|
| Normal cash sale | CASH | PAID | VENDOR | Tickets issued, e-ticket queued |
| Promotional sale (Buy 2 Get 1) | CASH | PAID | VENDOR | 2 PAID + 1 FREE ticket, totals from hold |
Error Code Reference
Safe error codes returned by the Nitro BFF layer. These are normalised from Vendora upstream codes — no raw SQL messages or stack traces reach the browser.
| Safe Code | HTTP Status | Retryable | Meaning |
|---|---|---|---|
UNAUTHORIZED | 401 | No | Missing or invalid portal/API authentication |
RATE_LIMITED | 429 | Yes | Too many requests — wait before retrying |
VALIDATION_ERROR | 422 | No | Request body failed server-side validation |
TICKET_SELECTION_UNAVAILABLE | 409 | No | One or more selected tickets are no longer available |
HOLD_EXPIRED | 410 | No | The hold has expired — create a new hold |
HOLD_NOT_FOUND | 404 | No | Hold reference not found |
TRANSACTION_NOT_FOUND | 404 | No | Order reference not found |
CUSTOMER_REVIEW_REQUIRED | 200 | No | Customer profile requires manual review before promotional holds |
CUSTOMER_MAPPING_MISSING | 422 | No | vendor_customer_id is required for this operation |
PRICE_VALIDATION_FAILED | 422 | No | Payment amount does not match the hold total |
UPSTREAM_UNAVAILABLE | 502 | Yes | The Vendora API is temporarily unavailable |
UPSTREAM_TIMEOUT | 504 | Yes | The Vendora API did not respond in time |
CONFIG_INVALID | 503 | No | The server is not correctly configured — contact administrator |