For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
    • Introduction
    • URL Structure
    • API Key
    • Errors
    • Versioning
    • Pagination
    • Replication
    • Rate Limits
    • Webhooks
  • System Services
    • Companies
    • Hello World
  • Accounts
  • Ticketing
    • Getting started
    • Catalog
    • Capacity
    • Tickets
    • Reservations
    • Schedule
  • Memberships
    • Catalog
    • Membership
    • Member
    • Card
    • Payment Method
    • Lifecycle
    • Miscellaneous
    • Points
  • Speedgate
  • Attraction Wallet
  • OTA Channel Manager
    • Getting started
    • Orders
  • POS
    • POS Sale
    • POS Entry
    • POS Unit
    • POS Store
    • Salesperson
    • External POS Sale
    • Global POS Entry
  • Restaurant
  • Inventory
    • Barcodes
    • Items
    • Item Ledger Entries
    • Item Categories
    • Item Variants
    • Item Translations
  • Coupon
  • Vouchers
    • Vouchers
  • Sales Documents
    • Ecommerce
  • Finance
    • General Ledger Account
    • General Ledger Entries
    • General Ledger Journal
  • Customers
    • Customers
    • GDPR
  • Retail Print
    • Print Price Labels
  • PDF Designer
LogoLogo
On this page
  • Overview
OTA Channel Manager

Getting Started

Was this page helpful?
Previous

Orders

Next
Built with

Overview

The OTA Channel Manager API issues tickets and coupons on behalf of an external sales channel from a single order submission. createOrder and replaceOrder are asynchronous: they accept the order, return immediately with status = Submitted, and issuance is performed in the background. Partners then learn the outcome either by subscribing to the ota_cm_order_processed webhook or by polling getOrder.

The walk-through below covers the recommended async flow end-to-end.

1 - Choose how you will be notified

Before submitting your first order, decide how your integration learns that an order has settled. Pick one of:

  • Webhook (recommended). Subscribe to ota_cm_order_processed. The event fires once per order, when the order has reached a terminal state (Issued, Draft, or Error). The payload carries the orderId, the OTA Channel Manager’s buyFromOrderReference, and the final status — enough to look the order up, reconcile it on your side, and decide on a follow-up action. The webhook also acts as a heartbeat: if you never see an event for an order you submitted, the order has not finished processing.

  • Polling. Call getOrder periodically until status is one of Issued, Draft, or Error. This works for environments where exposing an inbound HTTPS endpoint is hard, but consumes API quota and adds latency. Orders are picked up for processing on roughly a 60-second cadence, so an order can sit as Submitted for up to a minute before it starts moving; once it does, settling to a terminal state typically takes a few seconds. A polling cadence of 10–15 seconds is reasonable — faster than that adds load without buying you anything.

You do not need to pick before each order — pick once for the integration.

2 - Submit the order

Send the full order in a single call. The combination of partnerId and sellToOrderReference must be unique per partner. Include paymentReference if payment has already been captured; omit it if you intend to confirm payment in a second step (see step 4).

POST
/:tenant/:environment/:company/channelManager
1curl -X POST https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./channelManager \
2 -H "x-np-api-key: <NaviPartner API Key>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
6 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
7 "items": [
8 {
9 "itemNumber": "31001",
10 "visitDate": "2026-06-01",
11 "visitTime": "10:30:00",
12 "quantity": 2,
13 "wallet": {
14 "names": [
15 "Jane Doe",
16 "John Doe"
17 ],
18 "externalReferenceNumbers": [
19 "JD-2026-001",
20 "JOHN-2026-001"
21 ]
22 }
23 }
24 ],
25 "sellToEmail": "guest@example.com",
26 "sellToName": "Jane Doe",
27 "sellToLanguage": "ENU",
28 "paymentReference": "PAY-987654"
29}'
Try it

The response carries status = Submitted, the assigned orderId, and the OTA Channel Manager’s buyFromOrderReference. Items, wallets, and the manifest are empty — they will be populated once issuance settles. Capture the orderId; every subsequent call uses it.

