> This page is for API Reference.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.navipartner.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.navipartner.com/_mcp/server.

# Getting Started

## Overview

There are 5 steps to selling a ticket. This step by step guide below with examples will take you through the process:

#### 1 - Decide which ticket

First, query the available tickets catalog to find a product that fits the needs. This is done using the `/ticket/catalog/` endpoint.

### Request

GET [https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/catalog/\{storeCode}](https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/catalog/\{storeCode})

**`Catalog Example`**

```curl Catalog Example
curl https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN \
     -H "x-np-api-key: <NaviPartner API Key>"
```

**`Catalog Example`**

```python Catalog Example
import requests

url = "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN"

headers = {"x-np-api-key": "<NaviPartner API Key>"}

response = requests.get(url, headers=headers)

print(response.json())
```

**`Catalog Example`**

```javascript Catalog Example
const url = 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN';
const options = {method: 'GET', headers: {'x-np-api-key': '<NaviPartner API Key>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`Catalog Example`**

```go Catalog Example
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-np-api-key", "<NaviPartner API Key>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`Catalog Example`**

```ruby Catalog Example
require 'uri'
require 'net/http'

url = URI("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-np-api-key"] = '<NaviPartner API Key>'

response = http.request(request)
puts response.read_body
```

**`Catalog Example`**

```java Catalog Example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN")
  .header("x-np-api-key", "<NaviPartner API Key>")
  .asString();
```

**`Catalog Example`**

```php Catalog Example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN', [
  'headers' => [
    'x-np-api-key' => '<NaviPartner API Key>',
  ],
]);

echo $response->getBody();
```

**`Catalog Example`**

```csharp Catalog Example
using RestSharp;

var client = new RestClient("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN");
var request = new RestRequest(Method.GET);
request.AddHeader("x-np-api-key", "<NaviPartner API Key>");
IRestResponse response = client.Execute(request);
```

**`Catalog Example`**

```swift Catalog Example
import Foundation

let headers = ["x-np-api-key": "<NaviPartner API Key>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/catalog/EN")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

Use the `itemNumber` to specify your chosen ticket in later steps.

### Response (200)

```json
{
  "storeCode": "EN",
  "items": [
    {
      "itemNumber": "31001",
      "recommendedPrice": {
        "unitPrice": 100,
        "unitPriceIncludesVat": true,
        "vatPct": 25,
        "currencyCode": "SEK"
      },
      "ticketType": {
        "code": "WEB",
        "description": "Web sales",
        "category": "Online",
        "kind": "individualAdmission"
      },
      "description": {
        "title": "Castle Museum Entrance",
        "subtitle": "Adult Castle Ticket",
        "name": "Explore History",
        "description": "<b>Access</b> to all castle exhibits",
        "fullDescription": "<p>Step back in time and immerse yourself in the rich history of our castle museum.  Discover fascinating artifacts, explore grand halls, and learn about the lives of the people who once lived within these walls.</p> <p>Experience the grandeur of the castle's architecture and marvel at its intricate details.  Walk through beautifully decorated rooms and admire the stunning artwork and furniture on display.</p> <p>Join a guided tour to gain deeper insights into the castle's history and hear captivating stories  about its past. Learn about the battles fought, the royal inhabitants, and the secrets that lie hidden within these ancient walls.</p>"
      },
      "contents": [
        {
          "capacityControl": "sales",
          "code": "CASTLE",
          "default": true,
          "description": {
            "title": "Castle Museum Entrance",
            "subtitle": "Adult Castle Ticket",
            "name": "Explore the Castle",
            "description": "<b>Access</b> to the castle exhibit",
            "fullDescription": "<p>Experience the grandeur of the castle's architecture and marvel at its intricate details.  Walk through beautifully decorated rooms and admire the stunning artwork and furniture on display.</p>"
          },
          "included": "mandatory",
          "scheduleSelection": "noScheduleSelection",
          "maxCapacity": 175
        }
      ],
      "itemReferences": [
        {
          "referenceNumber": "EAN1234567890123",
          "description": "Reference number must be used when the item has a variant and could be used when same base item is used in different contexts / sales channels"
        }
      ]
    }
  ]
}
```

#### 2 - Find and select a time slot

Next we need to find time slots for the admission codes that are included with the selected product.
For that purpose we will use the `/ticket/capacity/search` endpoint.

### Request

GET [https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/capacity/search](https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/capacity/search)

**`ExampleCapacity1`**

```curl ExampleCapacity1
curl -G https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search \
     -H "x-np-api-key: <NaviPartner API Key>" \
     -d itemNumber=31001 \
     -d referenceDate=2024-10-15 \
     -d quantity=2
