Compare commits

..

38 Commits

Author SHA1 Message Date
b6a490c979 added AGO status to order response 2026-09-09 10:55:14 +02:00
Max Martens
1ac734de96 Add productId in issuedvoucher response (nb: its not added in purchasedproducts response as this was not implemented and not needed) 2026-09-09 09:33:11 +02:00
Max Martens
c692cd45ea Make voucherStatus response model consistent across array + object; add time offset everywhere 2026-08-31 12:57:13 +02:00
Max Martens
0f2eaed9dd Fixed touchPointId casing; added SE query param "includeStatusHistory", remove text explaining mandatory query params for SE issuedvoucher, add explanation for automatic touchpointId filtering 2026-08-27 16:15:29 +02:00
11ea8f5fea typo 2026-08-24 11:54:47 +02:00
e52fde1bb3 added delete endpoint to token vault API's 2026-08-21 13:08:50 +02:00
1761c662e7 Merge pull request 'features/OVPAY2475-Token-API' (#67) from features/OVPAY2475-Token-API into develop
Reviewed-on: #67
2026-08-21 11:02:29 +00:00
Max Martens
6a0e5a5fba Added metadata in VoucherSupplier GET/POST, re-added POST purchasedproduct CRUD 2026-08-14 08:55:40 +02:00
Max Martens
7953e035bb Add touchpointId/metadata1tm5/statusChangedAfter in CRUD and TP spec
POST purchasedProduct is missing in CRUD? Try to find it later (and add new changes to request body there as well)
2026-08-13 17:13:52 +02:00
Max Martens
3c4ca6e00c Fix ordervouchers delete URI 2026-08-10 16:56:00 +02:00
Max Martens
f87baaca06 Add voucherstatus reason in POST and GET 2026-08-10 15:04:31 +02:00
257f8f939b added query param for orderVoucher 2026-08-10 14:32:01 +02:00
c1bb52277e Merge pull request 'features/OVPAY2790-journalentryFiko' (#65) from features/OVPAY2790-journalentryFiko into develop
Reviewed-on: #65
2026-08-10 12:10:50 +00:00
e79ac51966 Merge pull request 'features/OVPAY2475-AGO' (#66) from features/OVPAY2475-AGO into develop
Reviewed-on: #66
2026-08-10 12:09:05 +00:00
c6b395a05b fix xtat -> xTat 2026-08-10 14:06:51 +02:00
1d4fbf5004 Links in se endpoints for TAT 2026-08-10 14:06:51 +02:00
Max Martens
8eed2a9dd6 Fix null paymentMomentId 2026-08-10 14:06:51 +02:00
Max Martens
5e255b7bac Added contractVersions in SE contracts list response, fixed some example formatting 2026-08-10 14:06:51 +02:00
Max Martens
e2f70a78af Updated SE-vouchers-supplier spec after review 2026-08-10 14:06:51 +02:00
Max Martens
ee0147b963 Fix JSON schema errors 2026-08-10 14:06:50 +02:00
0a8a706675 removed not available endpoint 2026-07-31 14:25:32 +02:00
d42236dafc meervoud 2026-07-31 10:07:00 +02:00
1aae9729b2 meervoud 2026-07-31 10:05:36 +02:00
f7975ed5a1 updates to processingFailure and transactionAuditTrail POST calls and GETS, consistency 2026-07-31 09:48:25 +02:00
f0c216be9b added FK to other tables 2026-07-30 15:58:35 +02:00
3db0d113a0 fixed example 2026-07-30 15:44:01 +02:00
f4e7bd9385 added new API's 2026-07-30 12:01:30 +02:00
c2a6b1c9c2 fixed description response 2026-07-29 09:14:09 +02:00
Max Martens
17f52cd914 Fix null paymentMomentId 2026-07-28 20:58:22 +02:00
a493694021 rebased changes 2026-07-28 15:38:12 +02:00
96fd6341b0 removed required for xTat in response 2026-07-28 14:35:10 +02:00
f1022c0d8d added href links 2026-07-28 14:29:14 +02:00
5b3264d9cd added authorize endpoint and get securitystatus endpoint 2026-07-28 14:15:18 +02:00
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
13 changed files with 2436 additions and 685 deletions

View File

View File

@ -215,8 +215,13 @@ public class ABTProductsPUTGenerator {
}
case "paymentMoment" -> {
LOGGER.info("Rewriting paymentMoment to paymentMomentId...");
Long paymentMomentId = jsonField.getValue().get("paymentMomentId").asLong();
((ObjectNode)newJsonNode).put("paymentMomentId", paymentMomentId);
if (jsonField.getValue().get("paymentMomentId").isNull()) {
LOGGER.info("Rewriting null paymentMomentId...");
((ObjectNode)newJsonNode).putRawValue("paymentMomentId", null);
} else {
Long paymentMomentId = jsonField.getValue().get("paymentMomentId").asLong();
((ObjectNode)newJsonNode).put("paymentMomentId", paymentMomentId);
}
}
case "requiredCustomerLevel" -> {
LOGGER.info("Rewriting requiredCustomerLevel to requiredCustomerLevelId...");

View File

@ -327,6 +327,20 @@ paths:
status: 500
title: Internal Server Error
detail: An unknown error has occurred
delete:
tags:
- securitytokens
summary: Delete the authorization for HTM for an ovpaytoken
description: Delete the authorization for HTM for an ovpaytoken if the customerProfileId has been supplied look in the customerToken DB otherwise check the AnonymousToken DB.
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/SecurityTokenStatusResponse"
example:
{}
components:
securitySchemes:
oAuthSample:

View File

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

View File

@ -1170,7 +1170,7 @@ paths:
"gboAgeProfile": null,
"tatSecurity": {
"isSecured": false,
"isAuthorized": null,
"isAuthorized": false,
},
"_links":
{
@ -1209,6 +1209,10 @@ paths:
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/51compare",
"method": "POST",
},
"secure": {
"href": "/tokens/securetoken",
"method": "POST"
}
},
},
],
@ -1597,6 +1601,22 @@ paths:
"birthdate": null,
"photo": null,
},
"tatSecurity": {
"isSecured": true,
"isAuthorized": false,
},
"_links":{
"self":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1",
"method": "GET",
},
"authorize":
{
"href": "/tokens/authorizetoken",
"method": "POST"
}
}
},
{
"customerProfileId": 1,
@ -1623,6 +1643,13 @@ paths:
"isSecured": true,
"isAuthorized": true,
},
"_links":{
"self":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1",
"method": "GET",
},
}
},
{
"customerProfileId": 18,
@ -1649,6 +1676,13 @@ paths:
"isSecured": true,
"isAuthorized": true,
},
"_links":{
"self":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1",
"method": "GET",
},
}
},
{
"customerProfileId": 132,
@ -1675,6 +1709,13 @@ paths:
"isSecured": true,
"isAuthorized": true,
},
"_links":{
"self":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1",
"method": "GET",
},
}
},
{
"customerProfileId": 166,
@ -1701,9 +1742,21 @@ paths:
},
"gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
"isSecured": false,
"isAuthorized": false,
},
"_links":{
"self":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1",
"method": "GET",
},
"secure":
{
"href": "/tokens/securetoken",
"method": "POST"
}
}
},
{
"customerProfileId": 166,
@ -1730,6 +1783,13 @@ paths:
"isSecured": true,
"isAuthorized": true,
},
"_links":{
"self":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1",
"method": "GET",
},
}
},
{
"customerProfileId": 1,
@ -1756,6 +1816,13 @@ paths:
"isSecured": true,
"isAuthorized": true,
},
"_links":{
"self":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1",
"method": "GET",
},
}
},
],
_links:
@ -1940,7 +2007,7 @@ paths:
"gboAgeProfile": null,
"tatSecurity": {
"isSecured": true,
"isAuthorized": true,
"isAuthorized": false,
},
"_links":
{
@ -1979,6 +2046,12 @@ paths:
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare",
"method": "POST",
},
"authorize":{
{
"href": "/tokens/authorizetoken",
"method": "POST"
}
}
},
},
"_links":

View File