Response
1{
2 "orderId": "9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8",
3 "status": "Submitted",
4 "statusMessage": "",
5 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
6 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
7 "buyFromOrderReference": "CM-20260515093000-A1B2",
8 "receivedAt": "2026-05-15T09:30:00Z",
9 "items": [
10 {
11 "lineNo": 100000,
12 "itemNumber": "31001",
13 "description": "Castle Admission",
14 "isPackage": false,
15 "quantity": 1,
16 "visitDate": "2026-06-01",
17 "visitTime": "10:30:00",
18 "wallets": [
19 {
20 "seqNo": 1,
21 "assets": [
22 {
23 "id": "2c3a84c7-059f-41d3-8033-0d94e08d4b13",
24 "type": "ticket",
25 "assetId": "3d4b95d8-16e0-42e4-9b2a-1d95f08d5c14",
26 "referenceNumber": "ATF-BIL010665L-3",
27 "itemNumber": "31001",
28 "description": "Castle Admission"
29 }
30 ],
31 "walletId": "5a1c2b3d-4e5f-6071-8293-a4b5c6d7e8f9",
32 "walletReferenceNumber": "141234529930210327",
33 "externalReferenceNumber": "JD-2026-001",
34 "name": "Jane Doe",
35 "issuedAt": "2026-05-15T09:30:05Z",
36 "unitPriceExclVat": 80,
37 "unitPriceInclVat": 100,
38 "currencyCode": "DKK",
39 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
40 }
41 ],
42 "sellToName": "Jane Doe",
43 "sellToEmail": "guest@example.com",
44 "sellToLanguage": "ENU"
45 }
46 ],
47 "sellToEmail": "guest@example.com",
48 "sellToName": "Jane Doe",
49 "sellToLanguage": "ENU",
50 "paymentReference": "PAY-987654"
51}
3 - Receive the completion

How you wait depends on the choice in step 1.

Webhook subscribers receive ota_cm_order_processed from your registered endpoint when the order reaches a terminal state. The payload is small by design — it carries orderId, buyFromOrderReference, and status. Call getOrder to fetch the full representation (wallets, ticket and coupon assets, prices, manifest URLs):

GET
/:tenant/:environment/:company/channelManager/:orderId
1curl https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./channelManager/9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8 \
2 -H "x-np-api-key: <NaviPartner API Key>"
Try it

Pollers call the same endpoint at their chosen cadence and inspect status:

if status in [Submitted, Scheduled, Processing] → not done yet, wait and retry
if status == Issued → success; tickets are in items[].wallets[].assets
if status == Draft → success but awaiting payment; see step 4
if status == Error → failure; see step 5

In both flows, the final response looks like this:

Response
1{
2 "orderId": "9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8",
3 "status": "Issued",
4 "statusMessage": "",
5 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
6 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
7 "buyFromOrderReference": "CM-20260515093000-A1B2",
8 "receivedAt": "2026-05-15T09:30:00Z",
9 "items": [
10 {
11 "lineNo": 100000,
12 "itemNumber": "31001",
13 "description": "Castle Admission",
14 "isPackage": false,
15 "quantity": 1,
16 "visitDate": "2026-06-01",
17 "visitTime": "10:30:00",
18 "wallets": [
19 {
20 "seqNo": 1,
21 "assets": [
22 {
23 "id": "2c3a84c7-059f-41d3-8033-0d94e08d4b13",
24 "type": "ticket",
25 "assetId": "3d4b95d8-16e0-42e4-9b2a-1d95f08d5c14",
26 "referenceNumber": "ATF-BIL010665L-3",
27 "itemNumber": "31001",
28 "description": "Castle Admission"
29 }
30 ],
31 "walletId": "5a1c2b3d-4e5f-6071-8293-a4b5c6d7e8f9",
32 "walletReferenceNumber": "141234529930210327",
33 "externalReferenceNumber": "JD-2026-001",
34 "name": "Jane Doe",
35 "issuedAt": "2026-05-15T09:30:05Z",
36 "unitPriceExclVat": 80,
37 "unitPriceInclVat": 100,
38 "currencyCode": "DKK",
39 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
40 }
41 ],
42 "sellToName": "Jane Doe",
43 "sellToEmail": "guest@example.com",
44 "sellToLanguage": "ENU"
45 }
46 ],
47 "sellToEmail": "guest@example.com",
48 "sellToName": "Jane Doe",
49 "sellToLanguage": "ENU",
50 "paymentReference": "PAY-987654",
51 "jobId": "TM-IMPORT-000123",
52 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
53}
4 - Confirm payment after the fact (optional)

If you did not include paymentReference in createOrder, the order settles in Draft. Tickets and coupons have been minted but are not valid until confirmed. Send the reference with confirmOrder to move the order to Issued and make the assets valid:

POST
/:tenant/:environment/:company/channelManager/:orderId/confirm
1curl -X POST https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./channelManager/9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8/confirm \
2 -H "x-np-api-key: <NaviPartner API Key>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "paymentReference": "PAY-987654"
6}'
Try it

