Compare commits

...

15 Commits

Author SHA1 Message Date
Max Martens
3d387e451b Added contractVersions in SE contracts list response, fixed some example formatting 2026-07-15 14:37:20 +02:00
Max Martens
851f60d665 Updated SE-vouchers-supplier spec after review 2026-07-14 17:31:52 +02:00
Max Martens
0987cedb4f Fix JSON schema errors 2026-07-14 15:50:57 +02:00
23dd83fac9 added schema for the post Order endpoint 2026-07-10 13:28:02 +02:00
a637cfb4f2 Removed voucher query param on the CRUD's en updated SE-order POST/ PATCH orderline in regards to vouchers 2026-07-09 17:50:14 +02:00
1f8e8f1381 Merge pull request 'feature/OVPAY-2485' (#63) from feature/OVPAY-2485 into develop
Reviewed-on: #63
2026-06-22 14:45:48 +00:00
1f0481119c OVPAY-2485 - Typo in url. 2026-06-18 16:04:41 +02:00
3d2885f2b8 OVPAY-2485 - Added support for anonymous TAT security. 2026-06-18 14:43:08 +02:00
280d3b1fcd OVPAY-2485 - Extended token details response bodies with security. 2026-06-18 11:58:34 +02:00
f28a797b6b OVPAY-2485 - Improved TP requests. 2026-06-18 11:17:04 +02:00
87d8f7df58 OVPAY-2485 - Updated OTP response body for TP. 2026-06-18 10:25:06 +02:00
30e8860a39 OVPAY-2485 - Added schemas. 2026-06-17 16:26:39 +02:00
d18afcae8c OVPAY-2485 - Minor additions. 2026-06-17 16:23:11 +02:00
eb03aa04e6 OVPAY-2485 - Added SE endpoint for AGO OTP verification. 2026-06-17 16:22:38 +02:00
aca160f65c OVPAY-2485 - Added SE endpoint for AGO activation. 2026-06-17 16:08:06 +02:00
6 changed files with 805 additions and 171 deletions

View File

@ -45,12 +45,36 @@ paths:
"contractStatus": "contractStatus":
{ "contractStatusId": 2, "name": "active" }, { "contractStatusId": 2, "name": "active" },
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting", "productName": "HTM Maand 20% korting doorlopend",
"termDuration": "P0Y1M0D", "termDuration": "P1M",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000", "created": "2024-08-01T15:01:00.000Z",
"ovPayTokenId": 1337, "ovPayTokenId": 1337,
"contractVersions": [
{
"contractVersionId": 1,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"productId": 1,
"productName": "HTM Maand 20% korting doorlopend",
"taxCode": "V9",
"taxPercentage": 9,
"termAmountInclTax": 400,
"start": "2024-08-01T15:01:00.000Z",
"end": "2025-01-01T03:00:00.000Z"
},
{
"contractVersionId": 2,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"productId": 1,
"productName": "HTM Maand 20% korting doorlopend",
"taxCode": "V9",
"taxPercentage": 9,
"termAmountInclTax": 500,
"start": "2025-01-01T03:00:00.000Z",
"end": null
}
],
"_links": "_links":
{ {
"get_token": "get_token":
@ -68,14 +92,38 @@ paths:
"orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8", "orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8",
"touchpointId": 2, "touchpointId": 2,
"contractStatus": "contractStatus":
{ "contractStatusId": 1, "name": "new" }, { "contractStatusId": 6, "name": "pending cancellation" },
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting", "productName": "HTM 20% Korting doorlopend",
"termDuration": "P0Y1M0D", "termDuration": "P1M",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000", "created": "2024-08-01T15:01:00.000Z",
"ovPayTokenId": 1338, "ovPayTokenId": 1338,
"contractVersions": [
{
"contractVersionId": 1,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"productId": 1,
"productName": "HTM 20% Korting doorlopend",
"taxCode": "V9",
"taxPercentage": 9,
"termAmountInclTax": 400,
"start": "2024-08-01T15:01:00.000Z",
"end": "2025-01-01T03:00:00.000Z"
},
{
"contractVersionId": 2,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"productId": 1,
"productName": "HTM 20% Korting doorlopend",
"taxCode": "V9",
"taxPercentage": 9,
"termAmountInclTax": 500,
"start": "2025-01-01T03:00:00.000Z",
"end": "2025-02-01T03:00:00.000Z"
}
],
"_links": "_links":
{ {
"get_token": "get_token":
@ -154,8 +202,8 @@ paths:
"contractStatus": "contractStatus":
{ "contractStatusId": 2, "name": "active" }, { "contractStatusId": 2, "name": "active" },
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting", "productName": "HTM 20% Korting doorlopend",
"termDuration": "P0Y1M0D", "termDuration": "P1M",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"ovPayTokenId": 1337, "ovPayTokenId": 1337,
@ -165,22 +213,22 @@ paths:
"contractVersionId": 1, "contractVersionId": 1,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting", "productName": "HTM 20% Korting doorlopend",
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2024-07-04 15:01:00.000", "start": "2024-08-01T15:01:00.000Z",
"end": "2024-12-31 15:01:00.000", "end": "2025-01-01T03:00:00.000Z",
}, },
{ {
"contractVersionId": 2, "contractVersionId": 2,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting", "productName": "HTM 20% Korting doorlopend",
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2025-01-01 15:01:00.000", "start": "2025-01-01T03:00:00.000Z",
}, },
], ],
"contractActions": "contractActions":
@ -190,7 +238,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 1, "name": "create" }, { "actionTypeId": 1, "name": "create" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-02 15:01:00.000", "timestamp": "2024-07-02T15:01:00.000Z",
"details": "Contract created", "details": "Contract created",
"correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee", "correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee",
}, },
@ -199,7 +247,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 2, "name": "change" }, { "actionTypeId": 2, "name": "change" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-03 15:01:00.000", "timestamp": "2024-07-03T15:01:00.000Z",
"details": "Contract changed", "details": "Contract changed",
"correlationId": "e2462347-6749-4841-b42a-cf8de19ec727", "correlationId": "e2462347-6749-4841-b42a-cf8de19ec727",
}, },
@ -211,8 +259,8 @@ paths:
"externalReference": "F2024-0001", "externalReference": "F2024-0001",
"term": 1, "term": 1,
"invoiceDate": "2024-07-02", "invoiceDate": "2024-07-02",
"created": "2024-07-02 15:01:00.000", "created": "2024-07-02T15:01:00.000Z",
"updated": "2024-07-02 15:01:00.000", "updated": "2024-07-02T15:01:00.000Z",
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
@ -270,8 +318,8 @@ paths:
"externalReference": "F2024-0001", "externalReference": "F2024-0001",
"term": 1, "term": 1,
"invoiceDate": "2024-07-02", "invoiceDate": "2024-07-02",
"created": "2024-07-02 15:01:34.000", "created": "2024-07-02T15:01:34.000Z",
"updated": "2024-07-04 00:04:56.000", "updated": "2024-07-04T00:04:56.000Z",
"state": "invoice_created", "state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0001", "public_link": "http://mijnfactuurinzien.nl/F2024-0001",
"isCredit": false, "isCredit": false,
@ -282,8 +330,8 @@ paths:
"externalReference": "F2024-0002", "externalReference": "F2024-0002",
"term": 2, "term": 2,
"invoiceDate": "2024-08-02", "invoiceDate": "2024-08-02",
"created": "2024-08-02 15:01:34.000", "created": "2024-08-02T15:01:34.000Z",
"updated": "2024-08-04 00:04:56.000", "updated": "2024-08-04T00:04:56.000Z",
"state": "invoice_created", "state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0002", "public_link": "http://mijnfactuurinzien.nl/F2024-0002",
"isCredit": false, "isCredit": false,
@ -328,8 +376,8 @@ paths:
"cancellationMoment": "termBound", "cancellationMoment": "termBound",
"termDuration": "P1M", "termDuration": "P1M",
"billingDay": 18, "billingDay": 18,
"cancellationFrom": "2024-08-10T00:00:00", "cancellationFrom": "2024-08-10T00:00:00Z",
"cancellationUntil": "2026-08-10T00:00:00", "cancellationUntil": "2026-08-10T00:00:00Z",
} }
/contracts/{contractId}/cancellationvalidation: /contracts/{contractId}/cancellationvalidation:
parameters: parameters:
@ -382,7 +430,7 @@ paths:
{ {
"validationResult": true, "validationResult": true,
"validationMessage": "", "validationMessage": "",
"end": "2024-08-10T03:59:59", "end": "2024-08-10T03:59:59Z",
"refundAmount": 2489, "refundAmount": 2489,
"refundMethods": ["creditInvoice", "iDeal"], "refundMethods": ["creditInvoice", "iDeal"],
} }
@ -451,7 +499,7 @@ paths:
the refund amount and refund method. the refund amount and refund method.
value: value:
{ {
"end": "2024-08-10T03:59:59", "end": "2024-08-10T03:59:59Z",
"refundAmount": 2489, "refundAmount": 2489,
"refundMethod": "creditInvoice", "refundMethod": "creditInvoice",
} }
@ -516,8 +564,8 @@ paths:
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2024-07-04 15:01:00.000", "start": "2024-07-04T15:01:00.000Z",
"end": "2024-12-31 15:01:00.000", "end": "2024-12-31T15:01:00.000Z",
}, },
{ {
"contractVersionId": 2, "contractVersionId": 2,
@ -527,7 +575,8 @@ paths:
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2025-01-01 15:01:00.000", "start": "2025-01-01T15:01:00.000Z",
"end": null
}, },
], ],
"contractActions": "contractActions":
@ -537,7 +586,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 1, "name": "create" }, { "actionTypeId": 1, "name": "create" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-02 15:01:00.000", "timestamp": "2024-07-02T15:01:00.000Z",
"details": "Contract created", "details": "Contract created",
"correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee", "correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee",
}, },
@ -546,7 +595,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 2, "name": "change" }, { "actionTypeId": 2, "name": "change" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-03 15:01:00.000", "timestamp": "2024-07-03T15:01:00.000Z",
"details": "Contract changed", "details": "Contract changed",
"correlationId": "e2462347-6749-4841-b42a-cf8de19ec727", "correlationId": "e2462347-6749-4841-b42a-cf8de19ec727",
}, },
@ -558,8 +607,8 @@ paths:
"externalReference": "F2024-0001", "externalReference": "F2024-0001",
"term": 1, "term": 1,
"invoiceDate": "2024-07-02", "invoiceDate": "2024-07-02",
"created": "2024-07-02 15:01:00.000", "created": "2024-07-02T15:01:00.000Z",
"updated": "2024-07-02 15:01:00.000", "updated": "2024-07-02T15:01:00.000Z",
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
@ -682,7 +731,7 @@ paths:
"termDuration": "P0Y1M0D", "termDuration": "P0Y1M0D",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000", "created": "2024-08-01T15:01:00.000Z",
"ovPayTokenId": 1337, "ovPayTokenId": 1337,
"contractVersions": "contractVersions":
[ [
@ -781,7 +830,7 @@ paths:
"termDuration": "P0Y1M0D", "termDuration": "P0Y1M0D",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000", "created": "2024-08-01T15:01:00.000Z",
"ovPayTokenId": 1337, "ovPayTokenId": 1337,
"contractVersions": "contractVersions":
[ [

View File

@ -380,7 +380,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
requestBody: requestBody:
content: content:
application/json: application/json:
@ -415,7 +415,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -429,7 +429,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
requestBody: requestBody:
content: content:
application/json: application/json:
@ -464,7 +464,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -478,7 +478,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
- name: customerPreferenceId - name: customerPreferenceId
in: path in: path
required: true required: true
@ -519,7 +519,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -533,8 +533,8 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
requestBody: requestBody:
content: content:
application/json: application/json:
@ -575,7 +575,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -589,7 +589,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
- name: addressId - name: addressId
in: path in: path
required: true required: true
@ -634,7 +634,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -648,7 +648,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
- name: addressId - name: addressId
in: path in: path
required: true required: true
@ -669,14 +669,14 @@ paths:
summary: Add a customer phone summary: Add a customer phone
description: >- description: >-
parameters: parameters:
- name: X-HTM-JWT-AUTH-HEADER - name: X-HTM-JWT-AUTH-HEADER
in: header in: header
schema: schema:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -690,7 +690,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
requestBody: requestBody:
content: content:
application/json: application/json:
@ -728,7 +728,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -742,7 +742,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
- name: phoneId - name: phoneId
in: path in: path
required: true required: true
@ -754,7 +754,7 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/phoneEntity" $ref: "#/components/schemas/phoneEntity"
examples: examples:
updateFullPhoneEntity: updateFullPhoneEntity:
value: value:
phone: phone:
@ -789,7 +789,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -803,7 +803,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
- name: phoneId - name: phoneId
in: path in: path
required: true required: true
@ -816,7 +816,7 @@ paths:
content: content:
application/json: {} application/json: {}
x-auth-type: Application & Application User x-auth-type: Application & Application User
x-throttling-tier: Unlimited x-throttling-tier: Unlimited
/customers/billinginformations: /customers/billinginformations:
get: get:
tags: tags:
@ -831,7 +831,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -845,7 +845,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
responses: responses:
200: 200:
description: OK description: OK
@ -866,7 +866,7 @@ paths:
"billingInformationId": 1, "billingInformationId": 1,
"iban": "NL••••••••••••1234", "iban": "NL••••••••••••1234",
"ascription": "J. Doe", "ascription": "J. Doe",
"alias": null, "alias": null,
"created": "2024-10-20T17:05:52.000", "created": "2024-10-20T17:05:52.000",
}, },
], ],
@ -875,7 +875,7 @@ paths:
get: get:
tags: tags:
- Customers - Customers
summary: Find direct debit mandates for a customer. summary: Find direct debit mandates for a customer.
description: Find direct debit mandates for a customer. description: Find direct debit mandates for a customer.
parameters: parameters:
- name: X-HTM-JWT-AUTH-HEADER - name: X-HTM-JWT-AUTH-HEADER
@ -884,7 +884,7 @@ paths:
type: string type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header in: header
schema: schema:
@ -898,7 +898,7 @@ paths:
type: string type: string
example: Customer example: Customer
required: false required: false
description: The role of the HTM employee in the case of the SMP description: The role of the HTM employee in the case of the SMP
responses: responses:
200: 200:
description: OK description: OK
@ -914,12 +914,12 @@ paths:
[ [
{ {
"directDebitMandateId": 71, "directDebitMandateId": 71,
"billingInformationId": "billingInformationId":
{ {
"billingInformationId": 15, "billingInformationId": 15,
"iban": "NL••••••••••••1234", "iban": "NL••••••••••••1234",
"ascription": "J. Doe", "ascription": "J. Doe",
"alias": null, "alias": null,
"created": "2024-10-20T17:05:52.000", "created": "2024-10-20T17:05:52.000",
}, },
"directDebitMandateType": "directDebitMandateType":
@ -1081,6 +1081,10 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -1130,9 +1134,9 @@ paths:
}, },
}, },
} }
OV pas without PAD: OV pas without PAD, without AGO:
summary: OV pas without PAD summary: OV pas without PAD, without AGO
description: OV pas without PAD description: OV pas without PAD, without AGO
value: value:
{ {
"ovPayTokens": "ovPayTokens":
@ -1142,7 +1146,7 @@ paths:
"ovPayTokenId": 1, "ovPayTokenId": 1,
"xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34567", "ovpasNumber": "OV34567",
"alias": "MyToken", "alias": "MyToken",
"tokenStatus": "tokenStatus":
@ -1164,6 +1168,10 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": false,
"isAuthorized": null,
},
"_links": "_links":
{ {
"self": "self":
@ -1213,9 +1221,9 @@ paths:
}, },
}, },
} }
OV pas with PAD and autoReload: OV pas with PAD, with autoReload, with AGO:
summary: OV pas with PAD and autoReload summary: OV pas with PAD, with autoReload, with AGO
description: OV pas with PAD and autoReload description: OV pas with PAD, with autoReload, with AGO
value: value:
{ {
"ovPayTokens": "ovPayTokens":
@ -1225,7 +1233,7 @@ paths:
"ovPayTokenId": 1, "ovPayTokenId": 1,
"xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34567", "ovpasNumber": "OV34567",
"alias": "MyToken", "alias": "MyToken",
"tokenStatus": "tokenStatus":
@ -1287,6 +1295,10 @@ paths:
"ageFromInclusive": 4, "ageFromInclusive": 4,
"ageToInclusive": 11, "ageToInclusive": 11,
}, },
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -1348,8 +1360,8 @@ paths:
"ovPayTokenId": 1, "ovPayTokenId": 1,
"xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34567", "ovpasNumber": "OV34567",
"alias": "MyToken", "alias": "MyToken",
"tokenStatus": "tokenStatus":
{ "tokenStatusId": 2, "name": "Active" }, { "tokenStatusId": 2, "name": "Active" },
@ -1385,6 +1397,10 @@ paths:
"ageFromInclusive": 4, "ageFromInclusive": 4,
"ageToInclusive": 11, "ageToInclusive": 11,
}, },
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -1446,7 +1462,7 @@ paths:
"ovPayTokenId": 1, "ovPayTokenId": 1,
"xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34567", "ovpasNumber": "OV34567",
"alias": "MyToken", "alias": "MyToken",
"tokenStatus": "tokenStatus":
@ -1501,6 +1517,10 @@ paths:
"ageFromInclusive": 4, "ageFromInclusive": 4,
"ageToInclusive": 11, "ageToInclusive": 11,
}, },
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -1562,7 +1582,7 @@ paths:
"ovPayTokenId": 1, "ovPayTokenId": 1,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34567", "ovpasNumber": "OV34567",
"alias": "MyToken", "alias": "MyToken",
"tokenStatus": "tokenStatus":
@ -1583,7 +1603,7 @@ paths:
"ovPayTokenId": 6, "ovPayTokenId": 6,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV54567", "ovpasNumber": "OV54567",
"alias": "MyToken", "alias": "MyToken",
"tokenStatus": "tokenStatus":
@ -1599,13 +1619,17 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
}, },
{ {
"customerProfileId": 18, "customerProfileId": 18,
"ovPayTokenId": 13, "ovPayTokenId": 13,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34547", "ovpasNumber": "OV34547",
"alias": "MyToken", "alias": "MyToken",
"tokenStatus": "tokenStatus":
@ -1621,13 +1645,17 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
}, },
{ {
"customerProfileId": 132, "customerProfileId": 132,
"ovPayTokenId": 21, "ovPayTokenId": 21,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34831", "ovpasNumber": "OV34831",
"alias": "Mijn OV Pas", "alias": "Mijn OV Pas",
"tokenStatus": "tokenStatus":
@ -1643,13 +1671,17 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
}, },
{ {
"customerProfileId": 166, "customerProfileId": 166,
"ovPayTokenId": 28, "ovPayTokenId": 28,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV34984", "ovpasNumber": "OV34984",
"alias": "Mijn OV Pas", "alias": "Mijn OV Pas",
"tokenStatus": "tokenStatus":
@ -1668,13 +1700,17 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
}, },
{ {
"customerProfileId": 166, "customerProfileId": 166,
"ovPayTokenId": 115, "ovPayTokenId": 115,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV54368", "ovpasNumber": "OV54368",
"alias": "My retired token", "alias": "My retired token",
"tokenStatus": "tokenStatus":
@ -1690,13 +1726,17 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
}, },
{ {
"customerProfileId": 1, "customerProfileId": 1,
"ovPayTokenId": 118, "ovPayTokenId": 118,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": "tokenType":
{ "tokenTypeId": 2, "name": "OV-pas physical" }, { "tokenTypeId": 2, "name": "OV-pas physical" },
"ovpasNumber": "OV98263", "ovpasNumber": "OV98263",
"alias": "My found token", "alias": "My found token",
"tokenStatus": "tokenStatus":
@ -1712,6 +1752,10 @@ paths:
"photo": null, "photo": null,
}, },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
}, },
], ],
_links: _links:
@ -1812,6 +1856,10 @@ paths:
"personalAccountData": "personalAccountData":
{ "name": null, "birthdate": null, "photo": null }, { "name": null, "birthdate": null, "photo": null },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -1890,6 +1938,10 @@ paths:
"personalAccountData": "personalAccountData":
{ "name": null, "birthdate": null, "photo": null }, { "name": null, "birthdate": null, "photo": null },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -2086,6 +2138,10 @@ paths:
"personalAccountData": "personalAccountData":
{ "name": null, "birthdate": null, "photo": null }, { "name": null, "birthdate": null, "photo": null },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -2149,6 +2205,10 @@ paths:
"personalAccountData": "personalAccountData":
{ "name": null, "birthdate": null, "photo": null }, { "name": null, "birthdate": null, "photo": null },
"gboAgeProfile": null, "gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
},
"_links": "_links":
{ {
"self": "self":
@ -2905,9 +2965,9 @@ paths:
summary: "**INTEGRATIELAAG** Transfer old OVpay token to new OVpay token." summary: "**INTEGRATIELAAG** Transfer old OVpay token to new OVpay token."
description: |- description: |-
**Note that this directly calls the integratielaag and not the Service Engine!** **Note that this directly calls the integratielaag and not the Service Engine!**
First transfers all personal account data (if present), then all products, of an existing OVpay token First transfers all personal account data (if present), then all products, of an existing OVpay token
to a new OVpay token. The new token will also be persisted in the profile as a replacement to a new OVpay token. The new token will also be persisted in the profile as a replacement
of the old token. This call is asynchronous, and progress can be monitored using the of the old token. This call is asynchronous, and progress can be monitored using the
`/customers/tokens/transfer/responsestatus/*` endpoint. `/customers/tokens/transfer/responsestatus/*` endpoint.
tags: tags:
- Token Replace v2 - Token Replace v2
@ -2920,9 +2980,9 @@ paths:
Transfer from a token without PAD to a new token: Transfer from a token without PAD to a new token:
summary: Transfer from a token without PAD to a new token summary: Transfer from a token without PAD to a new token
description: | description: |
Transfer of a token without PAD to a new OVpay token. Note the new token in the request is always Transfer of a token without PAD to a new OVpay token. Note the new token in the request is always
identified by xTAT, regardless if the new token already exists in the customer profile. If the new identified by xTAT, regardless if the new token already exists in the customer profile. If the new
token does not exist in the customer profile, the user needs to provide an alias for the new token, token does not exist in the customer profile, the user needs to provide an alias for the new token,
and it will be created in the customer profile. and it will be created in the customer profile.
value: value:
{ {
@ -2936,11 +2996,11 @@ paths:
Transfer from a token with PAD to a new token without existing PAD: Transfer from a token with PAD to a new token without existing PAD:
summary: Transfer from a token with PAD to a new token without existing PAD summary: Transfer from a token with PAD to a new token without existing PAD
description: | description: |
Transfer of a token with PAD to a new token by xTAT without existing PAD. Note how this request is Transfer of a token with PAD to a new token by xTAT without existing PAD. Note how this request is
different, since it has an e-mail address on which the new PAD should be created. This request may different, since it has an e-mail address on which the new PAD should be created. This request may
optionally provide an OTP for verification of th provided email address. optionally provide an OTP for verification of th provided email address.
Also note the new token in the request is always identified by xTAT, regardless if the new token Also note the new token in the request is always identified by xTAT, regardless if the new token
already exists in the customer profile. If the new token does not exist in the customer profile, the already exists in the customer profile. If the new token does not exist in the customer profile, the
user needs to provide an alias for the new token, and it will be created in the customer profile. user needs to provide an alias for the new token, and it will be created in the customer profile.
value: value:
{ {
@ -2957,8 +3017,8 @@ paths:
summary: Transfer from a token with PAD to a new token with existing PAD summary: Transfer from a token with PAD to a new token with existing PAD
description: | description: |
Transfer of a token with PAD to a new token by xTAT with existing PAD. Transfer of a token with PAD to a new token by xTAT with existing PAD.
Note that the new token in the request is always identified by xTAT, regardless if the new token Note that the new token in the request is always identified by xTAT, regardless if the new token
already exists in the customer profile. If the new token does not exist in the customer profile, the already exists in the customer profile. If the new token does not exist in the customer profile, the
user needs to provide an alias for the new token, and it will be created in the customer profile. user needs to provide an alias for the new token, and it will be created in the customer profile.
value: value:
{ {
@ -2996,7 +3056,7 @@ paths:
Transfer of token started: Transfer of token started:
description: | description: |
The transfer of the token was started successfully. The data of the token will be transferred The transfer of the token was started successfully. The data of the token will be transferred
asynchronously. In the response body the consumer will find information on how to retrieve the asynchronously. In the response body the consumer will find information on how to retrieve the
processing status. processing status.
value: value:
{ {
@ -3038,7 +3098,7 @@ paths:
- Token Replace v2 - Token Replace v2
summary: "**INTEGRATIELAAG** Get the status of the initiated token transfer process." summary: "**INTEGRATIELAAG** Get the status of the initiated token transfer process."
description: | description: |
**Note that this directly calls the integratielaag and not the Service Engine!** Get the status of the **Note that this directly calls the integratielaag and not the Service Engine!** Get the status of the
asynchronous token transfer processing. asynchronous token transfer processing.
responses: responses:
"200": "200":
@ -3166,7 +3226,7 @@ paths:
examples: examples:
Token transfer in progress: Token transfer in progress:
description: | description: |
The transfer of the token is still in progress. The response body shows the details of the The transfer of the token is still in progress. The response body shows the details of the
processing status. processing status.
value: value:
{ {
@ -3347,7 +3407,7 @@ paths:
in: query in: query
description: External id of the device you want to get the purchased HTM products for. description: External id of the device you want to get the purchased HTM products for.
schema: schema:
type: string type: string
- name: ovpayTokenId - name: ovpayTokenId
in: query in: query
description: Id of the OVpay-token you want to get the purchased HTM products for. description: Id of the OVpay-token you want to get the purchased HTM products for.
@ -3380,9 +3440,9 @@ paths:
} }
getTwoBarcodePurchasedProductsForDevice: getTwoBarcodePurchasedProductsForDevice:
summary: Two BarcodeTicket purchased products, one PendingActivation and one Active summary: Two BarcodeTicket purchased products, one PendingActivation and one Active
description: |- description: |-
The first ticket (PendingActivation) shows the 30-day range in which the ticket can be activated The first ticket (PendingActivation) shows the 30-day range in which the ticket can be activated
(using the PATCH endpoint) in the validityStart and validityEnd fields. The second ticket (Active) (using the PATCH endpoint) in the validityStart and validityEnd fields. The second ticket (Active)
shows the actual validity period of the ticket after activation. shows the actual validity period of the ticket after activation.
value: value:
{ {
@ -3401,14 +3461,14 @@ paths:
"name": "Barcode", "name": "Barcode",
}, },
"orderId": "501B17EF-36C4-4039-B92C-6517969B464E", "orderId": "501B17EF-36C4-4039-B92C-6517969B464E",
"orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E",
"ticketReference": "KJj43nejhbTxhrfef287", "ticketReference": "KJj43nejhbTxhrfef287",
"serviceId": "HTM-4321-7654-7659", "serviceId": "HTM-4321-7654-7659",
"issuedAt": "2026-03-21T09:01:35+01:00", "issuedAt": "2026-03-21T09:01:35+01:00",
"activatedAt": null, "activatedAt": null,
"blocked": false, "blocked": false,
"cancelledAt": null, "cancelledAt": null,
"activateBefore": "2026-03-30", "activateBefore": "2026-03-30",
"validityStart": null, "validityStart": null,
"validityEnd": null, "validityEnd": null,
"barcode": null, "barcode": null,
@ -3436,14 +3496,14 @@ paths:
"name": "Barcode", "name": "Barcode",
}, },
"orderId": "501B17EF-36C4-4039-B92C-6517969B464E", "orderId": "501B17EF-36C4-4039-B92C-6517969B464E",
"orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E",
"ticketReference": "KJj43nejhbTxhr897287", "ticketReference": "KJj43nejhbTxhr897287",
"serviceId": "HTM-1234-7654-8945", "serviceId": "HTM-1234-7654-8945",
"issuedAt": "2026-03-21T10:01:12+01:00", "issuedAt": "2026-03-21T10:01:12+01:00",
"activatedAt": "2026-03-21T12:45:01+01:00", "activatedAt": "2026-03-21T12:45:01+01:00",
"blocked": false, "blocked": false,
"cancelledAt": null, "cancelledAt": null,
"activateBefore": null, "activateBefore": null,
"validityStart": "2026-03-21T12:45:01+01:00", "validityStart": "2026-03-21T12:45:01+01:00",
"validityEnd": "2026-03-21T14:45:01+01:00", "validityEnd": "2026-03-21T14:45:01+01:00",
"barcode": "iVBORw0KGgoAAAANSUhEUgAAAVwAAAFcAQAAAACsbTuBAAAFDElEQVR4Xu2bQa6rOhBEGzHwMEtgKewMyM5YCkvIkAGif50yyc/Tl770piZW9HSNywzqVlW3nXcjc83cusxnvsbMjBieuelf/bzGYz1jWCKmeGS+4g5grSwlz/IaI+JgEfzcvzQZo2yhxQgW7wDutLJrvVLzEInbVHLpM/tK5T7kHmNdbxssgqSipQj/0KLA24yqNvEWWRclpJKpefNgE7YZr/lj1eZ55wMYIWkUbZb7Xj/wH+BezvPkFJhQetmD+7AI2VuSEQMevANYESzqZh49VlEXIKOT7SDtseqnpz0Iyc2DJZezkEB5aaVKSvuF5FMwaIdB7wCGOgb5fFgus2wlKhPDpUiTlogr1tsHG7lfzcqYLlVnDHq6ylYn1OE54qd5cNC6aQxL0UQRy2YJJxCS8N4m273Gm4BJFAhzlytb5T4A0QrCYmUTrxd1bYNVgGqqPndH7vHwYqHLHf9cpO1pHJxU3Nq6vUbAVhXaocnTKO5cpK+4AViLitRwf8IQdYFwBkkKW7FzZxNh/AN/g5NHqXyed5MOz45kjkvKofpLYNwBrNBR/Dz9SKpTDkGd8CApZYonT24B7un56XKnoMeXkOBNHqTDk/NOmrrwyfIWYHe51O4kn4FBnfYbnHjqKuw3AGMreKOvC07DCAebHS5lAXWq5eKVA0HjYA2xM0MYCSMnqTqpx48ZVSmPTd15tT03AF+LVBuOgJoMqc2HL6Gy8nr1/K2DU+YpmKerd45fQ2ypzSFyq8coUM2D1yBksNWqOTWnjqvLpVYPvrt17f6BP+AaQk85zR4MarfHbAlSu/XhgGCJNg6mQNmASXnGhpZY+tKp93lywaY+SjcPhroCWx1BHFAnVemR81mdjEikWlllzYNrCM27bKVt7nInLplEnef6SfPFhb19MDmCbewcjtL/d7FwAzCqmShYzMd/qaPnp0AxV+SOpq5xMCnLZJOhZCNCZuIR4BWwL6un4luF5sE9N7CKXIJ2Zecncnt3vZ0it+hN7wNC6+DU/Ene1gj+lOOr4BDGilyT3D74NZ4OlYm2Xmx9t2rJN+kb7P3A/wUzV6lSQaonIoR3DUdy7vR1WQt782CrzrbbvTOdxwu2ZKy4MZXXflPzYJoVLg6GpbIVtLSb2JxduzEg+6Mm+R3AXECaHYRjG4nH2UIak7jSm9zXNQ9OLha2yhbUCT/vOA1VHUAGXpVuhpsHE7H7O0d6d2+i7rxeI2EVVMTm4wZg5vZUV2/nBUmoG5befZ0XERKkNg9O8zR9Rexls+WgldPRmTYHp90BrAIkqqYYnkmNGfvEY1E2Ijeu/3SQLKar1Q/8AX88eDqCRe3wZKJ89sVCRdaTZfvg/u8uFhoH14J0apHvil2rFwrUNtuDcXLOruNdvRoGB9ezgJXP2OrwN+mz8jl9lPab3Ob0NwDbVteFpEuX+7ylbHGdo5Oeny8y4vJgy2DniHhzQQp3c4yCkLwZvPbXk+INwKeqj6grVB/ha+dC88LVfec3zR/q2gYnlyO5GD+Kvfp03unruKCUygJb1e8HmwdbPp2pg8fgr3XYnE6YQGUWUp20Dz6hSgReznmXY3hLJ5A2ozJT9wN/gfVIEbzBsxvdYSneL571OV279S+/jubBiuCzAL5qt5xHPNHMcHgciSuD15rXbYMtJFbE1piEkEi0fPp6AoLX5Lvjt+paBvOIRQjSEEHaCX5BSP4DBSalHh4bB/8DVeIFt2RfPhQAAAAASUVORK5CYII=", "barcode": "iVBORw0KGgoAAAANSUhEUgAAAVwAAAFcAQAAAACsbTuBAAAFDElEQVR4Xu2bQa6rOhBEGzHwMEtgKewMyM5YCkvIkAGif50yyc/Tl770piZW9HSNywzqVlW3nXcjc83cusxnvsbMjBieuelf/bzGYz1jWCKmeGS+4g5grSwlz/IaI+JgEfzcvzQZo2yhxQgW7wDutLJrvVLzEInbVHLpM/tK5T7kHmNdbxssgqSipQj/0KLA24yqNvEWWRclpJKpefNgE7YZr/lj1eZ55wMYIWkUbZb7Xj/wH+BezvPkFJhQetmD+7AI2VuSEQMevANYESzqZh49VlEXIKOT7SDtseqnpz0Iyc2DJZezkEB5aaVKSvuF5FMwaIdB7wCGOgb5fFgus2wlKhPDpUiTlogr1tsHG7lfzcqYLlVnDHq6ylYn1OE54qd5cNC6aQxL0UQRy2YJJxCS8N4m273Gm4BJFAhzlytb5T4A0QrCYmUTrxd1bYNVgGqqPndH7vHwYqHLHf9cpO1pHJxU3Nq6vUbAVhXaocnTKO5cpK+4AViLitRwf8IQdYFwBkkKW7FzZxNh/AN/g5NHqXyed5MOz45kjkvKofpLYNwBrNBR/Dz9SKpTDkGd8CApZYonT24B7un56XKnoMeXkOBNHqTDk/NOmrrwyfIWYHe51O4kn4FBnfYbnHjqKuw3AGMreKOvC07DCAebHS5lAXWq5eKVA0HjYA2xM0MYCSMnqTqpx48ZVSmPTd15tT03AF+LVBuOgJoMqc2HL6Gy8nr1/K2DU+YpmKerd45fQ2ypzSFyq8coUM2D1yBksNWqOTWnjqvLpVYPvrt17f6BP+AaQk85zR4MarfHbAlSu/XhgGCJNg6mQNmASXnGhpZY+tKp93lywaY+SjcPhroCWx1BHFAnVemR81mdjEikWlllzYNrCM27bKVt7nInLplEnef6SfPFhb19MDmCbewcjtL/d7FwAzCqmShYzMd/qaPnp0AxV+SOpq5xMCnLZJOhZCNCZuIR4BWwL6un4luF5sE9N7CKXIJ2Zecncnt3vZ0it+hN7wNC6+DU/Ene1gj+lOOr4BDGilyT3D74NZ4OlYm2Xmx9t2rJN+kb7P3A/wUzV6lSQaonIoR3DUdy7vR1WQt782CrzrbbvTOdxwu2ZKy4MZXXflPzYJoVLg6GpbIVtLSb2JxduzEg+6Mm+R3AXECaHYRjG4nH2UIak7jSm9zXNQ9OLha2yhbUCT/vOA1VHUAGXpVuhpsHE7H7O0d6d2+i7rxeI2EVVMTm4wZg5vZUV2/nBUmoG5befZ0XERKkNg9O8zR9Rexls+WgldPRmTYHp90BrAIkqqYYnkmNGfvEY1E2Ijeu/3SQLKar1Q/8AX88eDqCRe3wZKJ89sVCRdaTZfvg/u8uFhoH14J0apHvil2rFwrUNtuDcXLOruNdvRoGB9ezgJXP2OrwN+mz8jl9lPab3Ob0NwDbVteFpEuX+7ylbHGdo5Oeny8y4vJgy2DniHhzQQp3c4yCkLwZvPbXk+INwKeqj6grVB/ha+dC88LVfec3zR/q2gYnlyO5GD+Kvfp03unruKCUygJb1e8HmwdbPp2pg8fgr3XYnE6YQGUWUp20Dz6hSgReznmXY3hLJ5A2ozJT9wN/gfVIEbzBsxvdYSneL571OV279S+/jubBiuCzAL5qt5xHPNHMcHgciSuD15rXbYMtJFbE1piEkEi0fPp6AoLX5Lvjt+paBvOIRQjSEEHaCX5BSP4DBSalHh4bB/8DVeIFt2RfPhQAAAAASUVORK5CYII=",
@ -3499,7 +3559,7 @@ paths:
"barcodeTickets":[], "barcodeTickets":[],
"vouchers":[] "vouchers":[]
} }
} }
getSingleVoucherPurchasedProductForCustomer: getSingleVoucherPurchasedProductForCustomer:
summary: One voucher purchased product summary: One voucher purchased product
value: value:
@ -3523,7 +3583,7 @@ paths:
"voucherStatus": { "voucherStatus": {
"voucherStatusId": 2, "voucherStatusId": 2,
"name": "issued" "name": "issued"
}, },
"mandatoryCustomerDataItems": "mandatoryCustomerDataItems":
[ [
{ {
@ -3538,7 +3598,7 @@ paths:
} }
] ]
} }
} }
/purchasedproducts/{purchasedProductId}: /purchasedproducts/{purchasedProductId}:
parameters: parameters:
- name: X-HTM-JWT-AUTH-HEADER - name: X-HTM-JWT-AUTH-HEADER
@ -3586,7 +3646,7 @@ paths:
value: value:
{ {
"status": "Active" "status": "Active"
} }
responses: responses:
"200": "200":
description: OK description: OK
@ -3636,7 +3696,6 @@ paths:
"vouchers": [] "vouchers": []
} }
} }
/customers/devices: /customers/devices:
post: post:
summary: Add a new device to a customer profile. summary: Add a new device to a customer profile.
@ -3813,7 +3872,7 @@ components:
customerProfileId: customerProfileId:
type: integer type: integer
example: 1 example: 1
customerPreference: customerPreference:
$ref: "#/components/schemas/getCustomerPreference" $ref: "#/components/schemas/getCustomerPreference"
customerNumber: customerNumber:
type: integer type: integer
@ -4014,12 +4073,12 @@ components:
customerPreferenceId: customerPreferenceId:
type: integer type: integer
languageId: languageId:
type: integer type: integer
customerStatusEntity: customerStatusEntity:
type: object type: object
properties: properties:
customerStatusId: customerStatusId:
type: integer type: integer
OvPayTokensResponse: OvPayTokensResponse:
type: object type: object
required: required:
@ -4298,7 +4357,7 @@ components:
items: items:
type: object type: object
required: required:
- purchasedProductId - purchasedProductId
- productId - productId
- name - name
- status - status
@ -4421,13 +4480,13 @@ components:
type: string type: string
example: HTM 2 uurskaart example: HTM 2 uurskaart
description: |- description: |-
The name of the originating HTM product definition. The name of the originating HTM product definition.
Will be returned in the language as specified in the Accept-Language header or the customer profile. Otherwise defaults to NL. Will be returned in the language as specified in the Accept-Language header or the customer profile. Otherwise defaults to NL.
description: description:
type: string type: string
example: "Met deze kaart reis je 2 uur lang onbeperkt met de bussen en trams van HTM. Overstappen is natuurlijk toegestaan!" example: "Met deze kaart reis je 2 uur lang onbeperkt met de bussen en trams van HTM. Overstappen is natuurlijk toegestaan!"
description: |- description: |-
The description of the originating HTM product definition. The description of the originating HTM product definition.
Will be returned in the language as specified in the Accept-Language header or the customer profile. Otherwise defaults to NL. Will be returned in the language as specified in the Accept-Language header or the customer profile. Otherwise defaults to NL.
status: status:
type: string type: string
@ -4486,15 +4545,15 @@ components:
example: "2024-11-30" example: "2024-11-30"
description: Only present for barcode tickets that are not yet activated. Tickets can only be activated BEFORE this date. description: Only present for barcode tickets that are not yet activated. Tickets can only be activated BEFORE this date.
validityStart: validityStart:
description: |- description: |-
Only present for barcode tickets that have been activated. The date-time at which the ticket will become valid for traveling. Only present for barcode tickets that have been activated. The date-time at which the ticket will become valid for traveling.
The ticket will not be valid before this date/time. The ticket will not be valid before this date/time.
type: string type: string
format: date-time-offset format: date-time-offset
example: "2024-11-25T13:25:00+01:00" example: "2024-11-25T13:25:00+01:00"
validityEnd: validityEnd:
description: |- description: |-
Only present for barcode tickets that have been activated. The date-time at which the ticket will become invalid for traveling. Only present for barcode tickets that have been activated. The date-time at which the ticket will become invalid for traveling.
The ticket will not be valid after this date/time. The ticket will not be valid after this date/time.
type: string type: string
format: date-time-offset format: date-time-offset
@ -4603,4 +4662,3 @@ components:
customerDataItem: customerDataItem:
type: string type: string
example: emailAddress example: emailAddress