```

**`ExampleCapacity1`**

```python ExampleCapacity1
import requests

url = "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search"

querystring = {"itemNumber":"31001","referenceDate":"2024-10-15","quantity":"2"}

headers = {"x-np-api-key": "<NaviPartner API Key>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

**`ExampleCapacity1`**

```javascript ExampleCapacity1
const url = 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search?itemNumber=31001&referenceDate=2024-10-15&quantity=2';
const options = {method: 'GET', headers: {'x-np-api-key': '<NaviPartner API Key>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`ExampleCapacity1`**

```go ExampleCapacity1
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search?itemNumber=31001&referenceDate=2024-10-15&quantity=2"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-np-api-key", "<NaviPartner API Key>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`ExampleCapacity1`**

```ruby ExampleCapacity1
require 'uri'
require 'net/http'

url = URI("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search?itemNumber=31001&referenceDate=2024-10-15&quantity=2")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-np-api-key"] = '<NaviPartner API Key>'

response = http.request(request)
puts response.read_body
```

**`ExampleCapacity1`**

```java ExampleCapacity1
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search?itemNumber=31001&referenceDate=2024-10-15&quantity=2")
  .header("x-np-api-key", "<NaviPartner API Key>")
  .asString();
```

**`ExampleCapacity1`**

```php ExampleCapacity1
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search?itemNumber=31001&referenceDate=2024-10-15&quantity=2', [
  'headers' => [
    'x-np-api-key' => '<NaviPartner API Key>',
  ],
]);

echo $response->getBody();
```

**`ExampleCapacity1`**

```csharp ExampleCapacity1
using RestSharp;

var client = new RestClient("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search?itemNumber=31001&referenceDate=2024-10-15&quantity=2");
var request = new RestRequest(Method.GET);
request.AddHeader("x-np-api-key", "<NaviPartner API Key>");
IRestResponse response = client.Execute(request);
```

**`ExampleCapacity1`**

```swift ExampleCapacity1
import Foundation

let headers = ["x-np-api-key": "<NaviPartner API Key>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/capacity/search?itemNumber=31001&referenceDate=2024-10-15&quantity=2")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

From the response, user must select a suitable time slot. We need the `code` ("CASTLE") and `externalNumber` (452)
values to be able to create the reservation in the next step.

### Response (200)

```json
[
  {
    "capacityControl": "sales",
    "code": "CASTLE",
    "default": true,
    "discountPct": 0,
    "included": "mandatory",
    "quantity": 2,
    "referenceDate": "2024-10-15",
    "schedules": [
      {
        "allocatable": true,
        "allocationModel": "capacity",
        "capacityControl": "sales",
        "remainingCapacity": 10,
        "explanation": "Schedule is allocatable",
        "schedule": {
          "code": "MORNING",
          "duration": 10800,
          "endDate": "2024-10-15",
          "endTime": "12:00",
          "externalNumber": 452,
          "startDate": "2024-10-15",
          "startTime": "09:00",
          "arrivalFromTime": "08:30",
          "arrivalUntilTime": "10:00",
          "description": "Morning schedule"
        },
        "price": {
          "pricingOption": "fixed",
          "adjustmentAmount": 0,
          "adjustmentPct": 0,
          "adjustedUnitPrice": 100,
          "adjustedTotalPrice": 200
        },
        "sales": {
          "salesFromDate": "2024-10-11",
          "salesFromTime": "00:00",
          "salesUntilDate": "2024-10-17",
          "salesUntilTime": "23:59"
        }
      },
      {
        "allocatable": true,
        "allocationModel": "capacity",
        "capacityControl": "sales",
        "remainingCapacity": 12,
        "explanation": "Schedule is allocatable",
        "schedule": {
          "code": "EVENING",
          "duration": 10800,
          "endDate": "2024-10-15",
          "endTime": "20:00",
          "externalNumber": 489,
          "startDate": "2024-10-15",
          "startTime": "17:00",
          "arrivalFromTime": "16:30",
          "arrivalUntilTime": "18:00",
          "description": "Evening schedule"
        },
        "price": {
          "pricingOption": "fixed",
          "adjustmentAmount": 0,
          "adjustmentPct": 0,
          "adjustedUnitPrice": 100,
          "adjustedTotalPrice": 200
        },
        "sales": {
          "salesFromDate": "2024-10-11",
          "salesFromTime": "00:00",
          "salesUntilDate": "2024-10-17",
          "salesUntilTime": "23:59"
        }
      }
    ],
    "unitPrice": 100,
    "unitPriceIncludesVat": true,
    "vatPct": 25
  }
]
```

#### 3 - Create the reservation

To make a reservation we need to know the `itemNumber` (from step 1), `admissionCode` and `scheduleId` from step 2

### Request

POST [https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/reservation](https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/reservation)

**`Simple Reservation`**

```curl Simple Reservation
curl -X POST https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation \
     -H "x-np-api-key: <NaviPartner API Key>" \
     -H "Content-Type: application/json" \
     -d '{
  "reserve": [
    {
      "itemNumber": "31001",
      "quantity": 2,
      "ticketHolderLanguage": "ENU",
      "notificationAddress": "john@acme.com",
      "memberNumber": "MEMBER123",
      "content": [
        {
          "admissionCode": "CASTLE",
          "scheduleNumber": 452
        }
      ]
    }
  ]
}'
```

**`Simple Reservation`**

```python Simple Reservation
import requests