confirmOrder is synchronous and idempotent — confirming an already-Issued order is a no-op.

Response
1{
2 "orderId": "9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8",
3 "status": "Issued",
4 "statusMessage": "",
5 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
6 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
7 "buyFromOrderReference": "CM-20260515093000-A1B2",
8 "receivedAt": "2026-05-15T09:30:00Z",
9 "items": [
10 {
11 "lineNo": 100000,
12 "itemNumber": "31001",
13 "description": "Castle Admission",
14 "isPackage": false,
15 "quantity": 1,
16 "visitDate": "2026-06-01",
17 "visitTime": "10:30:00",
18 "wallets": [
19 {
20 "seqNo": 1,
21 "assets": [
22 {
23 "id": "2c3a84c7-059f-41d3-8033-0d94e08d4b13",
24 "type": "ticket",
25 "assetId": "3d4b95d8-16e0-42e4-9b2a-1d95f08d5c14",
26 "referenceNumber": "ATF-BIL010665L-3",
27 "itemNumber": "31001",
28 "description": "Castle Admission"
29 }
30 ],
31 "walletId": "5a1c2b3d-4e5f-6071-8293-a4b5c6d7e8f9",
32 "walletReferenceNumber": "141234529930210327",
33 "externalReferenceNumber": "JD-2026-001",
34 "name": "Jane Doe",
35 "issuedAt": "2026-05-15T09:30:05Z",
36 "unitPriceExclVat": 80,
37 "unitPriceInclVat": 100,
38 "currencyCode": "DKK",
39 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
40 }
41 ],
42 "sellToName": "Jane Doe",
43 "sellToEmail": "guest@example.com",
44 "sellToLanguage": "ENU"
45 }
46 ],
47 "sellToEmail": "guest@example.com",
48 "sellToName": "Jane Doe",
49 "sellToLanguage": "ENU",
50 "paymentReference": "PAY-987654",
51 "jobId": "TM-IMPORT-000123",
52 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
53}
5 - Replace an order's contents

Use replaceOrder to retry a failed order or to change a draft. partnerId and sellToOrderReference are immutable under PUT; all other header fields, plus the entire items array, are replaced. Any previously issued wallets, tickets, and coupons are destroyed and the order is re-submitted through the same async pipeline.

Replacement is only allowed when the existing order is Draft or Error.

PUT
/:tenant/:environment/:company/channelManager/:orderId
1curl -X PUT https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./channelManager/9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8 \
2 -H "x-np-api-key: <NaviPartner API Key>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
6 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
7 "items": [
8 {
9 "itemNumber": "31001",
10 "visitDate": "2026-06-01",
11 "visitTime": "10:30:00",
12 "quantity": 2,
13 "wallet": {
14 "names": [
15 "Jane Doe",
16 "John Doe"
17 ],
18 "externalReferenceNumbers": [
19 "JD-2026-001",
20 "JOHN-2026-001"
21 ]
22 }
23 }
24 ],
25 "sellToEmail": "guest@example.com",
26 "sellToName": "Jane Doe",
27 "sellToLanguage": "ENU"
28}'
Try it
Response
1{
2 "orderId": "9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8",
3 "status": "Submitted",
4 "statusMessage": "",
5 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
6 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
7 "buyFromOrderReference": "CM-20260515093000-A1B2",
8 "receivedAt": "2026-05-15T09:30:00Z",
9 "items": [
10 {
11 "lineNo": 100000,
12 "itemNumber": "31001",
13 "description": "Castle Admission",
14 "isPackage": false,
15 "quantity": 1,
16 "visitDate": "2026-06-01",
17 "visitTime": "10:30:00",
18 "wallets": [
19 {
20 "seqNo": 1,
21 "assets": [
22 {
23 "id": "2c3a84c7-059f-41d3-8033-0d94e08d4b13",
24 "type": "ticket",
25 "assetId": "3d4b95d8-16e0-42e4-9b2a-1d95f08d5c14",
26 "referenceNumber": "ATF-BIL010665L-3",
27 "itemNumber": "31001",
28 "description": "Castle Admission"
29 }
30 ],
31 "walletId": "5a1c2b3d-4e5f-6071-8293-a4b5c6d7e8f9",
32 "walletReferenceNumber": "141234529930210327",
33 "externalReferenceNumber": "JD-2026-001",
34 "name": "Jane Doe",
35 "issuedAt": "2026-05-15T09:30:05Z",
36 "unitPriceExclVat": 80,
37 "unitPriceInclVat": 100,
38 "currencyCode": "DKK",
39 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
40 }
41 ],
42 "sellToName": "Jane Doe",
43 "sellToEmail": "guest@example.com",
44 "sellToLanguage": "ENU"
45 }
46 ],
47 "sellToEmail": "guest@example.com",
48 "sellToName": "Jane Doe",
49 "sellToLanguage": "ENU",
50 "paymentReference": "PAY-987654"
51}

