FAQs

Frequently Asked Questions

Getting Started & Access

Q: How do I get API credentials (CompanyCode, Location, PosLocation)? A: All integrations must be customer-sponsored. Contact the customer's Access account manager to initiate the integration request. After the discovery phase and NDA signature, the EPOS Product Team will provide test environment credentials including your API key, password, and the CompanyCode/Location values for testing.

Q: Is there a sandbox/test environment available? A: Yes. Test environment access and credentials are provided after you sign the Non-Disclosure Agreement (NDA). The sandbox environment allows full development and testing without affecting live customer data.

Q: What's the base URL for the API endpoints? A: The production base URL is https://api.accessepos.com/Access.Epos.Orders.API

Q: Do I need to register my app or get approval before integrating? A: Yes. The integration journey includes:

  1. Customer-sponsored request through account manager

  2. Discovery call with EPOS Product Team

  3. NDA signature (required before test access)

  4. Technical development with ongoing support

  5. Technical sign-off meeting with test case validation

  6. Handover to Professional Services for customer onboarding

Q: Is HTTPS required? A: Yes. All API endpoints use HTTPS for secure communication.


Authentication & Security

Q: What authentication method is used? A: JWT (JSON Web Token) authentication. You first call the /Token endpoint with your API key and password to obtain a token, which you then include in all subsequent requests.

Q: Where do I include authentication credentials in requests? A: Include the JWT token in the Authorization header using Bearer token format:

Q: How do I handle authentication errors? A: 401 Unauthorised responses indicate authentication failure. Common causes:

  • Expired token (tokens typically last 24 hours)

  • Invalid API credentials

  • Missing Authorization header

When you receive a 401, obtain a new token by calling /Token again with your credentials.

Q: What's the token lifetime? A: JWT tokens typically last 24 hours. Implement token refresh logic to obtain a new token before expiry or when you receive 401 errors.


Rate Limiting & API Usage

Q: Are there rate limits on API calls? A: The documentation explicitly states: "Do not poll API endpoints." The API is designed for event-driven integrations, not continuous polling. Excessive polling may result in your integration being restricted.

Q: Should I implement retry logic? A: Yes, but with caution. Implement exponential backoff for transient failures (network issues, server errors). However, do NOT retry by continuously polling. For order status checks, use the GetTransaction endpoint only when necessary, not on a schedule.


Error Handling

Q: What HTTP status codes should I expect? A: Common status codes:

  • 200 OK: Request successful (always check error flag in response body)

  • 400 Bad Request: Invalid parameters or payload

  • 401 Unauthorised: Authentication failure

  • 404 Not Found: Company/location not found

  • 500+ Server Error: POS terminal may be disconnected or server issue

Q: What does the error response format look like? A: All responses include an error flag and errorMessage:

Always check the error flag even on 200 responses.

Q: What happens if the POS terminal is offline? A: You'll receive a 500+ status code. Use the PingTerminal endpoint before sending orders to verify terminal connectivity. The response indicates connection status, POS software version, and terminal configuration.


Field Validations

Q: What's the valid format for datetime fields? A: Use these formats:

  • Dates: YYYY-MM-DD (e.g., "2025-10-15")

  • Times: HH:mm in 24-hour format (e.g., "14:30", "19:00")

  • DateTimes: ISO 8601 format where required

Q: Which fields are mandatory for each OrderType?

All OrderTypes require:

  • isOpen

  • ordertype

  • tracktype

  • trackoffset

OrderType 4 (Kiosk) additionally require:

  • billno

  • saleprops.terminalid

  • weborderdisplayno

OrderType 7 (WebOrder) additionally requires:

  • weborderdate

  • webordertimefrom

  • webordertimeto

  • webordername

  • customerno

  • webordertype

  • weborderproductiontype

  • weborderdisplayno

  • weborderpayoncollectiondelivery

  • weborderlocationtimecat

  • Complete transactionitems array

  • paymentitems array (if pre-paid)


Q: How do I know which PLU IDs (offset values) are available for a location? A: Use the Menu endpoints:

  1. Call /api/Menu/Menus to get available menus

  2. Call /api/Menu/MenuDetails with the menuId to get complete menu structure including all PLU numbers in the plus arrays

Q: What happens if I submit an invalid/inactive PLU ID? A: You'll receive a validation error in the response:

Q: How do price levels work in practice? A: Price levels enable different pricing for the same items:

  • 0: Standard pricing (default)

  • 1+: Promotional, regional, time-based, or customer-type pricing

Set the priceLevel parameter when calling /api/Menu/MenuDetails to retrieve prices for specific tiers. In transactions, use useposprice: true to use POS pricing, or useposprice: false with a custom totalvalue to override.

Q: Should I cache menu data? A: Yes, absolutely. The documentation explicitly recommends: "Cache this data locally to reduce API calls and improve performance." Menu data doesn't change frequently, so fetch it once and refresh periodically (e.g., daily or when notified of menu updates).


Payment Processing

Q: How do I include card payment authorisation codes? A: Include payment processor details in the paymentitems array:

Q: Can I process multiple payment types in a single transaction? A: Yes. The paymentitems array supports multiple payments:

Q: How do I handle change given to customers? A: Use a separate payment item with ischange: true and negative totalvalue:


Webhook Setup

