Compare commits

..

No commits in common. "develop" and "features/OVPAY1312-TP-orders-incl-vouchers" have entirely different histories.

33 changed files with 1593 additions and 18195 deletions

View File

@ -8,7 +8,7 @@
</list> </list>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="temurin-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

View File

@ -1,9 +1,7 @@
# ABTProducts PUT request body generator # ABTProducts PUT request body generator
Simple tool to quickly edit HTM products via ABTProducts REST API. Simple tool to quickly edit HTM products via ABTProducts REST API.
- Requires JRE 17 - Requires JRE 21
## Generating a PUT output (that you need to supply to PUT API yourself):
- Run via: `java -jar ABTProductsPUTGenerator.jar` - Run via: `java -jar ABTProductsPUTGenerator.jar`
- Specify custom input/output path via: `java -jar ABTProductsPUTGenerator.jar <inputPath> <outputPath>` - Specify custom input/output path via: `java -jar ABTProductsPUTGenerator.jar <inputPath> <outputPath>`
- Takes a ABTProducts GET response body in JSON format (product details) - Takes a ABTProducts GET response body in JSON format (product details)
@ -12,14 +10,3 @@ Simple tool to quickly edit HTM products via ABTProducts REST API.
- `curl -X PUT -H 'Content-Type: application/json' {baseUrl}/abt/abtproducts/1.0/38 --data @output.json` - `curl -X PUT -H 'Content-Type: application/json' {baseUrl}/abt/abtproducts/1.0/38 --data @output.json`
- Default input path: /input.json - Default input path: /input.json
- Default output path: /output.json (output is overwritten if it exists) - Default output path: /output.json (output is overwritten if it exists)
## Bulk clearing (set to null) of a certain product attribute for all productIds in a product-tree (SE product reponse)
- Run via: `java -jar ABTProductsPUTGenerator.jar clearAttribute <inputPath> <attributeToClear> <environment> <wso2BearerToken>`
- Takes a SE GET product tree response body or ABTProducts GET response body in JSON format
- Also needs the attribute to clear and the WSO2 environment and valid WSO2 bearer token for that environment
- Performs the following operations:
- Finds all productId's in the given product(tree) and for each productId found:
- GETs productdetails via ABTProducts API
- Converts it to PUT request body using the functionality in the previous section
- Replaces <attributeToClear> with `null`
- Actually sends the modified PUT request body to ABTProducts PUT API

View File

@ -58,8 +58,8 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <configuration>
<source>17</source> <source>21</source>
<target>17</target> <target>21</target>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>

View File