View File

@ -0,0 +1,341 @@
openapi: 3.0.1
info:
title: Service Engine APIs for TAT security
description: >-
Service Engine APIs for TAT security. These are NOT the raw GBO APIs to access TAT security at GBO directly.
To be used by touch points to get secure a TAT.
version: "2.0"
servers:
- url: https://services.acc.api.htm.nl/abt/touchpoint/2.0
tags:
- name: TAT Security
paths:
/tokens/securetoken:
parameters:
- name: X-HTM-JWT-AUTH-HEADER
in: header
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header
schema:
type: integer
example: 323
required: false
description: The id of the customer Profile
- name: X-HTM-ROLE-HEADER
in: header
schema:
type: string
example: Customer
required: false
description: The role of the HTM employee in the case of the SMP
post:
tags:
- TAT Security
summary: Request additional OV-pas security for a token either in profile or anonymous.
description: Request additional OV-pas security for a token either in profile or anonymous
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SecureTokenRequest"
examples:
With customer account:
value:
ovPayTokenId: 42
emailAddress: stasjo@htm.nl
Without customer account:
value:
xtat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d
emailAddress: stasjo@htm.nl
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/EmailNotPreApprovedResponse"
example:
uid: 7594f3ee-cd3d-40a3-8e82-73b90d16c481
recipient: xxxxxx.user@gmail.com
key: 123456789123456789123456789abcde
description: OTP Sent
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Missing Parameters:
value:
status: 400
title: Missing Mandatory Parameter
detail: Required parameter {0} is missing.
Invalid Parameters:
value:
status: 400
title: Invalid Parameter
detail: Required parameter {0} is invalid.
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unauthorized:
value:
status: 401
title: Unauthorized
detail: Invalid Access Token
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
TAT not found:
value:
status: 404
title: Not Found
detail: TAT Account Not Found
"409":
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
TAT Already Secured:
value:
status: 409
title: Conflict
detail: TAT Already Secured
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
/tokens/verifyotp:
parameters:
- name: X-HTM-JWT-AUTH-HEADER
in: header
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header
schema:
type: integer
example: 323
required: false
description: The id of the customer Profile
- name: X-HTM-ROLE-HEADER
in: header
schema:
type: string
example: Customer
required: false
description: The role of the HTM employee in the case of the SMP
post:
tags:
- TAT Security
summary: Submit an OTP for a triggered OTP flow.
description: |
Submit an OTP for a triggered OTP flow. This can either be result of an AGO activation, or
result of an AGO authorization flow. Since the backoffice behaves slightly different depending
on which use case is executed, the calling TP needs to provide an `action` in the request body.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/VerifyOtpRequest"
examples:
OTP verification for TAT security activation for token in customer account:
value:
ovPayTokenId: 42
otp: 123456
action: secure
OTP verification for TAT security authorization for anonymous token:
value:
xtat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0
otp: 123456
action: authorize
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/VerifyOtpResponse'
examples:
Tat Secured:
value:
status: Success
description: TAT Secured
Tat Unsecured:
value:
status: Success
description: TAT Unsecured
Tat Authorized:
value:
status: Success
description: TAT Authorized
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Missing Parameters:
value:
status: 400
title: Missing Mandatory Parameter
detail: Required parameter {0} is missing.
Invalid Parameters:
value:
status: 400
title: Invalid Parameter
detail: Required parameter {0} is invalid.
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unauthorized:
value:
status: 401
title: Unauthorized
detail: Invalid Access Token
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
components:
schemas:
unavailable:
type: object
GenerateTatOutput:
type: object
properties:
uid:
type: string
description: >-
An uid IS A unique identifier THAT is associated with the
user.
recipient:
type: string
description: >-
A recipient IS A unique identifier THAT is associated with the
TAT owner.
key:
type: string
description: >-
A key IS a 32 character string THAT uniquely identifies the
OTP session.
EmailNotPreApprovedResponse:
type: object
description: >-
EmailNotPreApprovedResponse IS AN object THAT represents the response of
email pre-approval check.
properties:
uid:
type: string
description: A uid IS A unique identifier THAT is associated with the user.
example: 7594f3ee-cd3d-40a3-8e82-73b90d16c481
recipient:
type: string
description: >-
A recipient IS A unique identifier THAT is associated with the TAT
owner.
example: xxxxxx.user@gmail.com
key:
type: string
description: >-
A key IS a 32 character string THAT uniquely identifies the OTP
session.
example: 123456789123456789123456789abcde
description:
type: string
description: >-
A description IS A string THAT describes the reason why the email is
not pre-approved.
example: OTP Sent
SecureTokenRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xtat:
type: string
format: uuid
example: 6134db53-9ae5-41d1-a343-36656b60b510
emailAddress:
type: string
format: email
example: stasjo@htm.nl
required:
- ovPayTokenId
VerifyOtpRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xtat:
type: string
format: uuid
example: f3474452-e1d4-428c-b366-e5ad5965eb8c
otp:
type: string
example: 123456
action:
type: string
example: secure
required:
- otp
- action
VerifyOtpResponse:
type: object
properties:
status:
type: string
example: Success
description:
type: string
example: TAT Secured
ErrorResponse:
description: Default response when an invalid request has been sent
type: object
properties:
status:
type: integer
description: >-
A status IS An integer that represents the HTTP status code of the
response.
example: 400
title:
type: string
description: A title IS A string that provides a brief summary of the error.
detail:
type: string
description: A detail IS A string that provides more details about the error.