The response carries status = Submitted again — wait for the next webhook (or poll) to see the new terminal state.

6 - Cancel an order

DELETE /channelManager/:orderId tears down the order’s wallets, tickets, and coupons. The order row survives as Cancelled if it was previously Issued or Cancelled; it is removed outright if it was Draft or Error. Orders that are still in-flight (Submitted, Scheduled, Processing) cannot be cancelled — wait for them to settle.

DELETE
/:tenant/:environment/:company/channelManager/:orderId
1curl -X DELETE https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./channelManager/9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8 \
2 -H "x-np-api-key: <NaviPartner API Key>"
Try it
Response
1{
2 "orderId": "9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8",
3 "status": "Issued",
4 "statusMessage": "",
5 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
6 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
7 "buyFromOrderReference": "CM-20260515093000-A1B2",
8 "receivedAt": "2026-05-15T09:30:00Z",
9 "items": [
10 {
11 "lineNo": 100000,
12 "itemNumber": "31001",
13 "description": "Castle Admission",
14 "isPackage": false,
15 "quantity": 1,
16 "visitDate": "2026-06-01",
17 "visitTime": "10:30:00",
18 "wallets": [
19 {
20 "seqNo": 1,
21 "assets": [
22 {
23 "id": "2c3a84c7-059f-41d3-8033-0d94e08d4b13",
24 "type": "ticket",
25 "assetId": "3d4b95d8-16e0-42e4-9b2a-1d95f08d5c14",
26 "referenceNumber": "ATF-BIL010665L-3",
27 "itemNumber": "31001",
28 "description": "Castle Admission"
29 }
30 ],
31 "walletId": "5a1c2b3d-4e5f-6071-8293-a4b5c6d7e8f9",
32 "walletReferenceNumber": "141234529930210327",
33 "externalReferenceNumber": "JD-2026-001",
34 "name": "Jane Doe",
35 "issuedAt": "2026-05-15T09:30:05Z",
36 "unitPriceExclVat": 80,
37 "unitPriceInclVat": 100,
38 "currencyCode": "DKK",
39 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
40 }
41 ],
42 "sellToName": "Jane Doe",
43 "sellToEmail": "guest@example.com",
44 "sellToLanguage": "ENU"
45 }
46 ],
47 "sellToEmail": "guest@example.com",
48 "sellToName": "Jane Doe",
49 "sellToLanguage": "ENU",
50 "paymentReference": "PAY-987654",
51 "jobId": "TM-IMPORT-000123",
52 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
53}
7 - Look up orders by partner

Use listOrdersByPartner to fetch orders for one partner, optionally filtered by status, sellToOrderReference, or a receivedAt window. The returned objects are compact summaries; follow up with getOrder to inspect items and wallets. Filtering on status=Submitted,Scheduled,Processing is a quick way to see what is still in-flight.

GET
/:tenant/:environment/:company/channelManager/orders/:partnerId
1curl -G https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./channelManager/orders/21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e \
2 -H "x-np-api-key: <NaviPartner API Key>" \
3 -d status=Issued \
4 --data-urlencode receivedAtFrom=2026-05-01T00:00:00Z \
5 --data-urlencode receivedAtTo=2026-05-31T23:59:59Z
Try it
Response
1[
2 {
3 "orderId": "9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8",
4 "partnerId": "21e8c1d2-3f4a-4c5b-9e6d-7f8a9b0c1d2e",
5 "sellToOrderReference": "PARTNER-ORDER-2026-00042",
6 "buyFromOrderReference": "CM-20260515093000-A1B2",
7 "status": "Issued",
8 "statusMessage": "",
9 "receivedAt": "2026-05-15T09:30:00Z",
10 "sellToEmail": "guest@example.com",
11 "sellToName": "Jane Doe",
12 "sellToLanguage": "ENU",
13 "paymentReference": "PAY-987654",
14 "jobId": "TM-IMPORT-000123",
15 "manifestUrl": "https://manifests.npretail.app/wallets/manifest?mid=9c6b2f4e-2b71-4d23-9d6a-a3b4c5d6e7f8"
16 }
17]