@ -3,11 +3,8 @@ package nl.htm.ovpay.abt;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -22,15 +19,6 @@ public class ABTProductsPUTGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(ABTProductsPUTGenerator.class); private static final Logger LOGGER = LoggerFactory.getLogger(ABTProductsPUTGenerator.class);
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
LOGGER.info("Starting ABTProductsPUTGenerator with arguments {}", Arrays.stream(args).toList());
if (args.length > 0 && args[0].equalsIgnoreCase("clearAttribute")) {
clearAttribute(args);
} else {
generateOutput(args);
}
}
private static void generateOutput(String[] args) throws Exception {
if (args.length != 2) { if (args.length != 2) {
LOGGER.info("To modify input/output path, use: java -jar ABTProductsPUTGenerator.jar <inputPath> <outputPath>"); LOGGER.info("To modify input/output path, use: java -jar ABTProductsPUTGenerator.jar <inputPath> <outputPath>");
} }
@ -52,49 +40,6 @@ public class ABTProductsPUTGenerator {
} }
} }
private static void clearAttribute(String[] args) throws Exception {
if (args.length != 5) {
LOGGER.error("Incorrect input parameters!");
LOGGER.error("To clear attribute, use: java -jar ABTProductsPUTGenerator.jar clearAttribute <inputPath> <attributeToClear> <environment> <wso2BearerToken>");
return;
}
var inputFile = args[1];
var attributeToClear = args[2];
var environment = args[3];
var wso2BearerToken = args[4];
try (InputStream is = getInputStream(inputFile)) {
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(is);
var productIds = jsonNode.findValues("productId").stream().filter(JsonNode::isValueNode).map(JsonNode::asText).toList();
LOGGER.info("Found productIds to process: {}", productIds);
LOGGER.warn("Are you SURE you want to set attribute \"{}\" for all these productIds on environment {} to NULL?", attributeToClear, environment);
LOGGER.warn("Type 'yes' to continue...");
var input = new Scanner(System.in).nextLine();
if (!input.equalsIgnoreCase("yes")) {
LOGGER.info("Aborting...");
return;
}
for (var productId : productIds) {
LOGGER.info("Getting product details for product {}...", productId);
var productJsonString = APIHelper.getProductDetails(environment, productId, wso2BearerToken);
var productJsonNode = mapper.readTree(productJsonString);
var putJsonNode = processJsonNode(productJsonNode);
LOGGER.info("Clearing attribute \"{}\" from product with productId {}...", attributeToClear, productId);
((ObjectNode)putJsonNode).putRawValue(attributeToClear, null);
LOGGER.info("PUT product details for product with productId {} with cleared attribute \"{}\"...", productId, attributeToClear);
LOGGER.info("PUT product details with JSON body: {}", putJsonNode.toPrettyString());
APIHelper.putProductDetails(environment, productId, putJsonNode.toString(), wso2BearerToken);
}
LOGGER.info("DONE clearing attribute \"{}\" for productIds {}!", attributeToClear, productIds);
}
}
private static InputStream getInputStream(String filePath) throws IOException { private static InputStream getInputStream(String filePath) throws IOException {
var externalResource = new File(filePath); var externalResource = new File(filePath);
if (externalResource.exists()) { if (externalResource.exists()) {
@ -215,13 +160,8 @@ public class ABTProductsPUTGenerator {
} }
case "paymentMoment" -> { case "paymentMoment" -> {
LOGGER.info("Rewriting paymentMoment to paymentMomentId..."); LOGGER.info("Rewriting paymentMoment to paymentMomentId...");
if (jsonField.getValue().get("paymentMomentId").isNull()) { Long paymentMomentId = jsonField.getValue().get("paymentMomentId").asLong();
LOGGER.info("Rewriting null paymentMomentId..."); ((ObjectNode)newJsonNode).put("paymentMomentId", 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

@ -1,89 +0,0 @@
package nl.htm.ovpay.abt;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class APIHelper {
private static final Logger LOGGER = LoggerFactory.getLogger(APIHelper.class);
private static final String PRODUCT_DETAILS_URI = "https://services.<ENV>.api.htm.nl/abt/abtproducts/1.0/products/<PRODUCTID>";
public static String envToUriPart(String environment) {
return switch (environment) {
case "DEV" -> "dev";
case "ACC" -> "acc";
case "PRD" -> "";
default -> throw new IllegalArgumentException("Invalid environment: " + environment);
};
}
public static String getProductDetails(String environment, String productId, String wso2BearerToken) throws Exception {
var envUriPart = envToUriPart(environment);
var getProductDetailsUri = PRODUCT_DETAILS_URI.replace("<ENV>", envUriPart).replace("<PRODUCTID>", productId);
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, DummyX509TrustManager.getDummyArray(), new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
URL url = new URL(getProductDetailsUri);
URLConnection con = url.openConnection();
HttpURLConnection http = (HttpURLConnection)con;
http.setRequestMethod("GET");
http.setDoOutput(false);
http.setRequestProperty("Authorization", "Bearer " + wso2BearerToken);
http.connect();
try(InputStream is = http.getInputStream()) {
return new String(is.readAllBytes(), StandardCharsets.UTF_8);
}
}
public static void putProductDetails(String environment, String productId, String jsonBody, String wso2BearerToken) throws Exception {
var envUriPart = envToUriPart(environment);
var putProductDetailsUri = PRODUCT_DETAILS_URI.replace("<ENV>", envUriPart).replace("<PRODUCTID>", productId);
LOGGER.info("PUT product details to URI: {}", putProductDetailsUri);
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, DummyX509TrustManager.getDummyArray(), new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
URL url = new URL(putProductDetailsUri);
URLConnection con = url.openConnection();
HttpURLConnection http = (HttpURLConnection)con;
http.setRequestMethod("PUT");
http.setDoOutput(true);
http.setRequestProperty("Authorization", "Bearer " + wso2BearerToken);
http.setRequestProperty("Content-Type", "application/json");
byte[] out = jsonBody.getBytes(StandardCharsets.UTF_8);
int length = out.length;
http.setFixedLengthStreamingMode(length);
http.connect();
try(OutputStream os = http.getOutputStream()) {
os.write(out);
}
try(InputStream is = http.getInputStream()) {
LOGGER.info("Got response from PUT API: {}", new String(is.readAllBytes(), StandardCharsets.UTF_8));
}
}
}

View File

@ -1,38 +0,0 @@
package nl.htm.ovpay.abt;
import java.security.cert.X509Certificate;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public final class DummyX509TrustManager implements X509TrustManager {
private static DummyX509TrustManager INSTANCE;
private DummyX509TrustManager() {
// prevent instantiation
}
public static DummyX509TrustManager getInstance() {
if (INSTANCE == null) {
INSTANCE = new DummyX509TrustManager();
}
return INSTANCE;
}
public static TrustManager[] getDummyArray() {
if (INSTANCE == null) {
INSTANCE = new DummyX509TrustManager();
}
return new TrustManager[] { INSTANCE };
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}

View File

@ -1,33 +1,23 @@
{ {
"productId": 663, "productId": 251,
"parentProductId": null,
"layerInfo": {
"layerInfoId": 7,
"choiceKey": "isRenewable",
"choiceLabel": "Kies voor een doorlopend abonnement of een enkele termijn",
"isCustomChoice": false
},
"fikoArticleNumber": null, "fikoArticleNumber": null,
"gboPackageTemplateId": "30001", "parentProductId": null,
"gboPackageTemplateId": "30901",
"tapConnectProductCode": null, "tapConnectProductCode": null,
"productName": "Test OVPAY-2306", "productName": "MaxTestPOST-21-okt-test-1 edited PUT",
"productDescription": "Test OVPAY-2306 (sellingPeriods in kindje verwijderen en later opnieuw weer kunnen toevoegen)", "productDescription": "21-okt-test-1 edited PUT - reis met 90% korting gedurende de eerste F&F pilot!",
"validityPeriod": { "validityPeriod": null,
"validityPeriodId": 782, "productTranslations": null,
"fromInclusive": "2025-12-31T23:00:00.000Z",
"toInclusive": "2026-03-30T22:00:00.000Z"
},
"productTranslations": [],
"allowedGboAgeProfiles": [],
"productOwner": { "productOwner": {
"productOwnerId": 1, "productOwnerId": 1,
"name": "Wie dit leest", "name": "Corneel Verstoep",
"organization": "... is een aap." "organization": "HTM"
}, },
"marketSegments": [], "marketSegments": null,
"customerSegments": [], "customerSegments": null,
"allowedGboAgeProfiles": null,
"productCategory": { "productCategory": {
"productCategoryId": 1, "productCategoryId": 9,
"isTravelProduct": true, "isTravelProduct": true,
"name": "Kortingsabonnement" "name": "Kortingsabonnement"
}, },
@ -35,10 +25,32 @@
"requiredCustomerLevelId": 1, "requiredCustomerLevelId": 1,
"name": "guest" "name": "guest"
}, },
"requiredProducts": [], "requiredProducts": null,
"incompatibleProducts": [], "incompatibleProducts": null,
"mandatoryCustomerDataItems": [], "mandatoryCustomerDataItems": [
"requiredGboPersonalAttributes": [], {
"mandatoryCustomerDataItemId": 4,
"customerDataItem": "emailAddress"
},
{
"mandatoryCustomerDataItemId": 5,
"customerDataItem": "address"
}
],
"requiredGboPersonalAttributes": [
{
"requiredGboPersonalAttributeId": 1,
"name": "NAME"
},
{
"requiredGboPersonalAttributeId": 2,
"name": "BIRTHDATE"
},
{
"requiredGboPersonalAttributeId": 3,
"name": "PHOTO"
}
],
"tokenTypes": [ "tokenTypes": [
{ {
"tokenTypeId": 1, "tokenTypeId": 1,
@ -49,36 +61,72 @@
"paymentMomentId": 1, "paymentMomentId": 1,
"name": "prepaid" "name": "prepaid"
}, },
"serviceOptions": [ "serviceOptions": null,
{ "validityDuration": "P7D",
"serviceOptionId": 4, "maxStartInFutureDuration": "P6W",
"action": "cancel_notAllowed", "isRenewable": false,
"description": "Stopzetting is niet toegestaan (doorgaans in combinatie met refund_notAllowed)"
},
{
"serviceOptionId": 10,
"action": "refund_notAllowed",
"description": "Terugbetaling niet toegestaan (doorgaans in combinatie met cancel_notAllowed)"
}
],
"validityDuration": "P1W",
"maxStartInFutureDuration": "P1W",
"isRenewable": null,
"sendInvoice": false, "sendInvoice": false,
"imageReference": null, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg",
"productPageUrl": null, "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina",
"termsUrl": null, "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina",
"isSellableAtHtm": true, "isSellableAtHtm": true,
"needsSolvencyCheckConsumer": false, "needsSolvencyCheckConsumer": false,
"needsSolvencyCheckBusiness": false, "needsSolvencyCheckBusiness": false,
"sellingPeriods": [ "sellingPeriods": [
{ {
"sellingPeriodId": 1382, "sellingPeriodId": 240,
"fromInclusive": "2025-12-31T23:00:00.000Z", "fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2026-03-30T22:00:00.000Z", "toInclusive": "2024-12-29T23:59:59.000+00:00",
"salesTouchpoint": { "salesTouchpoint": {
"salesTouchpointId": 3, "salesTouchpointId": 6,
"name": "Website", "name": "Service-engine",
"isActive": true,
"retailer": {
"retailerId": 1000,
"name": "HTM intern beheer",
"street": "Koningin Julianaplein",
"number": 10,
"numberAddition": null,
"postalCode": "2595 AA",
"city": "Den Haag",
"country": "Nederland",
"emailAddress": "info@htm.nl",
"phoneNumber": "070 374 9002",
"taxId": null,
"imageReference": "https://www.htm.nl/typo3conf/ext/htm_template/Resources/Public/img/logo.svg"
}
},
"forbiddenPaymentMethods": null,
"sellingPrices": [
{
"sellingPriceId": 318,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 94,
"amountInclTax": 100,
"fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2024-12-18T23:59:59.000+00:00",
"internalPrice": 92.0000
},
{
"sellingPriceId": 319,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 98,
"amountInclTax": 102,
"fromInclusive": "2024-12-19T00:00:00.000+00:00",
"toInclusive": "2024-12-29T23:59:59.000+00:00",
"internalPrice": 0.0000
}
]
},
{
"sellingPeriodId": 241,
"fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2024-12-29T23:59:59.000+00:00",
"salesTouchpoint": {
"salesTouchpointId": 5,
"name": "Servicewinkel (Team Incident Masters)",
"isActive": true, "isActive": true,
"retailer": { "retailer": {
"retailerId": 1001, "retailerId": 1001,
@ -91,196 +139,64 @@
"country": "Nederland", "country": "Nederland",
"emailAddress": "info@htm.nl", "emailAddress": "info@htm.nl",
"phoneNumber": "070 374 9002", "phoneNumber": "070 374 9002",
"taxId": 572309345923, "taxId": null,
"imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg" "imageReference": "https://www.htm.nl/typo3conf/ext/htm_template/Resources/Public/img/logo.svg"
} }
}, },
"forbiddenPaymentMethods": [], "forbiddenPaymentMethods": [
"sellingPrices": [] {
"forbiddenPaymentMethodId": 2,
"name": "creditcard",
"issuer": "Visa"
}
],
"sellingPrices": [
{
"sellingPriceId": 320,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 94,
"amountInclTax": 100,
"fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2024-12-18T23:59:59.000+00:00",
"internalPrice": 92.0000
},
{
"sellingPriceId": 321,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 98,
"amountInclTax": 102,
"fromInclusive": "2024-12-19T00:00:00.000+00:00",
"toInclusive": "2024-12-29T23:59:59.000+00:00",
"internalPrice": 0.0000
}
]
} }
], ],
"purchasePrices": [], "purchasePrices": [
"productVariants": [
{ {
"productId": 664, "purchasePriceId": 184,
"parentProductId": 663, "taxCode": "V21",
"layerInfo": { "taxPercentage": 21.0000,
"layerInfoId": null, "amountExclTax": 0,
"choiceKey": null, "amountInclTax": 0,
"choiceLabel": null, "fromInclusive": "2024-09-01T00:00:00.000+00:00",
"isCustomChoice": false "toInclusive": "2024-12-31T23:59:59.000+00:00"
}, }
"fikoArticleNumber": null, ],
"gboPackageTemplateId": "30001", "auditTrail": [
"tapConnectProductCode": null, {
"productName": "Losse week - Test OVPAY-2306", "auditTrailId": 228,
"productDescription": "Test OVPAY-2306 (sellingPeriods in kindje verwijderen en later opnieuw weer kunnen toevoegen)", "action": "update",
"validityPeriod": { "user": "api",
"validityPeriodId": 783, "timestamp": "2024-10-21T09:00:30.410+00:00"
"fromInclusive": "2025-12-31T23:00:00.000Z",
"toInclusive": "2026-03-30T22:00:00.000Z"
},
"productTranslations": [],
"allowedGboAgeProfiles": [],
"productOwner": {
"productOwnerId": 1,
"name": "Wie dit leest",
"organization": "... is een aap."
},
"marketSegments": [],
"customerSegments": [],
"productCategory": {
"productCategoryId": 1,
"isTravelProduct": true,
"name": "Kortingsabonnement"
},
"requiredCustomerLevel": {
"requiredCustomerLevelId": 1,
"name": "guest"
},
"requiredProducts": [],
"incompatibleProducts": [],
"mandatoryCustomerDataItems": [],
"requiredGboPersonalAttributes": [],
"tokenTypes": [
{
"tokenTypeId": 1,
"name": "EMV"
}
],
"paymentMoment": {
"paymentMomentId": 1,
"name": "prepaid"
},
"serviceOptions": [
{
"serviceOptionId": 4,
"action": "cancel_notAllowed",
"description": "Stopzetting is niet toegestaan (doorgaans in combinatie met refund_notAllowed)"
},
{
"serviceOptionId": 10,
"action": "refund_notAllowed",
"description": "Terugbetaling niet toegestaan (doorgaans in combinatie met cancel_notAllowed)"
}
],
"validityDuration": "P1W",
"maxStartInFutureDuration": "P1W",
"isRenewable": false,
"sendInvoice": false,
"imageReference": null,
"productPageUrl": null,
"termsUrl": null,
"isSellableAtHtm": true,
"needsSolvencyCheckConsumer": false,
"needsSolvencyCheckBusiness": false,
"sellingPeriods": [
{
"sellingPeriodId": 1384,
"fromInclusive": "2025-12-31T23:00:00.000Z",
"toInclusive": "2026-03-30T22:00:00.000Z",
"salesTouchpoint": {
"salesTouchpointId": 3,
"name": "Website",
"isActive": true,
"retailer": {
"retailerId": 1001,
"name": "HTM externe touchpoints",
"street": "Koningin Julianaplein",
"number": 10,
"numberAddition": null,
"postalCode": "2595 AA",
"city": "Den Haag",
"country": "Nederland",
"emailAddress": "info@htm.nl",
"phoneNumber": "070 374 9002",
"taxId": 572309345923,
"imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg"
}
},
"forbiddenPaymentMethods": [],
"sellingPrices": []
}
],
"purchasePrices": [],
"productVariants": []
}, },
{ {
"productId": 665, "auditTrailId": 227,
"parentProductId": 663, "action": "insert",
"layerInfo": { "user": "api",
"layerInfoId": null, "timestamp": "2024-10-21T08:58:39.237+00:00"
"choiceKey": null,
"choiceLabel": null,
"isCustomChoice": false
},
"fikoArticleNumber": null,
"gboPackageTemplateId": "30001",
"tapConnectProductCode": null,
"productName": "Doorlopend - Test OVPAY-2306",
"productDescription": "Test OVPAY-2306 (sellingPeriods in kindje verwijderen en later opnieuw weer kunnen toevoegen)",
"validityPeriod": {
"validityPeriodId": 784,
"fromInclusive": "2025-12-31T23:00:00.000Z",
"toInclusive": "2026-03-30T22:00:00.000Z"
},
"productTranslations": [],
"allowedGboAgeProfiles": [],
"productOwner": {
"productOwnerId": 1,
"name": "Wie dit leest",
"organization": "... is een aap."
},
"marketSegments": [],
"customerSegments": [],
"productCategory": {
"productCategoryId": 1,
"isTravelProduct": true,
"name": "Kortingsabonnement"
},
"requiredCustomerLevel": {
"requiredCustomerLevelId": 1,
"name": "guest"
},
"requiredProducts": [],
"incompatibleProducts": [],
"mandatoryCustomerDataItems": [],
"requiredGboPersonalAttributes": [],
"tokenTypes": [
{
"tokenTypeId": 1,
"name": "EMV"
}
],
"paymentMoment": {
"paymentMomentId": 1,
"name": "prepaid"
},
"serviceOptions": [
{
"serviceOptionId": 4,
"action": "cancel_notAllowed",
"description": "Stopzetting is niet toegestaan (doorgaans in combinatie met refund_notAllowed)"
},
{
"serviceOptionId": 10,
"action": "refund_notAllowed",
"description": "Terugbetaling niet toegestaan (doorgaans in combinatie met cancel_notAllowed)"
}
],
"validityDuration": "P1W",
"maxStartInFutureDuration": "P1W",
"isRenewable": true,
"sendInvoice": false,
"imageReference": null,
"productPageUrl": null,
"termsUrl": null,
"isSellableAtHtm": true,
"needsSolvencyCheckConsumer": false,
"needsSolvencyCheckBusiness": false,
"sellingPeriods": [],
"purchasePrices": [],
"productVariants": []
} }
] ]
} }

View File

@ -17,10 +17,10 @@ paths:
description: > description: >
Create a claim by sending a JSON as specified in the schema. By Create a claim by sending a JSON as specified in the schema. By
specifying the chipcardnumber under 'chipkaart', specifying the chipcardnumber under 'chipkaart',
a claim for OV chipcard will be sent to the OVC API. If no
chipcardnumber is specified under 'chipkaart', a claim for EMV/OV-pas is sent a claim for OV chipcard will be send to the OVC API. If no
to Mendix, where it can be handled according to the fields present chipcardnumber is specified under 'chipkaart', a claim for EMV is send
(serviceRefId + totaalbedrag or ovPasNumber + verificationCode) to mendix.
parameters: [] parameters: []
requestBody: requestBody:
content: content:
@ -47,6 +47,8 @@ paths:
toelichting: string toelichting: string
lijn: '1' lijn: '1'
vervoertype: '1' vervoertype: '1'
serviceRefId: '1'
Totaalbedrag: 0
EMV: EMV:
value: value:
aankomsthalte: '1' aankomsthalte: '1'
@ -65,28 +67,8 @@ paths:
toelichting: string toelichting: string
lijn: '1' lijn: '1'
vervoertype: '1' vervoertype: '1'
serviceRefId: 'NLOV1234567ABCDEFG' serviceRefId: '1'
totaalbedrag: 3.14 Totaalbedrag: 0
OV-pas:
value:
aankomsthalte: '1'
instapdatum: '2024-03-06T15:20:44.549Z'
instaptijd: '2024-03-06T15:20:44.549Z'
ingecheckt: true
uitgecheckt: true
afgeschrevenbedrag: 0
vertrekhalte: string
korting: true
iban: '1234123412341234'
naam: string
emailadres: user@example.com
uitstaptijd: '2024-03-06T15:20:44.549Z'
verwachtbedrag: 0
toelichting: string
lijn: '1'
vervoertype: '1'
ovPasNumber: '63AW974'
verificationCode: '2FQ8'
responses: responses:
'200': '200':
description: ok description: ok
@ -121,19 +103,18 @@ paths:
examples: examples:
EMV: EMV:
value: value:
emailAddress: 'stasjo@htm.nl' emailAddress: 'j.beek@htm.nl'
orderNumber: 'ORD1000046' orderNumber: 'ORD1000046'
serviceReferenceId: 'NLOVA5BCD124H3Z21X' serviceReferenceId: 'NLOVA5BCD124H3Z21X'
amount: 2305 amount: 2305
iban: 'NL98INGB0003856625' iban: 'NL98INGB0003856625'
orderDate: '2025-01-13' orderDate: '2025-01-13'
productName: 'HTM 20% korting' productName: 'HTM 20% korting'
OV-pas: OVpas:
value: value:
emailAddress: 'stasjo@htm.nl' emailAddress: 'j.beek@htm.nl'
orderNumber: 'ORD1000046' orderNumber: 'ORD1000046'
ovpasNumber: '63AW974' ovpasNumber: '63AW974'
verificationCode: '2FQ8'
iban: 'NL98INGB0003856625' iban: 'NL98INGB0003856625'
orderDate: '2025-01-13' orderDate: '2025-01-13'
productName: 'HTM 20% korting' productName: 'HTM 20% korting'
@ -200,7 +181,7 @@ components:
iban: iban:
type: string type: string
description: String of length between 15 en 32 characters description: String of length between 15 en 32 characters
example: NL98INGB0003856625 example: '1234123412341234'
naam: naam:
type: string type: string
emailadres: emailadres:
@ -220,16 +201,9 @@ components:
type: string type: string
serviceRefId: serviceRefId:
type: string type: string
example: NLOV1234567ABCDEFG Totaalbedrag:
totaalbedrag:
type: number type: number
format: float format: float
ovPasNumber:
type: string
example: 63AW974
verificationCode:
type: string
example: 2FQ8
refundsEntity: refundsEntity:
required: required:
- emailAddress - emailAddress
@ -239,7 +213,7 @@ components:
emailAddress: emailAddress:
type: string type: string
format: email format: email
example: stasjo@htm.nl example: j.beek@htm.nl
orderNumber: orderNumber:
type: string type: string
example: ORD1000046 example: ORD1000046
@ -252,9 +226,6 @@ components:
ovpasNumber: ovpasNumber:
type: string type: string
example: 63AW974 example: 63AW974
verificationCode:
type: string
example: 2FQ8
iban: iban:
type: string type: string
example: NL00RABO000001337 example: NL00RABO000001337

File diff suppressed because it is too large Load Diff

View File

@ -1,417 +0,0 @@
openapi: 3.0.3
info:
title: Integration layer APIs for token storage for ABT
description: >-
APIs that give business processes access to the security and authorization state of a token within the scope of HTM. In the backend this is connected to a container which handles the accessToken en refreshToken management for an OVpas as given by GBO.
version: "1.0"
servers:
- url: https://services.acc.api.htm.nl/abt/containertokens/1.0
security:
- oAuthSample: [profile]
tags:
- name: securitytokens
paths:
/securitytokens:
post:
tags:
- securitytokens
summary: Create a new security token entry in the vault
description: Create a new security token entry in the vault, if the customerProfileId has been supplied create in the customerToken DB otherwise in the AnonymousToken DB
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateSecurityTokenBody"
examples:
token details:
value:
{
"xTat": "cf694905-7f76-4799-b0bc-490716921323",
"otpKey": "123456789123456789123456789abcde",
"customerProfileId": 12314
}
responses:
"201":
description: Created
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Missing Parameters:
value:
status: 400
title: Missing Mandatory Parameter
detail: Required parameter {0} is missing.
Invalid Parameters:
value:
status: 400
title: Invalid Parameter
detail: Required parameter {0} is invalid.
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unauthorized:
value:
status: 401
title: Unauthorized
detail: Invalid Access Token
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
TAT not found:
value:
status: 404
title: Not Found
detail: TAT Account Not Found
"409":
description: Conflict
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
TAT already exists:
value:
status: 409
title: Conflict
detail: Security Token already exists
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Internal Server Error:
value:
status: 500
title: Internal Server Error
detail: An unknown error has occurred
/securitytokens/{xTat}/status:
parameters:
- name: xTat
in: path
schema:
type: string
example: 85dbeacc-b9aa-4d5b-bdec-9319010c597f
required: true
description: The xTat of the OVpastoken for which the status needs to be checked
- name: customerProfileId
in: query
schema:
type: integer
example: 323
required: false
description: The id of the customer Profile for which the request is being done, if customer has identified themselves
get:
tags:
- securitytokens
summary: Request the security and authorization status of an OV pas token
description: Request the security and authorization status of an OV pas token, 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"
examples:
Not secured and not authorized :
summary: Not secured, not authorized
value:
{
"isAuthorized": false,
"isSecured": false
}
Secured and not authorized :
summary: Secured, not authorized
value:
{
"isAuthorized": false,
"isSecured": true
}
Secured and authorized :
summary: Secured and authorized
value:
{
"isAuthorized": true,
"isSecured": true
}
"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"
examples:
Internal Server Error:
value:
status: 500
title: Internal Server Error
detail: An unknown error has occurred
/securitytokens/{xTat}:
parameters:
- name: xTat
in: path
schema:
type: string
example: uuid
required: true
description: The xTat of the ovPastoken for which the status needs to be checked
- name: customerProfileId
in: query
schema:
type: integer
example: 323
required: false
description: The id of the customer Profile for which the request is being done, if customer has identified themselves
patch:
tags:
- securitytokens
summary: Validate the supplied OTP and secure and/or authorize the token
description: Validate the supplied OTP and secure and/or authorize the token if the customerProfileId has been supplied look in the customerToken DB otherwise check the AnonymousToken DB.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SecurityValidateTokenBody"
examples:
token:
value:
{
"otp": "123456"
}
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/SecurityTokenStatusResponse"
examples:
Not secured and not authorized :
summary: Not secured, not authorized
value:
{
"isAuthorized": false,
"isSecured": false
}
Secured and not authorized :
summary: Secured, not authorized
value:
{
"isAuthorized": false,
"isSecured": true
}
Secured and authorized :
summary: Secured and authorized
value:
{
"isAuthorized": true,
"isSecured": true
}
"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.
"422":
description: Unprocessable Entity
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Validation failed:
value:
status: 422
title: OTP validation failed
detail: The supplied OTP could not be validated
"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"
examples:
Internal Server Error:
value:
status: 500
title: Internal Server Error
detail: An unknown error has occurred
delete:
tags:
- securitytokens
summary: Delete the authorization for HTM for an ovpaytoken
description: Delete the authorization for HTM for an ovpaytoken if the customerProfileId has been supplied look in the customerToken DB otherwise check the AnonymousToken DB.
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/SecurityTokenStatusResponse"
example:
{}
components:
securitySchemes:
oAuthSample:
type: oauth2
description: This API uses OAuth 2 with the clientCredentials flow. [More info](https://api.example.com/docs/auth)
flows:
clientCredentials: # <---- OAuth flow( clientCredentials)
tokenUrl: https://identity.{env}.api.htm.nl/oauth2/token
scopes:
profile: "Access user profile"
schemas:
ErrorResponse:
description: Default response when an invalid request has been sent
type: object
properties:
status:
type: integer
description: >-
A status IS An integer that represents the HTTP status code of the
response.
example: 400
title:
type: string
description: A title IS A string that provides a brief summary of the error.
detail:
type: string
description: A detail IS A string that provides more details about the error.
CreateSecurityTokenBody:
description: Body for when the a new security token entry is created
type: object
required:
- xTat
- otpKey
properties:
xTat:
type : string
description: >-
Unique identifier for the GBO transit account
example: 03071794-482a-4168-b60f-84669a9e6a76
otpKey:
type : string
description: >-
Key used to validate the OTP at GBO
example: 123456789123456789123456789abcde
customerProfileId:
type : integer
description: >-
CustomerProfileId of the account requesting security or giving authorization
example: 123456
SecurityTokenStatusResponse:
description: Response for when the status of a token is requested
type: object
properties:
isSecured:
type: boolean
description: >-
Is the OVpas secured according to the GBO
example: false
isAuthorized:
type: boolean
description: >-
Does HTM have the authorization to access the secured the data of the OVpas
example: false
SecurityValidateTokenBody:
description: Body for when the a token entry is validated
type: object
required:
- otp
properties:
otp:
type : string
description: >-
OTP to be used to secure the token and retrieve the JWT at GBO
example: 123456

View File

@ -45,36 +45,12 @@ paths:
"contractStatus": "contractStatus":
{ "contractStatusId": 2, "name": "active" }, { "contractStatusId": 2, "name": "active" },
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting doorlopend", "productName": "HTM Maand 20% korting",
"termDuration": "P1M", "termDuration": "P0Y1M0D",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01T15:01:00.000Z", "created": "2024-08-01 15:01:00.000",
"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":
@ -92,38 +68,14 @@ paths:
"orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8", "orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8",
"touchpointId": 2, "touchpointId": 2,
"contractStatus": "contractStatus":
{ "contractStatusId": 6, "name": "pending cancellation" }, { "contractStatusId": 1, "name": "new" },
"productId": 1, "productId": 1,
"productName": "HTM 20% Korting doorlopend", "productName": "HTM Maand 20% korting",
"termDuration": "P1M", "termDuration": "P0Y1M0D",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01T15:01:00.000Z", "created": "2024-08-01 15:01:00.000",
"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":
@ -202,8 +154,8 @@ paths:
"contractStatus": "contractStatus":
{ "contractStatusId": 2, "name": "active" }, { "contractStatusId": 2, "name": "active" },
"productId": 1, "productId": 1,
"productName": "HTM 20% Korting doorlopend", "productName": "HTM Maand 20% korting",
"termDuration": "P1M", "termDuration": "P0Y1M0D",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"ovPayTokenId": 1337, "ovPayTokenId": 1337,
@ -213,22 +165,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 20% Korting doorlopend", "productName": "HTM Maand 20% korting",
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2024-08-01T15:01:00.000Z", "start": "2024-07-04 15:01:00.000",
"end": "2025-01-01T03:00:00.000Z", "end": "2024-12-31 15:01:00.000",
}, },
{ {
"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 20% Korting doorlopend", "productName": "HTM Maand 20% korting",
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2025-01-01T03:00:00.000Z", "start": "2025-01-01 15:01:00.000",
}, },
], ],
"contractActions": "contractActions":
@ -238,7 +190,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 1, "name": "create" }, { "actionTypeId": 1, "name": "create" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-02T15:01:00.000Z", "timestamp": "2024-07-02 15:01:00.000",
"details": "Contract created", "details": "Contract created",
"correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee", "correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee",
}, },
@ -247,7 +199,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 2, "name": "change" }, { "actionTypeId": 2, "name": "change" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-03T15:01:00.000Z", "timestamp": "2024-07-03 15:01:00.000",
"details": "Contract changed", "details": "Contract changed",
"correlationId": "e2462347-6749-4841-b42a-cf8de19ec727", "correlationId": "e2462347-6749-4841-b42a-cf8de19ec727",
}, },
@ -259,8 +211,8 @@ paths:
"externalReference": "F2024-0001", "externalReference": "F2024-0001",
"term": 1, "term": 1,
"invoiceDate": "2024-07-02", "invoiceDate": "2024-07-02",
"created": "2024-07-02T15:01:00.000Z", "created": "2024-07-02 15:01:00.000",
"updated": "2024-07-02T15:01:00.000Z", "updated": "2024-07-02 15:01:00.000",
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
@ -318,8 +270,8 @@ paths:
"externalReference": "F2024-0001", "externalReference": "F2024-0001",
"term": 1, "term": 1,
"invoiceDate": "2024-07-02", "invoiceDate": "2024-07-02",
"created": "2024-07-02T15:01:34.000Z", "created": "2024-07-02 15:01:34.000",
"updated": "2024-07-04T00:04:56.000Z", "updated": "2024-07-04 00:04:56.000",
"state": "invoice_created", "state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0001", "public_link": "http://mijnfactuurinzien.nl/F2024-0001",
"isCredit": false, "isCredit": false,
@ -330,8 +282,8 @@ paths:
"externalReference": "F2024-0002", "externalReference": "F2024-0002",
"term": 2, "term": 2,
"invoiceDate": "2024-08-02", "invoiceDate": "2024-08-02",
"created": "2024-08-02T15:01:34.000Z", "created": "2024-08-02 15:01:34.000",
"updated": "2024-08-04T00:04:56.000Z", "updated": "2024-08-04 00:04:56.000",
"state": "invoice_created", "state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0002", "public_link": "http://mijnfactuurinzien.nl/F2024-0002",
"isCredit": false, "isCredit": false,
@ -376,8 +328,8 @@ paths:
"cancellationMoment": "termBound", "cancellationMoment": "termBound",
"termDuration": "P1M", "termDuration": "P1M",
"billingDay": 18, "billingDay": 18,
"cancellationFrom": "2024-08-10T00:00:00Z", "cancellationFrom": "2024-08-10T00:00:00",
"cancellationUntil": "2026-08-10T00:00:00Z", "cancellationUntil": "2026-08-10T00:00:00",
} }
/contracts/{contractId}/cancellationvalidation: /contracts/{contractId}/cancellationvalidation:
parameters: parameters:
@ -430,14 +382,14 @@ paths:
{ {
"validationResult": true, "validationResult": true,
"validationMessage": "", "validationMessage": "",
"end": "2024-08-10T03:59:59Z", "end": "2024-08-10T03:59:59",
"refundAmount": 2489, "refundAmount": 2489,
"refundMethods": ["creditInvoice", "iDeal"], "refundMethods": ["creditInvoice", "iDeal"],
} }
Unsuccessful validation: Unsuccesful validation:
summary: Unsuccessful validation summary: Unsuccesful validation
description: | description: |
Unsuccessful validation. The response contains the error message. Unsuccesful validation. The response contains the error message.
value: value:
{ {
"validationResult": false, "validationResult": false,
@ -499,7 +451,7 @@ paths:
the refund amount and refund method. the refund amount and refund method.
value: value:
{ {
"end": "2024-08-10T03:59:59Z", "end": "2024-08-10T03:59:59",
"refundAmount": 2489, "refundAmount": 2489,
"refundMethod": "creditInvoice", "refundMethod": "creditInvoice",
} }
@ -564,8 +516,8 @@ paths:
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2024-07-04T15:01:00.000Z", "start": "2024-07-04 15:01:00.000",
"end": "2024-12-31T15:01:00.000Z", "end": "2024-12-31 15:01:00.000",
}, },
{ {
"contractVersionId": 2, "contractVersionId": 2,
@ -575,8 +527,7 @@ paths:
"taxCode": "V9", "taxCode": "V9",
"taxPercentage": 9.0, "taxPercentage": 9.0,
"termAmountInclTax": 400, "termAmountInclTax": 400,
"start": "2025-01-01T15:01:00.000Z", "start": "2025-01-01 15:01:00.000",
"end": null
}, },
], ],
"contractActions": "contractActions":
@ -586,7 +537,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 1, "name": "create" }, { "actionTypeId": 1, "name": "create" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-02T15:01:00.000Z", "timestamp": "2024-07-02 15:01:00.000",
"details": "Contract created", "details": "Contract created",
"correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee", "correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee",
}, },
@ -595,7 +546,7 @@ paths:
"actionType": "actionType":
{ "actionTypeId": 2, "name": "change" }, { "actionTypeId": 2, "name": "change" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-03T15:01:00.000Z", "timestamp": "2024-07-03 15:01:00.000",
"details": "Contract changed", "details": "Contract changed",
"correlationId": "e2462347-6749-4841-b42a-cf8de19ec727", "correlationId": "e2462347-6749-4841-b42a-cf8de19ec727",
}, },
@ -607,8 +558,8 @@ paths:
"externalReference": "F2024-0001", "externalReference": "F2024-0001",
"term": 1, "term": 1,
"invoiceDate": "2024-07-02", "invoiceDate": "2024-07-02",
"created": "2024-07-02T15:01:00.000Z", "created": "2024-07-02 15:01:00.000",
"updated": "2024-07-02T15:01:00.000Z", "updated": "2024-07-02 15:01:00.000",
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
@ -623,267 +574,6 @@ paths:
}, },
}, },
} }
/contracts/{uuid}/changemoments:
parameters:
- in: header
name: X-HTM-JWT-AUTH-HEADER
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: true
description: The JWT of the logged in customer.
- in: path
name: uuid
schema:
type: string
format: uuid
example: 9e224750-3065-471d-af57-85b9cffa7c89
required: true
description: The id of the contract to process.
get:
summary: Get all change moments for a given contract.
description: Get all change moments for a given contract.
tags:
- SE Contract Changes v2
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
examples:
All change moments of a contract:
summary: All change moments of a contract
description: |
All change moments of a contract. The response contains the
allowed change moments for the current contract term.
value:
{
"changeMoment": "termBound",
"termDuration": "P1M",
"billingDay": 18,
"changeFrom": "2024-08-10T00:00:00",
"changeUntil": "2024-08-10T03:59:59",
}
/contracts/{uuid}/changevalidation:
parameters:
- in: header
name: X-HTM-JWT-AUTH-HEADER
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: true
description: The JWT of the logged in customer.
- in: path
name: uuid
schema:
type: string
format: uuid
example: 9e224750-3065-471d-af57-85b9cffa7c89
required: true
description: The id of the contract to process.
post:
summary: Validate a change for a given contract.
description: Validate a change for a given contract.
tags:
- SE Contract Changes v2
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
examples:
Validate a change to another product:
summary: Validate a change to another product
description: |
Validate a change to another product. The response contains the allowed change moments for the current contract term.
value: { "productId": 124, "startDate": "2025-10-08" }
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
examples:
Successfully validated change:
summary: Successfully validated change
description: |
Successfully validated a change. The response contains the allowed change moments for the current contract term.
value:
{
"validationResult": true,
"validationMessage": "",
"contract":
{
"contractId": "15b43d9b-367a-4952-87f6-3e0fa902486f",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48",
"orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8",
"touchpointId": 2,
"contractStatus":
{ "contractStatusId": 2, "name": "active" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"created": "2024-08-01T15:01:00.000Z",
"ovPayTokenId": 1337,
"contractVersions":
[
{
"contractVersionId": 2,
"termsAndConditions": "https://www.htm.nl",
"productId": 124,
"productName": "Regiovrij Regio Centrum",
"taxCode": "V9",
"taxPercentage": 9.0,
"termAmountInclTax": 12,
"start": "2025-10-08",
},
{
"contractVersionId": 1,
"termsAndConditions": "https://www.htm.nl",
"productId": 123,
"productName": "Regiovrij Regio Zuid",
"taxCode": "V9",
"taxPercentage": 9.0,
"termAmountInclTax": 10,
"start": "2025-01-08",
"end": "2025-10-07",
},
],
},
}
Unsuccessful validation:
summary: Unsuccessful validation
description: |
Unsuccessful validation. The response contains the error message.
value:
{
"validationResult": false,
"validationMessage": "Contract status is not ACTIVE",
"contract": null,
}
/contracts/{uuid}/change:
parameters:
- in: header
name: X-HTM-JWT-AUTH-HEADER
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: true
description: The JWT of the logged in customer.
- in: path
name: uuid
schema:
type: string
format: uuid
example: 9e224750-3065-471d-af57-85b9cffa7c89
required: true
description: The id of the contract to process.
post:
summary: Change a contract.
description: Change a contract.
tags:
- SE Contract Changes v2
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
examples:
Change to another product:
summary: Change to another product
description: |
Change to another product. The response contains the details of the changed contract.
value: { "productId": 124, "startDate": "2025-10-08" }
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
examples:
Successfully changed contract:
summary: Successfully changed contract
description: |
Successfully changed a contract. The response contains the details of the changed contract.
value:
{
"contractId": "15b43d9b-367a-4952-87f6-3e0fa902486f",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48",
"orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8",
"touchpointId": 2,
"contractStatus":
{ "contractStatusId": 2, "name": "active" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"created": "2024-08-01T15:01:00.000Z",
"ovPayTokenId": 1337,
"contractVersions":
[
{
"contractVersionId": 2,
"termsAndConditions": "https://www.htm.nl",
"productId": 124,
"productName": "Regiovrij Regio Centrum",
"taxCode": "V9",
"taxPercentage": 9.0,
"termAmountInclTax": 12,
"start": "2025-10-08",
},
{
"contractVersionId": 1,
"termsAndConditions": "https://www.htm.nl",
"productId": 123,
"productName": "Regiovrij Regio Zuid",
"taxCode": "V9",
"taxPercentage": 9.0,
"termAmountInclTax": 10,
"start": "2025-01-08",
"end": "2025-10-07",
},
],
}
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
examples:
Unsuccessful change due to invalid productId:
summary: Unsuccessful change due to invalid productId
description: |
Unsuccessful change due to invalid productId. The response contains the error message.
value:
{
"type": "https://htm.nl/api/v1/probs/validationerror",
"title": "Your request is not valid.",
"detail": "The chosen parameters for this contract change are not valid.",
"instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
"errors":
[
{
"code": "CHANGE_DATE_IN_THE_PAST",
"detail": "Chosen date of contract change is in the past. This is not alllowed.",
"path": "$.startDate",
"parameter": null,
},
],
}
/contractpayments: /contractpayments:
parameters: parameters:
- in: header - in: header
@ -907,13 +597,9 @@ paths:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: examples:
Empty list: List all contract payments for a single debtor:
summary: Empty list summary: List all contract payments for a single debtor
description: List all contract payments for a debtor with no payments. description: List all contract payments for single debtor with debtor number 'D123456'.
value: { "contractPayments": [] }
Successful direct debit:
summary: Successful direct debit
description: One payment for a debtor with a successful direct debit.
value: value:
{ {
"contractPayments": "contractPayments":
@ -921,9 +607,8 @@ paths:
{ {
"paymentId": "151845776", "paymentId": "151845776",
"totalAmount": "26.62", "totalAmount": "26.62",
"paymentMethod": "Automatische incasso", "paymentMethod": "Twikey",
"paymentDate": "2024-09-12", "paymentDate": "2024-09-12",
"iban": "NL25INGB******1337",
"invoice": "invoice":
{ {
"invoiceId": "147722263", "invoiceId": "147722263",
@ -940,192 +625,23 @@ paths:
}, },
}, },
}, },
],
}
Direct debit reversal:
summary: Direct debit reversal
description: One payment for a debtor with a reversed direct debit.
value:
{
"contractPayments":
[
{ {
"paymentId": "151845776", "paymentId": "151845851",
"totalAmount": "-26.62", "totalAmount": "45.21",
"paymentMethod": "Stornering", "paymentMethod": "Twikey",
"paymentDate": "2024-09-12", "paymentDate": "2024-09-12",
"iban": "NL25INGB******1337",
"invoice": "invoice":
{ {
"invoiceId": "147722263", "invoiceId": "147722266",
"invoiceNumber": "F2024-0001", "invoiceNumber": "F2024-0002",
"description": "HTM Maandkorting 20%", "description": "HTM Maandkorting 20%",
"publicLink": "https://factuurinzien.nl/d/b0aac3f42f325f5dd6abc172f723caab5956524d/i/ddb245d6df67999eca48c4a71b5661b93038e20a", "publicLink": "https://factuurinzien.nl/d/ddb245d6df67999eca48c4a71b5661b93038e20a/i/dp5h1i5cuu94nopiolkdst3u17vkmzo",
}, },
"_links": "_links":
{ {
"get_contractdetails": "get_contractdetails":
{ {
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/5ca46c1a-cb9d-4c2d-960e-4471e8e28b6a", "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/7b2f8c1a-3d9d-4c2d-960e-4471e8e28b6a",
"method": "GET",
},
},
},
],
}
iDEAL payment:
summary: iDEAL payment
description: One payment for a debtor with an iDEAL payment.
value:
{
"contractPayments":
[
{
"paymentId": "151845776",
"totalAmount": "26.62",
"paymentMethod": "iDEAL",
"paymentDate": "2024-09-12",
"iban": "NL25INGB******1337",
"invoice":
{
"invoiceId": "147722263",
"invoiceNumber": "F2024-0001",
"description": "HTM Maandkorting 20%",
"publicLink": "https://factuurinzien.nl/d/b0aac3f42f325f5dd6abc172f723caab5956524d/i/ddb245d6df67999eca48c4a71b5661b93038e20a",
},
"_links":
{
"get_contractdetails":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/5ca46c1a-cb9d-4c2d-960e-4471e8e28b6a",
"method": "GET",
},
},
},
],
}
Bank transfer:
summary: Bank transfer
description: One payment for a debtor with a bank transfer.
value:
{
"contractPayments":
[
{
"paymentId": "151845776",
"totalAmount": "26.62",
"paymentMethod": "Overboeking",
"paymentDate": "2024-09-12",
"iban": "NL25INGB******1337",
"invoice":
{
"invoiceId": "147722263",
"invoiceNumber": "F2024-0001",
"description": "HTM Maandkorting 20%",
"publicLink": "https://factuurinzien.nl/d/b0aac3f42f325f5dd6abc172f723caab5956524d/i/ddb245d6df67999eca48c4a71b5661b93038e20a",
},
"_links":
{
"get_contractdetails":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/5ca46c1a-cb9d-4c2d-960e-4471e8e28b6a",
"method": "GET",
},
},
},
],
}
List of four payments for one invoice:
summary: List of four payments for one invoice
description: Four payments for a debtor for one invoice; a direct debit, a direct debit reversal, a bank transfer and an iDEAL payment.
value:
{
"contractPayments":
[
{
"paymentId": "151845776",
"totalAmount": "26.62",
"paymentMethod": "Automatische incasso",
"paymentDate": "2024-09-12",
"iban": "NL25INGB******1337",
"invoice":
{
"invoiceId": "147722263",
"invoiceNumber": "F2024-0001",
"description": "HTM Maandkorting 20%",
"publicLink": "https://factuurinzien.nl/d/b0aac3f42f325f5dd6abc172f723caab5956524d/i/ddb245d6df67999eca48c4a71b5661b93038e20a",
},
"_links":
{
"get_contractdetails":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/5ca46c1a-cb9d-4c2d-960e-4471e8e28b6a",
"method": "GET",
},
},
},
{
"paymentId": "151845776",
"totalAmount": "-26.62",
"paymentMethod": "Stornering",
"paymentDate": "2024-09-12",
"iban": "NL25INGB******1337",
"invoice":
{
"invoiceId": "147722263",
"invoiceNumber": "F2024-0001",
"description": "HTM Maandkorting 20%",
"publicLink": "https://factuurinzien.nl/d/b0aac3f42f325f5dd6abc172f723caab5956524d/i/ddb245d6df67999eca48c4a71b5661b93038e20a",
},
"_links":
{
"get_contractdetails":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/5ca46c1a-cb9d-4c2d-960e-4471e8e28b6a",
"method": "GET",
},
},
},
{
"paymentId": "151845777",
"totalAmount": "10.00",
"paymentMethod": "Overboeking",
"paymentDate": "2024-09-13",
"iban": "NL25INGB******1337",
"invoice":
{
"invoiceId": "147722263",
"invoiceNumber": "F2024-0001",
"description": "HTM Maandkorting 20%",
"publicLink": "https://factuurinzien.nl/d/b0aac3f42f325f5dd6abc172f723caab5956524d/i/ddb245d6df67999eca48c4a71b5661b93038e20a",
},
"_links":
{
"get_contractdetails":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/5ca46c1a-cb9d-4c2d-960e-4471e8e28b6a",
"method": "GET",
},
},
},
{
"paymentId": "151845778",
"totalAmount": "16.62",
"paymentMethod": "iDEAL",
"paymentDate": "2024-09-14",
"iban": "NL25INGB******1337",
"invoice":
{
"invoiceId": "147722263",
"invoiceNumber": "F2024-0001",
"description": "HTM Maandkorting 20%",
"publicLink": "https://factuurinzien.nl/d/b0aac3f42f325f5dd6abc172f723caab5956524d/i/ddb245d6df67999eca48c4a71b5661b93038e20a",
},
"_links":
{
"get_contractdetails":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/5ca46c1a-cb9d-4c2d-960e-4471e8e28b6a",
"method": "GET", "method": "GET",
}, },
}, },

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,617 +0,0 @@
openapi: 3.0.1
info:
title: Service Engine APIs for TAT security
description: >-
Service Engine APIs for TAT security. These are NOT the raw GBO APIs to access TAT security at GBO directly.
To be used by touch points to get secure a TAT.
version: "2.0"
servers:
- url: https://services.acc.api.htm.nl/abt/touchpoint/2.0
tags:
- name: TAT Security
paths:
/tokens/status:
parameters:
- name: X-HTM-JWT-AUTH-HEADER
in: header
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header
schema:
type: integer
example: 323
required: false
description: The id of the customer Profile
- name: X-HTM-ROLE-HEADER
in: header
schema:
type: string
example: Customer
required: false
description: The role of the HTM employee in the case of the SMP
- name: xTat
in: query
schema:
type: string
format : uuid
example: 5c4cba83-1ecd-46a4-b712-a8de0dcb7bbf
required: false
description: The xtat of the customerToken
- name: ovPayTokenId
in: query
schema:
type: integer
example: 1
required: false
description: The ovpay token id of a specific customer token
- name: serviceReferenceId
in: query
schema:
type: string
example: NLOV1234567ABCDEFG
required: false
description: The serviceReferencId found on the bankstatement for a given trip with a bankcard, required for an unknown EMV card
- name: amount
in: query
schema:
type: integer
example: 0
required: false
description: The amount of the value of the bankstatement in cents, required for an unknown EMV card
- name: ovpasNumber
in: query
schema:
type: string
example: OV34567
required: false
description: The number of the ovpas, required for an unknown Ovpas card
- name: verificationCode
in: query
schema:
type: string
example: HL78
required: false
description: The 4 digit verificationCode found on the backside of the Ovpas, required for an unknown Ovpas card
get:
tags:
- TAT Security
summary: Check the status of the security and authorization status of the given token
description: Check the status of the security and authorization status of the given token, check anonymous tokenDB if no customer headers are supplied otherwise check customer tokenDB
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/TokenStatusResponse"
examples:
isSecuredandnotAuthorized:
summary: Token is secured but HTM is not authorized
description: Token is secured but HTM is not authorized
value:
isSecured: true
isAuthorized: false
xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27
_links: {
"authorize": {
"href": "/tokens/authorizetoken",
"method": "POST"
}
}
notSecuredandnotAuthorized:
summary: Token is not secured but HTM is not authorized
description: Token is not secured but HTM is not authorized
value:
isSecured: false
isAuthorized: false
xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27
_links: {
"secure": {
"href": "/tokens/securetoken",
"method": "POST"
}
}
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Missing Parameters:
value:
status: 400
title: Missing Mandatory Parameter
detail: Required parameter {0} is missing.
Invalid Parameters:
value:
status: 400
title: Invalid Parameter
detail: Required parameter {0} is invalid.
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
TAT not found:
value:
status: 404
title: Not Found
detail: XTAT Account Not Found
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
/tokens/securetoken:
parameters:
- name: X-HTM-JWT-AUTH-HEADER
in: header
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header
schema:
type: integer
example: 323
required: false
description: The id of the customer Profile
- name: X-HTM-ROLE-HEADER
in: header
schema:
type: string
example: Customer
required: false
description: The role of the HTM employee in the case of the SMP
post:
tags:
- TAT Security
summary: Request additional OV-pas security for a token either in profile or anonymous.
description: Request additional OV-pas security for a token either in profile or anonymous
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SecureTokenRequest"
examples:
With customer account:
value:
ovPayTokenId: 42
emailAddress: stasjo@htm.nl
Without customer account:
value:
xTat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d
emailAddress: stasjo@htm.nl
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/EmailNotPreApprovedResponse"
example:
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
"409":
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
TAT Already Secured:
value:
status: 409
title: Conflict
detail: TAT Already Secured
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
/tokens/authorizetoken:
parameters:
- name: X-HTM-JWT-AUTH-HEADER
in: header
schema:
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
required: false
description: The JWT of a customer in case of touchpoint were customer logs in themselves
- name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
in: header
schema:
type: integer
example: 323
required: false
description: The id of the customer Profile
- name: X-HTM-ROLE-HEADER
in: header
schema:
type: string
example: Customer
required: false
description: The role of the HTM employee in the case of the SMP
post:
tags:
- TAT Authorization
summary: Request authorization for HTM to access the data secured by additional OV-pas security for a token either in profile or anonymous.
description: Request authorization for HTM to access the data secured by additional OV-pas security for a token either in profile or anonymous.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AuthorizeTokenRequest"
examples:
With customer account:
value:
ovPayTokenId: 42
Without customer account:
value:
xTat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/EmailNotPreApprovedResponse"
example:
recipient: xxxxxx.user@gmail.com
description: OTP Sent
_links: {
"verifyotp": {
"href": "/tokens/verifyotp",
"method": "POST"
}
}
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Missing Parameters:
value:
status: 400
title: Missing Mandatory Parameter
detail: Required parameter {0} is missing.
Invalid Parameters:
value:
status: 400
title: Invalid Parameter
detail: Required parameter {0} is invalid.
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unauthorized:
value:
status: 401
title: Unauthorized
detail: Invalid Access Token
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
TAT not found:
value:
status: 404
title: Not Found
detail: TAT Account Not Found
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
/tokens/verifyotp:
parameters:
- name: X-HTM-JWT-AUTH-HEADER
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 Verification
summary: Submit an OTP for a triggered OTP flow.
description: |
Submit an OTP for a triggered OTP flow. This can either be result of an AGO activation, or
result of an AGO authorization flow. Since the backoffice behaves slightly different depending
on which use case is executed, the calling TP needs to provide an `action` in the request body.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/VerifyOtpRequest"
examples:
OTP verification for TAT security activation for token in customer account:
value:
ovPayTokenId: 42
otp: 123456
action: secure
OTP verification for TAT security authorization for anonymous token:
value:
xTat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0
otp: 123456
action: authorize
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/VerifyOtpResponse'
examples:
Tat Secured:
value:
status: Success
description: TAT Secured
Tat Unsecured:
value:
status: Success
description: TAT Unsecured
Tat Authorized:
value:
status: Success
description: TAT Authorized
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Missing Parameters:
value:
status: 400
title: Missing Mandatory Parameter
detail: Required parameter {0} is missing.
Invalid Parameters:
value:
status: 400
title: Invalid Parameter
detail: Required parameter {0} is invalid.
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unauthorized:
value:
status: 401
title: Unauthorized
detail: Invalid Access Token
"500":
description: Internal server error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
example:
error: An unknown error has occurred
components:
schemas:
unavailable:
type: object
GenerateTatOutput:
type: object
properties:
uid:
type: string
description: >-
An uid IS A unique identifier THAT is associated with the
user.
recipient:
type: string
description: >-
A recipient IS A unique identifier THAT is associated with the
TAT owner.
key:
type: string
description: >-
A key IS a 32 character string THAT uniquely identifies the
OTP session.
EmailNotPreApprovedResponse:
type: object
description: >-
EmailNotPreApprovedResponse IS AN object THAT represents the response of
email pre-approval check.
properties:
recipient:
type: string
description: >-
A recipient IS A unique identifier THAT is associated with the TAT
owner.
example: xxxxxx.user@gmail.com
description:
type: string
description: >-
A description IS A string THAT describes the reason why the email is
not pre-approved.
example: OTP Sent
SecureTokenRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xTat:
type: string
format: uuid
example: 6134db53-9ae5-41d1-a343-36656b60b510
emailAddress:
type: string
format: email
example: stasjo@htm.nl
required:
- emailAddress
AuthorizeTokenRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xTat:
type: string
format: uuid
example: 6134db53-9ae5-41d1-a343-36656b60b510
VerifyOtpRequest:
type: object
properties:
ovPayTokenId:
type: integer
example: 42
xTat:
type: string
format: uuid
example: f3474452-e1d4-428c-b366-e5ad5965eb8c
otp:
type: string
example: 123456
action:
type: string
example: secure
required:
- otp
- action
VerifyOtpResponse:
type: object
properties:
status:
type: string
example: Success
description:
type: string
example: TAT Secured
ErrorResponse:
description: Default response when an invalid request has been sent
type: object
properties:
status:
type: integer
description: >-
A status IS An integer that represents the HTTP status code of the
response.
example: 400
title:
type: string
description: A title IS A string that provides a brief summary of the error.
detail:
type: string
description: A detail IS A string that provides more details about the error.
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