Q: How do I register webhook URLs? A: Use the /api/Notifications/UpdateWebOrdersNotificationSettings endpoint:

Q: How do I secure my webhook endpoint? A: Provide authentication details when registering:

  • authHeader: The header name (e.g., "Authorization", "X-API-Key")

  • authValue: The authentication value Access EPOS should send

Verify this authentication on your webhook endpoint before processing events.


Transaction Retrieval

Q: Can I poll GetTransaction to check order status? A: No. The API explicitly prohibits polling: "Do not poll API endpoints. The API is designed for event-driven integrations, not continuous polling." Use GetTransaction only when necessary (e.g., customer requests order status), not on a scheduled basis.

Q: What's the best practice for tracking orders? A: Store the order's tracking coordinates (ordertype, tracktype, trackoffset) and use GetTransaction only when needed. For real-time updates, implement webhooks using the Notifications endpoint.


Edge Cases & Scenarios

Q: What happens if the POS terminal goes offline during an order? A: You'll receive server errors (500+) when attempting API calls. Best practices:

  1. Implement retry logic with exponential backoff for transient failures

  2. Display clear error messages to users about terminal connectivity

  3. Cache the terminal connectivity status and refresh periodically

Q: How do I handle order cancellations/abandoned orders? A: For OrderTypes 4, 7, and 8, set orderstatus: 6 (OrderCanceled) to mark the order as abandoned. For OrderType 3, simply don't close the order—staff can void it on the POS.

Q: What happens to pre-paid WebOrders if the customer doesn't collect? A: This is a business process question not covered by the API. Typically handled through customer support channels and refund processes outside the API scope.


Q: How do I identify which condiments are free vs chargeable? A: Condiments use "condiment pricing" which is separate from main item pricing. The same PLU can have both main item price and condiment price. When you fetch MenuDetails:

  1. Look at the item's condiments array for linked condiment lists

  2. Each condiment list contains condPLUs with available options

  3. Condiment pricing applies when used as a condiment (not when ordered as main item)

Zero-priced condiments (like cooking instructions "Medium Rare") will have totalvalue: 0.00 in the pricing structure.


Split Bills & Multiple Payments

Q: How do I handle split bills? A: Use the transactionpos parameter:

  • 0: First bill

  • 1: Second bill

  • 2: Third bill

  • etc.

When retrieving split bills, specify the transactionPos parameter in GetTransaction:


Kitchen Integration

Q: Do I need to worry about printgroupno and kitchen routing? A: Generally no. The POS handles kitchen routing automatically based on item configuration. The printgroupno is configured per PLU in the POS and determines which kitchen printer/station receives the order.

Q: How does itemheld work—can I control kitchen timing via the API? A: Yes. Set itemheld: true on transaction items to prevent them from being sent to the kitchen immediately:

Later, call UpdateOrder with itemheld: false to release the item to the kitchen.


Testing & Validation

Q: Is there a ValidateOrder endpoint I can use for testing? A: Yes. The /ValidateOrder endpoint validates order payloads without creating transactions. It's highly recommended for OrderType 7 (WebOrder) before calling AddOrder, but works for all order types. Use it to:

  • Verify required fields are present

  • Check PLU validity

  • Test voucher codes

  • Validate gift card balances

  • Confirm price calculations

Q: How do I test without creating real transactions? A: Use the sandbox/test environment provided after NDA signature. This isolated environment allows full testing without affecting live customer data.


Performance & Best Practices

Q: Should I cache menu data or fetch it fresh each time? A: Always cache menu data. The documentation explicitly recommends this: "Cache this data locally to reduce API calls and improve performance." Menu data changes infrequently, so:

  1. Fetch MenuDetails on app startup or daily

  2. Store locally (database, file system, memory cache)

  3. Refresh when notified of menu changes or on a daily schedule

Q: What's the recommended approach for order status checks? A: Event-driven, not polling. The API prohibits continuous polling. Instead:

  1. Implement webhooks via UpdateWebOrdersNotificationSettings

  2. Use GetTransaction only when customer explicitly requests status

  3. Store order state from API responses and update UI accordingly


Support & Documentation

Q: Where can I find the full API specification? A: The OpenAPI 3.0 specification provided in the integration documentation is the complete API reference. It includes all endpoints, schemas, parameters, and response structures.

Q: Where do I report bugs or request features? A: Contact the integration support team:

Q: What support is available during development? A: Throughout the development phase:

  • Email support via [email protected]

  • Additional technical calls arranged as needed

  • Technical guidance and documentation clarification

  • Test case support before sign-off


Specific Technical Clarifications

Q: When exactly should calcsubtotaladjustments and forceSubTotal be true? A: Set these flags before processing payment to trigger POS business rules:

calcsubtotaladjustments: true to apply:

  • Subtotal-configured discounts

  • Service charges

  • POS-configured promotions

forceSubTotal: true to calculate:

  • Deposit return scheme fees

  • Loyalty point calculations

  • Other business rule triggers

Typical flow:

Q: Can I update an OrderType 7 (WebOrder) after submission via AddOrder? A: No. The documentation is explicit: "UpdateOrder NOT SUPPORTED for OrderType 7 (WebOrder)." WebOrders must contain the complete order in the single AddOrder call. This is why ValidateOrder is highly recommended before submitting WebOrders.

Q: What headers are required for API requests? A: Required headers:

Last updated

Was this helpful?