FORMAT: 1A HOST: https://openapi.eventii.dk/v1 # eventii Open API The eventii Open API provides programmatic access to the eventii ticketing platform. Manage customers, events, tickets, season cards, partners, webhooks, and more. ## Authentication All requests require an API key passed via the `X-API-KEY` header. ``` X-API-KEY: your-api-key-here ``` Each API key has scoped permissions (e.g. `Customers:Read`, `Tickets:Update`). Contact eventii to obtain an API key with the scopes your integration requires. ## Rate Limiting Most endpoints limit an API key to **100 requests per 60 seconds**. Operation-specific limits apply where documented; starting a historical sync is limited to **10 requests per 60 seconds**, while retrieving its status is limited to **60 requests per 60 seconds**. Exceeding a limit returns `429 Too Many Requests`. ## Response Format Most successful responses are wrapped in a standard envelope: ```json { "statusCode": 200, "isSuccess": true, "result": { ... } } ``` Paginated responses include pagination metadata: ```json { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 100, "data": [ ... ] } ``` Historical synchronization operations return their run status object directly, rather than this envelope. ## Error Responses Many errors follow this standard format; check each operation's documented status responses because synchronization operations return a run status object directly: ```json { "statusCode": 400, "isSuccess": false, "errorMessage": "bad request", "errors": ["'Id' must not be empty."] } ``` # Group Accounts Manage user accounts in the identity system. Create accounts, validate credentials, and change passwords. ## Account [/accounts/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Account ID (GUID) ### Get Account [GET] Retrieve an account by ID. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "email": "john.doe@example.com", "firstName": "John", "lastName": "Doe", "phoneNumber": "+4512345678", "address": "Vestergade 1", "city": "København", "postalCode": "1456", "country": "Danmark", "company": "", "vatNumber": "", "birthday": "1990-01-01", "gender": "Male", "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Entity of type Account with id 3fa85f64-5717-4562-b3fc-2c963f66afa6 was not found"] } ## Account By Username [/accounts/username/{Username}] + Parameters + Username: `john.doe@example.com` (string, required) - Username (typically an email) ### Get Account By Username [GET] Retrieve an account by username. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "email": "john.doe@example.com", "normalizedEmail": "JOHN.DOE@EXAMPLE.COM", "userName": "john.doe@example.com", "normalizedUserName": "JOHN.DOE@EXAMPLE.COM", "lockoutEnabled": false, "lockoutEnd": null } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Account with username john.doe@example.com was not found"] } ## Account Collection [/accounts] ### Create Account [POST] Create a new account in the identity system. + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "firstName": "John", "lastName": "Doe", "email": "john.doe@example.com", "phoneNumber": "+4512345678", "address": "Vestergade 1", "city": "København", "postalCode": "1456", "country": "Danmark", "company": "", "vatNumber": "", "birthday": "1990-01-01", "gender": "Male", "password": "SecureP@ss1", "passwordConfirmation": "SecureP@ss1", "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "email": "john.doe@example.com", "firstName": "John", "lastName": "Doe", "phoneNumber": "+4512345678", "address": "Vestergade 1", "city": "København", "postalCode": "1456", "country": "Danmark", "company": "", "vatNumber": "", "birthday": "1990-01-01", "gender": "Male", "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } } + Response 409 (application/json) { "statusCode": 409, "isSuccess": false, "errorMessage": "conflict", "errors": ["An account with this email already exists"] } ## Validate Credentials [/accounts/validatecredentials] ### Validate Credentials [POST] Validate username and password combination. + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "username": "john.doe@example.com", "password": "SecureP@ss1" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "email": "john.doe@example.com", "firstName": "John", "lastName": "Doe" } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Invalid credentials"] } ## Change Password [/accounts/changepassword] ### Change Password [POST] Change an account's password. Password must contain at least 8 characters, one letter, one digit, and one special character. + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "currentPassword": "OldP@ss1", "newPassword": "NewP@ss2" } + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Account not found"] } # Group API Keys Retrieve information about API keys. ## API Key [/apikeys] ### Get API Key [GET] Retrieve details about the current API key including its scopes. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "issuedTo": "Partner Integration", "issuedBy": "admin@eventii.dk", "issuedAtUtc": "2024-01-01T00:00:00Z", "expiresAtUtc": "2025-12-31T23:59:59Z", "scopes": [ "Customers:Read", "Tickets:Read", "SeasonCards:Read" ] } } # Group Customers Manage customer data, consents, and loyalty. ## Customer [/customers/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Customer ID (GUID) ### Get Customer [GET] Retrieve a customer by ID. **Required scope:** `Customers:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "fullName": "John Doe", "email": "john.doe@example.com", "phone": "+4512345678", "company": null, "cvrNumber": null, "birthday": "1990-01-01", "gender": "Male", "street": "Vestergade 1", "city": "København", "zipCode": "1456", "country": "Danmark", "subjectId": "auth0|abc123", "customFieldValue": null, "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "availableLoyaltyPoints": 150 } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Entity of type Customer with id 3fa85f64-5717-4562-b3fc-2c963f66afa6 was not found"] } ## Consent Types [/customers/consenttypes] ### Get Consent Types [GET] Retrieve all available consent types. **Required scope:** `Customers:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "marketing_email", "description": "Permission to send marketing emails", "displayName": "Email Marketing", "isRequired": false, "termsLink": "https://example.com/terms" } ] } ## Consent Type [/customers/consent] ### Create Consent Type [POST] Create a new consent type. **Required scope:** `Customers:Create` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "name": "marketing_email", "description": "Permission to send marketing emails", "displayName": "Email Marketing", "isRequired": false, "termsLink": "https://example.com/terms" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "marketing_email", "description": "Permission to send marketing emails", "displayName": "Email Marketing", "isRequired": false, "termsLink": "https://example.com/terms" } } ## Consent Type Update [/customers/consent/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Consent Type ID (GUID) ### Update Consent Type [PUT] Update an existing consent type. **Required scope:** `Customers:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "marketing_email", "description": "Updated description", "displayName": "Email Marketing Updated", "isRequired": false, "termsLink": "https://example.com/terms-v2" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": {} } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Consent type not found"] } ## Customer Consents [/customers/{id}/consents] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Customer ID (GUID) ### Get Customer Consents [GET] Retrieve all consents for a customer. **Required scope:** `Customers:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "consentTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "consentTypeName": "marketing_email", "grantedTimestamp": "2024-06-01T12:00:00Z", "grantedBy": "customer", "revokedTimestamp": null, "revokedBy": null } ] } ## Grant Consent [/customers/{CustomerId}/consent/grant/{ConsentTypeId}] + Parameters + CustomerId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Customer ID (GUID) + ConsentTypeId: `4fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Consent Type ID (GUID) ### Grant Consent [POST] Grant a consent type for a customer. **Required scope:** `Customers:Update` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": {} } ## Revoke Consent [/customers/{CustomerId}/consent/revoke/{ConsentTypeId}] + Parameters + CustomerId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Customer ID (GUID) + ConsentTypeId: `4fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Consent Type ID (GUID) ### Revoke Consent [POST] Revoke a consent type for a customer. **Required scope:** `Customers:Update` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": {} } ## Customers With Consent [/customers/consents/{ConsentTypeId}] + Parameters + ConsentTypeId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Consent Type ID (GUID) ### Get Customers With Consent [GET] Retrieve all customers who have granted a specific consent type. **Required scope:** `Customers:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "customerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "email": "john.doe@example.com", "grantedTimestamp": "2024-06-01T12:00:00Z" } ] } # Group Events Manage events and event types. ## Events Collection [/events] ### Get Events [GET] Retrieve all events. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VFF - OB", "displayName": "VFF vs OB", "matchId": 12345, "startTime": "2024-09-15T18:00:00Z", "endTime": "2024-09-15T20:00:00Z", "openTime": "2024-09-15T16:00:00Z", "eventText": "Superliga Round 8", "eventTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "eventTypeName": "Superliga", "imageUrl": "https://cdn.eventii.dk/events/vff-ob.jpg", "homeTeamLogoUrl": "https://cdn.eventii.dk/teams/vff.png", "awayLogoTeamLogoUrl": "https://cdn.eventii.dk/teams/ob.png", "venueId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "venueName": "Vejle Stadion" } ] } ## Event [/events/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event ID (GUID) ### Get Event [GET] Retrieve an event by ID. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VFF - OB", "displayName": "VFF vs OB", "matchId": 12345, "startTime": "2024-09-15T18:00:00Z", "endTime": "2024-09-15T20:00:00Z", "openTime": "2024-09-15T16:00:00Z", "eventText": "Superliga Round 8", "eventTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "eventTypeName": "Superliga", "imageUrl": "https://cdn.eventii.dk/events/vff-ob.jpg", "homeTeamLogoUrl": "https://cdn.eventii.dk/teams/vff.png", "awayLogoTeamLogoUrl": "https://cdn.eventii.dk/teams/ob.png", "venueId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "venueName": "Vejle Stadion" } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Entity of type Event with id 3fa85f64-5717-4562-b3fc-2c963f66afa6 was not found"] } ## Event Types Collection [/eventtypes] ### Get Event Types [GET] Retrieve all event types. **Required scope:** `Events:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Superliga", "description": "Danish Superliga matches" } ] } ### Create Event Type [POST] Create a new event type. **Required scope:** `Events:Create` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "name": "Superliga", "description": "Danish Superliga matches" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Superliga", "description": "Danish Superliga matches" } } ## Event Type [/eventtypes/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event Type ID (GUID) ### Get Event Type [GET] Retrieve a single event type by ID. **Required scope:** `Events:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Superliga", "description": "Danish Superliga matches" } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Event type not found"] } ### Update Event Type [PUT] Update an existing event type. **Required scope:** `Events:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Superliga Updated", "description": "Updated description" } + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Event type not found"] } # Group Tickets Manage tickets including retrieval, forwarding, and releasing. ## Ticket [/tickets/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Ticket ID (GUID) ### Get Ticket [GET] Retrieve a ticket by ID. **Required scope:** `Tickets:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "status": "Active", "deliveryType": "Digital", "expirationTime": "2024-09-15T22:00:00Z", "buyerInfo": { "id": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "externalId": "123456", "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "firstName": "John", "lastName": "Doe", "company": "", "gender": "Male", "birthDate": "1990-01-01" }, "holderInfo": { "id": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "externalId": "123456", "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "firstName": "John", "lastName": "Doe", "company": "", "gender": "Male", "birthDate": "1990-01-01" }, "eventInfo": { "id": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VFF - OB", "description": "Superliga Round 8", "startTime": "2024-09-15T18:00:00Z", "endTime": "2024-09-15T20:00:00Z", "gatesOpenTime": "2024-09-15T16:00:00Z", "venueId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "venueName": "Vejle Stadion" }, "seatingInfo": { "sectionId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "sectionName": "Section A", "tribune": "Nord", "entranceId": "8fa85f64-5717-4562-b3fc-2c963f66afa6", "entranceName": "Indgang 1", "seatId": "9fa85f64-5717-4562-b3fc-2c963f66afa6", "seatNumber": "15", "rowNumber": "3", "isNumbered": true }, "orderInfo": { "id": "afa85f64-5717-4562-b3fc-2c963f66afa6", "orderNumber": "1725522", "transactionId": "txn_abc123", "faceValue": 150.00, "deliveryPrice": 0.00, "totalPrice": 150.00, "priceCategoryId": "bfa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategory": "Voksen" }, "events": [ { "type": "Created", "timeStamp": "2024-08-01T10:00:00Z", "message": "Ticket was created" } ], "pdfLink": "https://api.eventii.dk/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6/pdf", "appleWalletLink": "https://applewallet.com/pass123", "googlePayLink": "https://googlewallet.com/pass123" } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Ticket not found"] } ## Tickets By Buyer [/tickets/buyer/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Buyer ID (GUID) ### Get Tickets By Buyer [GET] Retrieve all tickets purchased by a buyer. **Required scope:** `Tickets:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "status": "Active", "deliveryType": "Digital", "expirationTime": "2024-09-15T22:00:00Z", "buyerInfo": { }, "holderInfo": { }, "eventInfo": { }, "seatingInfo": { }, "orderInfo": { }, "events": [], "pdfLink": "", "appleWalletLink": "", "googlePayLink": "" } ] } ## Tickets By Holder [/tickets/holder/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Holder ID (GUID) ### Get Tickets By Holder [GET] Retrieve all tickets held by a person (only tickets currently on their profile). **Required scope:** `Tickets:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "status": "Active", "deliveryType": "Digital", "expirationTime": "2024-09-15T22:00:00Z", "buyerInfo": { }, "holderInfo": { }, "eventInfo": { }, "seatingInfo": { }, "orderInfo": { }, "events": [], "pdfLink": "", "appleWalletLink": "", "googlePayLink": "" } ] } ## Forward Ticket [/tickets/{id}/forward] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Ticket ID (GUID) ### Forward Ticket [POST] Forward a ticket to another person via email. **This action cannot be undone.** **Required scope:** `Tickets:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "email": "recipient@example.com" } + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Ticket not found"] } ## Release Ticket [/tickets/{id}/release] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Ticket ID (GUID) ### Release Ticket [POST] Release a ticket for resale. **This action cannot be undone.** **Required scope:** `Tickets:Update` + Request + Headers X-API-KEY: your-api-key-here + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Ticket not found"] } # Group Season Cards Manage season cards including retrieval, forwarding, releasing, and issuing as tickets. ## Season Card [/seasoncards/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Season Card ID (GUID) ### Get Season Card [GET] Retrieve a season card by ID. **Required scope:** `SeasonCards:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "cardHolder": "John Doe", "seasonCardTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "seasonCardTypeName": "Sæsonkort 2024/25", "status": "Active", "deliveryType": "Digital", "validFrom": "2024-07-01T00:00:00Z", "expirationTime": "2025-06-30T23:59:59Z", "holderBirthday": "1990-01-15T00:00:00Z", "buyerInfo": { "id": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "externalId": "123456", "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "firstName": "John", "lastName": "Doe", "company": "", "gender": "Male", "birthDate": "1990-01-01" }, "holderInfo": { "id": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "externalId": "123456", "externalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "firstName": "John", "lastName": "Doe", "company": "", "gender": "Male", "birthDate": "1990-01-01" }, "orderInfo": { "id": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "orderNumber": "1725522", "transactionId": "txn_abc123", "faceValue": 2500.00, "deliveryPrice": 0.00, "totalPrice": 2500.00, "priceCategoryId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategory": "Voksen" }, "seatingInfo": { "sectionId": "8fa85f64-5717-4562-b3fc-2c963f66afa6", "sectionName": "Section A", "tribune": "Nord", "entranceId": "9fa85f64-5717-4562-b3fc-2c963f66afa6", "entranceName": "Indgang 6", "seatId": "afa85f64-5717-4562-b3fc-2c963f66afa6", "seatNumber": "15", "rowNumber": "3", "isNumbered": true }, "appleWalletLink": "https://applewallet.com/pass123", "googlePayLink": "https://googlewallet.com/pass123", "validEvents": [ { "id": "bfa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VFF - OB", "startTime": "2024-09-15T18:00:00Z", "releaseStartTime": "2024-09-10T00:00:00Z", "releaseEndTime": "2024-09-14T23:59:59Z", "issueTicketStartTime": "2024-09-10T00:00:00Z", "issueTicketEndTime": "2024-09-14T23:59:59Z", "venueId": "cfa85f64-5717-4562-b3fc-2c963f66afa6", "venueName": "Vejle Stadion", "venueStreet": "Stadionvej 1", "venueCity": "Vejle", "venueZipCode": "7100", "venueCountry": "Danmark", "venueLongitude": 9.5357, "venueLatitude": 55.7113 } ], "releaseEvents": [ { "eventId": "dfa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "VFF - FCK", "eventTime": "2024-08-20T18:00:00Z", "releasedBy": "john.doe@example.com", "timestamp": "2024-08-15T10:30:00Z" } ], "cardTickets": [ { "ticketId": "efa85f64-5717-4562-b3fc-2c963f66afa6", "orderId": "ffa85f64-5717-4562-b3fc-2c963f66afa6", "orderNumber": "1725600", "issuedTo": "friend@example.com", "eventId": "bfa85f64-5717-4562-b3fc-2c963f66afa7", "eventName": "VFF - BIF", "eventTime": "2024-09-01T18:00:00Z", "timestamp": "2024-08-28T14:00:00Z" } ], "logEvents": [ { "eventType": "Released", "eventId": "dfa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "VFF - FCK", "message": "Season card was released for event VFF - FCK (dfa85f64-5717-4562-b3fc-2c963f66afa6)" }, { "eventType": "SentAsTicket", "eventId": "bfa85f64-5717-4562-b3fc-2c963f66afa7", "eventName": "VFF - BIF", "message": "Season card was sent as ticket to friend@example.com for event VFF - BIF (bfa85f64-5717-4562-b3fc-2c963f66afa7)" } ], "isSubscription": false } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Season card not found"] } ## Season Cards Query [/seasoncards/query{?page,pageSize,seasonCardTypeId,priceCategoryId,includeCancelled,includeExpired}] + Parameters + page: `1` (number, optional) - Page number (default: 1) + pageSize: `50` (number, optional) - Page size (default: 50) + seasonCardTypeId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, optional) - Filter by season card type + priceCategoryId: `4fa85f64-5717-4562-b3fc-2c963f66afa6` (string, optional) - Filter by price category + includeCancelled: `false` (boolean, optional) - Include cancelled cards + includeExpired: `false` (boolean, optional) - Include expired cards ### Query Season Cards [GET] Paginated query of season cards with optional filters. **Required scope:** `SeasonCards:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 150, "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "cardHolder": "John Doe", "seasonCardTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "seasonCardTypeName": "Sæsonkort 2024/25", "status": "Active", "deliveryType": "Digital", "validFrom": "2024-07-01T00:00:00Z", "expirationTime": "2025-06-30T23:59:59Z", "holderBirthday": "1990-01-15T00:00:00Z", "buyerInfo": { }, "holderInfo": { }, "orderInfo": { }, "seatingInfo": { }, "appleWalletLink": "", "googlePayLink": "", "validEvents": [], "releaseEvents": [], "cardTickets": [], "logEvents": [], "isSubscription": false } ] } ## Season Cards By Buyer [/seasoncards/buyer/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Buyer ID (GUID) ### Get Season Cards By Buyer [GET] Retrieve all season cards purchased by a buyer, including cards that have been forwarded to others. **Required scope:** `SeasonCards:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "cardHolder": "John Doe", "seasonCardTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "seasonCardTypeName": "Sæsonkort 2024/25", "status": "Active", "deliveryType": "Digital", "validFrom": "2024-07-01T00:00:00Z", "expirationTime": "2025-06-30T23:59:59Z", "holderBirthday": "1990-01-15T00:00:00Z", "buyerInfo": { }, "holderInfo": { }, "orderInfo": { }, "seatingInfo": { }, "appleWalletLink": "", "googlePayLink": "", "validEvents": [], "releaseEvents": [], "cardTickets": [], "logEvents": [], "isSubscription": false } ] } ## Season Cards By Holder [/seasoncards/holder/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Holder ID (GUID) ### Get Season Cards By Holder [GET] Retrieve all season cards held by a person (only cards currently on their profile). **Required scope:** `SeasonCards:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "cardHolder": "John Doe", "seasonCardTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "seasonCardTypeName": "Sæsonkort 2024/25", "status": "Active", "deliveryType": "Digital", "validFrom": "2024-07-01T00:00:00Z", "expirationTime": "2025-06-30T23:59:59Z", "holderBirthday": "1990-01-15T00:00:00Z", "buyerInfo": { }, "holderInfo": { }, "orderInfo": { }, "seatingInfo": { }, "appleWalletLink": "", "googlePayLink": "", "validEvents": [], "releaseEvents": [], "cardTickets": [], "logEvents": [], "isSubscription": false } ] } ## Forward Season Card [/seasoncards/{id}/forward] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Season Card ID (GUID) ### Forward Season Card [POST] Forward an entire season card to another person via email. **This action cannot be undone.** The card will be transferred from the current holder's profile to the recipient. **Required scope:** `SeasonCards:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "email": "recipient@example.com" } + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Season card not found"] } ## Release Season Card [/seasoncards/{id}/release] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Season Card ID (GUID) ### Release Season Card [POST] Release a season card for a specific event so the seat can be resold. **This action cannot be undone.** Only allowed within the event's release time window (`releaseStartTime` to `releaseEndTime`). **Required scope:** `SeasonCards:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "eventId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" } + Response 204 + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "bad request", "errors": ["Release window is not open for this event"] } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Season card not found"] } ## Send Season Card As Ticket [/seasoncards/{id}/ticket] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Season Card ID (GUID) ### Send As Ticket [POST] Issue a ticket from the season card for a specific event and send it to a recipient. Only allowed within the event's ticket issuance window (`issueTicketStartTime` to `issueTicketEndTime`). A season card can only issue one ticket per event. **Required scope:** `SeasonCards:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "eventId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "recipient": "friend@example.com" } + Response 204 + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "bad request", "errors": ["Ticket issuance window is not open for this event"] } + Response 409 (application/json) { "statusCode": 409, "isSuccess": false, "errorMessage": "conflict", "errors": ["A ticket has already been issued for this event"] } # Group Subscriptions Manage ticket subscriptions. ## Buyer Ticket Subscriptions [/subscriptions/tickets/buyer/{BuyerId}] + Parameters + BuyerId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Buyer ID (GUID) ### Get Buyer Ticket Subscriptions [GET] Retrieve all ticket subscriptions for a buyer. **Required scope:** `Subscriptions:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "Active", "deliveryType": "Digital", "seasonCardTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "seasonCardTypeName": "Billetabonnement 2024/25", "validFrom": "2024-07-01T00:00:00Z", "expirationTime": "2025-06-30T23:59:59Z", "holderBirthday": "1990-01-15T00:00:00Z", "buyerInfo": { }, "holderInfo": { }, "orderInfo": { }, "tickets": [ { "id": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "status": "Active", "deliveryType": "Digital", "expirationTime": "2024-09-15T22:00:00Z", "eventInfo": { }, "seatingInfo": { }, "orderInfo": { }, "appleWalletLink": "", "googlePayLink": "" } ], "validEvents": [] } ] } # Group Loyalty Retrieve loyalty point balances and activity. ## Loyalty Account [/loyalty/{CustomerId}] + Parameters + CustomerId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Customer ID (GUID) ### Get Loyalty Points [GET] Retrieve loyalty point balance and action history for a customer. **Required scope:** `Customers:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "points": 150, "actions": [ { "barcode": "1234567890123456", "event": "VFF - OB", "expiration": "2025-12-31T23:59:59Z", "name": "Match attendance", "points": 10, "timestamp": "2024-09-15T18:30:00Z", "type": "Earned" } ] } } # Group Pricing Retrieve pricing information. ## Price Categories [/pricing/pricecategories] ### Get Price Categories [GET] Retrieve all price categories. **Required scope:** `Pricing:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Voksen", "description": "Adult ticket", "displayName": "Voksen", "order": 1, "reducedPrice": false } ] } # Group Partners Manage partners, contacts, business codes, and groups. ## Partners [/partners] ### Create Partner [POST] Create a partner and primary contact. Requires `Partners:Create`. Required fields are `company`, `email`, `businessCodeId`, `primaryContactFirstName`, `primaryContactLastName`, and `primaryContactEmail`. `sendCreationEmail` defaults to `false`. + Request (application/json) + Body { "company": "Example Partner", "email": "contact@example.com", "businessCodeId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "primaryContactFirstName": "Alex", "primaryContactLastName": "Jensen", "primaryContactEmail": "alex@example.com", "sendCreationEmail": false } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "company": "Example Partner" } } + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "Company is required", "errors": [] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "Business code not found", "errors": [] } + Response 409 (application/json) { "statusCode": 409, "isSuccess": false, "errorMessage": "A contact with that email already exists", "errors": [] } ## Partner [/partners/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Partner ID (GUID) ### Get Partner [GET] Retrieve a partner by ID. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "company": "Sponsor A/S", "cvrNumber": "12345678", "note": "", "email": "contact@sponsor.dk", "phone": "+4587654321", "street": "Sponsorgade 10", "city": "Vejle", "zipCode": "7100", "country": "Danmark", "primaryContact": { "id": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "Lars", "lastName": "Hansen", "partnerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "partner": "Sponsor A/S", "role": "Manager", "isPrimary": true, "department": null, "description": null, "office": null, "title": "Sponsorchef", "email": "lars@sponsor.dk", "phone": "+4587654322" }, "businessCode": { "id": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Hovedsponsor", "description": "Primary sponsors" }, "partnerGroups": [ { "id": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VIP Partners", "description": "Partners with VIP access" } ], "isLockout": false } } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Partner not found"] } ### Update Partner [PUT] Update a partner. Requires `Partners:Update`. The route ID, `company`, `email`, and `businessCodeId` are required. A successful response has no body. + Request (application/json) + Body { "company": "Example Partner", "email": "contact@example.com", "businessCodeId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "lockout": null } + Response 200 + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "Company is required", "errors": [] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "Partner not found", "errors": [] } ### Delete Partner [DELETE] Delete a partner. Requires `Partners:Delete`. + Response 204 + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "bad request", "errors": [] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "Partner not found", "errors": [] } ## Partner Contacts [/partners/{id}/contacts] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Partner ID (GUID) ### Get Partner Contacts [GET] Retrieve all contacts for a partner. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "Lars", "lastName": "Hansen", "partnerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "partner": "Sponsor A/S", "role": "Manager", "isPrimary": true, "department": null, "description": null, "office": null, "title": "Sponsorchef", "email": "lars@sponsor.dk", "phone": "+4587654322" } ] } ### Create Partner Contact [POST] Add a contact to this partner. Requires `Partners:Create`. `firstName`, `lastName`, and `email` are required. If present, `role` is `Administrator` or `Employee`; it defaults to `Employee`. + Request (application/json) + Body { "firstName": "Alex", "lastName": "Jensen", "email": "alex@example.com", "role": "Employee" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "partnerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "Alex", "lastName": "Jensen", "role": "Employee" } } + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "FirstName is required", "errors": [] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "Partner not found", "errors": [] } + Response 409 (application/json) { "statusCode": 409, "isSuccess": false, "errorMessage": "A contact with that email already exists", "errors": [] } ## Partner Contact [/partners/{PartnerId}/contacts/{Id}] + Parameters + PartnerId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Partner ID (GUID) + Id: `4fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Contact ID (GUID) ### Update Partner Contact [PUT] Update a contact. Requires `Partners:Update`. `firstName`, `lastName`, and `email` are required; `role`, if supplied, is `Administrator` or `Employee`. A successful response has no body. + Request (application/json) + Body { "firstName": "Alex", "lastName": "Jensen", "email": "alex@example.com", "role": "Employee" } + Response 200 + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "FirstName is required", "errors": [] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "Contact not found", "errors": [] } ### Delete Partner Contact [DELETE] Remove a contact. Requires `Partners:Delete`. A primary contact cannot be removed. + Response 204 + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "Primary contact cannot be removed", "errors": [] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "Contact not found", "errors": [] } ## Partner Products [/partners/{id}/products] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Partner ID (GUID) ### Get Partner Products [GET] Retrieve all products assigned to a partner. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VIP Lounge", "displayName": "VIP Lounge Package", "productType": "Ticket", "type": "Event", "orderQuantityRestriction": 10, "productId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "quantity": 50, "remaining": 35, "salesChannelId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "salesChannelName": "Partner Portal" } ] } ## Search Partners [/partners/search{?searchTerm,partnerGroupId,businessCodeId,productId,page,pageSize}] + Parameters + searchTerm: `Sponsor` (string, optional) - Search term to filter partners + partnerGroupId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, optional) - Filter by partner group + businessCodeId: `4fa85f64-5717-4562-b3fc-2c963f66afa6` (string, optional) - Filter by business code + productId: `5fa85f64-5717-4562-b3fc-2c963f66afa6` (string, optional) - Filter by product + page: `1` (number, optional) - Page number + pageSize: `50` (number, optional) - Page size ### Search Partners [GET] Search and filter partners with pagination. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 5, "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "company": "Sponsor A/S", "cvrNumber": "12345678", "note": "", "email": "contact@sponsor.dk", "phone": "+4587654321", "street": "Sponsorgade 10", "city": "Vejle", "zipCode": "7100", "country": "Danmark", "primaryContact": { }, "businessCode": { }, "partnerGroups": [], "isLockout": false } ] } ## Business Codes [/partners/businesscodes] ### Get Business Codes [GET] Retrieve all business codes. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 3, "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Hovedsponsor", "description": "Primary sponsors" } ] } ### Create Business Code [POST] Create a new business code. **Required scope:** `Partners:Create` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "name": "Hovedsponsor", "description": "Primary sponsors" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Hovedsponsor", "description": "Primary sponsors" } } ## Business Code [/partners/businesscodes/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Business Code ID (GUID) ### Update Business Code [PUT] Update an existing business code. **Required scope:** `Partners:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Hovedsponsor Updated", "description": "Updated description" } + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Business code not found"] } ## Partner Groups [/partners/groups] ### Get Partner Groups [GET] Retrieve all partner groups. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VIP Partners", "description": "Partners with VIP access" } ] } ### Create Partner Group [POST] Create a new partner group. **Required scope:** `Partners:Create` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "name": "VIP Partners", "description": "Partners with VIP access" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VIP Partners", "description": "Partners with VIP access" } } ## Partner Group [/partners/groups/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Partner Group ID (GUID) ### Update Partner Group [PUT] Update an existing partner group. **Required scope:** `Partners:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VIP Partners Updated", "description": "Updated description" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": {} } ## Partner Group Members [/partners/groups/{id}/members] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Partner Group ID (GUID) ### Get Partner Group Members [GET] Retrieve all members of a partner group. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "company": "Sponsor A/S", "cvrNumber": "12345678", "email": "contact@sponsor.dk", "phone": "+4587654321", "businessCodeId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "businessCodeName": "Hovedsponsor" } ] } ## Add Partner To Group [/partners/groups/add] ### Add Partner To Group [PUT] Add a partner to a partner group. **Required scope:** `Partners:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "groupId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "partnerId": "4fa85f64-5717-4562-b3fc-2c963f66afa6" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": {} } ## Remove Partner From Group [/partners/groups/remove] ### Remove Partner From Group [PUT] Remove a partner from a partner group. **Required scope:** `Partners:Update` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "groupId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "partnerId": "4fa85f64-5717-4562-b3fc-2c963f66afa6" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": {} } ## Products [/partners/products] ### Get Products [GET] Retrieve all available products for partner assignment. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VIP Lounge", "description": "VIP Lounge Package", "productType": "Ticket", "type": "Event" } ] } # Group Webhooks Subscribe to real-time event notifications. When events occur (e.g. tickets created, orders paid), a POST request is sent to your configured URL with the event payload. ## Webhook Collection [/webhooks] ### Get Webhooks [GET] Retrieve all webhook subscriptions for the current API key. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Order notifications", "authorizationType": "Basic", "authorizationName": "Authorization", "authorizationValue": "Bearer my-secret-token", "eventName": "OrderCreated", "url": "https://myapp.com/webhooks/orders", "createdBy": "api-key-owner", "createdOnUtc": "2024-01-15T10:00:00Z", "lastModifiedBy": null, "lastModifiedOnUtc": null } ] } ### Create Webhook [POST] Create a new webhook subscription. Each API key can only have one subscription per event type. **Supported events:** `TicketCreated`, `TicketActivated`, `TicketUpdated`, `TicketForwarded`, `TicketCancelled`, `TicketReleased`, `SeasonCardCreated`, `SeasonCardActivated`, `SeasonCardUpdated`, `SeasonCardForwarded`, `SeasonCardReleased`, `SeasonCardCancelled`, `OrderCreated`, `OrderPaid`, `OrderCancelled`, `OrderLineCancelled`, `CustomerCreated`, `CustomerUpdated`, `CustomerDeleted`, `ConsentGranted`, `ConsentRetracted`, `PassEntered`, `PartnerRegistration` + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "name": "Order notifications", "authorizationType": "Basic", "authorizationName": "Authorization", "authorizationValue": "Bearer my-secret-token", "eventName": "OrderCreated", "uri": "https://myapp.com/webhooks/orders" } + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Order notifications", "authorizationType": "Basic", "authorizationName": "Authorization", "authorizationValue": "Bearer my-secret-token", "eventName": "OrderCreated", "url": "https://myapp.com/webhooks/orders", "createdBy": "api-key-owner", "createdOnUtc": "2024-01-15T10:00:00Z", "lastModifiedBy": null, "lastModifiedOnUtc": null } } + Response 409 (application/json) { "statusCode": 409, "isSuccess": false, "errorMessage": "conflict", "errors": ["A webhook for this event already exists for this API key"] } ## Webhook [/webhooks/{id}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Webhook ID (GUID) ### Update Webhook [PUT] Update an existing webhook subscription. + Request (application/json) + Headers X-API-KEY: your-api-key-here + Body { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Order notifications v2", "authorizationType": "Basic", "authorizationName": "Authorization", "authorizationValue": "Bearer my-new-token", "eventName": "OrderCreated", "uri": "https://myapp.com/webhooks/v2/orders" } + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Webhook not found"] } ### Delete Webhook [DELETE] Delete a webhook subscription. + Request + Headers X-API-KEY: your-api-key-here + Response 204 + Response 404 (application/json) { "statusCode": 404, "isSuccess": false, "errorMessage": "not found", "errors": ["Webhook not found"] } ## Webhook Logs [/webhooks/{id}/logs] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Webhook ID (GUID) ### Get Webhook Logs [GET] Retrieve delivery logs for a webhook subscription. **Required scope:** `Webhooks:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "subscriptionId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "timestamp": "2024-09-15T18:00:05Z", "type": "OrderCreated", "destinationUrl": "https://myapp.com/webhooks/orders", "authorizationType": "Basic", "dataObject": "{\"eventName\":\"OrderCreated\",\"data\":{...}}", "responseCode": "200", "responseContent": "OK" } ] } # Group Webhook Event Payloads Preview the payload structure for each webhook event type. ## Event Payload [/webhooks/event/{EventName}] + Parameters + EventName: `OrderCreated` (string, required) - The event name. Supported: `TicketCreated`, `TicketActivated`, `TicketUpdated`, `TicketForwarded`, `TicketCancelled`, `TicketReleased`, `SeasonCardCreated`, `SeasonCardActivated`, `SeasonCardUpdated`, `SeasonCardForwarded`, `SeasonCardReleased`, `SeasonCardCancelled`, `OrderCreated`, `OrderPaid`, `OrderCancelled`, `OrderLineCancelled`, `CustomerCreated`, `CustomerUpdated`, `CustomerDeleted`, `ConsentGranted`, `ConsentRetracted`, `PassEntered`, `PartnerRegistration` ### Get Event Payload Example [GET] Retrieve a camel-case preview payload for a webhook event type. This preview response is an API-reference example; it is not the JSON contract sent to a subscription URL. Actual webhook delivery is a `POST` to the configured subscription URL. It serializes the envelope and nested event data with PascalCase property names: `EventName`, `IdempotencyKey`, `CreatedAtUtc`, and `Data`. `IdempotencyKey` is a 32-character GUID without hyphens. For the usual integration events, `Data` also contains `Id`, `CreationDate`, `TenantId`, and `OrganiserId`; the envelope `CreatedAtUtc` is that event's `CreationDate`. TicketCreated uses `EventTime` and includes `HolderEmail`, `HolderPhone`, and `HolderType`. TicketActivated includes those contact and type fields in addition to its `EventTimeUtc`. SeasonCardCreated and SeasonCardActivated include `HolderEmail` and `HolderPhone`. TicketForwarded delivers only `TicketId` and `Recipient`, and TicketReleased delivers only `TicketId`; neither carries the usual integration-event metadata and each envelope timestamp is set when it is published. Actual delivery example: ```json {"EventName":"TicketReleased","IdempotencyKey":"a1b2c3d4e5f67890abcdef1234567890","CreatedAtUtc":"2026-09-17T10:00:00Z","Data":{"TicketId":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}} ``` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) **OrderCreated** - Fired when a new order is created. + Body { "eventName": "OrderCreated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "orderId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "orderNumber": "1725522", "buyerId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "buyerFirstName": "John", "buyerLastName": "Doe", "buyerEmail": "john.doe@example.com", "buyerPhoneNumber": "+4512345678", "buyerCompany": "", "buyerVatNumber": "", "buyerStreet": "Vestergade 1", "buyerCity": "København", "buyerPostalCode": "1456", "buyerCountry": "Danmark", "deliveryMethod": "Digital", "deliveryFee": 0.00, "orderTotal": 150.00, "salesChannel": "Webshop", "orderCreationTime": "2024-09-15T12:00:00Z", "items": [ { "itemId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "productId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "productName": "VFF - OB", "priceCategoryId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategoryName": "Voksen", "sectionName": "Section A", "seatNumber": "", "rowNumber": "", "price": 150.00, "fee": 0.00, "itemType": "Ticket", "isSubscription": false, "isDiscount": false } ] } } + Response 200 (application/json) **OrderPaid** - Fired when an order is paid. + Body { "eventName": "OrderPaid", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:05:00Z", "data": { "orderId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "orderNumber": "1725522", "buyerId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "buyerFirstName": "John", "buyerLastName": "Doe", "buyerEmail": "john.doe@example.com", "buyerPhoneNumber": "+4512345678", "buyerCompany": "", "buyerVatNumber": "", "buyerStreet": "Vestergade 1", "buyerCity": "København", "buyerPostalCode": "1456", "buyerCountry": "Danmark", "deliveryMethod": "Digital", "deliveryFee": 0.00, "orderTotal": 150.00, "salesChannel": "Webshop", "orderCreationTime": "2024-09-15T12:00:00Z", "items": [ { "itemId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "productId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "productName": "VFF - OB", "priceCategoryId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategoryName": "Voksen", "sectionName": "Section A", "seatNumber": "", "rowNumber": "", "price": 150.00, "fee": 0.00, "itemType": "Ticket", "isSubscription": false, "isDiscount": false } ], "transactionId": "txn_a1b2c3d4e5f6", "transactionTime": "2024-09-15T12:05:00Z", "transactionFee": 5.00 } } + Response 200 (application/json) **OrderCancelled** - Fired when an order is cancelled. + Body { "eventName": "OrderCancelled", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:10:00Z", "data": { "orderId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "orderNumber": "1725522", "buyerId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "buyerFirstName": "John", "buyerLastName": "Doe", "buyerEmail": "john.doe@example.com", "buyerPhoneNumber": "+4512345678", "buyerCompany": "", "buyerVatNumber": "", "buyerStreet": "Vestergade 1", "buyerCity": "København", "buyerPostalCode": "1456", "buyerCountry": "Danmark", "deliveryMethod": "Digital", "deliveryFee": 0.00, "orderTotal": 150.00, "salesChannel": "Webshop", "orderCreationTime": "2024-09-15T12:00:00Z", "items": [ { "itemId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "productId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "productName": "VFF - OB", "priceCategoryId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategoryName": "Voksen", "sectionName": "Section A", "seatNumber": "", "rowNumber": "", "price": 150.00, "fee": 0.00, "itemType": "Ticket", "isSubscription": false, "isDiscount": false } ], "cancelledByUsername": "admin@example.com", "cancellationTime": "2024-09-15T12:10:00Z" } } + Response 200 (application/json) **TicketCreated** - Fired when a ticket is created. + Body { "eventName": "TicketCreated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "ticketId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "ticketStatus": "Active", "eventId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "OB - VFF", "eventTimeUtc": "2024-09-15T18:00:00Z", "holderId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "holderFirstName": "John", "holderLastName": "Doe", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "sectionId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "sectionName": "Section A", "seatId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "seatRow": "1", "seatNumber": "1", "entranceId": "8fa85f64-5717-4562-b3fc-2c963f66afa6", "entranceName": "Entrance A", "appleWalletUrl": "https://applewallet.com/pass123", "googlePayUrl": "https://googlewallet.com/pass123", "priceCategoryId": "9fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategoryName": "Adult" } } + Response 200 (application/json) **TicketActivated** - Fired when a ticket is activated. Same payload as TicketCreated. + Body { "eventName": "TicketActivated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "ticketId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "ticketStatus": "Active", "eventId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "OB - VFF", "eventTimeUtc": "2024-09-15T18:00:00Z", "holderId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "holderFirstName": "John", "holderLastName": "Doe", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "sectionId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "sectionName": "Section A", "seatId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "seatRow": "1", "seatNumber": "1", "entranceId": "8fa85f64-5717-4562-b3fc-2c963f66afa6", "entranceName": "Entrance A", "appleWalletUrl": "https://applewallet.com/pass123", "googlePayUrl": "https://googlewallet.com/pass123", "priceCategoryId": "9fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategoryName": "Adult" } } + Response 200 (application/json) **TicketUpdated** - Fired when a ticket holder is changed. + Body { "eventName": "TicketUpdated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "ticketId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } } + Response 200 (application/json) **TicketCancelled** - Fired when a ticket is cancelled. + Body { "eventName": "TicketCancelled", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "ticketId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } } + Response 200 (application/json) **TicketForwarded** - Fired when a ticket is forwarded to another person. + Body { "eventName": "TicketForwarded", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "ticketId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "recipient": "friend@example.com" } } + Response 200 (application/json) **SeasonCardCreated** - Fired when a season card is created. + Body { "eventName": "SeasonCardCreated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "seasonCardId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "seasonCardStatus": "Active", "seasonCardTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "seasonCardTypeName": "Sæsonkort 2024/25", "expirationDateUtc": "2025-06-30T23:59:59Z", "holderId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "holderFirstName": "John", "holderLastName": "Doe", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "sectionId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "sectionName": "Section A", "seatId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "seatRow": "1", "seatNumber": "1", "entranceId": "8fa85f64-5717-4562-b3fc-2c963f66afa6", "entranceName": "Entrance A", "appleWalletUrl": "https://applewallet.com/pass123", "googlePayUrl": "https://googlewallet.com/pass123", "priceCategoryId": "9fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategoryName": "Adult" } } + Response 200 (application/json) **SeasonCardActivated** - Fired when a season card is activated. Same payload as SeasonCardCreated. + Body { "eventName": "SeasonCardActivated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "seasonCardId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "barcode": "1234567890123456", "seasonCardStatus": "Active", "seasonCardTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "seasonCardTypeName": "Sæsonkort 2024/25", "expirationDateUtc": "2025-06-30T23:59:59Z", "holderId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "holderFirstName": "John", "holderLastName": "Doe", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "sectionId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "sectionName": "Section A", "seatId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "seatRow": "1", "seatNumber": "1", "entranceId": "8fa85f64-5717-4562-b3fc-2c963f66afa6", "entranceName": "Entrance A", "appleWalletUrl": "https://applewallet.com/pass123", "googlePayUrl": "https://googlewallet.com/pass123", "priceCategoryId": "9fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategoryName": "Adult" } } + Response 200 (application/json) **SeasonCardUpdated** - Fired when a season card holder is changed. + Body { "eventName": "SeasonCardUpdated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "seasonCardId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } } + Response 200 (application/json) **SeasonCardCancelled** - Fired when a season card is cancelled. + Body { "eventName": "SeasonCardCancelled", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "seasonCardId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } } + Response 200 (application/json) **SeasonCardForwarded** - Fired when a season card is forwarded to another person. + Body { "eventName": "SeasonCardForwarded", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "seasonCardId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ], "recipient": "friend@example.com" } } + Response 200 (application/json) **SeasonCardReleased** - Fired when a season card is released for a specific event. + Body { "eventName": "SeasonCardReleased", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "seasonCardId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "eventId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "OB - VFF", "holderExternalIds": [ { "provider": "LigaLogin", "providerId": "123456" } ] } } + Response 200 (application/json) **TicketReleased** - Fired when a ticket is released. + Body { "eventName": "TicketReleased", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "ticketId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" } } + Response 200 (application/json) **OrderLineCancelled** - Fired when an individual order line is cancelled. + Body { "eventName": "OrderLineCancelled", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:15:00Z", "data": { "orderLineId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" } } + Response 200 (application/json) **CustomerCreated** - Fired when a new customer is created. + Body { "eventName": "CustomerCreated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "customerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "fullName": "John Doe", "gender": "Male", "birthDate": "1990-01-01T00:00:00Z", "street": "Vestergade 1", "city": "København", "zipCode": "1456", "country": "Danmark", "email": "john.doe@example.com", "phone": "+4512345678", "company": "" } } + Response 200 (application/json) **CustomerUpdated** - Fired when a customer is updated. + Body { "eventName": "CustomerUpdated", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "customerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "fullName": "John Doe", "gender": "Male", "birthDate": "1990-01-01T00:00:00Z", "street": "Vestergade 1", "city": "København", "zipCode": "1456", "country": "Danmark", "email": "john.doe@example.com", "phone": "+4512345678", "company": "", "loyaltyBalance": 120 } } + Response 200 (application/json) **CustomerDeleted** - Fired when a customer is deleted. + Body { "eventName": "CustomerDeleted", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "customerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "fullName": "John Doe", "gender": "Male", "birthDate": "1990-01-01T00:00:00Z", "street": "Vestergade 1", "city": "København", "zipCode": "1456", "country": "Danmark", "email": "john.doe@example.com", "phone": "+4512345678", "company": "" } } + Response 200 (application/json) **ConsentGranted** - Fired when a customer grants consent. + Body { "eventName": "ConsentGranted", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "customerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "email": "john.doe@example.com", "phoneNumber": "+4512345678", "consentTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "consentTypeName": "Marketing", "consentTypeKind": "Email" } } + Response 200 (application/json) **ConsentRetracted** - Fired when a customer retracts consent. + Body { "eventName": "ConsentRetracted", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "customerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "email": "john.doe@example.com", "phoneNumber": "+4512345678", "consentTypeId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "consentTypeName": "Marketing", "consentTypeKind": "Email" } } + Response 200 (application/json) **PartnerRegistration** - Fired when a partner registration is created. + Body { "eventName": "PartnerRegistration", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T12:00:00Z", "data": { "registrationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "partnerId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "partnerName": "Sponsor A/S", "registrationProductId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "registrationProductName": "VIP Lounge Package", "registrationOptionId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "registrationOptionName": "Table for 10", "eventId": "7fa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "VFF - OB", "eventTime": "2024-09-15T18:00:00Z", "participant": "Lars Hansen", "participantEmail": "lars@sponsor.dk", "participantMobile": "+4587654321", "buyerFirstName": "Lars", "buyerLastName": "Hansen", "buyerCompany": "Sponsor A/S", "buyerEmail": "lars@sponsor.dk", "timestamp": "2024-09-15T10:30:00Z", "note": "" } } + Response 200 (application/json) **PassEntered** - Fired when a pass (ticket or season card) is scanned at an entrance. + Body { "eventName": "PassEntered", "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "createdAtUtc": "2024-09-15T17:45:00Z", "data": { "entityId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "type": "SeasonCard", "timestamp": "2024-09-15T17:45:00Z", "entranceId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "entranceName": "Indgang 6", "eventId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "OB - VFF", "holderId": "6fa85f64-5717-4562-b3fc-2c963f66afa6", "holderEmail": "john.doe@example.com", "section": "A", "priceCategory": "Standard" } } + Response 400 (application/json) { "statusCode": 400, "isSuccess": false, "errorMessage": "bad request", "errors": ["'EventName' must be a supported event. See property descriptions for supported events"] } # Group Sync Bulk data synchronization endpoints for full data exports. ## Sync Customers [/sync/customers] ### Get All Customers [GET] Retrieve all customers for synchronization. Returns the full customer dataset. **Required scope:** `Customers:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "fullName": "John Doe", "email": "john.doe@example.com", "phone": "+4512345678", "company": null, "cvrNumber": null, "birthday": "1990-01-01", "gender": "Male", "street": "Vestergade 1", "city": "København", "zipCode": "1456", "country": "Danmark", "subjectId": "auth0|abc123", "externalIds": [], "availableLoyaltyPoints": 150 } ] } ## Sync Partners [/sync/partners] ### Get All Partners [GET] Retrieve all partners for synchronization. Returns the full partner dataset including contacts and products. **Required scope:** `Partners:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "company": "Sponsor A/S", "cvrNumber": "12345678", "note": "", "email": "contact@sponsor.dk", "phone": "+4587654321", "street": "Sponsorgade 10", "city": "Vejle", "zipCode": "7100", "country": "Danmark", "primaryContact": { }, "businessCode": { }, "partnerGroups": [], "isLockout": false } ] } ## Sync Season Cards [/sync/seasoncards] ### Get All Season Cards [GET] Retrieve all season cards, subscriptions, and card reservations for synchronization. Returns aggregated data including usage statistics. **Required scope:** `SeasonCards:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "holder": "John Doe", "barcode": "1234567890123456", "holderId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "customerType": "B2C", "email": "john.doe@example.com", "cardTypeId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "cardTypeName": "Sæsonkort 2024/25", "priceCategory": "Voksen", "pluNumber": "", "section": "Section A", "rowNumber": "3", "seatNumber": "15", "status": "Active", "created": "2024-07-01T00:00:00Z", "expiration": "2025-06-30T23:59:59Z", "type": "SeasonCard", "scans": 12, "events": 15, "usage": "80%" } ] } ## Campaigns Sync [/sync/campaigns] ### Start Campaigns Sync [POST] Start a Campaigns historical state bootstrap. Requires `Campaigns:Update` and allows 10 requests per 60 seconds. `components` is required and must select one or more of `Profiles`, `Partners`, `SeasonCards`, `Subscriptions`, or `TicketSubscriptions`; `All` cannot be combined with other selections. The response is a run status object, not the standard envelope. + Request (application/json) + Body { "components": ["Profiles", "SeasonCards"] } + Response 202 (application/json) { "runId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "queued", "startedAt": "2026-09-17T10:00:00Z", "completedAt": null, "profileCount": 0, "seasonCardCount": 0, "ticketSubscriptionCount": 0, "components": ["Profiles", "SeasonCards"] } + Response 400 (application/json) { "status": "rejected" } + Response 401 (application/json) { "status": "unauthorized" } + Response 409 (application/json) { "status": "running" } + Response 500 (application/json) { "status": "failed" } ## Campaigns Sync Run [/sync/campaigns/{runId}] + Parameters + runId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Sync run ID (GUID) ### Get Campaigns Sync [GET] Get Campaigns bootstrap status. Requires `Campaigns:Read` and allows 60 requests per 60 seconds. The response is a run status object, not the standard envelope. + Response 200 (application/json) { "runId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "running", "startedAt": "2026-09-17T10:00:00Z", "completedAt": null, "profileCount": 42, "seasonCardCount": 10, "ticketSubscriptionCount": 5, "components": ["All"] } + Response 401 (application/json) { "status": "unauthorized" } + Response 404 + Response 500 (application/json) { "status": "failed" } ## HeyLoyalty Sync [/sync/heyloyalty] ### Start HeyLoyalty Sync [POST] Queue a HeyLoyalty historical sync. Requires `Campaigns:Update`, allows 10 requests per 60 seconds, and needs an explicit non-empty `components` selection using the supported component names. The API-key tenant must have a configured compatible HeyLoyalty main list. The response is a run status object. + Request (application/json) + Body { "components": ["Profiles"] } + Response 202 (application/json) { "runId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "queued", "startedAt": "2026-09-17T10:00:00Z", "completedAt": null, "queuedCount": 0, "components": ["Profiles"] } + Response 400 (application/json) { "status": "rejected" } + Response 401 (application/json) { "status": "unauthorized" } + Response 409 (application/json) { "status": "running" } + Response 500 (application/json) { "status": "failed" } ## HeyLoyalty Sync Run [/sync/heyloyalty/{runId}] + Parameters + runId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Sync run ID (GUID) ### Get HeyLoyalty Sync [GET] Get HeyLoyalty source-queue status. Requires `Campaigns:Read` and allows 60 requests per 60 seconds. Queued confirms durable source messages, not provider application. The response is a run status object. + Response 200 (application/json) { "runId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "queued", "startedAt": "2026-09-17T10:00:00Z", "completedAt": null, "queuedCount": 42, "components": ["Profiles"] } + Response 401 (application/json) { "status": "unauthorized" } + Response 404 + Response 500 (application/json) { "status": "failed" } ## Klaviyo Sync [/sync/klaviyo] ### Start Klaviyo Sync [POST] Queue an existing-profile-only Klaviyo historical sync. Requires `Campaigns:Update` and allows 10 requests per 60 seconds. `components` uses the supported component names and defaults to `All` when omitted. The response is a run status object. + Request (application/json) + Body { "components": ["All"] } + Response 202 (application/json) { "runId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "queued", "startedAt": "2026-09-17T10:00:00Z", "completedAt": null, "queuedCount": 0, "components": ["All"] } + Response 400 (application/json) { "status": "rejected" } + Response 401 (application/json) { "status": "unauthorized" } + Response 409 (application/json) { "status": "running" } + Response 500 (application/json) { "status": "failed" } ## Klaviyo Sync Run [/sync/klaviyo/{runId}] + Parameters + runId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Sync run ID (GUID) ### Get Klaviyo Sync [GET] Get Klaviyo source-queue status. Requires `Campaigns:Read` and allows 60 requests per 60 seconds. The response is a run status object. + Response 200 (application/json) { "runId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "queued", "startedAt": "2026-09-17T10:00:00Z", "completedAt": null, "queuedCount": 42, "components": ["All"] } + Response 401 (application/json) { "status": "unauthorized" } + Response 404 + Response 500 (application/json) { "status": "failed" } # Group Reports Data reporting endpoints for analytics and external integrations. ## Match Report [/reports/match/{EventId}] + Parameters + EventId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event ID (GUID) ### Get Match Report [GET] Retrieve comprehensive match/event report data including orders, buyers, entries, and POS information. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "orderId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "orderNumber": "1725522", "buyerName": "John Doe", "buyerEmail": "john.doe@example.com", "section": "Section A", "row": "3", "seat": "15", "priceCategory": "Voksen", "price": 150.00, "barcode": "1234567890123456", "entryTime": "2024-09-15T17:45:00Z", "releaseTimestamp": "2024-09-15T16:00:00Z", "entrance": "Indgang 6" } ] } ## Junu Attendance [/reports/junu/attendance/{eventId}{?page,pageSize}] + Parameters + eventId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event ID (GUID) + page: `1` (number, optional) - Page number + pageSize: `50` (number, optional) - Page size ### Get Junu Attendance Data [GET] Retrieve attendance data for Junu integration. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 500, "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "timestamp": "2024-09-15T17:45:00Z", "eventId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "customerId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "ticketTypeId": "6fa85f64-5717-4562-b3fc-2c963f66afa6" } ] } ## Junu Customers [/reports/junu/customers{?page,pageSize}] + Parameters + page: `1` (number, optional) - Page number + pageSize: `50` (number, optional) - Page size ### Get Junu Customers Data [GET] Retrieve customer data for Junu integration. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 1000, "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "firstName": "John", "lastName": "Doe", "fullName": "John Doe", "email": "john.doe@example.com", "birthdate": "1990-01-01", "country": "Danmark", "gender": "Male", "zipCode": "1456" } ] } ## Junu Events [/reports/junu/events{?page,pageSize,timestamp}] + Parameters + page: `1` (number, optional) - Page number + pageSize: `50` (number, optional) - Page size + timestamp: `2024-01-01T00:00:00Z` (string, optional) - Filter events after this timestamp ### Get Junu Events Data [GET] Retrieve event data for Junu integration. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 30, "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "VFF - OB", "date": "2024-09-15T18:00:00Z", "type": "Superliga", "matchId": 12345 } ] } ## Junu Ticket Types [/reports/junu/tickettypes] ### Get Junu Ticket Types Data [GET] Retrieve ticket type data for Junu integration. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Voksen" } ] } ## Junu Transactions [/reports/junu/transaction/{eventId}{?page,pageSize}] + Parameters + eventId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event ID (GUID) + page: `1` (number, optional) - Page number + pageSize: `50` (number, optional) - Page size ### Get Junu Transaction Data [GET] Retrieve transaction data for Junu integration. + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "page": 1, "pageSize": 50, "resultSize": 300, "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "timestamp": "2024-09-15T12:00:00Z", "ticketType": "Voksen", "eventId": "4fa85f64-5717-4562-b3fc-2c963f66afa6", "customerId": "5fa85f64-5717-4562-b3fc-2c963f66afa6", "priceCategory": "Voksen", "price": 150.00, "cancelled": false, "currency": "DKK", "tribune": "Nord", "section": "Section A", "entrance": "Indgang 1", "group": "", "rowNumber": "3", "seatNumber": "15", "barcode": "1234567890123456", "salesChannel": "Webshop", "paymentGateway": "Nets", "transactionId": "txn_abc123" } ] } ## Access Card Report [/reports/access-cards/{EventId}] + Parameters + EventId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event ID (GUID) ### Get Access Card Counts [GET] Retrieve measured all-access card entries grouped by card type. Requires `Reporting:read`, allows 100 requests per 60 seconds, and caches each API-key response for two minutes. + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [{ "type": "AccessCard", "entryCount": 3, "source": "measured-entry", "cards": [{ "name": "(1234567890) Press Box", "entryCount": 2 }] }] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 500 (application/json) { "statusCode": 500, "isSuccess": false, "errorMessage": "internal server error", "errors": [] } ## Attendance Adjustments [/reports/attendance-adjustments/{EventId}] + Parameters + EventId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event ID (GUID) ### Get Attendance Adjustments [GET] Retrieve manual attendance adjustments. Requires `Reporting:read`, allows 100 requests per 60 seconds, and caches each API-key response for two minutes. Amount can be negative; preserve the manual/measured distinction. + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [{ "id": 1, "name": "Sponsor guests", "amount": 120, "source": "manual", "adjustedBy": "ticketoffice@club.example", "adjustTime": "2026-09-17T10:00:00Z" }] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 500 (application/json) { "statusCode": 500, "isSuccess": false, "errorMessage": "internal server error", "errors": [] } ## Manual Upload Report [/reports/manual-uploads/{EventId}] + Parameters + EventId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Event ID (GUID) ### Get Manual Upload Report [GET] Retrieve one row for each manually uploaded barcode, including unscanned rows and the latest row not superseded by a later barcode reset. Requires `Reporting:read`, allows 100 requests per 60 seconds, and caches each API-key response for two minutes. + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [{ "eventId": 1, "eventUniqueidentifier": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "eventName": "Example Event", "eventTime": "2026-09-17T10:00:00Z", "barcode": "BAR123456789", "sectionId": 10, "section": "East Stand", "uploadedBy": "gate-operator", "uploadTime": "2026-09-17T09:00:00Z", "entered": true, "enteredTimestamp": "2026-09-17T09:30:00Z", "scannedBy": "Scanner A", "scannedAt": "Gate A" }] } + Response 401 (application/json) { "statusCode": 401, "isSuccess": false, "errorMessage": "unauthorized", "errors": [] } + Response 500 (application/json) { "statusCode": 500, "isSuccess": false, "errorMessage": "internal server error", "errors": [] } # Group Products Products are addon purchases (non-ticket items: parking, memberships, upgrades, etc.) tied to a customer. Each returned row includes pre-baked Apple Wallet and Google Pay URLs — partners render these directly without knowing the signing scheme. ## Products By Customer [/products/customer/{id}{?organiserId}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Customer ID (GUID) + organiserId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, optional) - Organiser filter. When supplied only rows for that organiser are returned; otherwise products across all organisers the customer holds are returned. ### Get Products By Customer [GET] Retrieve every addon Product owned by the customer, optionally filtered to a single organiser. **Required scope:** `Products:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "a1901faf-5b8e-49b5-a5ef-f8c9db1f6b04", "organiserId": "62aa5179-9690-481c-a84f-16ffa22ef636", "organiserName": "Example Organiser", "customerId": "478cb0ac-4f11-445f-8374-08db3a7f92d5", "productId": "3779c71b-9e04-4e61-9851-e2d6580c6012", "productName": "Example Product", "barcode": "5933558100874891", "eventId": null, "eventName": "Example Event", "orderNumber": "484666", "validTo": "2026-05-24T10:00:00Z", "orderTime": "2026-04-24T10:00:00Z", "pluNr": "15", "customerName": "Example Customer", "customerEmail": "customer@example.com", "appleWalletUrl": "https://addons.eventii.dk/v1/products/AppleWallet/a1901faf-5b8e-49b5-a5ef-f8c9db1f6b04/{hash}/62aa5179-9690-481c-a84f-16ffa22ef636", "googlePayUrl": "https://addons.eventii.dk/v1/products/GooglePay/a1901faf-5b8e-49b5-a5ef-f8c9db1f6b04/{hash}/62aa5179-9690-481c-a84f-16ffa22ef636" } ] } # Group Ticket Coupons Ticket coupons are partner-issued discount or benefit vouchers bound to a customer. Like products, each returned row includes pre-baked Apple Wallet and Google Pay URLs. ## Ticket Coupons By Customer [/ticketcoupons/customer/{id}{?organiserId}] + Parameters + id: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, required) - Customer ID (GUID) + organiserId: `3fa85f64-5717-4562-b3fc-2c963f66afa6` (string, optional) - Organiser filter. When supplied only rows for that organiser are returned. ### Get Ticket Coupons By Customer [GET] Retrieve every ticket coupon owned by the customer, optionally filtered to a single organiser. **Required scope:** `TicketCoupons:Read` + Request + Headers X-API-KEY: your-api-key-here + Response 200 (application/json) { "statusCode": 200, "isSuccess": true, "result": [ { "id": "b2a02fbf-6c9f-5ac6-b6ff-f9d0ec2f7c05", "organiserId": "62aa5179-9690-481c-a84f-16ffa22ef636", "organiserName": "Example Organiser", "customerId": "ad0ee4b5-42b4-44ab-8a73-08d9f1ebec44", "ticketCouponTypeId": "e1871b89-a8e7-44cd-bd93-4ce4248dc19d", "productName": "Example Coupon", "salesText": "Example Coupon", "barcode": "9138164606420077", "orderNumber": "484522", "quantity": 50, "price": 5, "pluNr": 5, "priceCategory": "Standard", "validFrom": "2026-04-24T10:00:00Z", "validTo": "2026-05-24T10:00:00Z", "customerFullName": "Example Customer", "customerEmail": "customer@example.com", "appleWalletUrl": "https://addons.eventii.dk/v1/ticketcoupons/AppleWallet/b2a02fbf-6c9f-5ac6-b6ff-f9d0ec2f7c05/{hash}/62aa5179-9690-481c-a84f-16ffa22ef636", "googlePayUrl": "https://addons.eventii.dk/v1/ticketcoupons/GooglePay/b2a02fbf-6c9f-5ac6-b6ff-f9d0ec2f7c05/{hash}/62aa5179-9690-481c-a84f-16ffa22ef636" } ] }