url = "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation"

payload = { "reserve": [
        {
            "itemNumber": "31001",
            "quantity": 2,
            "ticketHolderLanguage": "ENU",
            "notificationAddress": "john@acme.com",
            "memberNumber": "MEMBER123",
            "content": [
                {
                    "admissionCode": "CASTLE",
                    "scheduleNumber": 452
                }
            ]
        }
    ] }
headers = {
    "x-np-api-key": "<NaviPartner API Key>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

**`Simple Reservation`**

```javascript Simple Reservation
const url = 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation';
const options = {
  method: 'POST',
  headers: {'x-np-api-key': '<NaviPartner API Key>', 'Content-Type': 'application/json'},
  body: '{"reserve":[{"itemNumber":"31001","quantity":2,"ticketHolderLanguage":"ENU","notificationAddress":"john@acme.com","memberNumber":"MEMBER123","content":[{"admissionCode":"CASTLE","scheduleNumber":452}]}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`Simple Reservation`**

```go Simple Reservation
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation"

	payload := strings.NewReader("{\n  \"reserve\": [\n    {\n      \"itemNumber\": \"31001\",\n      \"quantity\": 2,\n      \"ticketHolderLanguage\": \"ENU\",\n      \"notificationAddress\": \"john@acme.com\",\n      \"memberNumber\": \"MEMBER123\",\n      \"content\": [\n        {\n          \"admissionCode\": \"CASTLE\",\n          \"scheduleNumber\": 452\n        }\n      ]\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("x-np-api-key", "<NaviPartner API Key>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`Simple Reservation`**

```ruby Simple Reservation
require 'uri'
require 'net/http'

url = URI("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["x-np-api-key"] = '<NaviPartner API Key>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"reserve\": [\n    {\n      \"itemNumber\": \"31001\",\n      \"quantity\": 2,\n      \"ticketHolderLanguage\": \"ENU\",\n      \"notificationAddress\": \"john@acme.com\",\n      \"memberNumber\": \"MEMBER123\",\n      \"content\": [\n        {\n          \"admissionCode\": \"CASTLE\",\n          \"scheduleNumber\": 452\n        }\n      ]\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

**`Simple Reservation`**

```java Simple Reservation
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation")
  .header("x-np-api-key", "<NaviPartner API Key>")
  .header("Content-Type", "application/json")
  .body("{\n  \"reserve\": [\n    {\n      \"itemNumber\": \"31001\",\n      \"quantity\": 2,\n      \"ticketHolderLanguage\": \"ENU\",\n      \"notificationAddress\": \"john@acme.com\",\n      \"memberNumber\": \"MEMBER123\",\n      \"content\": [\n        {\n          \"admissionCode\": \"CASTLE\",\n          \"scheduleNumber\": 452\n        }\n      ]\n    }\n  ]\n}")
  .asString();
```

**`Simple Reservation`**

```php Simple Reservation
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation', [
  'body' => '{
  "reserve": [
    {
      "itemNumber": "31001",
      "quantity": 2,
      "ticketHolderLanguage": "ENU",
      "notificationAddress": "john@acme.com",
      "memberNumber": "MEMBER123",
      "content": [
        {
          "admissionCode": "CASTLE",
          "scheduleNumber": 452
        }
      ]
    }
  ]
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'x-np-api-key' => '<NaviPartner API Key>',
  ],
]);

