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" -> { case "paymentMoment" -> {
LOGGER.info("Rewriting paymentMoment to paymentMomentId..."); LOGGER.info("Rewriting paymentMoment to paymentMomentId...");
Long paymentMomentId = jsonField.getValue().get("paymentMomentId").asLong(); if (jsonField.getValue().get("paymentMomentId").isNull()) {
((ObjectNode)newJsonNode).put("paymentMomentId", paymentMomentId); 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" -> { case "requiredCustomerLevel" -> {
LOGGER.info("Rewriting requiredCustomerLevel to requiredCustomerLevelId..."); LOGGER.info("Rewriting requiredCustomerLevel to requiredCustomerLevelId...");

View File

@ -327,6 +327,20 @@ paths:
status: 500 status: 500
title: Internal Server Error title: Internal Server Error
detail: An unknown error has occurred 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: components:
securitySchemes: securitySchemes:
oAuthSample: oAuthSample:

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

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

View File

@ -10,6 +10,148 @@ servers:
tags: tags:
- name: TAT Security - name: TAT Security
paths: 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: /tokens/securetoken:
parameters: parameters:
- name: X-HTM-JWT-AUTH-HEADER - name: X-HTM-JWT-AUTH-HEADER
@ -50,7 +192,7 @@ paths:
emailAddress: stasjo@htm.nl emailAddress: stasjo@htm.nl
Without customer account: Without customer account:
value: value:
xtat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d xTat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d
emailAddress: stasjo@htm.nl emailAddress: stasjo@htm.nl
responses: responses:
"200": "200":
@ -60,10 +202,14 @@ paths:
schema: schema:
$ref: "#/components/schemas/EmailNotPreApprovedResponse" $ref: "#/components/schemas/EmailNotPreApprovedResponse"
example: example:
uid: 7594f3ee-cd3d-40a3-8e82-73b90d16c481
recipient: xxxxxx.user@gmail.com recipient: xxxxxx.user@gmail.com
key: 123456789123456789123456789abcde
description: OTP Sent description: OTP Sent
_links: {
"verifyotp": {
"href": "/tokens/verifyotp",
"method": "POST"
}
}
"400": "400":
description: Bad Request description: Bad Request
content: content:
@ -125,6 +271,111 @@ paths:
$ref: "#/components/schemas/ErrorResponse" $ref: "#/components/schemas/ErrorResponse"
example: example:
error: An unknown error has occurred 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: /tokens/verifyotp:
parameters: parameters:
- name: X-HTM-JWT-AUTH-HEADER - name: X-HTM-JWT-AUTH-HEADER
@ -150,7 +401,7 @@ paths:
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
post: post:
tags: tags:
- TAT Security - TAT Verification
summary: Submit an OTP for a triggered OTP flow. summary: Submit an OTP for a triggered OTP flow.
description: | description: |
Submit an OTP for a triggered OTP flow. This can either be result of an AGO activation, or 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 action: secure
OTP verification for TAT security authorization for anonymous token: OTP verification for TAT security authorization for anonymous token:
value: value:
xtat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0 xTat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0
otp: 123456 otp: 123456
action: authorize action: authorize
responses: responses:
@ -257,22 +508,12 @@ components:
EmailNotPreApprovedResponse IS AN object THAT represents the response of EmailNotPreApprovedResponse IS AN object THAT represents the response of
email pre-approval check. email pre-approval check.
properties: properties:
uid:
type: string
description: A uid IS A unique identifier THAT is associated with the user.
example: 7594f3ee-cd3d-40a3-8e82-73b90d16c481
recipient: recipient:
type: string type: string
description: >- description: >-
A recipient IS A unique identifier THAT is associated with the TAT A recipient IS A unique identifier THAT is associated with the TAT
owner. owner.
example: xxxxxx.user@gmail.com 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: description:
type: string type: string
description: >- description: >-
@ -285,7 +526,7 @@ components:
ovPayTokenId: ovPayTokenId:
type: integer type: integer
example: 42 example: 42
xtat: xTat:
type: string type: string
format: uuid format: uuid
example: 6134db53-9ae5-41d1-a343-36656b60b510 example: 6134db53-9ae5-41d1-a343-36656b60b510
@ -294,14 +535,24 @@ components:
format: email format: email
example: stasjo@htm.nl example: stasjo@htm.nl
required: required:
- ovPayTokenId - emailAddress
AuthorizeTokenRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xTat:
type: string
format: uuid
example: 6134db53-9ae5-41d1-a343-36656b60b510
VerifyOtpRequest: VerifyOtpRequest:
type: object type: object
properties: properties:
ovPayTokenId: ovPayTokenId:
type: integer type: integer
example: 42 example: 42
xtat: xTat:
type: string type: string
format: uuid format: uuid
example: f3474452-e1d4-428c-b366-e5ad5965eb8c example: f3474452-e1d4-428c-b366-e5ad5965eb8c
@ -339,3 +590,28 @@ components:
detail: detail:
type: string 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 - status
- aggregationReference - aggregationReference
- accountingSystemReference - accountingSystemReference
- createdOn
- lastUpdatedOn
- name: $select - name: $select
in: query in: query
description: Select properties to be returned description: Select properties to be returned
@ -79,6 +81,8 @@ paths:
- status - status
- aggregationReference - aggregationReference
- accountingSystemReference - accountingSystemReference
- createdOn
- lastUpdatedOn
responses: responses:
"200": "200":
description: OK description: OK
@ -118,6 +122,8 @@ paths:
status: created status: created
aggregationReference: null 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 - "@odata.etag": e671c8a1-b918-4867-bf12-5289822479c3
transactionItemRowId: 3232 transactionItemRowId: 3232
transactionItemId: 1c1fc1c8-57f4-4336-9b43-a974eae5afbf transactionItemId: 1c1fc1c8-57f4-4336-9b43-a974eae5afbf
@ -137,6 +143,8 @@ paths:
status: failed status: failed
aggregationReference: null 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 - "@odata.etag": be2715d4-4eff-4562-9bf3-5c43ad23e2c8
transactionItemRowId: 3233 transactionItemRowId: 3233
transactionItemId: 3f58441e-dc8f-4956-9bc5-c952312476db transactionItemId: 3f58441e-dc8f-4956-9bc5-c952312476db
@ -156,6 +164,8 @@ paths:
status: returned to src status: returned to src
aggregationReference: FIKO-171f40609e 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 - "@odata.etag": 52130c4d-e944-4454-a73e-8d55449a4bd1
transactionItemRowId: 3234 transactionItemRowId: 3234
transactionItemId: 4418825f-3f9b-45bc-b662-dc3cd4ce6599 transactionItemId: 4418825f-3f9b-45bc-b662-dc3cd4ce6599
@ -175,6 +185,8 @@ paths:
status: returned to trx-db status: returned to trx-db
aggregationReference: null 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 - "@odata.etag": 7da305e1-85cd-4250-ad77-8b54b2649cfb
transactionItemRowId: 3235 transactionItemRowId: 3235
transactionItemId: 2ddc1831-cf7b-4a77-8aa1-11aaf8e98d9f transactionItemId: 2ddc1831-cf7b-4a77-8aa1-11aaf8e98d9f
@ -194,6 +206,8 @@ paths:
status: re-entered status: re-entered
aggregationReference: null 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 - "@odata.etag": c3b17d21-0506-474d-b3d4-7ff654f368b9
transactionItemRowId: 3236 transactionItemRowId: 3236
transactionItemId: 5ab2513d-f334-4cf8-8895-4e7269374a4b transactionItemId: 5ab2513d-f334-4cf8-8895-4e7269374a4b
@ -213,6 +227,8 @@ paths:
status: succeeded status: succeeded
aggregationReference: FIKO-6a4fca8cd6 aggregationReference: FIKO-6a4fca8cd6
accountingSystemReference: U4F-123456 accountingSystemReference: U4F-123456
createdOn: 2024-11-04T00:00:00Z
lastUpdatedOn: 2024-11-04T04:00:00Z
security: security:
- default: [] - default: []
x-auth-type: Application & Application User x-auth-type: Application & Application User
@ -434,7 +450,7 @@ paths:
summary: Add a processing failure. summary: Add a processing failure.
description: Add a processing failure. description: Add a processing failure.
tags: tags:
- Failures v2.2 - Failures v2.3
requestBody: requestBody:
required: true required: true
content: content:
@ -455,6 +471,7 @@ paths:
reasonCode: "012" reasonCode: "012"
reasonDescription: Transaction date is in the future. reasonDescription: Transaction date is in the future.
resolved: false resolved: false
journalEntryId: 0e53b984-16b2-4ef7-b669-29bcdad2a3ce
responses: responses:
"201": "201":
description: Created description: Created
@ -472,67 +489,6 @@ paths:
- default: [] - default: []
x-auth-type: Application & Application User x-auth-type: Application & Application User
x-throttling-tier: Unlimited 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: /Odata/TransactionAuditTrail:
get: get:
summary: Find audit trail entries. summary: Find audit trail entries.
@ -564,6 +520,7 @@ paths:
- action - action
- status - status
- correlationId - correlationId
- journalEntryId
- name: $select - name: $select
in: query in: query
description: Select properties to be returned description: Select properties to be returned
@ -584,6 +541,7 @@ paths:
- action - action
- status - status
- correlationId - correlationId
- journalEntryId
- name: $expand - name: $expand
in: query in: query
description: Expand related entities description: Expand related entities
@ -597,6 +555,7 @@ paths:
type: string type: string
enum: enum:
- TransactionItem - TransactionItem
- JournalEntry
responses: responses:
"200": "200":
description: OK description: OK
@ -627,6 +586,7 @@ paths:
status: created status: created
description: Transaction created. description: Transaction created.
correlationId: null correlationId: null
journalEntryId: null
- "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5 - "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5
transactionAuditTrailRowId: 8219 transactionAuditTrailRowId: 8219
transactionAuditTrailId: 1d234fc1-eb16-41d3-b2e0-e400e17b017f transactionAuditTrailId: 1d234fc1-eb16-41d3-b2e0-e400e17b017f
@ -637,6 +597,7 @@ paths:
status: created status: created
description: Transaction created. description: Transaction created.
correlationId: null correlationId: null
journalEntryId: null
- "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb - "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb
transactionAuditTrailRowId: 8220 transactionAuditTrailRowId: 8220
transactionAuditTrailId: f4798a84-489d-4533-9dfe-42423c70f6b6 transactionAuditTrailId: f4798a84-489d-4533-9dfe-42423c70f6b6
@ -647,6 +608,7 @@ paths:
status: return to src status: return to src
description: Transaction retunred to source. description: Transaction retunred to source.
correlationId: a3891560-3084-42cb-867c-f289e7cda47d correlationId: a3891560-3084-42cb-867c-f289e7cda47d
journalEntryId: null
- "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc - "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc
transactionAuditTrailRowId: 8221 transactionAuditTrailRowId: 8221
transactionAuditTrailId: cc80d58d-6ee7-409a-8c14-b1f807e67c10 transactionAuditTrailId: cc80d58d-6ee7-409a-8c14-b1f807e67c10
@ -657,6 +619,7 @@ paths:
status: failed status: failed
description: Validation XYZ failed. description: Validation XYZ failed.
correlationId: null correlationId: null
journalEntryId: a062f64f-f39e-48e7-9793-efbfa86d2827
List containing multiple transaction audit trails of one transaction item: List containing multiple transaction audit trails of one transaction item:
summary: List containing multiple 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`). 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 status: re-entered
description: Transaction re-entered. description: Transaction re-entered.
correlationId: null correlationId: null
journalEntryId: null
- "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5 - "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5
transactionAuditTrailRowId: 8219 transactionAuditTrailRowId: 8219
transactionAuditTrailId: b2192e6c-ab79-4000-a04d-d8f4d574a82f transactionAuditTrailId: b2192e6c-ab79-4000-a04d-d8f4d574a82f
@ -683,6 +647,7 @@ paths:
status: return to src status: return to src
description: Transaction retunred to source. description: Transaction retunred to source.
correlationId: a3891560-3084-42cb-867c-f289e7cda47d correlationId: a3891560-3084-42cb-867c-f289e7cda47d
journalEntryId: null
- "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb - "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb
transactionAuditTrailRowId: 8220 transactionAuditTrailRowId: 8220
transactionAuditTrailId: 1d759985-7f1a-48bd-8dd1-efa30ce26423 transactionAuditTrailId: 1d759985-7f1a-48bd-8dd1-efa30ce26423
@ -693,6 +658,7 @@ paths:
status: failed status: failed
description: Validation XYZ failed. description: Validation XYZ failed.
correlationId: null correlationId: null
journalEntryId: b479507a-a65d-48b5-8476-87c88ba3c560
- "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc - "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc
transactionAuditTrailRowId: 8221 transactionAuditTrailRowId: 8221
transactionAuditTrailId: afce35b2-1dff-4ace-98d0-4b9ac405c87d transactionAuditTrailId: afce35b2-1dff-4ace-98d0-4b9ac405c87d
@ -703,6 +669,7 @@ paths:
status: created status: created
description: Transaction created. description: Transaction created.
correlationId: null correlationId: null
journalEntryId: null
List containing multiple audit trails of different failed transactions: List containing multiple audit trails of different failed transactions:
summary: 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). description: List containing multiple audit trails of different failed transactions (status = failed).
@ -719,6 +686,7 @@ paths:
status: failed status: failed
description: Validation XYZ failed. description: Validation XYZ failed.
correlationId: null correlationId: null
journalEntryId: null
- "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5 - "@odata.etag": 1ce407d3-4725-46b8-92b2-47282ccd38f5
transactionAuditTrailRowId: 8219 transactionAuditTrailRowId: 8219
transactionAuditTrailId: 1d234fc1-eb16-41d3-b2e0-e400e17b017f transactionAuditTrailId: 1d234fc1-eb16-41d3-b2e0-e400e17b017f
@ -729,6 +697,7 @@ paths:
status: failed status: failed
description: Validation XYZ failed. description: Validation XYZ failed.
correlationId: null correlationId: null
journalEntryId: 43a98533-bb01-4aad-8d61-005051125969
- "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb - "@odata.etag": c8dec28b-bb85-4cb2-8a56-4a95fb2ed7bb
transactionAuditTrailRowId: 8220 transactionAuditTrailRowId: 8220
transactionAuditTrailId: f4798a84-489d-4533-9dfe-42423c70f6b6 transactionAuditTrailId: f4798a84-489d-4533-9dfe-42423c70f6b6
@ -739,6 +708,7 @@ paths:
status: failed status: failed
description: Validation XYZ failed. description: Validation XYZ failed.
correlationId: null correlationId: null
journalEntryId: null
- "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc - "@odata.etag": 967ddfa0-835e-4954-a4af-2eb11de325dc
transactionAuditTrailRowId: 8221 transactionAuditTrailRowId: 8221
transactionAuditTrailId: cc80d58d-6ee7-409a-8c14-b1f807e67c10 transactionAuditTrailId: cc80d58d-6ee7-409a-8c14-b1f807e67c10
@ -749,6 +719,7 @@ paths:
status: failed status: failed
description: Validation XYZ failed. description: Validation XYZ failed.
correlationId: null correlationId: null
journalEntryId: null
security: security:
- default: [] - default: []
x-auth-type: Application & Application User x-auth-type: Application & Application User
@ -786,6 +757,7 @@ paths:
- reasonDescription - reasonDescription
- resolved - resolved
- change - change
- journalEntryId
- name: $select - name: $select
in: query in: query
description: Select properties to be returned description: Select properties to be returned
@ -808,6 +780,7 @@ paths:
- reasonDescription - reasonDescription
- resolved - resolved
- change - change
- journalEntryId
- name: $expand - name: $expand
in: query in: query
description: Expand related entities description: Expand related entities
@ -821,6 +794,7 @@ paths:
type: string type: string
enum: enum:
- TransactionItem - TransactionItem
- JournalEntry
responses: responses:
"200": "200":
description: OK description: OK
@ -856,6 +830,7 @@ paths:
reasonDescription: Cost type does not exist. reasonDescription: Cost type does not exist.
resolved: false resolved: false
change: null change: null
journalEntryId: null
- "@odata.etag": ff49829d-a5de-4c1a-b331-15fd9c71dfe9 - "@odata.etag": ff49829d-a5de-4c1a-b331-15fd9c71dfe9
processingFailureRowId: 10 processingFailureRowId: 10
processingFailureId: ccc06dc9-956d-47d8-bde7-9644ddde2193 processingFailureId: ccc06dc9-956d-47d8-bde7-9644ddde2193
@ -867,6 +842,7 @@ paths:
reasonDescription: Cost center does not exist. reasonDescription: Cost center does not exist.
resolved: true resolved: true
change: Adapt config change: Adapt config
journalEntryId: null
- "@odata.etag": 5d5d3351-d3f1-49b2-905f-4dbbe1cc30e3 - "@odata.etag": 5d5d3351-d3f1-49b2-905f-4dbbe1cc30e3
processingFailureRowId: 11 processingFailureRowId: 11
processingFailureId: 96bf8d44-0030-4509-b24e-2d62299779c5 processingFailureId: 96bf8d44-0030-4509-b24e-2d62299779c5
@ -878,6 +854,7 @@ paths:
reasonDescription: Department does not exist. reasonDescription: Department does not exist.
resolved: true resolved: true
change: Adapt config change: Adapt config
journalEntryId: null
List of unfiltered processing failures: List of unfiltered processing failures:
summary: List of unfiltered processing failures summary: List of unfiltered processing failures
description: | description: |
@ -897,6 +874,7 @@ paths:
reasonDescription: Transaction date is in the future reasonDescription: Transaction date is in the future
resolved: false resolved: false
change: null change: null
journalEntryId: null
- "@odata.etag": 584d3a8a-48bc-45f9-99be-8dd70399e6e4 - "@odata.etag": 584d3a8a-48bc-45f9-99be-8dd70399e6e4
processingFailureRowId: 10 processingFailureRowId: 10
processingFailureId: 76aa82e1-a10f-4664-a84f-1f30d60884b3 processingFailureId: 76aa82e1-a10f-4664-a84f-1f30d60884b3
@ -908,6 +886,7 @@ paths:
reasonDescription: Cost center does not exist. reasonDescription: Cost center does not exist.
resolved: false resolved: false
change: null change: null
journalEntryId: null
- "@odata.etag": df4ade9b-1bda-4d91-a5ba-4dbe067568a0 - "@odata.etag": df4ade9b-1bda-4d91-a5ba-4dbe067568a0
processingFailureRowId: 11 processingFailureRowId: 11
processingFailureId: 25d2dd6f-ae17-44a7-b7a5-43eaf6de78e1 processingFailureId: 25d2dd6f-ae17-44a7-b7a5-43eaf6de78e1
@ -919,6 +898,7 @@ paths:
reasonDescription: Department does not exist. reasonDescription: Department does not exist.
resolved: false resolved: false
change: null change: null
journalEntryId: null
security: security:
- default: [] - default: []
x-auth-type: Application & Application User x-auth-type: Application & Application User
@ -969,6 +949,415 @@ paths:
- default: [] - default: []
x-auth-type: Application & Application User x-auth-type: Application & Application User
x-throttling-tier: Unlimited 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: /Odata/BookingProcess:
get: get:
summary: Find booking processes. summary: Find booking processes.
@ -3316,6 +3705,16 @@ components:
- occurredOn - occurredOn
- type - type
- status - 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: TransactionItemsBulkRequestBody:
type: object type: object
properties: properties:
@ -3551,6 +3950,11 @@ components:
type: string type: string
nullable: true nullable: true
example: Adapt config example: Adapt config
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required: required:
- timestamp - timestamp
- element - element
@ -3617,6 +4021,11 @@ components:
type: string type: string
nullable: true nullable: true
example: Adapt config example: Adapt config
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required: required:
- processingFailureId - processingFailureId
- transactionItemId - transactionItemId
@ -3681,6 +4090,11 @@ components:
format: uuid format: uuid
nullable: true nullable: true
example: 37a8095b-19db-498f-9349-5f37d21c5bdf example: 37a8095b-19db-498f-9349-5f37d21c5bdf
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required: required:
- user - user
- timestamp - timestamp
@ -3754,6 +4168,11 @@ components:
format: uuid format: uuid
nullable: true nullable: true
example: a3891560-3084-42cb-867c-f289e7cda47d example: a3891560-3084-42cb-867c-f289e7cda47d
journalEntryId:
type: string
format: uuid
nullable: true
example: b51b377d-6c82-4c4f-9ed3-1068ab6e30c9
required: required:
- transactionAuditTrailId - transactionAuditTrailId
- transactionItemId - transactionItemId
@ -3761,6 +4180,89 @@ components:
- timestamp - timestamp
- action - action
- status - 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: BookingProcessesGetResponseBody:
type: object type: object
properties: properties:

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
@ -777,6 +769,13 @@ paths:
example: 9e3363c8-e776-4675-b108-99b8c2e38eb6 example: 9e3363c8-e776-4675-b108-99b8c2e38eb6
required: false required: false
description: The id of the orderLine 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: get:
summary: Find vouchers on the order summary: Find vouchers on the order
description: 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 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
@ -66,8 +57,8 @@ paths:
summary: No products / Empty list summary: No products / Empty list
description: No products description: No products
value: { "voucherDefinitions": [] } value: { "voucherDefinitions": [] }
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) summary: List containing one voucher definition (called by touchPointId 12)
description: |- description: |-
List containing one voucher definition for a voucher that can be redeemed for the product "Ooievaarspas voor AOW-ers in Den Haag".\ 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.\ 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: /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. \
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: 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
@ -240,6 +233,21 @@ paths:
schema: schema:
type: integer type: integer
example: 321 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 - name: voucherStatusId
in: query in: query
required: false required: false
@ -258,6 +266,14 @@ paths:
items: items:
type: integer type: integer
example: [4,5] 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: tags:
- Vouchers - Vouchers
responses: responses:
@ -281,9 +297,9 @@ paths:
{ {
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90", "issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT", "voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000", "fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000", "untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" }, "voucherStatus": { "voucherStatusId": 2, "name": "issued", "createdOn": "2024-10-04T00:00:00.000Z", "reason": "Test reason" },
"product": "product":
{ {
"productId": 263, "productId": 263,
@ -323,9 +339,94 @@ paths:
"mandatoryCustomerDataItemId": 8, "mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate", "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", "issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT", "voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000", "fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000", "untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" }, "voucherStatus": { "voucherStatusId": 2, "name": "issued", "createdOn": "2024-10-04T00:00:00.000Z", "reason": "Test reason" },
"product": "product":
{ {
"productId": 264, "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", "issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT", "voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000", "fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000", "untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" }, "voucherStatus": { "voucherStatusId": 2, "name": "issued", "createdOn": "2024-10-04T00:00:00.000Z", "reason": "Test reason" },
"product": "product":
{ {
"productId": 265, "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": "403":
description: Forbidden description: Forbidden
content: content:
@ -466,10 +593,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).
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. 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 +618,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",
@ -492,18 +631,37 @@ paths:
[ [
{ {
"mandatoryCustomerDataItemId": 8, "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: 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-30",
}
],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
} }
responses: responses:
"201": "201":
@ -519,9 +677,9 @@ paths:
{ {
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90", "issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT", "voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000", "fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000", "untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" }, "voucherStatus": { "voucherStatusId": 1, "name": "new", "createdOn": "2024-10-04T00:00:00.000Z", "reason": null },
"product": "product":
{ {
"productId": 263, "productId": 263,
@ -561,9 +719,14 @@ paths:
"mandatoryCustomerDataItemId": 8, "mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate", "customerDataItem": "padBirthDate",
}, },
"value": "1980-06-31", "value": "1980-06-30",
} }
], ],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
} }
"400": "400":
description: Bad request description: Bad request
@ -573,12 +736,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 +777,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,11 +796,20 @@ paths:
schema: schema:
$ref: "#/components/schemas/supplierTouchpointUpdateIssuedVoucherRequest" $ref: "#/components/schemas/supplierTouchpointUpdateIssuedVoucherRequest"
examples: examples:
Mark a voucher as revoked: Mark a voucher as issued:
summary: Mark a voucher as revoked summary: Mark a voucher as issued
description: Mark a voucher as issued. Only vouchers with a status of "issued" can actually be redeemed.
value: 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: responses:
"200": "200":
@ -650,9 +825,9 @@ paths:
{ {
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90", "issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT", "voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000", "fromInclusive": "2024-10-04T00:00:00.000Z",
"untilInclusive": "2024-11-04T00:00:00.000", "untilInclusive": "2024-11-04T00:00:00.000Z",
"voucherStatus": { "voucherStatusId": 4, "name": "revoked" }, "voucherStatus": { "voucherStatusId": 4, "name": "revoked", "createdOn": "2024-10-04T12:34:56.000Z", "reason": "Voucher was redeemed by an unauthorized person" },
"product": "product":
{ {
"productId": 263, "productId": 263,
@ -691,9 +866,14 @@ paths:
"mandatoryCustomerDataItemId": 8, "mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate", "customerDataItem": "padBirthDate",
}, },
"value": "1980-06-31", "value": "1980-06-30",
} }
] ],
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null
} }
"400": "400":
description: Bad request description: Bad request
@ -734,7 +914,6 @@ components:
- validityPeriod - validityPeriod
- productCategory - productCategory
- sellingPeriods - sellingPeriods
properties: properties:
productId: productId:
type: integer type: integer
@ -758,11 +937,11 @@ components:
fromInclusive: fromInclusive:
type: string type: string
format: date-time-offset format: date-time-offset
example: "2024-09-03T10:01:34.000+00:00" example: "2024-09-03T10:01:34.000+00:00Z"
toInclusive: toInclusive:
type: string type: string
format: date-time-offset format: date-time-offset
example: "2024-09-03T23:59:59.999+00:00" example: "2024-09-03T23:59:59.999+00:00Z"
productCategory: productCategory:
type: object type: object
required: required:
@ -832,11 +1011,11 @@ components:
fromInclusive: fromInclusive:
type: string type: string
format: date-time-offset format: date-time-offset
example: "2022-03-01T00:00:00.000+00:00" example: "2022-03-01T00:00:00.000+00:00Z"
toInclusive: toInclusive:
type: string type: string
format: date-time-offset format: date-time-offset
example: "2022-06-01T00:00:00.000+00:00" example: "2022-06-01T00:00:00.000+00:00Z"
salesTouchpoint: salesTouchpoint:
type: object type: object
required: required:
@ -923,11 +1102,11 @@ components:
fromInclusive: fromInclusive:
type: string type: string
format: date-time-offset format: date-time-offset
example: "2022-03-01T00:00:00.000+00:00" example: "2022-03-01T00:00:00.000+00:00Z"
toInclusive: toInclusive:
type: string type: string
format: date-time-offset format: date-time-offset
example: "2022-06-01T00:00:00.000+00:00" example: "2022-06-01T00:00:00.000+00:00Z"
internalPrice: internalPrice:
type: number type: number
example: 908.1234 example: 908.1234
@ -976,6 +1155,26 @@ components:
type: string type: string
description: The value that the customer must provide for this mandatoryCustomerDataItem to be able to redeem the voucher. description: The value that the customer must provide for this mandatoryCustomerDataItem to be able to redeem the voucher.
example: "1970-01-01" 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: supplierTouchpointUpdateIssuedVoucherRequest:
type: object type: object
required: required:
@ -985,6 +1184,10 @@ components:
type: integer type: integer
description: The new status of the voucher. description: The new status of the voucher.
example: 4 example: 4
reason:
type: string
description: The reason for the change of the voucher status.
example: "Voucher was redeemed by an unauthorized person"
supplierTouchpointIssuedVouchersListResponse: supplierTouchpointIssuedVouchersListResponse:
type: object type: object
properties: properties:
@ -1026,25 +1229,17 @@ components:
the maximum allowed start date of a requiredProduct (for this, the existing order flow logic is applied). 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" example: "2024-11-04T00:00:00.000+01:00"
voucherStatus: voucherStatus:
type: object allOf:
required: - $ref: "#/components/schemas/voucherStatusInstance"
- voucherStatusId - type: object
- name - description: |-
description: |- The current status of the voucher. Can be any of the following:
The current status of the voucher. Can be any of the following: - 1 = new
- 1 = new - 2 = issued
- 2 = issued - 3 = redeemed
- 3 = redeemed - 4 = revoked
- 4 = revoked - 5 = expired
- 5 = expired - 6 = pendingRedemption
- 6 = pendingRedemption
properties:
voucherStatusId:
type: integer
example: 2
name:
type: string
example: "issued"
product: product:
type: object type: object
description: The "product" referencing the voucher definition that this voucher instance is based on description: The "product" referencing the voucher definition that this voucher instance is based on
@ -1160,7 +1355,51 @@ components:
value: value:
type: string type: string
example: 1970-01-01 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: unavailable:
type: object type: object
rfc9457: rfc9457:

View File

@ -209,6 +209,12 @@ paths:
{ {
"issuedVoucherId": "e1f2g3h4-i5j6-k7l8-m9n0-o1p2q3r4s5t6", "issuedVoucherId": "e1f2g3h4-i5j6-k7l8-m9n0-o1p2q3r4s5t6",
"voucherCode": "VOUCHER12345", "voucherCode": "VOUCHER12345",
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances": "voucherStatusInstances":
[ [
{ {
@ -219,6 +225,7 @@ paths:
"name": "New", "name": "New",
}, },
"createdOn": "2024-10-04T12:34:56.000", "createdOn": "2024-10-04T12:34:56.000",
"reason": null,
}, },
{ {
"voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1", "voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1",
@ -228,6 +235,7 @@ paths:
"name": "Issued", "name": "Issued",
}, },
"createdOn": "2024-10-04T12:37:14.000", "createdOn": "2024-10-04T12:37:14.000",
"reason": "test reason"
}, },
], ],
"voucherClaims": "voucherClaims":
@ -248,6 +256,155 @@ paths:
], ],
"href": null, "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}: /purchasedproducts/{purchasedProductId}:
parameters: parameters:
- in: path - in: path
@ -382,6 +539,12 @@ paths:
{ {
"issuedVoucherId": "e1f2g3h4-i5j6-k7l8-m9n0-o1p2q3r4s5t6", "issuedVoucherId": "e1f2g3h4-i5j6-k7l8-m9n0-o1p2q3r4s5t6",
"voucherCode": "VOUCHER12345", "voucherCode": "VOUCHER12345",
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances": "voucherStatusInstances":
[ [
{ {
@ -389,12 +552,14 @@ paths:
"voucherStatus": "voucherStatus":
{ "voucherStatusId": 1, "name": "New" }, { "voucherStatusId": 1, "name": "New" },
"createdOn": "2024-10-04T12:34:56.000", "createdOn": "2024-10-04T12:34:56.000",
"reason": null,
}, },
{ {
"voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1", "voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1",
"voucherStatus": "voucherStatus":
{ "voucherStatusId": 2, "name": "Issued" }, { "voucherStatusId": 2, "name": "Issued" },
"createdOn": "2024-10-04T12:37:14.000", "createdOn": "2024-10-04T12:37:14.000",
"reason": "test reason"
}, },
], ],
"voucherClaims": "voucherClaims":
@ -1054,11 +1219,18 @@ paths:
example: example:
{ {
"voucherCode": "VOUCHER123", "voucherCode": "VOUCHER123",
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances": "voucherStatusInstances":
[ [
{ {
"voucherStatusId": 1, "voucherStatusId": 1,
"createdOn": "2024-10-04T12:34:56.000", "createdOn": "2024-10-04T12:34:56.000",
"reason": "test reason"
}, },
], ],
"voucherClaims": "voucherClaims":
@ -1066,7 +1238,7 @@ paths:
{ "mandatoryCustomerDataItemId": 8, "value": "1999-12-31" }, { "mandatoryCustomerDataItemId": 8, "value": "1999-12-31" },
{ {
"mandatoryCustomerDataItemId": 4, "mandatoryCustomerDataItemId": 4,
"value": "vlad.harkonnen@househarkonnen.net", "value": "john.doe@example.com",
}, },
], ],
"fromInclusive": "2024-10-04T12:34:56.000", "fromInclusive": "2024-10-04T12:34:56.000",
@ -1102,6 +1274,14 @@ paths:
format: uuid format: uuid
example: 058a1af7-897f-45d5-b691-9cc9161e387f example: 058a1af7-897f-45d5-b691-9cc9161e387f
description: The id of the purchased product. 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 - in: query
name: productId name: productId
schema: schema:
@ -1146,6 +1326,13 @@ paths:
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90", "issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"purchasedProductId": "058a1af7-897f-45d5-b691-9cc9161e387f", "purchasedProductId": "058a1af7-897f-45d5-b691-9cc9161e387f",
"voucherCode": "VOUCHER123", "voucherCode": "VOUCHER123",
"productId": 888,
"touchPointId": 23,
"metadata1": null,
"metadata2": null,
"metadata3": null,
"metadata4": null,
"metadata5": null,
"voucherStatusInstances": "voucherStatusInstances":
[ [
{ {
@ -1153,12 +1340,14 @@ paths:
"voucherStatus": "voucherStatus":
{ "voucherStatusId": 1, "name": "New" }, { "voucherStatusId": 1, "name": "New" },
"createdOn": "2024-10-04T12:34:56.000", "createdOn": "2024-10-04T12:34:56.000",
"reason": null,
}, },
{ {
"voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1", "voucherStatusInstanceId": "b01412e6-70fb-4c05-9bef-e65bf2747ca1",
"voucherStatus": "voucherStatus":
{ "voucherStatusId": 2, "name": "Issued" }, { "voucherStatusId": 2, "name": "Issued" },
"createdOn": "2024-10-04T12:37:14.000", "createdOn": "2024-10-04T12:37:14.000",
"reason": "test reason",
}, },
], ],
"voucherClaims": "voucherClaims":
@ -1177,7 +1366,7 @@ paths:
"mandatoryCustomerDataItemId": 4, "mandatoryCustomerDataItemId": 4,
"customerDataItem": "emailAddress", "customerDataItem": "emailAddress",
}, },
"value": "vlad.harkonnen@househarkonnen.net", "value": "john.doe@example.com",
}, },
], ],
"fromInclusive": "2024-10-04T12:34:56.000", "fromInclusive": "2024-10-04T12:34:56.000",
@ -1205,9 +1394,16 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/PostIssuedVoucherStatusInstanceRequest"
example: examples:
{ "voucherStatusId": 2, "createdOn": "2024-10-04T12:34:56.000" } 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: responses:
"200": "200":
description: OK description: OK
@ -1241,6 +1437,7 @@ paths:
{ "voucherStatusId": 3, "name": "Redeemed" }, { "voucherStatusId": 3, "name": "Redeemed" },
{ "voucherStatusId": 4, "name": "Revoked" }, { "voucherStatusId": 4, "name": "Revoked" },
{ "voucherStatusId": 5, "name": "Expired" }, { "voucherStatusId": 5, "name": "Expired" },
{ "voucherStatusId": 6, "name": "PendingRedemption" },
], ],
} }
components: components:
@ -1252,6 +1449,22 @@ components:
schemas: schemas:
unavailable: unavailable:
type: object 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: PostPurchasedTapConnectTicketRequest:
type: object type: object
required: required:
@ -1313,56 +1526,6 @@ components:
format: date-time 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. 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 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: rfc9457:
type: object type: object
properties: 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" }