@ -10,6 +10,148 @@ servers:
tags:
- name: TAT Security
paths:
/tokens/status:
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
- name: xTat
in: query
schema:
type: string
format : uuid
example: 5c4cba83-1ecd-46a4-b712-a8de0dcb7bbf
required: false
description: The xtat of the customerToken
- name: ovPayTokenId
in: query
schema:
type: integer
example: 1
required: false
description: The ovpay token id of a specific customer token
- name: serviceReferenceId
in: query
schema:
type: string
example: NLOV1234567ABCDEFG
required: false
description: The serviceReferencId found on the bankstatement for a given trip with a bankcard, required for an unknown EMV card
- name: amount
in: query
schema:
type: integer
example: 0
required: false
description: The amount of the value of the bankstatement in cents, required for an unknown EMV card
- name: ovpasNumber
in: query
schema:
type: string
example: OV34567
required: false
description: The number of the ovpas, required for an unknown Ovpas card
- name: verificationCode
in: query
schema:
type: string
example: HL78
required: false
description: The 4 digit verificationCode found on the backside of the Ovpas, required for an unknown Ovpas card
get:
tags:
- TAT Security
summary: Check the status of the security and authorization status of the given token
description: Check the status of the security and authorization status of the given token, check anonymous tokenDB if no customer headers are supplied otherwise check customer tokenDB
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/TokenStatusResponse"
examples:
isSecuredandnotAuthorized:
summary: Token is secured but HTM is not authorized
description: Token is secured but HTM is not authorized
value:
isSecured: true
isAuthorized: false
xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27
_links: {
"authorize": {
"href": "/tokens/authorizetoken",
"method": "POST"
}
}
notSecuredandnotAuthorized:
summary: Token is not secured but HTM is not authorized
description: Token is not secured but HTM is not authorized
value:
isSecured: false
isAuthorized: false
xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27
_links: {
"secure": {
"href": "/tokens/securetoken",
"method": "POST"
}
}
"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.
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
TAT not found:
value:
status: 404
title: Not Found
detail: XTAT Account Not Found
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
/tokens/securetoken:
parameters:
- name: X-HTM-JWT-AUTH-HEADER
@ -50,7 +192,7 @@ paths:
emailAddress: stasjo@htm.nl
Without customer account:
value:
xtat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d
xTat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d
emailAddress: stasjo@htm.nl
responses:
"200":
@ -60,10 +202,14 @@ paths:
schema:
$ref: "#/components/schemas/EmailNotPreApprovedResponse"
example:
uid: 7594f3ee-cd3d-40a3-8e82-73b90d16c481
recipient: xxxxxx.user@gmail.com
key: 123456789123456789123456789abcde
description: OTP Sent
_links: {
"verifyotp": {
"href": "/tokens/verifyotp",
"method": "POST"
}
}
"400":
description: Bad Request
content:
@ -125,6 +271,111 @@ paths:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
/tokens/authorizetoken:
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 Authorization
summary: Request authorization for HTM to access the data secured by additional OV-pas security for a token either in profile or anonymous.
description: Request authorization for HTM to access the data secured by additional OV-pas security for a token either in profile or anonymous.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AuthorizeTokenRequest"
examples:
With customer account:
value:
ovPayTokenId: 42
Without customer account:
value:
xTat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/EmailNotPreApprovedResponse"
example:
recipient: xxxxxx.user@gmail.com
description: OTP Sent
_links: {
"verifyotp": {
"href": "/tokens/verifyotp",
"method": "POST"
}
}
"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
"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
@ -150,7 +401,7 @@ paths:
description: The role of the HTM employee in the case of the SMP
post:
tags:
- TAT Security
- TAT Verification
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
@ -169,7 +420,7 @@ paths:
action: secure
OTP verification for TAT security authorization for anonymous token:
value:
xtat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0
xTat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0
otp: 123456
action: authorize
responses:
@ -257,22 +508,12 @@ components:
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: >-
@ -285,7 +526,7 @@ components:
ovPayTokenId:
type: integer
example: 42
xtat:
xTat:
type: string
format: uuid
example: 6134db53-9ae5-41d1-a343-36656b60b510
@ -294,14 +535,24 @@ components:
format: email
example: stasjo@htm.nl
required:
- ovPayTokenId
- emailAddress
AuthorizeTokenRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xTat:
type: string
format: uuid
example: 6134db53-9ae5-41d1-a343-36656b60b510
VerifyOtpRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xtat:
xTat:
type: string
format: uuid
example: f3474452-e1d4-428c-b366-e5ad5965eb8c
@ -338,4 +589,29 @@ components:
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.
description: A detail IS A string that provides more details about the error.
TokenStatusResponse:
type: object
description: >-
TokenStatusResponse IS AN object THAT represents the current state of the token in relation to the AGO security and authorization status of HTM.
required:
- isSecured
- isAuthorized
properties:
isSecured:
type: boolean
description: >-
Is the token secured in the national database (GBO)
example: false
isAuthorized:
type: boolean
description: >-
Does HTM have the authorization to access the secured data for this token, only applicable when isSecured equals True.
example: false
xTat:
type: string
format: uuid
description: >-
The xtat of the customerToken given when token is unknown for the customer
example: 883674e5-54c7-47d6-a3e3-8781f0d3ffea

View File