View File

@ -111,14 +111,6 @@ paths:
explode: false explode: false
required: false required: false
description: Filter on most recent order status. 1 = concept, 2 = awaitingPayment, 3 = pendingPayment, 4 = paid, 5 = delivered, 6 = cancelled. description: Filter on most recent order status. 1 = concept, 2 = awaitingPayment, 3 = pendingPayment, 4 = paid, 5 = delivered, 6 = cancelled.
- in: query
name: issuedVoucherId
schema:
type: string
format: uuid
example: "b0a9f3c9-9b92-4f8c-b78d-6129be7218a6"
required: false
description: Filter on applied issuedVoucherId for the order.
responses: responses:
"200": "200":
description: OK description: OK

View File

@ -479,7 +479,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/PostOrder"
examples: examples:
Create order with OVpas and PAD: Create order with OVpas and PAD:
summary: Create order with OVpas and PAD summary: Create order with OVpas and PAD
@ -494,7 +494,11 @@ paths:
{ {
"externalOrderLineId": null, "externalOrderLineId": null,
"productId": 1, "productId": 1,
"vouchers":[], "vouchers":[
{
"voucherCode": "Voucher1234"
}
],
"quantity": 1, "quantity": 1,
"validFrom": "2024-03-22T09:00:00", "validFrom": "2024-03-22T09:00:00",
"validUntil": null, "validUntil": null,
@ -1864,7 +1868,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/PostOrderLine"
examples: examples:
Add order line to concept order: Add order line to concept order:
summary: Add order line to concept order product with children summary: Add order line to concept order product with children
@ -1873,7 +1877,11 @@ paths:
{ {
"externalOrderLineId": null, "externalOrderLineId": null,
"productId": 2, "productId": 2,
"vouchers":[], "vouchers":[
{
"voucherCode": "HTM-787466"
}
],
"quantity": 1, "quantity": 1,
"validFrom": "2024-03-22T09:00:00", "validFrom": "2024-03-22T09:00:00",
"validUntil": null, "validUntil": null,
@ -1897,7 +1905,6 @@ paths:
value: value:
{ {
"productId": 2, "productId": 2,
"vouchers":[],
"quantity": 1, "quantity": 1,
"createdOn": "2024-03-22T09:00:00", "createdOn": "2024-03-22T09:00:00",
} }
@ -1962,7 +1969,64 @@ paths:
"taxAmount": null, "taxAmount": null,
"amountExclTax": null, "amountExclTax": null,
"amountInclTax": 121, "amountInclTax": 121,
"vouchers":[], "vouchers":[
{
"issuedVoucherId": "8e405272-470f-4ed6-8303-791ab40e72b5",
"voucherCode": "HTM-787466",
"fromInclusive": "2025-10-04T00:00:00.000",
"untilInclusive": "2026-11-04T00:00:00.000",
"voucherStatus":
{ "voucherStatusId": 1, "name": "New" },
"product":
{
"productId": 263,
"productName": "HTM-80001",
"productDescription": "10 euro korting op HTM maandkorting 20%",
"productCategory":
{
"productCategoryId": 9,
"isTravelProduct": false,
"name": "Voucher",
},
"amountInclTax": -1000,
"requiredProducts":
[
{
"productId": 1,
"productName": "HTM-30001",
"productDescription": "HTM Maandkorting 20%",
"_links":
{
"get_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/products/1",
"method": "GET",
},
},
},
],
"_links":
{
"get_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/products/263",
"method": "GET",
},
},
},
"mandatoryCustomerDataItems":
[
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate"
},
{
"mandatoryCustomerDataItemId": 4,
"customerDataItem": "emailAddress"
},
],
}
],
"quantity": 1, "quantity": 1,
"orderLineTerms": "orderLineTerms":
[ [
@ -2328,7 +2392,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/PatchOrderLine"
examples: examples:
Update order line: Update order line:
summary: Update order line summary: Update order line
@ -2336,7 +2400,6 @@ paths:
value: value:
{ {
"productId": 21, "productId": 21,
"vouchers":[],
"quantity": 1, "quantity": 1,
"validFrom": "2024-03-25T09:00:00", "validFrom": "2024-03-25T09:00:00",
"validUntil": null, "validUntil": null,
@ -2808,7 +2871,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/PostVoucher"
examples: examples:
Add voucher to orderLine: Add voucher to orderLine:
summary: Add voucher to orderLine to receive voucher benefits for a specific product summary: Add voucher to orderLine to receive voucher benefits for a specific product
@ -3115,7 +3178,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/PostVoucher"
examples: examples:
Add voucher to concept order: Add voucher to concept order:
summary: Add voucher to orderLine to receive voucher benefits for a whole order summary: Add voucher to orderLine to receive voucher benefits for a whole order
@ -6813,3 +6876,98 @@ components:
ageToInclusive: ageToInclusive:
type: integer type: integer
example: 11 example: 11
PostOrder:
type: object
properties:
externalOrderId:
type: string
description: |-
The id used in an external sales system
example: "MyOrder123"
languageId:
type: integer
description: |-
The id of the language for this order, all communications about the order will be in the given language
example: 1
externalDeviceId:
type: string
description: |-
The mobile device in use when placing the order
example: "ae3d9f69-945b-4290-a286-8c2dd5d7db8e"
orderLines:
type: array
description: |-
The orderLines with the chosen product and if known/required a voucher and customerToken
items:
$ref: "#/components/schemas/PostOrderLine"
PostOrderLine:
type: object
required:
- productId
- quantity
- createdOn
properties:
productId:
type: integer
description: |-
The id of the chosen product
example: 1
quantity:
type: integer
description: |-
Amount of the products to be delivered, in case of saldo quantity is used to define the amount of saldo to be charged in eurocents. If multiple GBO products are added, the same amount of customerTokens will be required.
example: 1
createdOn:
type: string
format: date-time
description: |-
Current datetime, moment client added orderLine to the order
example: "2024-03-22T09:00:00"
externalOrderLineId:
type: string
description: |-
The orderLineId as known in an external sales system, used for reconcilliation
example: "MyOrderLine123"
validFrom:
type: string
format: date-time
description: |-
The moment the chosen product should be activated
example: "2024-03-30T09:00:00"
validUntil:
type: string
format: date-time
description: |-
Only required when a product does not have a fixed duration, otherwise it is calculated by the back end system
example: null
vouchers:
type: array
description: |-
List of vouchers applicable for this orderLine
items:
$ref: "#/components/schemas/PostVoucher"
PatchOrderLine:
type: object
properties:
productId:
type: integer
example: 1
quantity:
type: integer
example: 1
validFrom:
type: string
format: date-time
example: "2024-03-30T09:00:00"
validUntil:
type: string
format: date-time
example: null
PostVoucher:
type: object
required:
- voucherCode
properties:
voucherCode:
type: string
example: "Voucher1234"

View File

@ -1,7 +1,7 @@
openapi: 3.0.1 openapi: 3.0.1
info: info:
title: Service Engine APIs for HTM voucher suppliers title: Service Engine APIs for HTM voucher suppliers
description: Service Engine APIs for HTM voucher suppliers, this means all instances responsible for supplying vouchers. These are NOT the CRUD APIs to the data hub. These are ALSO NOT the api's for sales touchpoints. description: Service Engine APIs for HTM voucher suppliers, this means all instances responsible for supplying vouchers. These are NOT the CRUD APIs to the data hub. These are ALSO NOT the APIs for sales touchpoints.
version: "1.0" version: "1.0"
servers: servers:
- url: https://services.acc.api.htm.nl/abt/abtvouchers/1.0 - url: https://services.acc.api.htm.nl/abt/abtvouchers/1.0
@ -24,15 +24,6 @@ paths:
When a requiredProduct is configured, all attributes of the requiredProduct are also prerequisites for redeeming the voucher; thus they do not need to also be configured for the voucher definition. The requiredProduct itself is the single source of truth for this; and voucher definitions do not need to be updated if the requirements of the requiredProduct change. For example, if the requiredProduct requires an OVpay token, an OVpay token is automatically required to redeem issued vouchers. When a requiredProduct is configured, all attributes of the requiredProduct are also prerequisites for redeeming the voucher; thus they do not need to also be configured for the voucher definition. The requiredProduct itself is the single source of truth for this; and voucher definitions do not need to be updated if the requirements of the requiredProduct change. For example, if the requiredProduct requires an OVpay token, an OVpay token is automatically required to redeem issued vouchers.
parameters: parameters:
- name: touchpointId
in: query
required: false
description: |
Filter the voucher definitions on a specific touchpointId. This means that only voucher definitions with active selling periods for the specified touchpoint are returned.
This query parameter is only intended for administrative purposes, since the touchpoint associated with the access token used in the request is used to determine which voucher definitions are returned. This query parameter can be used to retrieve voucher definitions for other touchpoints within the same retailer, for example to retrieve voucher definitions for a specific sales touchpoint that is different from the calling touchpoint.
schema:
type: integer
example: 12
- name: productId - name: productId
in: query in: query
required: false required: false
@ -206,18 +197,15 @@ paths:
/issuedvouchers: /issuedvouchers:
get: get:
summary: Get a list of issued vouchers that were issued for a specific touch point summary: Get a list of issued vouchers that were issued for a specific touch point
description: description: |-
Retrieve all issued vouchers for a specific touchpoint. This means that only vouchers that were issued by a touchpoint within the same retailer as the calling touchpoint are returned. Retrieve all issued vouchers that match the given query parameters. \
At least on of the following query parameters should be provided:
- `issuedVoucherId` (internal and globally unique ID);
- `voucherCode` (code that the customer uses for redeeming the voucher, can be reissued as long as only one instance is active at the same time);
- `productId` (the productId of the voucher definition).
When a voucher code has been issued multiple times, all issuedvouchers with the same voucher code will be returned, together with their statuses.
parameters: parameters:
- name: touchpointId
in: query
required: false
description: |-
Filter the issued vouchers on a specific touchpointId. This means that only vouchers that were issued by the specified touchpoint are returned.
This query parameter is only intended for administrative purposes, since the touchpoint associated with the access token used in the request is used to determine which issued vouchers are returned. This query parameter can be used to retrieve issued vouchers for other touchpoints within the same retailer, for example to retrieve issued vouchers for a specific sales touchpoint that is different from the calling touchpoint.
schema:
type: integer
example: 12
- name: issuedVoucherId - name: issuedVoucherId
in: query in: query
required: false required: false
@ -416,6 +404,22 @@ paths:
} }
] ]
} }
"400":
description: Bad request
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Missing required query parameters:
summary: Missing required query parameters
value:
{
"type": "https://example.com/probs/bad-request",
"title": "Missing required query parameters",
"detail": "At least one of the following query parameters should be provided: issuedVoucherId, voucherCode, or productId.",
"instance": "/issuedvouchers"
}
"403": "403":
description: Forbidden description: Forbidden
content: content:
@ -466,10 +470,20 @@ paths:
} }
post: post:
summary: Issue a voucher for a specific voucher definition summary: Issue a voucher for a specific voucher definition
description: | description: |-
Issue a voucher for a specific voucher definition. Vouchers can only be issued on a one-by-one basis, so that it is always clear what voucher code has been issued for specific voucher claims (which by itself my not uniquely identify the voucher; however the voucher code is guaranteed to be unique). The voucher can only be issued if the calling touchpoint (recognized by the access token) has an active selling period for the voucher definition (recognized by the productId).\ Issue a voucher for a specific voucher definition. Vouchers can only be issued on a one-by-one basis, so that it is always clear what voucher code has been issued for specific voucher claims (which by itself may not uniquely identify the voucher; however the voucher code is guaranteed to be unique).\
The \"fromInclusive\" and \"untilInclusive\" fields specify the date-time range in which the voucher can be redeemed by the customer. This has nothing to do with the allowed start date of a requiredProduct (for this, the existing order flow logic is applied).\ The voucher can only be issued if the calling touchpoint (recognized by the access token) has an active selling period for the voucher definition (recognized by the productId).
If the voucher definition contains mandatoryCustomerDataItems, a value (to be checked against customer input when redeeming the voucher) has to be provided for each of these items.
When providing a voucher code, the supplier is allowed to re-use a voucher code that has already been issued, but only if the previously issued voucher is not active anymore.\
This means that a voucher code can only be re-used once the previous instance has a `voucherStatus` of "revoked" or "expired".\
Redeemed is NOT a valid end-state, as this voucher might still refer to an active travel product (which can be revoked by revoking the voucher).
The `fromInclusive` and `untilInclusive` fields specify the date-time range in which the voucher can be redeemed by the customer.\
This has nothing to do with the allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
If the voucher definition contains mandatoryCustomerDataItems, a value (to be checked against customer input when redeeming the voucher) has to be provided for each of these items.
A newly issued voucher will always receive the status "new". Vouchers can only be redeemed after they have been explicitly set to the status "issued" (via `PATCH /issuedvouchers/{issuedVoucherId}`), for example when the customer receives the actual voucher code.
tags: tags:
- Vouchers - Vouchers
requestBody: requestBody:
@ -481,7 +495,9 @@ paths:
examples: examples:
Issue a voucher and supply own voucher code: Issue a voucher and supply own voucher code:
summary: Issue a voucher and supply own voucher code summary: Issue a voucher and supply own voucher code
description: This allows the voucher supplier to supply its own voucher code, which can be useful if the supplier already has its own (internal or external) source for voucher codes. The supplied voucher code must be unique - if this code is already in use, the request will fail. description: |-
This allows the voucher supplier to supply its own voucher code, which can be useful if the supplier already has its own (internal or external) source for voucher codes.\
The supplied voucher code must be unique (or a previous instance must be revoked/expired, see main endpoint description).
value: value:
{ {
"voucherCode": "HTM-A7J-128-PYT", "voucherCode": "HTM-A7J-128-PYT",
@ -498,12 +514,21 @@ paths:
} }
Issue a voucher and receive a voucher code (generated by ABT backend) in response: Issue a voucher and receive a voucher code (generated by ABT backend) in response:
summary: Issue a voucher and receive a voucher code (generated by ABT backend) in response summary: Issue a voucher and receive a voucher code (generated by ABT backend) in response
description: If the supplier is not able to generate its own unique voucher codes, it can issue a voucher without supplying any voucher code - the ABT backend will then receive a unique voucher code and return it in response. description: |-
If the supplier is not able to generate its own unique voucher codes, it can issue a voucher without supplying any voucher code.\
The ABT backend will then generate a unique voucher code and return it in response.
value: value:
{ {
"fromInclusive": "2026-01-01T00:00:00.000+00:00", "fromInclusive": "2026-01-01T00:00:00.000+00:00",
"untilInclusive": "2030-12-31T23:59:59.000+00:00", "untilInclusive": "2030-12-31T23:59:59.000+00:00",
"productId": 264 "productId": 264,
"voucherClaims":
[
{
"mandatoryCustomerDataItemId": 8,
"value": "1980-06-31",
}
],
} }
responses: responses:
"201": "201":
@ -521,7 +546,7 @@ paths:
"voucherCode": "HTM-A7J-128-PYT", "voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000", "fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000", "untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" }, "voucherStatus": { "voucherStatusId": 1, "name": "new" },
"product": "product":
{ {
"productId": 263, "productId": 263,
@ -573,12 +598,12 @@ paths:
$ref: "#/components/schemas/rfc9457" $ref: "#/components/schemas/rfc9457"
examples: examples:
Voucher code already in use: Voucher code already in use:
summary: Voucher code already in use summary: Another active voucher instance already exists for this voucher code
value: value:
{ {
"type": "https://example.com/probs/bad-request", "type": "https://example.com/probs/bad-request",
"title": "Invalid voucher code", "title": "Invalid voucher code",
"detail": "This voucher code is already in use.", "detail": "Another active voucher instance already exists for this voucher code.",
"instance": "/issuedvouchers" "instance": "/issuedvouchers"
} }
Missing mandatory voucher claims: Missing mandatory voucher claims:
@ -614,6 +639,9 @@ paths:
summary: Update the status of an issued voucher summary: Update the status of an issued voucher
description: |- description: |-
Update the status of an issued voucher. Not every state change is allowed; an error will be returned if an invalid state change is attempted.\ Update the status of an issued voucher. Not every state change is allowed; an error will be returned if an invalid state change is attempted.\
If a redeemed voucher is revoked using this endpoint, it may also impact any active travel products that have been acquired using this voucher.\
This depends on specific business rules that are agreed upon with HTM.
Possible voucher statuses are: Possible voucher statuses are:
- 1 = new - 1 = new
- 2 = issued - 2 = issued
@ -630,8 +658,16 @@ paths:
schema: schema:
$ref: "#/components/schemas/supplierTouchpointUpdateIssuedVoucherRequest" $ref: "#/components/schemas/supplierTouchpointUpdateIssuedVoucherRequest"
examples: examples:
Mark a voucher as issued:
summary: Mark a voucher as issued
description: Mark a voucher as issued. Only vouchers with a status of "issued" can actually be redeemed.
value:
{
"voucherStatusId": 2
}
Mark a voucher as revoked: Mark a voucher as revoked:
summary: Mark a voucher as revoked summary: Mark a voucher as revoked
description: Mark a voucher as revoked. This may also impact any active travel products that have been acquired using this voucher. This depends on specific business rules that are agreed upon with HTM.
value: value:
{ {
"voucherStatusId": 4 "voucherStatusId": 4