echo $response->getBody();
```

**`Simple Reservation`**

```csharp Simple Reservation
using RestSharp;

var client = new RestClient("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation");
var request = new RestRequest(Method.POST);
request.AddHeader("x-np-api-key", "<NaviPartner API Key>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"reserve\": [\n    {\n      \"itemNumber\": \"31001\",\n      \"quantity\": 2,\n      \"ticketHolderLanguage\": \"ENU\",\n      \"notificationAddress\": \"john@acme.com\",\n      \"memberNumber\": \"MEMBER123\",\n      \"content\": [\n        {\n          \"admissionCode\": \"CASTLE\",\n          \"scheduleNumber\": 452\n        }\n      ]\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

**`Simple Reservation`**

```swift Simple Reservation
import Foundation

let headers = [
  "x-np-api-key": "<NaviPartner API Key>",
  "Content-Type": "application/json"
]
let parameters = ["reserve": [
    [
      "itemNumber": "31001",
      "quantity": 2,
      "ticketHolderLanguage": "ENU",
      "notificationAddress": "john@acme.com",
      "memberNumber": "MEMBER123",
      "content": [
        [
          "admissionCode": "CASTLE",
          "scheduleNumber": 452
        ]
      ]
    ]
  ]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

If the reservation is successful, we will get a reservation token in return. As long as the reservation is valid, our tickets are guaranteed.
For subsequent references to this reservation we need the reservation `token`.

### Response (200)

```json
{
  "token": "ABC123456DEF789GHI",
  "reservationStatus": "registered",
  "expiresAt": "2024-10-11T12:13:00Z",
  "reservations": [
    {
      "itemNumber": "31001",
      "quantity": 2,
      "lineId": "819647d5-9d69-492e-8bb5-87799bfbf179",
      "ticket": {
        "ticketKind": "individualAdmission",
        "validFrom": "2024-10-15T00:00:00Z",
        "validUntil": "2024-10-15T23:59:59Z",
        "issuedAt": "2024-10-15T12:13:00Z",
        "blocked": false,
        "unitPrice": 80,
        "unitPriceInclVat": 100,
        "currencyCode": "DKK"
      },
      "content": [
        {
          "admissionDetails": {
            "capacityControl": "sales",
            "code": "CASTLE",
            "default": true,
            "description": {
              "title": "Castle Museum Entrance",
              "subtitle": "Adult Castle Ticket",
              "name": "Explore the Castle",
              "description": "<b>Access</b> to the castle exhibit",
              "fullDescription": "<p>Experience the grandeur of the castle's architecture and marvel at its intricate details.  Walk through beautifully decorated rooms and admire the stunning artwork and furniture on display.</p>"
            },
            "included": "mandatory"
          },
          "scheduleDetails": {
            "code": "MORNING",
            "duration": 10800,
            "endDate": "2024-10-15",
            "endTime": "12:00",
            "externalNumber": 452,
            "startDate": "2024-10-15",
            "startTime": "09:00",
            "arrivalFromTime": "08:30",
            "arrivalUntilTime": "10:00",
            "description": "Morning schedule"
          }
        }
      ]
    }
  ]
}
```

#### 4 - Confirm the reservation

Tickets are reserved but not valid until the reservation has been confirmed. To confirm a reservation we use the `/ticket/reservation/:token/confirm` endpoint.

### Request

POST [https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/reservation/\{token}/confirm](https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/reservation/\{token}/confirm)

**`Confirm individual admission ticket`**

```curl Confirm individual admission ticket
curl -X POST https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm \
     -H "x-np-api-key: <NaviPartner API Key>" \
     -H "Content-Type: application/json" \
     -d '{
  "ticketHolder": "John Doe",
  "ticketHolderLanguage": "ENU",
  "notificationAddress": "john@acme.com",
  "paymentReference": "PAY123456"
}'
```

**`Confirm individual admission ticket`**

```python Confirm individual admission ticket
import requests