@ -49,6 +49,8 @@ paths:
- status
- aggregationReference
- accountingSystemReference
- createdOn
- lastUpdatedOn
- name: $select
in: query
description: Select properties to be returned
@ -79,6 +81,8 @@ paths:
- status
- aggregationReference
- accountingSystemReference
- createdOn
- lastUpdatedOn
responses:
"200":
description: OK
@ -117,7 +121,9 @@ paths:
articleNumber: "4031"
status: created
aggregationReference: null
accountingSystemReference: null
accountingSystemReference: null
createdOn: 2024-11-04T00:00:00Z
lastUpdatedOn: 2024-11-04T04:00:00Z
- "@odata.etag": e671c8a1-b918-4867-bf12-5289822479c3
transactionItemRowId: 3232
transactionItemId: 1c1fc1c8-57f4-4336-9b43-a974eae5afbf
@ -136,7 +142,9 @@ paths:
articleNumber: "4051"
status: failed
aggregationReference: null
accountingSystemReference: null
accountingSystemReference: null
createdOn: 2024-11-04T00:00:00Z
lastUpdatedOn: 2024-11-04T04:00:00Z
- "@odata.etag": be2715d4-4eff-4562-9bf3-5c43ad23e2c8
transactionItemRowId: 3233
transactionItemId: 3f58441e-dc8f-4956-9bc5-c952312476db
@ -155,7 +163,9 @@ paths:
articleNumber: "4051"
status: returned to src
aggregationReference: FIKO-171f40609e
accountingSystemReference: null
accountingSystemReference: null
createdOn: 2024-11-04T00:00:00Z
lastUpdatedOn: 2024-11-04T04:00:00Z
- "@odata.etag": 52130c4d-e944-4454-a73e-8d55449a4bd1
transactionItemRowId: 3234
transactionItemId: 4418825f-3f9b-45bc-b662-dc3cd4ce6599
@ -174,7 +184,9 @@ paths:
articleNumber: "4051"
status: returned to trx-db
aggregationReference: null
accountingSystemReference: null
accountingSystemReference: null
createdOn: 2024-11-04T00:00:00Z
lastUpdatedOn: 2024-11-04T04:00:00Z
- "@odata.etag": 7da305e1-85cd-4250-ad77-8b54b2649cfb
transactionItemRowId: 3235
transactionItemId: 2ddc1831-cf7b-4a77-8aa1-11aaf8e98d9f
@ -193,7 +205,9 @@ paths:
articleNumber: "4051"
status: re-entered
aggregationReference: null
accountingSystemReference: null
accountingSystemReference: null
createdOn: 2024-11-04T00:00:00Z
lastUpdatedOn: 2024-11-04T04:00:00Z
- "@odata.etag": c3b17d21-0506-474d-b3d4-7ff654f368b9
transactionItemRowId: 3236
transactionItemId: 5ab2513d-f334-4cf8-8895-4e7269374a4b
@ -212,7 +226,9 @@ paths:
articleNumber: "1737"
status: succeeded
aggregationReference: FIKO-6a4fca8cd6
accountingSystemReference: U4F-123456
accountingSystemReference: U4F-123456
createdOn: 2024-11-04T00:00:00Z
lastUpdatedOn: 2024-11-04T04:00:00Z
security:
- default: []
x-auth-type: Application & Application User
@ -434,7 +450,7 @@ paths:
summary: Add a processing failure.
description: Add a processing failure.
tags:
- Failures v2.2
- Failures v2.3
requestBody:
required: true
content:
@ -455,6 +471,7 @@ paths:
reasonCode: "012"
reasonDescription: Transaction date is in the future.
resolved: false
journalEntryId: 0e53b984-16b2-4ef7-b669-29bcdad2a3ce
responses:
"201":
description: Created
@ -472,67 +489,6 @@ paths:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/transactionitems/{transactionItemId}/transactionaudittrails:
parameters:
- in: path
name: transactionItemId
schema:
type: string
format: uuid
example: 9834b346-d68c-438d-9bd5-6716422c2657
required: true
description: The id of the transaction item to process.
post:
summary: Add an audit trail entry.
description: Add an audit trail entry.
tags:
- Audit Trail v2.2
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/TransactionAuditTrailsPostRequestBody"
examples:
Add new transaction audit trail for created transaction item:
summary: Add new transaction audit trail for created transaction item
description: Add a new audit trail record for a newly created transaction item.
value:
user: fiko
timestamp: 2022-01-01 12:34:00
action: create
status: created
description: Transaction item created.
correlationId: null
Add new transaction audit trail for updated transaction item:
summary: Add new transaction audit trail for updated transaction item
description: Add a new audit trail record for an updated transaction item.
value:
user: ad.vogelaar
timestamp: 2022-01-02 12:34:00
action: update
status: return to src
description: Transaction item returned to source.
correlationId: 0dc216ea-58e7-4a5e-aa18-449f0304209c
responses:
"201":
description: Created
content:
application/json:
schema:
$ref: "#/components/schemas/TransactionAuditTrailsPostResponseBody"
examples:
Transaction audit trail record created:
summary: Transaction audit trail record created
description: |
A new audit trail record for this transaction item was successfully created.
The transactionAuditTrailId is returned as a reference for the consumer.
value:
transactionAuditTrailId: 37a8095b-19db-498f-9349-5f37d21c5bdf
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/Odata/TransactionAuditTrail:
get:
summary: Find audit trail entries.
@ -564,6 +520,7 @@ paths:
- action
- status
- correlationId
- journalEntryId
- name: $select
in: query
description: Select properties to be returned
@ -584,6 +541,7 @@ paths:
- action
- status
- correlationId
- journalEntryId
- name: $expand
in: query
description: Expand related entities
@ -597,6 +555,7 @@ paths:
type: string
enum:
- TransactionItem
- JournalEntry
responses:
"200":
description: OK
@ -627,6 +586,7 @@ paths:
status: created
description: Transaction created.
correlationId: null
journalEntryId: null
- "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5
transactionAuditTrailRowId: 8219
transactionAuditTrailId: 1d234fc1-eb16-41d3-b2e0-e400e17b017f
@ -637,6 +597,7 @@ paths:
status: created
description: Transaction created.
correlationId: null
journalEntryId: null
- "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb
transactionAuditTrailRowId: 8220
transactionAuditTrailId: f4798a84-489d-4533-9dfe-42423c70f6b6
@ -647,6 +608,7 @@ paths:
status: return to src
description: Transaction retunred to source.
correlationId: a3891560-3084-42cb-867c-f289e7cda47d
journalEntryId: null
- "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc
transactionAuditTrailRowId: 8221
transactionAuditTrailId: cc80d58d-6ee7-409a-8c14-b1f807e67c10
@ -657,6 +619,7 @@ paths:
status: failed
description: Validation XYZ failed.
correlationId: null
journalEntryId: a062f64f-f39e-48e7-9793-efbfa86d2827
List containing multiple transaction audit trails of one transaction item:
summary: List containing multiple audit trails of one transaction item
description: List containing multiple audit trail records of one transaction item (with id `d667d293-aa82-4c9e-9b10-77cffc9058a1`).
@ -673,6 +636,7 @@ paths:
status: re-entered
description: Transaction re-entered.
correlationId: null
journalEntryId: null
- "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5
transactionAuditTrailRowId: 8219
transactionAuditTrailId: b2192e6c-ab79-4000-a04d-d8f4d574a82f
@ -683,6 +647,7 @@ paths:
status: return to src
description: Transaction retunred to source.
correlationId: a3891560-3084-42cb-867c-f289e7cda47d
journalEntryId: null
- "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb
transactionAuditTrailRowId: 8220
transactionAuditTrailId: 1d759985-7f1a-48bd-8dd1-efa30ce26423
@ -693,6 +658,7 @@ paths:
status: failed
description: Validation XYZ failed.
correlationId: null
journalEntryId: b479507a-a65d-48b5-8476-87c88ba3c560
- "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc
transactionAuditTrailRowId: 8221
transactionAuditTrailId: afce35b2-1dff-4ace-98d0-4b9ac405c87d
@ -703,6 +669,7 @@ paths:
status: created
description: Transaction created.
correlationId: null
journalEntryId: null
List containing multiple audit trails of different failed transactions:
summary: List containing multiple audit trails of different failed transactions
description: List containing multiple audit trails of different failed transactions (status = failed).
@ -719,6 +686,7 @@ paths:
status: failed
description: Validation XYZ failed.
correlationId: null
journalEntryId: null
- "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5
transactionAuditTrailRowId: 8219
transactionAuditTrailId: 1d234fc1-eb16-41d3-b2e0-e400e17b017f
@ -729,6 +697,7 @@ paths:
status: failed
description: Validation XYZ failed.
correlationId: null
journalEntryId: 43a98533-bb01-4aad-8d61-005051125969
- "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb
transactionAuditTrailRowId: 8220
transactionAuditTrailId: f4798a84-489d-4533-9dfe-42423c70f6b6
@ -739,6 +708,7 @@ paths:
status: failed
description: Validation XYZ failed.
correlationId: null
journalEntryId: null
- "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc
transactionAuditTrailRowId: 8221
transactionAuditTrailId: cc80d58d-6ee7-409a-8c14-b1f807e67c10
@ -749,6 +719,7 @@ paths:
status: failed
description: Validation XYZ failed.
correlationId: null
journalEntryId: null
security:
- default: []
x-auth-type: Application & Application User
@ -786,6 +757,7 @@ paths:
- reasonDescription
- resolved
- change
- journalEntryId
- name: $select
in: query
description: Select properties to be returned
@ -808,6 +780,7 @@ paths:
- reasonDescription
- resolved
- change
- journalEntryId
- name: $expand
in: query
description: Expand related entities
@ -820,7 +793,8 @@ paths:
items:
type: string
enum:
- TransactionItem
- TransactionItem
- JournalEntry
responses:
"200":
description: OK
@ -856,6 +830,7 @@ paths:
reasonDescription: Cost type does not exist.
resolved: false
change: null
journalEntryId: null
- "@odata.etag": ff49829d-a5de-4c1a-b331-15fd9c71dfe9
processingFailureRowId: 10
processingFailureId: ccc06dc9-956d-47d8-bde7-9644ddde2193
@ -866,7 +841,8 @@ paths:
reasonCode: "002"
reasonDescription: Cost center does not exist.
resolved: true
change: Adapt config
change: Adapt config
journalEntryId: null
- "@odata.etag": 5d5d3351-d3f1-49b2-905f-4dbbe1cc30e3
processingFailureRowId: 11
processingFailureId: 96bf8d44-0030-4509-b24e-2d62299779c5
@ -877,7 +853,8 @@ paths:
reasonCode: "001"
reasonDescription: Department does not exist.
resolved: true
change: Adapt config
change: Adapt config
journalEntryId: null
List of unfiltered processing failures:
summary: List of unfiltered processing failures
description: |
@ -896,7 +873,8 @@ paths:
reasonCode: "009"
reasonDescription: Transaction date is in the future
resolved: false
change: null
change: null
journalEntryId: null
- "@odata.etag": 584d3a8a-48bc-45f9-99be-8dd70399e6e4
processingFailureRowId: 10
processingFailureId: 76aa82e1-a10f-4664-a84f-1f30d60884b3
@ -907,7 +885,8 @@ paths:
reasonCode: "002"
reasonDescription: Cost center does not exist.
resolved: false
change: null
change: null
journalEntryId: null
- "@odata.etag": df4ade9b-1bda-4d91-a5ba-4dbe067568a0
processingFailureRowId: 11
processingFailureId: 25d2dd6f-ae17-44a7-b7a5-43eaf6de78e1
@ -918,7 +897,8 @@ paths:
reasonCode: "001"
reasonDescription: Department does not exist.
resolved: false
change: null
change: null
journalEntryId: null
security:
- default: []
x-auth-type: Application & Application User
@ -969,6 +949,415 @@ paths:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/Odata/JournalEntries:
get:
summary: Find journalEntry.
description: Find journalEntry.
tags:
- Odata
parameters:
- $ref: "#/components/parameters/top"
- $ref: "#/components/parameters/skip"
- $ref: "#/components/parameters/filter"
- $ref: "#/components/parameters/count"
- name: $orderby
in: query
description: Order items by property values
required: false
style: form
explode: false
schema:
uniqueItems: true
type: array
items:
type: string
enum:
- journalEntryId
- aggregationReference
- accountingSystemReference
- name: $select
in: query
description: Select properties to be returned
required: false
style: form
explode: false
schema:
uniqueItems: true
type: array
items:
type: string
enum:
- journalEntryId
- aggregationReference
- accountingSystemReference
- data
- response
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/JournalEntryGetResponseBody"
examples:
List containing all journal entries:
summary: List containing all journal entries
description: Returns a list containing all journal entries (no filters applied).
value:
"@odata.context": "$metadata#JournalEntry"
value:
- "@odata.etag": 8f085711-eeae-44ed-bac1-06779bedb480
journalEntryId: e0af8c8f-d421-4567-a14e-48e2a1bb86fb
aggregationReference: FIKO-123456
accountingSystemReference: null
data: {
"transaction": {
"header": {
"key": {
"cmpCode": "1HTM",
"code": "OPBR-FIKO"
},
"timeStamp": 0,
"inputDate": "2026-07-20T00:00:00Z",
"period": "2026/6",
"curCode": "EUR",
"date": "2026-07-20T00:00:00Z",
"originalCompany": "1HTM",
"originalCode": "OPBR-FIKO",
"completionWorkflow": {
"completionStatus": "wfl_no_completion"
},
"salesInvoiceStatus": "salesinv_notyetinv"
},
"lines": {
"line": [
{
"number": 1,
"accountCode": "100.99999.D150000001",
"docValue": 100.00,
"lineType": "summary",
"lineSense": "debit",
"lineOrigin": "dl_orig_defined",
"description": "test",
"extRef1": "99999991",
"extRef2": "99999",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
},
{
"number": 2,
"accountCode": "642.41236.609311",
"docValue": 100.00,
"userStatus": "",
"lineType": "analysis",
"lineSense": "credit",
"lineOrigin": "dl_orig_defined",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
}
]
}
}
}
response: {
"status": "failed",
"message": [
{
"code": "352",
"reason": "Documentregel 1 kan niet geboekt worden."
},
{
"code": "159",
"reason": "Element 99999 (niveau 2) is niet toegestaan in linkerlijst van element D150000001 (niveau 3)."
}
],
"hints": [],
"paths": [
"/InputRequest/PostToBooks/Request/Transaction/Lines/Line[1]/AccountCode"
]
}
- "@odata.etag": 66c033af-fc67-4eb2-9d17-d74a0166470f
journalEntryId: 36a34bd8-2b84-4c89-87a4-22e809f6ed4a
aggregationReference: FIKO-123457
accountingSystemReference: "OPBR-FIKO10000090"
data: {
"transaction": {
"header": {
"key": {
"cmpCode": "1HTM",
"code": "OPBR-FIKO"
},
"timeStamp": 0,
"inputDate": "2026-07-20T00:00:00Z",
"period": "2026/6",
"curCode": "EUR",
"date": "2026-07-20T00:00:00Z",
"originalCompany": "1HTM",
"originalCode": "OPBR-FIKO",
"completionWorkflow": {
"completionStatus": "wfl_no_completion"
},
"salesInvoiceStatus": "salesinv_notyetinv"
},
"lines": {
"line": [
{
"number": 1,
"accountCode": "100.99999.D150000001",
"docValue": 100.00,
"lineType": "summary",
"lineSense": "debit",
"lineOrigin": "dl_orig_defined",
"description": "test",
"extRef1": "99999991",
"extRef2": "99999",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
},
{
"number": 2,
"accountCode": "642.41236.609311",
"docValue": 100.00,
"userStatus": "",
"lineType": "analysis",
"lineSense": "credit",
"lineOrigin": "dl_orig_defined",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
}
]
}
}
}
response: {
"key": {
"$type": "finance_transaction_txnKey",
"cmpCode": "1HTM",
"code": "OPBR-FIKO",
"number": " 10000090"
},
"suppliedNumber": ""
}
- "@odata.etag": 159f526c-3c88-48a1-93a0-e16430500bef
journalEntryId: 6097121f-f300-4c0b-ab8d-0a24685bda92
aggregationReference: FIKO-123458
accountingSystemReference: null
data: {
"transaction": {
"header": {
"key": {
"cmpCode": "1HTM",
"code": "OPBR-FIKO"
},
"timeStamp": 0,
"inputDate": "2026-07-20T00:00:00Z",
"period": "2026/6",
"curCode": "EUR",
"date": "2026-07-20T00:00:00Z",
"originalCompany": "1HTM",
"originalCode": "OPBR-FIKO",
"completionWorkflow": {
"completionStatus": "wfl_no_completion"
},
"salesInvoiceStatus": "salesinv_notyetinv"
},
"lines": {
"line": [
{
"number": 1,
"accountCode": "100.99999.D150000001",
"docValue": 100.00,
"lineType": "summary",
"lineSense": "debit",
"lineOrigin": "dl_orig_defined",
"description": "test",
"extRef1": "99999991",
"extRef2": "99999",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
},
{
"number": 2,
"accountCode": "642.41236.609311",
"docValue": 100.00,
"userStatus": "",
"lineType": "analysis",
"lineSense": "credit",
"lineOrigin": "dl_orig_defined",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
}
]
}
}
}
response: null
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/journalEntries:
post:
summary: Add a journalEntry.
description: Add a journalEntry.
tags:
- journalEntries v1.0
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/JournalEntryPostRequestBody"
examples:
Add a new journalEntry:
summary: Add a new journalEntry
description: In this example we add a new journalEntry.
value:
aggregationReference: FIKO-123456
data: {
"transaction": {
"header": {
"key": {
"cmpCode": "1HTM",
"code": "OPBR-FIKO"
},
"timeStamp": 0,
"inputDate": "2026-07-20T00:00:00Z",
"period": "2026/6",
"curCode": "EUR",
"date": "2026-07-20T00:00:00Z",
"originalCompany": "1HTM",
"originalCode": "OPBR-FIKO",
"completionWorkflow": {
"completionStatus": "wfl_no_completion"
},
"salesInvoiceStatus": "salesinv_notyetinv"
},
"lines": {
"line": [
{
"number": 1,
"accountCode": "100.99999.D150000001",
"docValue": 100.00,
"lineType": "summary",
"lineSense": "debit",
"lineOrigin": "dl_orig_defined",
"description": "test",
"extRef1": "99999991",
"extRef2": "99999",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
},
{
"number": 2,
"accountCode": "642.41236.609311",
"docValue": 100.00,
"userStatus": "",
"lineType": "analysis",
"lineSense": "credit",
"lineOrigin": "dl_orig_defined",
"sepaPaymentCategoryPurposeCode": "none",
"sepaPaymentPurposeCode": "none"
}
]
}
}
}
responses:
"201":
description: Created
content:
application/json:
schema:
$ref: "#/components/schemas/JournalEntryPostResponseBody"
examples:
Journalentry created successfully:
summary: Journalentry created successfully
description: TheJournalentry was successfully added to the database.
value:
journalEntryId: 6ce10520-9a73-4cb4-b8dd-39ee46ceb617
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/journalEntries/{journalEntryId}:
parameters:
- in: path
name: journalEntryId
schema:
type: string
format: uuid
example: 37a8095b-19db-498f-9349-5f37d21c5bdf
required: true
description: The id of the journalEntry.
patch:
summary: Update journalEntry.
description: Update journalEntry.
tags:
- journalEntries v1.0
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/JournalEntryPatchRequestBody"
examples:
Update an journalEntry after error:
summary: Update an journalEntry after error
description: Update an journalEntry after error by logging the response
value:
response: {
"status": "failed",
"message": [
{
"code": "352",
"reason": "Documentregel 1 kan niet geboekt worden."
},
{
"code": "159",
"reason": "Element 99999 (niveau 2) is niet toegestaan in linkerlijst van element D150000001 (niveau 3)."
}
],
"hints": [],
"paths": [
"/InputRequest/PostToBooks/Request/Transaction/Lines/Line[1]/AccountCode"
]
}
Update an journalEntry after success:
summary: Update an journalEntry after succesfull call
description: Update an journalEntry after uccesfull call bij logging the response and the accountingSystemReference.
value:
accountingSystemReference: "OPBR-FIKO10000090"
response: {
"key": {
"$type": "finance_transaction_txnKey",
"cmpCode": "1HTM",
"code": "OPBR-FIKO",
"number": " 10000090"
},
"suppliedNumber": ""
}
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/JournalEntryPatchResponseBody"
examples:
JournalEntry updated successfully:
summary: JournalEntry updated successfully
description: The journalEntry was successfully updated in the database.
value:
journalEntryId: 5bbf5abc-4da5-4bb4-894e-a7f553789a20
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/Odata/BookingProcess:
get:
summary: Find booking processes.
@ -3316,6 +3705,16 @@ components:
- occurredOn
- type
- status
createdOn:
type: string
nullable: false
format: datetime
example: "2026-07-20T00:00:00Z"
updatedOn:
type: string
nullable: false
format: datetime
example: "2026-07-25T00:00:00Z"
TransactionItemsBulkRequestBody:
type: object
properties:
@ -3551,6 +3950,11 @@ components:
type: string
nullable: true
example: Adapt config
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required:
- timestamp
- element
@ -3617,6 +4021,11 @@ components:
type: string
nullable: true
example: Adapt config
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required:
- processingFailureId
- transactionItemId
@ -3681,6 +4090,11 @@ components:
format: uuid
nullable: true
example: 37a8095b-19db-498f-9349-5f37d21c5bdf
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required:
- user
- timestamp
@ -3754,6 +4168,11 @@ components:
format: uuid
nullable: true
example: a3891560-3084-42cb-867c-f289e7cda47d
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required:
- transactionAuditTrailId
- transactionItemId
@ -3761,6 +4180,89 @@ components:
- timestamp
- action
- status
JournalEntryGetResponseBody:
type: object
properties:
"@odata.context":
type: string
example: $metadata#JournalEntry
value:
type: array
items:
$ref: "#/components/schemas/JournalEntry"
JournalEntry:
type: object
properties:
"@odata.etag":
type: string
example: 333d6b7d-b709-3b89-89e0-bcb3d5fdddfc
journalEntryId:
type: string
format: uuid
example: 8871d779-512c-4d4d-9a8a-dee7c635179d
aggregationReference:
type: string
example: FIKO-123456
accountingSystemReference:
type: string
nullable: true
example: U4F-123456
data:
type: object
example: {}
responses:
type: object
nullable: true
example: {}
required:
- journalEntryId
- aggregationReference
- data
JournalEntryPostRequestBody:
type: object
properties:
aggregationReference:
type: string
example: FIKO-123456
accountingSystemReference:
type: string
nullable: true
example: U4F-123456
data:
type: object
example: {}
responses:
type: object
nullable: true
example: {}
required:
- aggregationReference
- data
JournalEntryPostResponseBody:
type: object
properties:
journalEntryId:
type: string
format: uuid
example: c97a8123-8d0e-41ea-9737-35843ebe2385
JournalEntryPatchRequestBody:
type: object
properties:
accountingSystemReference:
type: string
nullable: true
example: U4F-123456
responses:
type: object
nullable: true
example: {}
JournalEntryPatchResponseBody:
type: object
properties:
journalEntryId:
type: string
format: uuid
example: c97a8123-8d0e-41ea-9737-35843ebe2385
BookingProcessesGetResponseBody:
type: object
properties:

View File

@ -111,14 +111,6 @@ paths:
explode: false
required: false
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:
"200":
description: OK
@ -777,6 +769,13 @@ paths:
example: 9e3363c8-e776-4675-b108-99b8c2e38eb6
required: false
description: The id of the orderLine
- in: query
name: issuedVoucherId
schema:
type: string
example: 9e3363c8-e776-4675-b108-99b8c2e38eb6
required: false
description: The id of the issuedVoucher
get:
summary: Find vouchers on the order
description: Find vouchers on the order

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
openapi: 3.0.1
info:
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"
servers:
- 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.
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
in: query
required: false
@ -66,8 +57,8 @@ paths:
summary: No products / Empty list
description: No products
value: { "voucherDefinitions": [] }
List containing one voucher definition (called by touchpointId 12):
summary: List containing one voucher definition (called by touchpointId 12)
List containing one voucher definition (called by touchPointId 12):
summary: List containing one voucher definition (called by touchPointId 12)
description: |-
List containing one voucher definition for a voucher that can be redeemed for the product "Ooievaarspas voor AOW-ers in Den Haag".\
In this case, the voucher definition has a sellingPrice of 0, which means that vouchers issued from this voucher definition can be redeemed to acquire the requiredProduct for free. The requiredProduct also has a sellingPrice of 0, so no "discount" is shown to the customer; just the voucher's amountInclTax.\
@ -206,18 +197,20 @@ paths:
/issuedvouchers:
get:
summary: Get a list of issued vouchers that were issued for a specific touch point
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.
description: |-
Retrieve all issued vouchers that match the given query parameters. \
Every request is automatically filtered to return only vouchers issued by the calling touch point (based on the touchPointId that is assigned to the caller's API credentials).
Further filtering can be done by providing any of the following query parameters:
- `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);
- `voucherStatusId` (return only voucher instances with the given status(es));
- `statusChangedAfter` (only return voucher instances whose status changed after this date-time);
- `includeStatusHistory` (include the status history for each voucher instance).
When a voucher code has been issued multiple times, all issuedvouchers with the same voucher code will be returned, together with their status (or optionally also the status history).
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
in: query
required: false
@ -240,6 +233,21 @@ paths:
schema:
type: integer
example: 321
- name: touchpointId
in: query
required: false
description: Return only issued vouchers that were issued by a specific touchpoint.
schema:
type: integer
example: 3
- name: statusChangedAfter
in: query
required: false
description: Return only issued vouchers that have had their status changed after the given date and time.
schema:
type: string
format: date-time-offset
example: "2024-10-04T00:00:00.000Z"
- name: voucherStatusId
in: query
required: false
@ -252,12 +260,20 @@ paths:
- 3 = redeemed
- 4 = revoked
- 5 = expired
- 6 = pendingRedemption
- 6 = pendingRedemption
schema:
type: array
items:
type: integer
example: [4,5]
- name: includeStatusHistory
in: query
required: false
description: Include the status history for each voucher instance. Is false by default (if not provided).
schema:
type: boolean
example: false
tags:
- Vouchers
responses:
@ -281,9 +297,9 @@ paths:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued", "createdOn": "2024-10-04T00:00:00.000Z", "reason": "Test reason" },
"product":
{
"productId": 263,
@ -323,9 +339,94 @@ paths:
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
},
"value": "1980-06-31",
"value": "1980-06-30",
}
]
],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
}
]
}
List containing one issued voucher, with status history:
summary: List containing one issued voucher, with status history
description: |-
The same issued voucher is returned as was shown in the first example, but in this case
requested with query parameter `includeStatusHistory=true`.
value:
{
"issuedVouchers":
[
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued", "createdOn": "2024-10-04T00:00:00.000Z", "reason": "Test reason" },
"product":
{
"productId": 263,
"productName": "Voucher Ooievaarspas-product AOW",
"productDescription": "Voucher voor AOW-ers in Den Haag met een Ooievaarspas, die ingewisseld kan worden voor het product \"Ooievaarspas voor AOW-ers in Den Haag\"",
"amountInclTax": 0,
"requiredProducts":
[
{
"productId": 982,
"productName": "Ooievaarspas voor AOW-ers in Den Haag",
"productDescription": "Vrij reizen bij HTM voor Haagse AOW-gerechtigden met een Ooievaarspas.",
"productCategory":
{
"productCategoryId": 2,
"isTravelProduct": true,
"name": "Afgekocht reisrecht",
},
"amountInclTax": 0
},
],
"_links":
{
"get_voucher_definition_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/voucherdefinitions/263",
"method": "GET",
},
},
},
"voucherClaims":
[
{
"mandatoryCustomerDataItem":
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
},
"value": "1980-06-30",
}
],
"voucherStatusInstances":
[
{
"voucherStatusId": 1,
"name": "new",
"createdOn": "2024-10-04T12:34:56.000Z",
"reason": null
},
{
"voucherStatusId": 2,
"name": "issued",
"createdOn": "2024-10-04T12:37:14.000Z",
"reason": "Test reason"
},
],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
}
]
}
@ -343,9 +444,9 @@ paths:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued", "createdOn": "2024-10-04T00:00:00.000Z", "reason": "Test reason" },
"product":
{
"productId": 264,
@ -376,7 +477,12 @@ paths:
}
}
},
"voucherClaims":[]
"voucherClaims": [],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
},
]
}
@ -393,9 +499,9 @@ paths:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued", "createdOn": "2024-10-04T00:00:00.000Z", "reason": "Test reason" },
"product":
{
"productId": 265,
@ -412,10 +518,31 @@ paths:
}
}
},
"voucherClaims":[]
"voucherClaims": [],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
}
]
}
"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":
description: Forbidden
content:
@ -466,10 +593,20 @@ paths:
}
post:
summary: Issue a voucher for a specific voucher definition
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).\
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.
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 may 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).
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:
- Vouchers
requestBody:
@ -481,7 +618,9 @@ paths:
examples:
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:
{
"voucherCode": "HTM-A7J-128-PYT",
@ -492,18 +631,37 @@ paths:
[
{
"mandatoryCustomerDataItemId": 8,
"value": "1980-06-31",
"value": "1980-06-30",
}
],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
}
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:
{
"fromInclusive": "2026-01-01T00:00:00.000+00:00",
"untilInclusive": "2030-12-31T23:59:59.000+00:00",
"productId": 264
"productId": 264,
"voucherClaims":
[
{
"mandatoryCustomerDataItemId": 8,
"value": "1980-06-30",
}
],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
}
responses:
"201":
@ -519,9 +677,9 @@ paths:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 1, "name": "new", "createdOn": "2024-10-04T00:00:00.000Z", "reason": null },
"product":
{
"productId": 263,
@ -561,9 +719,14 @@ paths:
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
},
"value": "1980-06-31",
"value": "1980-06-30",
}
],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
}
"400":
description: Bad request
@ -573,12 +736,12 @@ paths:
$ref: "#/components/schemas/rfc9457"
examples:
Voucher code already in use:
summary: Voucher code already in use
summary: Another active voucher instance already exists for this voucher code
value:
{
"type": "https://example.com/probs/bad-request",
"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"
}
Missing mandatory voucher claims:
@ -614,6 +777,9 @@ paths:
summary: Update the status of an issued voucher
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.\
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:
- 1 = new
- 2 = issued
@ -630,11 +796,20 @@ paths:
schema:
$ref: "#/components/schemas/supplierTouchpointUpdateIssuedVoucherRequest"
examples:
Mark a voucher as revoked:
summary: Mark a voucher as revoked
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": 4
"voucherStatusId": 2
}
Mark a voucher as revoked (with reason):
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:
{
"voucherStatusId": 4,
"reason": "Voucher was redeemed by an unauthorized person"
}
responses:
"200":
@ -650,9 +825,9 @@ paths:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 4, "name": "revoked" },
"fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 4, "name": "revoked", "createdOn": "2024-10-04T12:34:56.000Z", "reason": "Voucher was redeemed by an unauthorized person" },
"product":
{
"productId": 263,
@ -691,9 +866,14 @@ paths:
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
},
"value": "1980-06-31",
"value": "1980-06-30",
}
]
],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
}
"400":
description: Bad request
@ -733,8 +913,7 @@ components:
- productDescription
- validityPeriod
- productCategory
- sellingPeriods
- sellingPeriods
properties:
productId:
type: integer
@ -758,11 +937,11 @@ components:
fromInclusive:
type: string
format: date-time-offset
example: "2024-09-03T10:01:34.000+00:00"
example: "2024-09-03T10:01:34.000+00:00Z"
toInclusive:
type: string
format: date-time-offset
example: "2024-09-03T23:59:59.999+00:00"
example: "2024-09-03T23:59:59.999+00:00Z"
productCategory:
type: object
required:
@ -832,11 +1011,11 @@ components:
fromInclusive:
type: string
format: date-time-offset
example: "2022-03-01T00:00:00.000+00:00"
example: "2022-03-01T00:00:00.000+00:00Z"
toInclusive:
type: string
format: date-time-offset
example: "2022-06-01T00:00:00.000+00:00"
example: "2022-06-01T00:00:00.000+00:00Z"
salesTouchpoint:
type: object
required:
@ -923,11 +1102,11 @@ components:
fromInclusive:
type: string
format: date-time-offset
example: "2022-03-01T00:00:00.000+00:00"
example: "2022-03-01T00:00:00.000+00:00Z"
toInclusive:
type: string
format: date-time-offset
example: "2022-06-01T00:00:00.000+00:00"
example: "2022-06-01T00:00:00.000+00:00Z"
internalPrice:
type: number
example: 908.1234
@ -976,6 +1155,26 @@ components:
type: string
description: The value that the customer must provide for this mandatoryCustomerDataItem to be able to redeem the voucher.
example: "1970-01-01"
metadata1:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata2:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata3:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata4:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata5:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
supplierTouchpointUpdateIssuedVoucherRequest:
type: object
required:
@ -985,6 +1184,10 @@ components:
type: integer
description: The new status of the voucher.
example: 4
reason:
type: string
description: The reason for the change of the voucher status.
example: "Voucher was redeemed by an unauthorized person"
supplierTouchpointIssuedVouchersListResponse:
type: object
properties:
@ -1026,25 +1229,17 @@ components:
the maximum allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
example: "2024-11-04T00:00:00.000+01:00"
voucherStatus:
type: object
required:
- voucherStatusId
- name
description: |-
The current status of the voucher. Can be any of the following:
- 1 = new
- 2 = issued
- 3 = redeemed
- 4 = revoked
- 5 = expired
- 6 = pendingRedemption
properties:
voucherStatusId:
type: integer
example: 2
name:
type: string
example: "issued"
allOf:
- $ref: "#/components/schemas/voucherStatusInstance"
- type: object
- description: |-
The current status of the voucher. Can be any of the following:
- 1 = new
- 2 = issued
- 3 = redeemed
- 4 = revoked
- 5 = expired
- 6 = pendingRedemption
product:
type: object
description: The "product" referencing the voucher definition that this voucher instance is based on
@ -1160,7 +1355,51 @@ components:
value:
type: string
example: 1970-01-01
voucherStatusInstances:
type: array
description: List of voucherStatusInstances, providing information about the status history of the voucher
items:
$ref: "#/components/schemas/voucherStatusInstance"
metadata1:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata2:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata3:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata4:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
metadata5:
type: string
description: Field for storing custom metadata.
example: "Some metadata"
voucherStatusInstance:
type: object
required:
- voucherStatusId
- name
- createdOn
properties:
voucherStatusId:
type: integer
example: 4
name:
type: string
example: "revoked"
createdOn:
type: string
format: date-time-offset
example: "2021-05-23T12:00:00.000+02:00"
reason:
type: string
example: "Voucher revoked because it was redeemed by an unauthorized user."
unavailable:
type: object
rfc9457:

View File

@ -209,6 +209,12 @@ paths:
{
"issuedVoucherId": "e1f2g3h4-i5j6-k7l8-m9n0-o1p2q3r4s5t6",
"voucherCode": "VOUCHER12345",
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances":
[
{
@ -219,6 +225,7 @@ paths:
"name": "New",
},
"createdOn": "2024-10-04T12:34:56.000",
"reason": null,
},
{
"voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1",
@ -228,6 +235,7 @@ paths:
"name": "Issued",
},
"createdOn": "2024-10-04T12:37:14.000",
"reason": "test reason"
},
],
"voucherClaims":
@ -248,6 +256,155 @@ paths:
],
"href": null,
}
post:
tags:
- Purchased Product
summary: Create a new purchased product.
description: Create a new purchased product. Only one single instance of `purchasedGboProducts`, `purchasedTapconnectTickets` or `issuedVouchers` can be specified at once.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
examples:
Create Purchased GBO Product:
value:
{
"productId": 11,
"createdOn": "2024-10-04T12:34:56.000",
"lastUpdatedOn": "2024-10-04T12:34:56.000",
"purchasedProductResources":
[
{
"resourceNameId": 1,
"resourceIdentifier": "408eefa9-b393-4bb3-8439-b2e51833abc7",
},
{
"resourceNameId": 2,
"resourceIdentifier": "f809a6e1-1c8d-4f8e-8a6e-0d0b1e1e1e1e",
},
],
"purchasedGboProducts":
[
{
"salesTimestamp": "2024-10-04T12:34:56.000",
"refundTimestamp": "2024-10-04T12:34:56.000",
"fromInclusive": "2024-10-04T12:34:56.000",
"untilInclusive": "2024-10-04T12:34:56.000",
"packageTemplateId": "30003",
"xBot": "f15efe6f-7353-4968-b134-60ba6fc2da8b",
"xTat": "42efebf7-132e-4ee0-9cbb-4037a9a54ad8",
"xSpit": "d67b2f72-918a-4e6c-957d-a39ed9c9e16b",
"customerTokenId": "b6492322-c458-4857-9ac3-a109c1887b9f",
"ovPayTokenId": 13,
"createdOn": "2024-10-04T12:34:56.000",
"lastUpdatedOn": "2024-10-04T12:34:56.000",
"createdBy": "someuser",
"lastUpdatedBy": null
},
],
"purchasedTapconnectTickets": [],
"issuedVouchers": [],
}
Create Purchased TapConnect Ticket:
value:
{
"productId": 11,
"createdOn": "2024-10-04T12:34:56.000",
"lastUpdatedOn": "2024-10-04T12:34:56.000",
"purchasedProductResources":
[
{
"resourceNameId": 1,
"resourceIdentifier": "408eefa9-b393-4bb3-8439-b2e51833abc7",
},
{
"resourceNameId": 2,
"resourceIdentifier": "f809a6e1-1c8d-4f8e-8a6e-0d0b1e1e1e1e",
},
],
"purchasedGboProducts": [],
"purchasedTapconnectTickets":
[
{
"issuedAt": "2024-10-04T12:34:56.000",
"activatedAt": "2024-10-04T12:34:56.000",
"cancelledAt": "2024-10-04T12:34:56.000",
"ticketReference": "KJj43nejhbTxhr897287",
"createdOn": "2024-10-04T12:34:56.000",
"lastUpdatedOn": "2024-10-04T12:34:56.000",
"createdBy": "John Doe",
"lastUpdatedBy": "John Doe",
"externalDeviceId": "c5545584-04af-4c60-a955-d6a70baab848",
"serviceId": "HTM-1234-7654-8945",
"activateBefore": "2024-10-08",
"validityStart": "2024-10-05T12:34:56.000",
"validityEnd": "2024-10-06T12:34:56.000"
},
],
"issuedVouchers": [],
}
Create Issued Voucher:
value:
{
"productId": 11,
"createdOn": "2024-10-04T12:34:56.000",
"lastUpdatedOn": "2024-10-04T12:34:56.000",
"purchasedProductResources":
[
{
"resourceNameId": 1,
"resourceIdentifier": "408eefa9-b393-4bb3-8439-b2e51833abc7",
},
{
"resourceNameId": 2,
"resourceIdentifier": "f809a6e1-1c8d-4f8e-8a6e-0d0b1e1e1e1e",
},
],
"purchasedGboProducts": [],
"purchasedTapconnectTickets": [],
"issuedVouchers":
[
{
"voucherCode": "VOUCHER123",
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances": [
{
"voucherStatusId": 1,
"createdOn": "2024-10-04T12:34:56.000",
"reason": "test reason"
}
],
"voucherClaims": [
{
"mandatoryCustomerDataItemId": 8,
"value": "1999-12-31"
},
{
"mandatoryCustomerDataItemId": 4,
"value": "john.doe@example.com"
}
],
"fromInclusive": "2024-10-04T12:34:56.000",
"untilInclusive": "2025-10-04T12:34:56.000"
},
],
}
responses:
"201":
description: Created
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{ "purchasedProductId": "a9b3dea5-fb8a-4b1e-9fe6-90cad31c0cfd" }
/purchasedproducts/{purchasedProductId}:
parameters:
- in: path
@ -382,6 +539,12 @@ paths:
{
"issuedVoucherId": "e1f2g3h4-i5j6-k7l8-m9n0-o1p2q3r4s5t6",
"voucherCode": "VOUCHER12345",
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances":
[
{
@ -389,12 +552,14 @@ paths:
"voucherStatus":
{ "voucherStatusId": 1, "name": "New" },
"createdOn": "2024-10-04T12:34:56.000",
"reason": null,
},
{
"voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1",
"voucherStatus":
{ "voucherStatusId": 2, "name": "Issued" },
"createdOn": "2024-10-04T12:37:14.000",
"reason": "test reason"
},
],
"voucherClaims":
@ -1054,11 +1219,18 @@ paths:
example:
{
"voucherCode": "VOUCHER123",
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances":
[
{
"voucherStatusId": 1,
"createdOn": "2024-10-04T12:34:56.000",
"reason": "test reason"
},
],
"voucherClaims":
@ -1066,7 +1238,7 @@ paths:
{ "mandatoryCustomerDataItemId": 8, "value": "1999-12-31" },
{
"mandatoryCustomerDataItemId": 4,
"value": "vlad.harkonnen@househarkonnen.net",
"value": "john.doe@example.com",
},
],
"fromInclusive": "2024-10-04T12:34:56.000",
@ -1102,6 +1274,14 @@ paths:
format: uuid
example: 058a1af7-897f-45d5-b691-9cc9161e387f
description: The id of the purchased product.
- in: query
name: statusChangedAfter
required: false
description: Return only issued vouchers that have had their status changed after the given date and time.
schema:
type: string
format: date-time-offset
example: "2024-10-04T00:00:00.000Z"
- in: query
name: productId
schema:
@ -1146,6 +1326,13 @@ paths:
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"purchasedProductId": "058a1af7-897f-45d5-b691-9cc9161e387f",
"voucherCode": "VOUCHER123",
"productId": 888,
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances":
[
{
@ -1153,12 +1340,14 @@ paths:
"voucherStatus":
{ "voucherStatusId": 1, "name": "New" },
"createdOn": "2024-10-04T12:34:56.000",
"reason": null,
},
{
"voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1",
"voucherStatus":
{ "voucherStatusId": 2, "name": "Issued" },
"createdOn": "2024-10-04T12:37:14.000",
"reason": "test reason",
},
],
"voucherClaims":
@ -1177,7 +1366,7 @@ paths:
"mandatoryCustomerDataItemId": 4,
"customerDataItem": "emailAddress",
},
"value": "vlad.harkonnen@househarkonnen.net",
"value": "john.doe@example.com",
},
],
"fromInclusive": "2024-10-04T12:34:56.000",
@ -1205,9 +1394,16 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{ "voucherStatusId": 2, "createdOn": "2024-10-04T12:34:56.000" }
$ref: "#/components/schemas/PostIssuedVoucherStatusInstanceRequest"
examples:
newToIssued:
summary: Mark a voucher as issued
value:
{ "voucherStatusId": 2, "createdOn": "2024-10-04T12:34:56.000" }
issuedToRevokedWithReason:
summary: Mark a voucher as revoked with reason
value:
{ "voucherStatusId": 4, "createdOn": "2024-10-04T12:34:56.000", "reason": "Voucher revoked because it was redeemed by an unauthorized user." }
responses:
"200":
description: OK
@ -1241,6 +1437,7 @@ paths:
{ "voucherStatusId": 3, "name": "Redeemed" },
{ "voucherStatusId": 4, "name": "Revoked" },
{ "voucherStatusId": 5, "name": "Expired" },
{ "voucherStatusId": 6, "name": "PendingRedemption" },
],
}
components:
@ -1252,6 +1449,22 @@ components:
schemas:
unavailable:
type: object
PostIssuedVoucherStatusInstanceRequest:
type: object
required:
- voucherStatusId
- createdOn
properties:
voucherStatusId:
type: integer
example: 4
createdOn:
type: string
format: date-time
example: 2024-10-04T12:34:56.000
reason:
type: string
example: "Voucher revoked because it was redeemed by an unauthorized user."
PostPurchasedTapConnectTicketRequest:
type: object
required:
@ -1313,56 +1526,6 @@ components:
format: date-time
description: The date-time at which the ticket will become invalid for traveling. The ticket will not be valid after this date/time.
example: 2024-10-06T12:34:56.000
BulkResponseBody:
type: object
properties:
startTime:
type: string
format: date-time
example: 2025-02-14T05:32:47.0672237Z
status:
type: string
example: Running
clientTrackingId:
type: string
example: 08584620957189579629541919368CU00
callbackurl:
type: string
format: uri
example: https://services.api.htm.nl/purchasedproducts/responsestatus/runtime/webhooks/workflow/scaleUnits/prod-00/workflows/6fd466916c
retryAfter:
type: integer
example: 10
summary:
$ref: "#/components/schemas/summaryBody"
required:
- startTime
- status
- clientTrackingId
- callbackurl
- retryAfter
- summary
summaryBody:
type: object
properties:
summary:
type: object
properties:
created:
type: integer
example: 15
updated:
type: integer
example: 2
total:
type: integer
example: 17
required:
- created
- total
- updated
required:
- summary
rfc9457:
type: object
properties:

151
trip2.json Normal file
View File

@ -0,0 +1,151 @@
{ "tripId": 796727186, "tripVersion": 1, "tripStatus": "COMPLETE", "organisationIcon": "/icons/organisations/3.svg", "organisationId": "3", "organisationName": "HTM", "supersededByTripIds": [], "supersedesTripIds": [], "products": [ {
"productTemplateId": "30901", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "HTM 90% Korting" },
{
"key": "en-US", "value": "HTM 90% Discount" }
]
},
"productIcon": "001.jpg", "purchaseDateTime": "2026-04-02T12:38:28+02:00", "organisationName": "ProductRetailer HTM", "appliedValue": -125, "organisationId": "3", "category": "SALES", "typesOfFareProduct": [ {
"privateCode": "discount" }
],
"xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1" },
{
"productTemplateId": "N/A", "purchaseDateTime": "2025-07-09T12:39:27+02:00", "appliedValue": 139, "category": "SALES", "typesOfFareProduct": [ {
"privateCode": "payg" }
],
"xspit": "7618337f-c986-4bef-990d-f5a6b47292b8" },
{
"productTemplateId": "1:2000", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "Basis Bus Tram Metro" },
{
"key": "en-US", "value": "BTM full fare" }
]
},
"validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 116, "appliedMetric": "FARE", "appliedValue": 116, "category": "INTERNAL", "typesOfFareProduct": [ {
"privateCode": "payg" }
],
"xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" },
{
"productTemplateId": "2:2000", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "Basis Bus Tram Metro" },
{
"key": "en-US", "value": "BTM full fare" }
]
},
"validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 23, "appliedMetric": "FARE", "appliedValue": 23, "category": "INTERNAL", "typesOfFareProduct": [ {
"privateCode": "payg" }
],
"xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" },
{
"productTemplateId": "3:30901", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "HTM 90% Korting" },
{
"key": "en-US", "value": "HTM 90% Discount" },
{
"key": "nl-NL", "value": "Reis je regelmatig met HTM? Activeer dan HTM 90% Korting op je betaalpas of credit card en reis een week lang met korting!" },
{
"key": "en-US", "value": "Are you a regular traveler? Activate HTM 90% discount on your EMV card!" }
]
},
"validFrom": "2026-04-03T04:00:00+02:00", "validUntil": "2031-04-03T04:00:00+02:00", "organisationName": "Product Owner HTM", "weight": -125, "appliedMetric": "DISCOUNT", "appliedValue": -125, "organisationId": "3", "category": "INTERNAL", "typesOfFareProduct": [ {
"privateCode": "discount" }
],
"productCatalogVersionId": "PC-HTM:70", "xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1", "xpit": "1848597c-5ba9-4dab-8d9f-3948948706a1" }
],
"checkinTransactionTimestamp": "2026-04-20T16:59:48+02:00", "checkoutTransactionTimestamp": "2026-04-20T17:04:50+02:00", "checkinTransactionReference": "00310F92;29023;emvClt", "checkoutTransactionReference": "0030DBC1;30528;emvClt", "checkinLocation": { "stopId": 2721, "stopName": { "items": [ {
"key": "nl-NL", "value": "Station Hollands Spoor" },
{
"key": "en-US", "value": "Station Hollands Spoor" }
]
},
"stopDesc": "Stop point2721", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 },
"checkoutLocation": { "stopId": 2862, "stopName": { "items": [ {
"key": "nl-NL", "value": "Kalvermarkt-Stadhuis" },
{
"key": "en-US", "value": "Kalvermarkt-Stadhuis" }
]
},
"stopDesc": "Stop point2862", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 },
"tokenType": "EMV-CLT", "transportType": "TRAM", "lineId": "17", "lineName": "Tram17", "networkId": "1", "networkName": "HTM netwerk", "currency": "EUR", "transportIcon": "/icons/transportTypes/tram.svg", "legs": [ {
"legId": 1614950977, "checkinTransactionTimestamp": "2026-04-20T16:59:48+02:00", "checkoutTransactionTimestamp": "2026-04-20T17:04:50+02:00", "checkinLocation": { "stopId": 2721, "stopName": { "items": [ {
"key": "nl-NL", "value": "Station Hollands Spoor" },
{
"key": "en-US", "value": "Station Hollands Spoor" }
]
},
"stopDesc": "Stop point2721", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 },
"checkoutLocation": { "stopId": 2862, "stopName": { "items": [ {
"key": "nl-NL", "value": "Kalvermarkt-Stadhuis" },
{
"key": "en-US", "value": "Kalvermarkt-Stadhuis" }
]
},
"stopDesc": "Stop point2862", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 },
"baseRate": 139, "lineId": "17", "lineName": "Tram17", "networkId": "1", "networkName": "HTM netwerk", "fare": 14, "fareState": "CALCULATED", "currency": "EUR", "products": [ {
"productTemplateId": "30901", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "HTM 90% Korting" },
{
"key": "en-US", "value": "HTM 90% Discount" }
]
},
"productIcon": "001.jpg", "purchaseDateTime": "2026-04-02T12:38:28+02:00", "organisationName": "ProductRetailer HTM", "appliedValue": -125, "organisationId": "3", "category": "SALES", "typesOfFareProduct": [ {
"privateCode": "discount" }
],
"xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1" },
{
"productTemplateId": "N/A", "purchaseDateTime": "2025-07-09T12:39:27+02:00", "appliedValue": 139, "category": "SALES", "typesOfFareProduct": [ {
"privateCode": "payg" }
],
"xspit": "7618337f-c986-4bef-990d-f5a6b47292b8" },
{
"productTemplateId": "1:2000", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "Basis Bus Tram Metro" },
{
"key": "en-US", "value": "BTM full fare" }
]
},
"validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 116, "appliedMetric": "FARE", "appliedValue": 116, "category": "INTERNAL", "typesOfFareProduct": [ {
"privateCode": "payg" }
],
"xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" },
{
"productTemplateId": "2:2000", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "Basis Bus Tram Metro" },
{
"key": "en-US", "value": "BTM full fare" }
]
},
"validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 23, "appliedMetric": "FARE", "appliedValue": 23, "category": "INTERNAL", "typesOfFareProduct": [ {
"privateCode": "payg" }
],
"xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" },
{
"productTemplateId": "3:30901", "productCommercialName": { "items": [ {
"key": "nl-NL", "value": "HTM 90% Korting" },
{
"key": "en-US", "value": "HTM 90% Discount" },
{
"key": "nl-NL", "value": "Reis je regelmatig met HTM? Activeer dan HTM 90% Korting op je betaalpas of credit card en reis een week lang met korting!" },
{
"key": "en-US", "value": "Are you a regular traveler? Activate HTM 90% discount on your EMV card!" }
]
},
"validFrom": "2026-04-03T04:00:00+02:00", "validUntil": "2031-04-03T04:00:00+02:00", "organisationName": "Product Owner HTM", "weight": -125, "appliedMetric": "DISCOUNT", "appliedValue": -125, "organisationId": "3", "category": "INTERNAL", "typesOfFareProduct": [ {
"privateCode": "discount" }
],
"discountPercentage": 90, "productCatalogVersionId": "PC-HTM:70", "xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1", "xpit": "1848597c-5ba9-4dab-8d9f-3948948706a1" }
],
"appliedTimePeriods": [], "tariffJourneyStart": true, "topoDistance": 1161, "concessionId": "1", "appliedZones": [] }
],
"lastUpdatedTripDateTime": "2026-04-20T17:04:50+02:00", "fare": 14, "loyaltyOrDiscount": true, "supportCode": "pWM8Km6J8aHg5n", "tripVersionReason": "STRUCTURE", "checkinTransactionId": "00310F92-29023-emvClt-1776697188000", "checkoutTransactionId": "0030DBC1-30528-emvClt-1776697490000", "tariffVersionId": "HTM-CF1:278", "correlationId": "4bc7a040-71bf-4084-a61e-b2dd72092079", "createdAt": "2026-04-20T17:05:01.473+02:00", "entryTariffLocation": { "stopId": 2721, "stopName": { "items": [ {
"key": "nl-NL", "value": "Station Hollands Spoor" },
{
"key": "en-US", "value": "Station Hollands Spoor" }
]
},
"stopDesc": "Stop point2721", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 },
"traveledLines": [ {
"lineId": "17", "lineName": "Tram17" }
],
"tripFareNature": "FIXED", "paymentMethodId": "229a01ff-7bd9-4740-9b19-00637146a6ca", "paymentMethodMode": "PREPAID", "paymentMethodName": "EPURSE", "paymentProviderName": "TPURSE", "paymentProviderBusinessEntityId": "600027", "registryFragmentVersionId": "REG:27", "vehicleId": 5063, "xbot": "c85e34d6-f9c1-49c2-8574-59b37e0f3b8e" }