@ -243,7 +243,7 @@ paths:
suffix: PhD suffix: PhD
dateOfBirth: "2002-10-29" dateOfBirth: "2002-10-29"
emailAddresses: TEST@HTM.NL emailAddresses: TEST@HTM.NL
isEmailVerified: false isEmailVerified: True
addresses: addresses:
- addressId: 1 - addressId: 1
street: mystreet street: mystreet
@ -332,6 +332,14 @@ paths:
user: user user: user
timestamp: "2023-10-20T17:05:52.000+02:00" timestamp: "2023-10-20T17:05:52.000+02:00"
correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95 correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95
_links:
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?customerProfileId=1",
"method": "GET",
},
}
- customerProfileId: 12 - customerProfileId: 12
customerNumber: 1000002 customerNumber: 1000002
debtorNumber: DB100121 debtorNumber: DB100121
@ -369,7 +377,7 @@ paths:
suffix: PhD suffix: PhD
dateOfBirth: "2002-10-29" dateOfBirth: "2002-10-29"
emailAddresses: TEST@HTM.NL emailAddresses: TEST@HTM.NL
isEmailVerified: false isEmailVerified: False
address: address:
- addressId: 1 - addressId: 1
street: mystreet street: mystreet
@ -459,7 +467,32 @@ paths:
user: user user: user
timestamp: "2023-10-20T17:05:52.000+02:00" timestamp: "2023-10-20T17:05:52.000+02:00"
correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95 correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95
href: "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?offset=20&limit=20" _links:
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?customerProfileId=12",
"method": "GET",
},
}
_links:
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?offset=20",
"method": "GET",
},
"prev":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers",
"method": "GET",
},
"next":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?offset=40",
"method": "GET",
},
}
getCustomerActive: getCustomerActive:
summary: getCustomerActive summary: getCustomerActive
description: >- description: >-
@ -493,7 +526,7 @@ paths:
suffix: PhD suffix: PhD
dateOfBirth: "2002-10-29" dateOfBirth: "2002-10-29"
emailAddresses: TEST@HTM.NL emailAddresses: TEST@HTM.NL
isEmailVerified: false isEmailVerified: False
addresses: addresses:
- addressId: 1 - addressId: 1
street: mystreet street: mystreet
@ -582,7 +615,22 @@ paths:
user: user user: user
timestamp: "2023-10-20T17:05:52.000+02:00" timestamp: "2023-10-20T17:05:52.000+02:00"
correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95 correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95
href: https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?offset=20&limit=20 _links:
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?customerProfileId=1",
"method": "GET",
},
}
_links:
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers",
"method": "GET",
},
}
getCustomerBlocked: getCustomerBlocked:
summary: getCustomerBlocked summary: getCustomerBlocked
description: >- description: >-
@ -621,7 +669,7 @@ paths:
suffix: PhD suffix: PhD
dateOfBirth: "2002-10-29" dateOfBirth: "2002-10-29"
emailAddresses: TEST@HTM.NL emailAddresses: TEST@HTM.NL
isEmailVerified: false isEmailVerified: True
addresses: addresses:
- addressId: 1 - addressId: 1
street: mystreet street: mystreet
@ -710,7 +758,22 @@ paths:
user: user user: user
timestamp: "2023-10-20T17:05:52.000+02:00" timestamp: "2023-10-20T17:05:52.000+02:00"
correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95 correlationId: 01c6d8b4-1cd3-4f9b-85ea-c9adca53ce95
href: https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?offset=20&limit=20 _links:
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers?customerProfileId=1",
"method": "GET",
},
}
_links:
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/customers",
"method": "GET",
},
}
400: 400:
description: Bad Request description: Bad Request
content: content:
@ -772,7 +835,7 @@ paths:
suffix: jr suffix: jr
dateOfBirth: "1970-01-01" dateOfBirth: "1970-01-01"
emailAddress: j.jansen@hatseflats.nl emailAddress: j.jansen@hatseflats.nl
isEmailVerified: false isEmailVerified: False
addresses: addresses:
- street: Laan van Meerdervoort - street: Laan van Meerdervoort
houseNumber: 5 houseNumber: 5
@ -871,7 +934,7 @@ paths:
suffix: "jr", suffix: "jr",
dateOfBirth: "1970-01-01", dateOfBirth: "1970-01-01",
emailAddress: "TEST@TEST1.NL", emailAddress: "TEST@TEST1.NL",
isEmailVerified: false isEmailVerified: False
} }
updateCompleteEntity: updateCompleteEntity:
value: value:
@ -883,7 +946,7 @@ paths:
suffix: "jr", suffix: "jr",
dateOfBirth: "1970-01-01", dateOfBirth: "1970-01-01",
emailAddress: "TEST@TEST1.NL", emailAddress: "TEST@TEST1.NL",
isEmailVerified: false isEmailVerified: True
} }
required: true required: true
responses: responses:
@ -1240,6 +1303,7 @@ paths:
name: externalDeviceId name: externalDeviceId
schema: schema:
type: string type: string
format: uuid
example: c5545584-04af-4c60-a955-d6a70baab848 example: c5545584-04af-4c60-a955-d6a70baab848
required: false required: false
description: The external id of the device. description: The external id of the device.
@ -1375,7 +1439,13 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/patchDeviceResponse" $ref: "#/components/schemas/getDevices"
examples:
updateDeviceResponse:
value:
deviceId: "5bedce29-af0c-4f3c-b182-2caa8a1f9377"
externalDeviceId: "7122a988-a00a-417d-a5b4-da2d91354976"
alias: "iPhone zakelijk"
security: security:
- default: [] - default: []
@ -1538,7 +1608,24 @@ paths:
"replacedByTokenId": 12, "replacedByTokenId": 12,
}, },
], ],
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/ovPayTokens?offset=20&limit=20" "_links":
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/ovPayTokens?offset=20",
"method": "GET",
},
"prev":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/ovPayTokens",
"method": "GET",
},
"next":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/ovPayTokens?offset=40",
"method": "GET",
},
},
} }
/customers/{customerProfileId}/ovpaytokens: /customers/{customerProfileId}/ovpaytokens:
post: post:
@ -1857,10 +1944,9 @@ paths:
"created": "2024-10-20T17:05:52.000", "created": "2024-10-20T17:05:52.000",
}, },
], ],
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/billingInformations?offset=20&limit=20"
} }
getBillingInformationSingleSpecificCustomer: getBillingInformationSingleSpecificCustomer:
summary: Get single billing information entity for a specific customers summary: Get singel billing information entity for a specific customers
description: >- description: >-
Found one billing information matching the search parameters Found one billing information matching the search parameters
value: value:
@ -2050,7 +2136,59 @@ paths:
"updateTimestamp": "2024-03-22T08:55:00", "updateTimestamp": "2024-03-22T08:55:00",
}, },
], ],
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/directdebitmandates?offset=20&limit=20" "_links":
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/directdebitmandates",
"method": "GET",
},
"next":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/directdebitmandates?offset=20",
"method": "GET",
},
},
}
getDirectDebitMandateWithNextPageandPreviousPage:
value:
{
"directDebitMandates":
[
{
"directDebitMandateId": 71,
"customerProfileId": 12,
"billingInformationId": 51,
"directDebitMandateType":
{
"directDebitMandateTypeId": 1,
"name": "import",
"description": "import",
},
"created": "2024-03-22T08:55:00",
"mandateReference": "CORE01",
"mandateState": "SIGNED",
"updateTimestamp": "2024-03-22T08:55:00",
},
],
"_links":
{
"self":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/directdebitmandates?offset=20",
"method": "GET",
},
"prev":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/directdebitmandates",
"method": "GET",
},
"next":
{
"href": "https://api.integratielaag.nl/abt/abtcustomers/2.0/directdebitmandates?offset=40",
"method": "GET",
},
},
} }
/billingInformation/{billingInformationId}/directdebitmandates: /billingInformation/{billingInformationId}/directdebitmandates:
post: post:
@ -2342,6 +2480,7 @@ components:
format: uuid format: uuid
externalDeviceId: externalDeviceId:
type: string type: string
format: uuid
alias: alias:
type: string type: string
required: required:
@ -2460,6 +2599,7 @@ components:
properties: properties:
externalDeviceId: externalDeviceId:
type: string type: string
format: uuid
alias: alias:
type: string type: string
defaultCustomerProfileResponse: defaultCustomerProfileResponse:
@ -2706,7 +2846,7 @@ components:
emailAddress: emailAddress:
type: string type: string
isEmailVerified: isEmailVerified:
type: boolean type: string
postOvPayTokenResponse: postOvPayTokenResponse:
type: object type: object
properties: properties:
@ -2720,14 +2860,6 @@ components:
type: array type: array
items: items:
$ref: "#/components/schemas/getDeviceEntity" $ref: "#/components/schemas/getDeviceEntity"
patchDeviceResponse:
type: object
properties:
deviceId:
type: string
format: uuid
example: "b2c8a8c6-3d1c-4b6b-8f8d-3a6a1b6a1b6a"
getDeviceEntity: getDeviceEntity:
type: object type: object
properties: properties:
@ -2738,6 +2870,7 @@ components:
type: integer type: integer
externalDeviceId: externalDeviceId:
type: string type: string
format: uuid
alias: alias:
type: string type: string
required: required:

File diff suppressed because it is too large Load Diff

View File

@ -417,56 +417,38 @@ paths:
example: example:
Entries: Entries:
phoneTypes: phoneTypes:
- name: Mobiel - name: mobile
id: 1 id: 1
- name: Thuis - name: fixed line
id: 2 id: 2
- name: Ouders
id: 3
- name: Bewindvoerder
id: 4
- name: Home
id: 5
- name: Mobile
id: 6
- name: Work
id: 7
- name: Noodtelefoon
id: 8
addressTypes: addressTypes:
- name: Shipping - name: home
id: 1 id: 1
- name: Billing - name: office
id: 2 id: 2
customerStatuses: customerStatuses:
- name: Inactive - name: active
id: 1 id: 1
- name: Active - name: blocked
id: 2 id: 2
- name: Blocked - name: inactive
id: 3 id: 3
- name: Frozen - name: new
id: 4 id: 4
- name: Cleared
id: 5
tokenTypes: tokenTypes:
- name: EMV - name: Debit card
id: 1 id: 1
- name: OVPas physical - name: Credit card
id: 2 id: 2
- name: OVPas digital - name: OVPas physical
id: 3 id: 3
- name: OVPas digital
id: 4
directDebitMandateTypes: directDebitMandateTypes:
- name: Paper Contract - name: Paper Contract
id: 1 id: 1
- name: PIN transaction - name: PIN transaction
id: 2 id: 2
- name: SEPA eMandate
id: 3
- name: Digital signature
id: 4
- name: IDEAL transaction
id: 5
tokenStatuses: tokenStatuses:
- name: Expired - name: Expired
id: 1 id: 1