url = "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm"

payload = {
    "ticketHolder": "John Doe",
    "ticketHolderLanguage": "ENU",
    "notificationAddress": "john@acme.com",
    "paymentReference": "PAY123456"
}
headers = {
    "x-np-api-key": "<NaviPartner API Key>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

**`Confirm individual admission ticket`**

```javascript Confirm individual admission ticket
const url = 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm';
const options = {
  method: 'POST',
  headers: {'x-np-api-key': '<NaviPartner API Key>', 'Content-Type': 'application/json'},
  body: '{"ticketHolder":"John Doe","ticketHolderLanguage":"ENU","notificationAddress":"john@acme.com","paymentReference":"PAY123456"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`Confirm individual admission ticket`**

```go Confirm individual admission ticket
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm"

	payload := strings.NewReader("{\n  \"ticketHolder\": \"John Doe\",\n  \"ticketHolderLanguage\": \"ENU\",\n  \"notificationAddress\": \"john@acme.com\",\n  \"paymentReference\": \"PAY123456\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("x-np-api-key", "<NaviPartner API Key>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`Confirm individual admission ticket`**

```ruby Confirm individual admission ticket
require 'uri'
require 'net/http'

url = URI("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["x-np-api-key"] = '<NaviPartner API Key>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"ticketHolder\": \"John Doe\",\n  \"ticketHolderLanguage\": \"ENU\",\n  \"notificationAddress\": \"john@acme.com\",\n  \"paymentReference\": \"PAY123456\"\n}"

response = http.request(request)
puts response.read_body
```

**`Confirm individual admission ticket`**

```java Confirm individual admission ticket
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm")
  .header("x-np-api-key", "<NaviPartner API Key>")
  .header("Content-Type", "application/json")
  .body("{\n  \"ticketHolder\": \"John Doe\",\n  \"ticketHolderLanguage\": \"ENU\",\n  \"notificationAddress\": \"john@acme.com\",\n  \"paymentReference\": \"PAY123456\"\n}")
  .asString();
```

**`Confirm individual admission ticket`**

```php Confirm individual admission ticket
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm', [
  'body' => '{
  "ticketHolder": "John Doe",
  "ticketHolderLanguage": "ENU",
  "notificationAddress": "john@acme.com",
  "paymentReference": "PAY123456"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'x-np-api-key' => '<NaviPartner API Key>',
  ],
]);

echo $response->getBody();
```

**`Confirm individual admission ticket`**

```csharp Confirm individual admission ticket
using RestSharp;

var client = new RestClient("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm");
var request = new RestRequest(Method.POST);
request.AddHeader("x-np-api-key", "<NaviPartner API Key>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"ticketHolder\": \"John Doe\",\n  \"ticketHolderLanguage\": \"ENU\",\n  \"notificationAddress\": \"john@acme.com\",\n  \"paymentReference\": \"PAY123456\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

**`Confirm individual admission ticket`**

```swift Confirm individual admission ticket
import Foundation

let headers = [
  "x-np-api-key": "<NaviPartner API Key>",
  "Content-Type": "application/json"
]
let parameters = [
  "ticketHolder": "John Doe",
  "ticketHolderLanguage": "ENU",
  "notificationAddress": "john@acme.com",
  "paymentReference": "PAY123456"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/reservation/ABC123456DEF789GHI/confirm")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

The response object contains the ticket numbers that are created and valid for admission.

### Response (200)

```json
{
  "token": "ABC123456DEF789GHI",
  "reservationStatus": "confirmed",
  "reservations": [
    {
      "itemNumber": "31001",
      "quantity": 2,
      "lineId": "819647d5-9d69-492e-8bb5-87799bfbf179",
      "ticket": {
        "ticketKind": "individualAdmission",
        "validFrom": "2024-10-15T00:00:00Z",
        "validUntil": "2024-10-15T23:59:59Z",
        "issuedAt": "2024-10-15T12:13:00Z",
        "blocked": false,
        "unitPrice": 80,
        "unitPriceInclVat": 100,
        "currencyCode": "DKK",
        "ticketNumbers": [
          {
            "ticketId": "12345678-1234-1234-1234-123456789012",
            "ticketNumber": "TICKET123"
          },
          {
            "ticketId": "ABCDEFAB-1234-1234-1234-123456789013",
            "ticketNumber": "TICKET124"
          }
        ],
        "pinCode": "1234-5678",
        "ticketHolder": "John Doe"
      },
      "content": [
        {
          "admissionDetails": {
            "capacityControl": "sales",
            "code": "CASTLE",
            "default": true,
            "description": {
              "title": "Castle Museum Entrance",
              "subtitle": "Adult Castle Ticket",
              "name": "Explore the Castle",
              "description": "<b>Access</b> to the castle exhibit",
              "fullDescription": "<p>Experience the grandeur of the castle's architecture and marvel at its intricate details.  Walk through beautifully decorated rooms and admire the stunning artwork and furniture on display.</p>"
            },
            "included": "mandatory"
          },
          "scheduleDetails": {
            "code": "MORNING",
            "duration": 10800,
            "endDate": "2024-10-15",
            "endTime": "12:00",
            "externalNumber": 452,
            "startDate": "2024-10-15",
            "startTime": "09:00",
            "arrivalFromTime": "08:30",
            "arrivalUntilTime": "10:00",
            "description": "Morning schedule"
          }
        }
      ]
    }
  ]
}
```

#### 5 - Ticket information

To get access to the ticket endpoint services, you need to know the ticketId - a unique id for each ticket. You can look-up the this id if you have printed barcode of the ticket with the `Find Ticket` service.

### Request

GET [https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket](https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket)

**`Find tickets using external ticket numbers`**

```curl Find tickets using external ticket numbers
curl -G https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket \
     -H "x-np-api-key: <NaviPartner API Key>" \
     --data-urlencode externalNumbers=TICKET123,TICKET124 \
     -d withAdmissionContent=true \
     -d withAccessHistoryDetails=true \
     -d withWallet=true \
     -d activeOnly=true
```

**`Find tickets using external ticket numbers`**

```python Find tickets using external ticket numbers
import requests

url = "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket"

querystring = {"externalNumbers":"TICKET123,TICKET124","withAdmissionContent":"true","withAccessHistoryDetails":"true","withWallet":"true","activeOnly":"true"}

headers = {"x-np-api-key": "<NaviPartner API Key>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

**`Find tickets using external ticket numbers`**

```javascript Find tickets using external ticket numbers
const url = 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket?externalNumbers=TICKET123%2CTICKET124&withAdmissionContent=true&withAccessHistoryDetails=true&withWallet=true&activeOnly=true';
const options = {method: 'GET', headers: {'x-np-api-key': '<NaviPartner API Key>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`Find tickets using external ticket numbers`**

```go Find tickets using external ticket numbers
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket?externalNumbers=TICKET123%2CTICKET124&withAdmissionContent=true&withAccessHistoryDetails=true&withWallet=true&activeOnly=true"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-np-api-key", "<NaviPartner API Key>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`Find tickets using external ticket numbers`**

```ruby Find tickets using external ticket numbers
require 'uri'
require 'net/http'

url = URI("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket?externalNumbers=TICKET123%2CTICKET124&withAdmissionContent=true&withAccessHistoryDetails=true&withWallet=true&activeOnly=true")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-np-api-key"] = '<NaviPartner API Key>'

response = http.request(request)
puts response.read_body
```

**`Find tickets using external ticket numbers`**

```java Find tickets using external ticket numbers
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket?externalNumbers=TICKET123%2CTICKET124&withAdmissionContent=true&withAccessHistoryDetails=true&withWallet=true&activeOnly=true")
  .header("x-np-api-key", "<NaviPartner API Key>")
  .asString();
```

**`Find tickets using external ticket numbers`**

```php Find tickets using external ticket numbers
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket?externalNumbers=TICKET123%2CTICKET124&withAdmissionContent=true&withAccessHistoryDetails=true&withWallet=true&activeOnly=true', [
  'headers' => [
    'x-np-api-key' => '<NaviPartner API Key>',
  ],
]);

echo $response->getBody();
```

**`Find tickets using external ticket numbers`**

```csharp Find tickets using external ticket numbers
using RestSharp;

var client = new RestClient("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket?externalNumbers=TICKET123%2CTICKET124&withAdmissionContent=true&withAccessHistoryDetails=true&withWallet=true&activeOnly=true");
var request = new RestRequest(Method.GET);
request.AddHeader("x-np-api-key", "<NaviPartner API Key>");
IRestResponse response = client.Execute(request);
```

**`Find tickets using external ticket numbers`**

```swift Find tickets using external ticket numbers
import Foundation

let headers = ["x-np-api-key": "<NaviPartner API Key>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket?externalNumbers=TICKET123%2CTICKET124&withAdmissionContent=true&withAccessHistoryDetails=true&withWallet=true&activeOnly=true")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

When the ticketId is know, use the `Get Ticket` endpoint to retrieve all ticket information.

### Request

GET [https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/\{ticketId}](https://api.npretail.app/\{tenant}/\{environment}/\{company}/ticket/\{ticketId})

**`Get individual admission ticket`**

```curl Get individual admission ticket
curl -G https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012 \
     -H "x-np-api-key: <NaviPartner API Key>" \
     -d storeCode=EN \
     -d withAccessHistory=true \
     -d withAccessHistoryDetails=true \
     -d withWallet=true
```

**`Get individual admission ticket`**

```python Get individual admission ticket
import requests

url = "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012"

querystring = {"storeCode":"EN","withAccessHistory":"true","withAccessHistoryDetails":"true","withWallet":"true"}

headers = {"x-np-api-key": "<NaviPartner API Key>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

**`Get individual admission ticket`**

```javascript Get individual admission ticket
const url = 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012?storeCode=EN&withAccessHistory=true&withAccessHistoryDetails=true&withWallet=true';
const options = {method: 'GET', headers: {'x-np-api-key': '<NaviPartner API Key>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`Get individual admission ticket`**

```go Get individual admission ticket
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012?storeCode=EN&withAccessHistory=true&withAccessHistoryDetails=true&withWallet=true"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-np-api-key", "<NaviPartner API Key>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`Get individual admission ticket`**

```ruby Get individual admission ticket
require 'uri'
require 'net/http'

url = URI("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012?storeCode=EN&withAccessHistory=true&withAccessHistoryDetails=true&withWallet=true")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-np-api-key"] = '<NaviPartner API Key>'

response = http.request(request)
puts response.read_body
```

**`Get individual admission ticket`**

```java Get individual admission ticket
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012?storeCode=EN&withAccessHistory=true&withAccessHistoryDetails=true&withWallet=true")
  .header("x-np-api-key", "<NaviPartner API Key>")
  .asString();
```

**`Get individual admission ticket`**

```php Get individual admission ticket
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012?storeCode=EN&withAccessHistory=true&withAccessHistoryDetails=true&withWallet=true', [
  'headers' => [
    'x-np-api-key' => '<NaviPartner API Key>',
  ],
]);

echo $response->getBody();
```

**`Get individual admission ticket`**

```csharp Get individual admission ticket
using RestSharp;

var client = new RestClient("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012?storeCode=EN&withAccessHistory=true&withAccessHistoryDetails=true&withWallet=true");
var request = new RestRequest(Method.GET);
request.AddHeader("x-np-api-key", "<NaviPartner API Key>");
IRestResponse response = client.Execute(request);
```

**`Get individual admission ticket`**

```swift Get individual admission ticket
import Foundation

let headers = ["x-np-api-key": "<NaviPartner API Key>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./ticket/12345678-1234-1234-1234-123456789012?storeCode=EN&withAccessHistory=true&withAccessHistoryDetails=true&withWallet=true")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

The response contain all relevant ticket details:

### Response (200)

```json
{
  "ticketId": "12345678-1234-1234-1234-123456789012",
  "ticketNumber": "TICKET123",
  "ticketKind": "individualAdmission",
  "reservationToken": "ABC123456DEF789GHI",
  "itemNumber": "31001",
  "validFrom": "2024-10-15T00:00:00Z",
  "validUntil": "2025-10-14T23:59:59Z",
  "issuedAt": "2024-10-15T12:13:00Z",
  "blocked": false,
  "content": [
    {
      "admissionDetails": {
        "capacityControl": "sales",
        "code": "CASTLE",
        "default": true,
        "description": {
          "title": "Castle Museum Entrance",
          "subtitle": "Adult Castle Ticket",
          "name": "Explore the Castle",
          "description": "<b>Access</b> to the castle exhibit",
          "fullDescription": "<p>Experience the grandeur of the castle's architecture and marvel at its intricate details.  Walk through beautifully decorated rooms and admire the stunning artwork and furniture on display.</p>"
        },
        "included": "mandatory"
      },
      "scheduleDetails": {
        "code": "MORNING",
        "duration": 10800,
        "endDate": "2024-10-15",
        "endTime": "12:00",
        "externalNumber": 452,
        "startDate": "2024-10-15",
        "startTime": "09:00",
        "type": "initialEntry",
        "arrivalFromTime": "08:30",
        "arrivalUntilTime": "10:00",
        "description": "Morning schedule"
      }
    }
  ],
  "description": {
    "title": "Castle Museum Entrance",
    "subtitle": "Adult Castle Ticket",
    "name": "Explore History",
    "description": "<b>Access</b> to all castle exhibits",
    "fullDescription": "<p>Step back in time and immerse yourself in the rich history of our castle museum.  Discover fascinating artifacts, explore grand halls, and learn about the lives of the people who once lived within these walls.</p> <p>Experience the grandeur of the castle's architecture and marvel at its intricate details.  Walk through beautifully decorated rooms and admire the stunning artwork and furniture on display.</p> <p>Join a guided tour to gain deeper insights into the castle's history and hear captivating stories  about its past. Learn about the battles fought, the royal inhabitants, and the secrets that lie hidden within these ancient walls.</p>"
  },
  "pinCode": "1234-5678",
  "unitPrice": 80,
  "unitPriceInclVat": 100,
  "currencyCode": "DKK",
  "ticketHolder": "John Doe",
  "ticketHolderLanguage": "ENU",
  "notificationAddress": "john@acme.com",
  "inWallet": true,
  "wallets": [
    {
      "walletId": "a2cbd5bc-5cf4-ef11-b3a1-a1084fe21c78",
      "referenceNumber": "141234529930210327",
      "description": "My wallet holds my tickets, coupons and vouchers for the event.",
      "expiryDatetime": "2026-12-31T23:59:59Z",
      "lastPrintedAt": "2026-12-31T23:59:59Z",
      "printCount": 1,
      "originatesFromItemNo": "70009",
      "originatesFromDescription": "Family Fun Pack",
      "externalReferenceNumber": "151234529930210327"
    }
  ],
  "printCount": 1,
  "printedAt": "2024-10-15T12:00:00Z",
  "accessHistory": [
    {
      "admissionCode": "CASTLE",
      "firstAdmissionAt": "2025-01-31T09:12:00Z",
      "events": [
        {
          "event": "admitted",
          "eventAt": "2025-01-31T09:12:00Z"
        },
        {
          "event": "departed",
          "eventAt": "2025-01-31T12:47:00Z"
        }
      ]
    }
  ]
}
```