File diff suppressed because it is too large Load Diff

View File

@ -49,8 +49,6 @@ 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
@ -81,8 +79,6 @@ paths:
- status - status
- aggregationReference - aggregationReference
- accountingSystemReference - accountingSystemReference
- createdOn
- lastUpdatedOn
responses: responses:
"200": "200":
description: OK description: OK
@ -121,9 +117,7 @@ paths:
articleNumber: "4031" articleNumber: "4031"
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
@ -142,9 +136,7 @@ paths:
articleNumber: "4051" articleNumber: "4051"
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
@ -163,9 +155,7 @@ paths:
articleNumber: "4051" articleNumber: "4051"
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
@ -184,9 +174,7 @@ paths:
articleNumber: "4051" articleNumber: "4051"
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
@ -205,9 +193,7 @@ paths:
articleNumber: "4051" articleNumber: "4051"
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
@ -226,9 +212,7 @@ paths:
articleNumber: "1737" articleNumber: "1737"
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
@ -450,7 +434,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.3 - Failures v2.2
requestBody: requestBody:
required: true required: true
content: content:
@ -471,7 +455,6 @@ 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
@ -489,6 +472,67 @@ 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.
@ -520,7 +564,6 @@ 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
@ -541,7 +584,6 @@ paths:
- action - action
- status - status
- correlationId - correlationId
- journalEntryId
- name: $expand - name: $expand
in: query in: query
description: Expand related entities description: Expand related entities
@ -555,7 +597,6 @@ paths:
type: string type: string
enum: enum:
- TransactionItem - TransactionItem
- JournalEntry
responses: responses:
"200": "200":
description: OK description: OK
@ -586,7 +627,6 @@ 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
@ -597,7 +637,6 @@ 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
@ -608,7 +647,6 @@ 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
@ -619,7 +657,6 @@ 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`).
@ -636,7 +673,6 @@ 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
@ -647,7 +683,6 @@ 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
@ -658,7 +693,6 @@ 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
@ -669,7 +703,6 @@ 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).
@ -686,7 +719,6 @@ 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
@ -697,7 +729,6 @@ 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
@ -708,7 +739,6 @@ 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
@ -719,7 +749,6 @@ 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
@ -757,7 +786,6 @@ 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
@ -780,7 +808,6 @@ paths:
- reasonDescription - reasonDescription
- resolved - resolved
- change - change
- journalEntryId
- name: $expand - name: $expand
in: query in: query
description: Expand related entities description: Expand related entities
@ -793,8 +820,7 @@ paths:
items: items:
type: string type: string
enum: enum:
- TransactionItem - TransactionItem
- JournalEntry
responses: responses:
"200": "200":
description: OK description: OK
@ -830,7 +856,6 @@ 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
@ -841,8 +866,7 @@ paths:
reasonCode: "002" reasonCode: "002"
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
@ -853,8 +877,7 @@ paths:
reasonCode: "001" reasonCode: "001"
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: |
@ -873,8 +896,7 @@ paths:
reasonCode: "009" reasonCode: "009"
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
@ -885,8 +907,7 @@ paths:
reasonCode: "002" reasonCode: "002"
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
@ -897,8 +918,7 @@ paths:
reasonCode: "001" reasonCode: "001"
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
@ -949,415 +969,6 @@ 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.
@ -3705,16 +3316,6 @@ 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:
@ -3950,11 +3551,6 @@ 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
@ -4021,11 +3617,6 @@ 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
@ -4090,11 +3681,6 @@ 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
@ -4168,11 +3754,6 @@ 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
@ -4180,89 +3761,6 @@ 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

@ -57,12 +57,12 @@ paths:
required: false required: false
description: The id of the touch point where the order was initiated. description: The id of the touch point where the order was initiated.
- in: query - in: query
name: externalDeviceId name: deviceId
schema: schema:
type: string type: string
example: "7a28bd54-7ca9-499a-a722-d15ab858ab99" example: "7a28bd54-7ca9-499a-a722-d15ab858ab99"
required: false required: false
description: The external id of the device used to place the order. description: The id of the device used to place the order.
- in: query - in: query
name: languageId name: languageId
schema: schema:
@ -111,6 +111,14 @@ 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
@ -132,7 +140,7 @@ paths:
"touchPointId": 1, "touchPointId": 1,
"name": "Perplex" "name": "Perplex"
}, },
"externalDeviceId": "42e77532-d831-41da-b07a-7edb9bb7f004", "deviceId": "42e77532-d831-41da-b07a-7edb9bb7f004",
"language": "language":
{ {
"languageId": 1, "languageId": 1,
@ -162,24 +170,46 @@ paths:
"description": "Betaling in behandeling", "description": "Betaling in behandeling",
}, },
], ],
"orderVouchers": [ "order_OrderVouchers": [
{ {
"orderVoucherId": "399bd3b3-9721-4f09-a936-d64637de1621", "order_OrderVoucherId": "399bd3b3-9721-4f09-a936-d64637de1621",
"issuedVoucher":{ "issuedVoucher":{
"issuedVoucherId": "a0996218-bc5e-4826-9020-cda98a32838d", "issuedVoucherId": "a0996218-bc5e-4826-9020-cda98a32838d",
"voucherCode": "Voucher1234", "voucherCode": "Voucher1234",
"purchasedProductId": 31, "voucherStatusInstances":
[
{
"voucherStatus":
{
"voucherStatusId": 2,
"name": "issued"
},
"createdOn": "2025-11-22T13:00:00"
}
],
"productId": 31,
"fromInclusive": "2025-03-22T08:55:00", "fromInclusive": "2025-03-22T08:55:00",
"untillInclusive": "2026-03-22T08:55:00" "untillInclusive": "2026-03-22T08:55:00"
}, },
"orderLineId": null "orderLineId": null
}, },
{ {
"orderVoucherId": "f6c7ac42-1811-4e4d-82af-53e18fe16110", "order_OrderVoucherId": "f6c7ac42-1811-4e4d-82af-53e18fe16110",
"issuedVoucher":{ "issuedVoucher":{
"issuedVoucherId": "54668baf-4905-4e9a-af02-09c170f295ed", "issuedVoucherId": "54668baf-4905-4e9a-af02-09c170f295ed",
"voucherCode": "Voucher124", "voucherCode": "Voucher124",
"purchasedProductId": 35, "voucherStatusInstances":
[
{
"voucherStatus":
{
"voucherStatusId": 2,
"name": "issued"
},
"createdOn": "2025-11-22T13:00:00"
}
],
"productId": 35,
"fromInclusive": "2025-03-22T08:55:00", "fromInclusive": "2025-03-22T08:55:00",
"untillInclusive": "2026-03-22T08:55:00" "untillInclusive": "2026-03-22T08:55:00"
}, },
@ -315,7 +345,7 @@ paths:
{ {
"orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893", "orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893",
"addressType": "addressType":
{ "addressTypeId": 2, "name": "Billing" }, { "addressTypeId": 3, "name": "Billing" },
"street": "Kon. Julianaplein", "street": "Kon. Julianaplein",
"houseNumber": 10, "houseNumber": 10,
"houseNumberSuffix": "a", "houseNumberSuffix": "a",
@ -365,7 +395,7 @@ paths:
"customerProfileId": 1337, "customerProfileId": 1337,
"totalAmount": 121, "totalAmount": 121,
"touchPointId": 1, "touchPointId": 1,
"externalDeviceId": "b8ca9fdf-0bb9-4e49-b48d-41e395563377", "deviceId": "b8ca9fdf-0bb9-4e49-b48d-41e395563377",
"languageId": 1, "languageId": 1,
"createdOn": "2024-03-22T09:00:00", "createdOn": "2024-03-22T09:00:00",
"order_OrderStatus": "order_OrderStatus":
@ -376,7 +406,7 @@ paths:
"description": "Concept order", "description": "Concept order",
}, },
], ],
"orderVouchers": "order_OrderVouchers":
[ [
{ {
"issuedVoucherId": "e81b2197-a6c2-45b6-9560-8ce8442e8604", "issuedVoucherId": "e81b2197-a6c2-45b6-9560-8ce8442e8604",
@ -477,7 +507,7 @@ paths:
"touchPointId": 1, "touchPointId": 1,
"name": "Perplex" "name": "Perplex"
}, },
"externalDeviceId": null, "deviceId": null,
"language": "language":
{ {
"languageId": 1, "languageId": 1,
@ -503,7 +533,7 @@ paths:
"description": "Betaling in behandeling", "description": "Betaling in behandeling",
}, },
], ],
"orderVouchers": null, "order_OrderVouchers": null,
"orderLines": "orderLines":
[ [
{ {
@ -626,7 +656,7 @@ paths:
{ {
"orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893", "orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893",
"addressType": "addressType":
{ "addressTypeId": 2, "name": "Billing" }, { "addressTypeId": 3, "name": "Billing" },
"street": "Kon. Julianaplein", "street": "Kon. Julianaplein",
"houseNumber": 10, "houseNumber": 10,
"houseNumberSuffix": "a", "houseNumberSuffix": "a",
@ -650,7 +680,7 @@ paths:
example: example:
{ {
"customerProfileId": 1337, "customerProfileId": 1337,
"externalDeviceId": "fe68e624-b75f-48ca-a179-d5f86a8ab7d5", "deviceId": "fe68e624-b75f-48ca-a179-d5f86a8ab7d5",
"totalAmount": 121, "totalAmount": 121,
"languageId": 1, "languageId": 1,
"lastUpdatedOn": "2024-03-22T09:00:00", "lastUpdatedOn": "2024-03-22T09:00:00",
@ -743,12 +773,12 @@ paths:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
example: example:
{ {
"orderVoucherId": "b9cf0096-4211-4be6-ac21-7bc34bc8e066", "order_orderVoucherId": "b9cf0096-4211-4be6-ac21-7bc34bc8e066",
} }
/ordervouchers: /ordervouchers:
parameters: parameters:
- in: query - in: query
name: orderVoucherId name: order_OrderVoucherId
schema: schema:
type: string type: string
format: uuid format: uuid
@ -769,13 +799,6 @@ 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
@ -791,22 +814,15 @@ paths:
example: example:
[ [
{ {
"orderVoucherId": "19ef6882-8eda-43bf-b48e-9b4ff8745a50", "order_OrderVoucherId": "19ef6882-8eda-43bf-b48e-9b4ff8745a50",
"issuedVoucher":{
"issuedVoucherId": "54668baf-4905-4e9a-af02-09c170f295ed",
"voucherCode": "Voucher124",
"purchasedProductId": 35,
"fromInclusive": "2025-03-22T08:55:00",
"untillInclusive": "2026-03-22T08:55:00"
},
"orderId": "f59e4769-53a0-4156-8991-6f9119ba629f", "orderId": "f59e4769-53a0-4156-8991-6f9119ba629f",
"orderLineId": "eeb86071-4f59-405d-b2be-7d7a77044bfa" "orderLineId": "eeb86071-4f59-405d-b2be-7d7a77044bfa"
} }
] ]
/ordervouchers/{ordervoucherId}: /ordervouchers/{order_ordervoucherId}:
parameters: parameters:
- in: path - in: path
name: ordervoucherId name: order_ordervoucherId
schema: schema:
type: string type: string
format: uuid format: uuid
@ -837,7 +853,7 @@ paths:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
example: example:
{ {
"orderVoucherId": "b9cf0096-4211-4be6-ac21-7bc34bc8e066", "order_orderVoucherId": "b9cf0096-4211-4be6-ac21-7bc34bc8e066",
} }
delete: delete:
summary: Delete an order voucher. summary: Delete an order voucher.
@ -958,7 +974,7 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
Minimum orderline requestBody: Minimum orderline requestBody:
value: value:
{ {
@ -1044,7 +1060,7 @@ paths:
"orderCustomerAddresses": "orderCustomerAddresses":
[ [
{ {
"addressTypeId": 2, "addressTypeId": 3,
"street": "Kon. Julianaplein", "street": "Kon. Julianaplein",
"houseNumber": 10, "houseNumber": 10,
"houseNumberSuffix": "a", "houseNumberSuffix": "a",
@ -1982,6 +1998,7 @@ paths:
"touchPointId": 1, "touchPointId": 1,
"name": "Perplex" "name": "Perplex"
}, },
"deviceId": null,
"isRefund": false, "isRefund": false,
"htmPaymentReference": "HTM-1234", "htmPaymentReference": "HTM-1234",
"pspPaymentReference": "Buckaroo-1234", "pspPaymentReference": "Buckaroo-1234",
@ -2325,7 +2342,7 @@ paths:
{ {
"orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893", "orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893",
"addressType": "addressType":
{ "addressTypeId": 2, "name": "Billing" }, { "addressTypeId": 3, "name": "Billing" },
"street": "Kon. Julianaplein", "street": "Kon. Julianaplein",
"houseNumber": 10, "houseNumber": 10,
"houseNumberSuffix": "a", "houseNumberSuffix": "a",
@ -2395,7 +2412,7 @@ paths:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
example: example:
{ {
"addressTypeId": 2, "addressTypeId": 3,
"street": "Kon. Julianaplein", "street": "Kon. Julianaplein",
"houseNumber": 10, "houseNumber": 10,
"houseNumberSuffix": "a", "houseNumberSuffix": "a",
@ -2445,7 +2462,7 @@ paths:
type: integer type: integer
explode: false explode: false
required: false required: false
description: Filter on possible types of addresses. 1 = Shipping, 2 = Billing. description: Filter on possible types of addresses. 1 = Shipping, 3 = Billing.
- in: query - in: query
name: street name: street
schema: schema:
@ -2501,7 +2518,7 @@ paths:
"orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893", "orderCustomerAddressId": "aa50047c-58ac-4f15-9448-ee000dfc6893",
"orderCustomerId": "540d8b7a-d626-443f-8f99-c24398604d7a", "orderCustomerId": "540d8b7a-d626-443f-8f99-c24398604d7a",
"orderId": "73cca95a-81d1-468f-a8bf-99b36367001a", "orderId": "73cca95a-81d1-468f-a8bf-99b36367001a",
"addressType": { "addressTypeId": 2, "name": "Billing" }, "addressType": { "addressTypeId": 3, "name": "Billing" },
"street": "Kon. Julianaplein", "street": "Kon. Julianaplein",
"houseNumber": 10, "houseNumber": 10,
"houseNumberSuffix": "a", "houseNumberSuffix": "a",

File diff suppressed because it is too large Load Diff

View File

@ -313,7 +313,6 @@ paths:
{ {
"productId": 24, "productId": 24,
"parentProductId": null, "parentProductId": null,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "30901", "gboPackageTemplateId": "30901",
@ -430,7 +429,6 @@ paths:
{ {
"productId": 126, "productId": 126,
"parentProductId": null, "parentProductId": null,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 1, "layerInfoId": 1,
"choiceKey": "isRenewable", "choiceKey": "isRenewable",
@ -539,7 +537,6 @@ paths:
{ {
"productId": 119, "productId": 119,
"parentProductId": 126, "parentProductId": 126,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "30001", "gboPackageTemplateId": "30001",
@ -655,7 +652,6 @@ paths:
{ {
"productId": 120, "productId": 120,
"parentProductId": 126, "parentProductId": 126,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "30001", "gboPackageTemplateId": "30001",
@ -783,7 +779,6 @@ paths:
{ {
"productId": 49, "productId": 49,
"parentProductId": null, "parentProductId": null,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 2, "layerInfoId": 2,
"choiceKey": "regio", "choiceKey": "regio",
@ -931,7 +926,6 @@ paths:
{ {
"productId": 109, "productId": 109,
"parentProductId": 49, "parentProductId": 49,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 3, "layerInfoId": 3,
"choiceKey": "allowedGboAgeProfiles", "choiceKey": "allowedGboAgeProfiles",
@ -1082,7 +1076,6 @@ paths:
{ {
"productId": 114, "productId": 114,
"parentProductId": 109, "parentProductId": 109,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 1, "layerInfoId": 1,
"choiceKey": "isRenewable", "choiceKey": "isRenewable",
@ -1233,7 +1226,6 @@ paths:
{ {
"productId": 115, "productId": 115,
"parentProductId": 109, "parentProductId": 109,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 1, "layerInfoId": 1,
"choiceKey": "isRenewable", "choiceKey": "isRenewable",
@ -1385,7 +1377,6 @@ paths:
{ {
"productId": 116, "productId": 116,
"parentProductId": 115, "parentProductId": 115,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "33615", "gboPackageTemplateId": "33615",
@ -1535,7 +1526,6 @@ paths:
{ {
"productId": 117, "productId": 117,
"parentProductId": 115, "parentProductId": 115,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "33615", "gboPackageTemplateId": "33615",
@ -1689,7 +1679,6 @@ paths:
{ {
"productId": 112, "productId": 112,
"parentProductId": 49, "parentProductId": 49,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 3, "layerInfoId": 3,
"choiceKey": "allowedGboAgeProfiles", "choiceKey": "allowedGboAgeProfiles",
@ -2161,10 +2150,6 @@ components:
parentProductId: parentProductId:
type: integer type: integer
example: 1 example: 1
needsVoucher:
type: boolean
description: Indicates if the product needs a voucher (with this productId as requiredProductId) to be bought - if false, this is optional, but still allowed
example: false
layerInfo: layerInfo:
$ref: '#/components/schemas/LayerInfoResponse' $ref: '#/components/schemas/LayerInfoResponse'
fikoArticleNumber: fikoArticleNumber:

View File

@ -313,7 +313,6 @@ paths:
{ {
"productId": 24, "productId": 24,
"parentProductId": null, "parentProductId": null,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "30901", "gboPackageTemplateId": "30901",
@ -430,7 +429,6 @@ paths:
{ {
"productId": 126, "productId": 126,
"parentProductId": null, "parentProductId": null,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 1, "layerInfoId": 1,
"choiceKey": "isRenewable", "choiceKey": "isRenewable",
@ -539,7 +537,6 @@ paths:
{ {
"productId": 119, "productId": 119,
"parentProductId": 126, "parentProductId": 126,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "30001", "gboPackageTemplateId": "30001",
@ -655,7 +652,6 @@ paths:
{ {
"productId": 120, "productId": 120,
"parentProductId": 126, "parentProductId": 126,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "30001", "gboPackageTemplateId": "30001",
@ -783,7 +779,6 @@ paths:
{ {
"productId": 49, "productId": 49,
"parentProductId": null, "parentProductId": null,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 2, "layerInfoId": 2,
"choiceKey": "regio", "choiceKey": "regio",
@ -931,7 +926,6 @@ paths:
{ {
"productId": 109, "productId": 109,
"parentProductId": 49, "parentProductId": 49,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 3, "layerInfoId": 3,
"choiceKey": "allowedGboAgeProfiles", "choiceKey": "allowedGboAgeProfiles",
@ -1082,7 +1076,6 @@ paths:
{ {
"productId": 114, "productId": 114,
"parentProductId": 109, "parentProductId": 109,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 1, "layerInfoId": 1,
"choiceKey": "isRenewable", "choiceKey": "isRenewable",
@ -1233,7 +1226,6 @@ paths:
{ {
"productId": 115, "productId": 115,
"parentProductId": 109, "parentProductId": 109,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 1, "layerInfoId": 1,
"choiceKey": "isRenewable", "choiceKey": "isRenewable",
@ -1385,7 +1377,6 @@ paths:
{ {
"productId": 116, "productId": 116,
"parentProductId": 115, "parentProductId": 115,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "33615", "gboPackageTemplateId": "33615",
@ -1535,7 +1526,6 @@ paths:
{ {
"productId": 117, "productId": 117,
"parentProductId": 115, "parentProductId": 115,
"needsVoucher": false,
"layerInfo": null, "layerInfo": null,
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"gboPackageTemplateId": "33615", "gboPackageTemplateId": "33615",
@ -1689,7 +1679,6 @@ paths:
{ {
"productId": 112, "productId": 112,
"parentProductId": 49, "parentProductId": 49,
"needsVoucher": false,
"layerInfo": { "layerInfo": {
"layerInfoId": 3, "layerInfoId": 3,
"choiceKey": "allowedGboAgeProfiles", "choiceKey": "allowedGboAgeProfiles",
@ -2161,10 +2150,6 @@ components:
parentProductId: parentProductId:
type: integer type: integer
example: 1 example: 1
needsVoucher:
type: boolean
description: Indicates if the product needs a voucher (with this productId as requiredProductId) to be bought - if false, this is optional, but still allowed
example: false
layerInfo: layerInfo:
$ref: '#/components/schemas/LayerInfoResponse' $ref: '#/components/schemas/LayerInfoResponse'
fikoArticleNumber: fikoArticleNumber:

View File

@ -1,400 +0,0 @@
openapi: 3.0.1
info:
title: Service Engine APIs for HTM voucher for sales Touchpoint
description: Service Engine APIs for HTM vouchers. These are NOT the CRUD APIs to the data hub. These ARE the APIs for sales touchpoints.
version: "1.0"
servers:
- url: https://services.acc.api.htm.nl/abt/abtvouchersTouchpoint/1.0
paths:
/issuedvouchers/{voucherCode}:
get:
summary: Get details of a voucher, that was issued for a specific touchpoint
description:
Get details of an issued voucher for a specific touchpoint. This means that only products that the calling touchpoint is allowed to see or sell
(i.e. has active sellingPeriods for touchPointId of the calling touchpoint) are returned.
parameters:
- name: voucherCode
in: path
required: true
description: The unique code of the issued voucher to retrieve.
schema:
type: string
example: VOUCHER123
tags:
- Vouchers
responses:
"200":
description: Successful retrieval of voucher instance
content:
application/json:
schema:
$ref: "#/components/schemas/salesTouchpointIssuedVoucherResponse"
examples:
Voucher that grants a voucher-only product for free:
summary: Voucher that grants a voucher-only product for free
description: |-
Voucher that grants a product (that can only be acquired via a voucher) for free.
In this case, the voucher has an amountInclTax of 0. If the requiredProduct has a
non-zero sellingPrice (amountInclTax), the difference between sellingPrice and
voucher amountInclTax represents the granted discount. If the requiredProduct has
a sellingPrice of 0, no "discount" is shown; just the voucher's amountInclTax.
value:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"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_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/products/982",
"method": "GET",
},
},
},
]
},
"mandatoryCustomerDataItems":
[
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate"
}
]
}
Voucher that grants a hybrid product for a reduced price:
summary: Voucher that grants a hybrid product for a reduced price
description: |-
Voucher that grants a hybrid product (that can be acquired via voucher or via ordinary order flow)
for a reduced price. In this case, the voucher has an amountInclTax > 0, which dictates the (modified)
total amount that needs to be paid for said product. If the requiredProduct has a
non-zero sellingPrice (amountInclTax), the difference between sellingPrice and
voucher amountInclTax represents the granted discount. If the requiredProduct has
a sellingPrice of 0, no "discount" is shown; just the voucher's amountInclTax./
Specifically, in this example, the product "HTM 20% Korting" can be purchased for 1 euro instead of 5 euro.
value:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"product":
{
"productId": 264,
"productName": "Kortingsvoucher HTM 20% Korting ",
"productDescription": "Voucher waarmee het product \"HTM 20% Korting\" voor een lagere prijs kan worden aangeschaft.",
"amountInclTax": 100,
"requiredProducts":
[
{
"productId": 984,
"productName": "HTM 20% Korting",
"productDescription": "Reis met 20% korting op je betaalpas bij HTM.",
"productCategory":
{
"productCategoryId": 1,
"isTravelProduct": true,
"name": "Kortingsabonnement",
},
"amountInclTax": 500,
"_links":
{
"get_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/products/984",
"method": "GET",
},
},
},
]
},
"mandatoryCustomerDataItems": []
}
Voucher that grants a discount for a whole order:
summary: Voucher that grants a discount for a whole order
description: |-
Voucher that grants a discount for a whole order. In this case, no requiredProduct is specified, and
the voucher has an amountInclTax < 0. The (negative) amountInclTax dictates the value of the voucher,
that is subtracted from the total order value as a discount (with a minimum order total of 0).
value:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"product":
{
"productId": 265,
"productName": "Voucher 10 euro korting",
"productDescription": "Voucher die 10 euro korting geeft op je gehele winkelmand.",
"amountInclTax": -1000,
"requiredProducts": []
},
"mandatoryCustomerDataItems": []
}
"403":
description: Forbidden
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Access denied due to insufficient permissions:
summary: Access denied due to insufficient permissions
value:
{
"type": "https://example.com/probs/forbidden",
"title": "Access denied",
"detail": "You do not have permission to access this resource.",
"instance": "/issuedvouchers",
}
"400":
description: Bad request
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Invalid voucher code:
summary: Invalid voucher code
value:
{
"type": "https://example.com/probs/bad-request",
"title": "Invalid voucher code",
"detail": "No valid voucher found for code VOUCHER123.",
"instance": "/issuedvouchers",
}
"500":
description: Internal server error
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Unexpected server error:
summary: Unexpected server error
value:
{
"type": "https://example.com/probs/internal-server-error",
"title": "Internal Server Error",
"detail": "An unexpected error occurred while processing your request.",
"instance": "/issuedvouchers",
}
components:
securitySchemes:
bearerToken:
type: http
scheme: bearer
bearerFormat: JWT
schemas:
salesTouchpointIssuedVoucherResponse:
type: object
required:
- issuedVoucherId
- voucherCode
- fromInclusive
- untilInclusive
- voucherStatus
- product
- mandatoryCustomerDataItems
properties:
issuedVoucherId:
type: string
description: The unique (technical) identifier of the issued voucher instance.
example: "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90"
voucherCode:
type: string
description: The voucher code that is shared with the customer and uniquely identifies this voucher.
example: "HTM-A7J-128-PYT"
fromInclusive:
type: string
format: date-time-offset
description: |-
The date and time the voucher becomes valid for redemption. This has nothing to do with
the allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
example: "2024-10-04T00:00:00.000+02:00"
untilInclusive:
type: string
format: date-time-offset
description: |-
The date and time the voucher becomes invalid for redemption. This has nothing to do with
the maximum allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
example: "2024-11-04T00:00:00.000+01:00"
voucherStatus:
type: object
required:
- voucherStatusId
- name
description: |-
The current status of the voucher. Can be any of the following:
- 1 = new
- 2 = issued
- 3 = redeemed
- 4 = revoked
- 5 = expired
- 6 = pendingRedemption
properties:
voucherStatusId:
type: integer
example: 2
name:
type: string
example: "issued"
product:
type: object
description: The "product" referencing the voucher definition that this voucher instance is based on
required:
- productId
- productName
- productDescription
- amountInclTax
properties:
productId:
type: integer
example: 263
productName:
type: string
example: Voucher Ooievaarspas-product AOW
productDescription:
type: string
example: |-
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:
type: integer
description: |-
When combined with a requiredProduct, the (positive or zero) amountInclTax dictates
the (modified) total amount that needs to be paid for said product. When the requiredProduct
has a sellingPrice > 0, the difference between sellingPrice and voucher amountInclTax
represents the granted discount.
When not combined with a required product, the (negative) amountInclTax dictates
the value of the voucher, that is subtracted from the total order value as a discount
(with a minimum order total of 0).
example: 0
requiredProducts:
type: array
description: |-
Currently, only one requiredProduct is supported and thus, this array can contain at
most one element.
items:
type: object
required:
- productId
properties:
productId:
type: integer
example: 892
productName:
type: string
example: "Ooievaarspas voor AOW-ers in Den Haag"
productDescription:
type: string
example: "Vrij reizen bij HTM voor Haagse AOW-gerechtigden met een Ooievaarspas."
productCategory:
type: object
required:
- productCategoryId
- isTravelProduct
- name
properties:
productCategoryId:
type: integer
example: 2
isTravelProduct:
type: boolean
example: true
name:
type: string
example: "Afgekocht reisrecht"
amountInclTax:
type: integer
description: |-
Selling price of the product in cents (including tax, if applicable) that is
currently active for the calling touchpoint. When 0, the product is free of charge.
example: 0
imageReference:
type: string
description: Can be a URL or a base64 encoded image
example: https://www.htm.nl/nog-onbekende-productafbeelding
_links:
type: object
properties:
get_details:
type: object
description: Link to get more details for the product that this voucher instance applies to
properties:
href:
type: string
example: https://api.integratielaag.nl/abt/touchpoint/1.0/products/982
method:
type: string
example: GET
mandatoryCustomerDataItems:
type: array
description: |-
List of mandatory customer data items that are required to redeem this voucher.\
The values provided for these data items may be checked against allowed values as provided by the voucher issuer.
items:
type: object
required:
- mandatoryCustomerDataItemId
- customerDataItem
properties:
mandatoryCustomerDataItemId:
type: integer
example: 8
customerDataItem:
type: string
example: padBirthdate
unavailable:
type: object
rfc9457:
type: object
properties:
type:
type: string
format: url
example: https://example.com/probs/out-of-credit
title:
type: string
example: You do not have enough credit.
detail:
type: string
example: Your current balance is 30, but that costs 50.
instance:
type: string
example: /account/12345/msgs/abc
balance:
type: string
example: 30
accounts:
type: array
items:
type: string
example:
- /account/12345
- /account/67890

File diff suppressed because it is too large Load Diff

View File

@ -1553,9 +1553,6 @@ components:
- productCategoryId: 8 - productCategoryId: 8
name: Saldo name: Saldo
isTravelProduct: true isTravelProduct: true
- productCategoryId: 9
name: Voucher
isTravelProduct: false
type: array type: array
items: items:
$ref: '#/components/schemas/productCategoryGetEntity' $ref: '#/components/schemas/productCategoryGetEntity'
@ -1814,7 +1811,7 @@ components:
- mandatoryCustomerDataItemId: 5 - mandatoryCustomerDataItemId: 5
customerDataItem: address customerDataItem: address
- mandatoryCustomerDataItemId: 6 - mandatoryCustomerDataItemId: 6
customerDataItem: voucher customerDataItem: phone
- mandatoryCustomerDataItemId: 7 - mandatoryCustomerDataItemId: 7
customerDataItem: ovPayToken customerDataItem: ovPayToken
- mandatoryCustomerDataItemId: 8 - mandatoryCustomerDataItemId: 8
@ -1823,8 +1820,6 @@ components:
customerDataItem: shippingAddress customerDataItem: shippingAddress
- mandatoryCustomerDataItemId: 10 - mandatoryCustomerDataItemId: 10
customerDataItem: billingAddress customerDataItem: billingAddress
- mandatoryCustomerDataItemId: 11
customerDataItem: startDate
items: items:
$ref: '#/components/schemas/mandatoryCustomerDataItemGetEntity' $ref: '#/components/schemas/mandatoryCustomerDataItemGetEntity'
type: array type: array

View File

@ -46,13 +46,6 @@ paths:
when false, return only non-archived products (isArchived = false). when false, return only non-archived products (isArchived = false).
schema: schema:
type: boolean type: boolean
- name: onlyVouchers
in: query
required: false
description: |-
When omitted, defaults to false (i.e. return all normal products that are NOT voucher definitions); when true, return only voucher definitions
schema:
type: boolean
responses: responses:
'200': '200':
description: OK description: OK
@ -394,7 +387,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": "30901", "gboPackageTemplateId": "30901",
"productName": "HTM pilot 90% korting", "productName": "HTM pilot 90% korting",
"productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!",
@ -482,7 +474,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": "30901", "gboPackageTemplateId": "30901",
"productName": "HTM pilot 90% korting", "productName": "HTM pilot 90% korting",
"productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!",
@ -569,7 +560,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": "30901", "gboPackageTemplateId": "30901",
"productName": "HTM pilot 90% korting", "productName": "HTM pilot 90% korting",
"productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!",
@ -690,7 +680,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": "33610", "gboPackageTemplateId": "33610",
"productName": "HTM Regio Vrij DH73", "productName": "HTM Regio Vrij DH73",
"productDescription": "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in het gekozen gebied in de regio Rotterdam Den Haag.", "productDescription": "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in het gekozen gebied in de regio Rotterdam Den Haag.",
@ -877,7 +866,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": "30901", "gboPackageTemplateId": "30901",
"tapConnectProductCode": null, "tapConnectProductCode": null,
"productName": "HTM pilot 90% korting", "productName": "HTM pilot 90% korting",
@ -1040,7 +1028,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": "30901", "gboPackageTemplateId": "30901",
"tapConnectProductCode": null, "tapConnectProductCode": null,
"productName": "HTM pilot 90% korting", "productName": "HTM pilot 90% korting",
@ -1283,7 +1270,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": "33610", "gboPackageTemplateId": "33610",
"tapConnectProductCode": null, "tapConnectProductCode": null,
"productName": "HTM Regio Vrij DH73", "productName": "HTM Regio Vrij DH73",
@ -1489,7 +1475,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": null, "gboPackageTemplateId": null,
"tapConnectProductCode": null, "tapConnectProductCode": null,
"productName": "IBAN wijzigen functioneel product", "productName": "IBAN wijzigen functioneel product",
@ -1687,7 +1672,6 @@ paths:
"fikoArticleNumber": "1234", "fikoArticleNumber": "1234",
"isValid": true, "isValid": true,
"isArchived": false, "isArchived": false,
"needsVoucher": false,
"gboPackageTemplateId": null, "gboPackageTemplateId": null,
"tapConnectProductCode": null, "tapConnectProductCode": null,
"productName": "OV-pas saldo (1 eurocent)", "productName": "OV-pas saldo (1 eurocent)",
@ -2791,10 +2775,6 @@ components:
type: boolean type: boolean
description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product
example: false example: false
needsVoucher:
type: boolean
description: Indicates if the product needs a voucher (with this productId as requiredProductId) to be bought - if false, this is optional, but still allowed
example: false
gboPackageTemplateId: gboPackageTemplateId:
type: string type: string
example: '30901' example: '30901'
@ -3152,10 +3132,6 @@ components:
type: boolean type: boolean
description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product
example: false example: false
needsVoucher:
type: boolean
description: Indicates if the product needs a voucher (with this productId as requiredProductId) to be bought - if false, this is optional, but still allowed
example: false
gboPackageTemplateId: gboPackageTemplateId:
type: string type: string
description: >- description: >-
@ -3527,10 +3503,6 @@ components:
type: boolean type: boolean
description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product
example: false example: false
needsVoucher:
type: boolean
description: Indicates if the product needs a voucher (with this productId as requiredProductId) to be bought - if false, this is optional, but still allowed
example: false
gboPackageTemplateId: gboPackageTemplateId:
type: string type: string
description: >- description: >-

File diff suppressed because it is too large Load Diff

View File

View File

@ -1,151 +0,0 @@
{ "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" }