openapi: 3.0.1 info: title: ABTProducts description: >- CRUD APIs for HTM products (based on the new domainmodel v2.2). Internal use only; external touchpoints can get read-only, filtered access via the HTM Service Engine, using a different endpoint. version: '1.0' servers: - url: https://api.integratielaag.nl/abt/products/1.0 tags: - name: ABTProducts CRUD description: >- Internal use only; external touchpoints can get read-only, filtered access via the HTM Service Engine. paths: /products: get: tags: - ABTProducts CRUD summary: Get a list of all defined HTM products description: |- Get a list of all HTM products, without any filters. Only a few details are returned per product - use the `GET /products/{productId}` endpoint to get more details. \ In the examples, it can be seen that (when a touchpoint HTTP header is present) only products that have active sellingPeriods for touchpoints within the same retailer as the calling retailer are returned. \ Touchpoint 1 and 2 belong to retailer 1; touchpoint 3 and 4 belong to retailer 2. parameters: - name: parentProductId in: query required: false description: |- Only return products that refer to the given parentProductId. \ Returns parent-products (i.e. products with parentProductId = null) if left empty. schema: type: integer example: 1 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProductPayloadListResponse' examples: getListNoProducts: summary: No products / Empty list description: No products value: { "Entries": [], "href": null } getListOneProductNoSellingPeriodsNoTouchpointId: summary: List containing one product without any SellingPeriods (no touchpointId in HTTP-headers) description: All products are returned, even if they have no activesellingPeriods value: { "Entries": [ { "productId": 1, "productCode": "30901-WL", "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" } ], "sellableTouchPointIds": null, "amountInclTax": null, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" } ], "href": null } getListOneProductNoTouchpointId: summary: List containing one product with 4 currently active SellingPeriods (no touchpointId in HTTP-headers) description: All products are returned, even if they have no active SellingPeriods value: { "Entries": [ { "productId": 2, "productCode": "312AB-WL", "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 6, "isTravelProduct": false, "name": "Barcode" }, "tokenTypes": null, "sellableTouchPointIds": [ 1, 2, 3, 4 ], "amountInclTax": null, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" } ], "href": null } getListOneProductTouchpointId3: summary: List containing one product with 4 currently active SellingPeriods (touchpointId 3 in HTTP-headers) description: Only products that have active sellingPeriods for touchpoint 3 are returned value: { "Entries": [ { "productId": 2, "productCode": "312AB-WL", "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 6, "isTravelProduct": false, "name": "Barcode" }, "tokenTypes": null, "sellableTouchPointIds": [ 3, 4 ], "amountInclTax": 300, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" } ], "href": null } getListMultipleProductsWithPaginationNoTouchpointId: summary: List containing multiple products with pagination (no touchpointId in HTTP-headers) description: All products are returned, even if they have no active SellingPeriods value: { "Entries": [ { "productId": 1, "productCode": "30901-WL", "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" } ], "sellableTouchPointIds": null, "amountInclTax": null, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" }, { "productId": 2, "productCode": "312AB-WL", "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 6, "isTravelProduct": false, "name": "Barcode" }, "tokenTypes": null, "sellableTouchPointIds": [ 1, 2, 3, 4 ], "amountInclTax": null, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" }, { "productId": 3, "productCode": "30001-ML", "productName": "HTM 20% korting", "productDescription": "Reis een maand lang met 20% korting!", "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" } ], "sellableTouchPointIds": [ 1, 2 ], "amountInclTax": null, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" }, { "productId": 4, "productCode": "30002-ML", "productName": "HTM 40% korting", "productDescription": "Reis een maand lang met 40% korting!", "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" } ], "sellableTouchPointIds": [ 3, 4 ], "amountInclTax": null, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" } ], "href": "https://api.htm.nl/products?pageNumber=2" } getListMultipleProductsWithPaginationTuchpointId1: summary: List containing multiple products with pagination (touchpointId 3 in HTTP-headers) description: Only products that have active SellingPeriods for touchpoint 3 are returned value: { "Entries": [ { "productId": 2, "productCode": "312AB-WL", "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 6, "isTravelProduct": false, "name": "Barcode" }, "tokenTypes": null, "sellableTouchPointIds": [ 3, 4 ], "amountInclTax": 300, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" }, { "productId": 4, "productCode": "30002-ML", "productName": "HTM 40% korting", "productDescription": "Reis een maand lang met 40% korting!", "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" } ], "sellableTouchPointIds": [ 3, 4 ], "amountInclTax": 800, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" } ], "href": "https://api.htm.nl/products?pageNumber=2" } '400': description: '400' content: application/json: schema: $ref: '#/components/schemas/400Response' '401': description: '401' content: application/json: schema: $ref: '#/components/schemas/401Response' '404': description: '404' content: application/json: schema: $ref: '#/components/schemas/404Response' '500': description: '500' content: application/json: schema: $ref: '#/components/schemas/500Response' post: tags: - ABTProducts CRUD summary: >- Persist a new HTM product as defined in the request body, after successful validation description: >- Persist a new HTM product as defined in the raw JSON request body, but only after successful validation of the entire request body. When any (subset of) validation fails, nothing is persisted in the underlying database. requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateProductRequest' examples: postMinimalProduct: summary: >- Minimum request body (to be used as minimal parent-template for hierarchical products) value: { "productOwnerId": 1, "isRenewable": false, "isSellableAtHtm": false, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false } postGboProduct: summary: Add new GBO product (non-renewable) value: { "productCode": "30901-WL", "gboPackageTemplateId": "30901", "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "validityPeriod": { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" }, "productTranslations": [ { "language": "en", "name": "HTM pilot 90% discount", "description": "Travel with 90% discount during the first F&F pilot!" } ], "productOwnerId": 1, "marketSegmentIds": [ 1 ], "customerSegmentIds": [ 2, 3, 4, 5 ], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 1, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 5 ], "tokenTypeIds": [ 1 ], "paymentMomentId": 1, "validityDuration": "P7D", "maxStartInFutureDuration": "P6W", "isRenewable": false, "sendInvoice": false, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "salesTouchpointId": 3, "sellingPrices": [ { "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 } ] } ], "purchasePrices": [ { "amountExclTax": 0, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" } ] } postGboProductMultiplePeriods: summary: >- Add new GBO product (non-renewable, multiple sellingPeriods/prices per period) value: { "productCode": "30901-WL", "gboPackageTemplateId": "30901", "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "validityPeriod": { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999" }, "productTranslations": [ { "language": "en", "name": "HTM pilot 90% discount", "description": "Travel with 90% discount during the first F&F pilot!" } ], "productOwnerId": 1, "marketSegmentIds": [ 1 ], "customerSegmentIds": [ 2, 3, 4, 5 ], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 2, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 5 ], "tokenTypeIds": [ 1 ], "paymentMomentId": 1, "validityDuration": "P7D", "maxStartInFutureDuration": "P6W", "isRenewable": false, "sendInvoice": false, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "salesTouchpointId": 3, "sellingPrices": [ { "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "amountExclTax": 101, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 110, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] }, { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "salesTouchpointId": 2, "sellingPrices": [ { "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "amountExclTax": 101, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 110, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] } ], "purchasePrices": [ { "amountExclTax": 0, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999" } ] } postGboPadProduct: summary: >- Add new GBO product (PAD required, renewable, serviceOptions, forbiddenPaymentMethods) value: { "productCode": "35301-MA", "gboPackageTemplateId": "35301", "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.", "validityPeriod": { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" }, "productTranslations": [ { "language": "en", "name": "HTM Regio Free DH73", "description": "For a fixed amount unlimited travel with EBS, HTM and RET in the chosen area in the Rotterdam The Hague region." } ], "productOwnerId": 1, "marketSegmentIds": [ 1 ], "customerSegmentIds": [ 2, 3, 4, 5 ], "productCategoryId": 3, "requiredCustomerLevelId": 3, "requiredProducts": [ { "requiredProductId": 1, "description": "Basisproduct nodig" } ], "incompatibleProducts": [ { "incompatibleProductId": 3, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 3, 4, 5, 6 ], "requiredGboPersonalAttributeIds": [ 1, 2, 3 ], "tokenTypeIds": [ 1, 2, 3 ], "paymentMomentId": 1, "serviceOptionIds": [ 1, 2 ], "validityDuration": "P1M", "maxStartInFutureDuration": "P6W", "isRenewable": true, "sendInvoice": true, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "salesTouchpointId": 3, "forbiddenPaymentMethodIds": [ 1 ], "sellingPrices": [ { "amountExclTax": 5413, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 5900, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 5413.0000 } ] } ], "purchasePrices": [ { "amountExclTax": 0, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" } ] } postGboProductSupplement: summary: TODO - Add new GBO product (supplement with requirements) value: { "productName": "TODO" } postTapConnectProduct: summary: TODO - Add new TapConnect product value: { "productName": "TODO" } postIbanMandate: summary: TODO - Add new IBAN mandate (functional product) value: { "productName": "TODO" } responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CreateOrUpdateProductResponse' '400': description: '400' content: application/json: schema: $ref: '#/components/schemas/400Response' '401': description: '401' content: application/json: schema: $ref: '#/components/schemas/401Response' '404': description: '404' content: application/json: schema: $ref: '#/components/schemas/404Response' '500': description: '500' content: application/json: schema: $ref: '#/components/schemas/500Response' /products/{productId}: get: tags: - ABTProducts CRUD summary: Get full details of a single HTM product, specified by the productId description: >- Get full details of a single HTM product, specified by the productId, without any filtering. External consumers can get access to a filtered view via the HTM Service Engine, only receiving the information that is allowed to be seen by the touchpointId of the consumer. parameters: - name: productId in: path required: true style: simple description: Id of the product to get details for schema: type: integer example: 1 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProductPayloadResponse' examples: getDetailsGboNonRenewable: summary: GBO product (non-renewable) value: { "productId": 1, "parentProductId": null, "productCode": "30901-WL", "gboPackageTemplateId": "30901", "tapConnectProductCode": null, "productGroupMetadata": null, "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "validityPeriod": { "validityPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00" }, "productTranslations": [ { "language": "en", "name": "HTM pilot 90% discount", "description": "Travel with 90% discount during the first F&F pilot!" } ], "productOwner": { "productOwnerId": 1, "name": "Corneel Verstoep", "organization": "HTM" }, "marketSegments": [ { "marketSegmentId": 1, "name": "B2C" } ], "customerSegments": [ { "customerSegmentId": 2, "name": "Kind (4-11)" }, { "customerSegmentId": 3, "name": "Jongere (12-17)" }, { "customerSegmentId": 4, "name": "Volwassene (18-64)" }, { "customerSegmentId": 5, "name": "Oudere (65+)" } ], "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 1, "name": "anonymous" }, "requiredProducts": null, "incompatibleProducts": [ { "incompatibleProductId": 1, "productName": "HTM pilot 90% korting", "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItems": [ { "mandatoryCustomerDataItemId": 4, "customerDataItem": "emailAddress" }, { "mandatoryCustomerDataItemId": 5, "customerDataItem": "ovPayToken" } ], "requiredGboPersonalAttributes": null, "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" } ], "paymentMoment": { "paymentMomentId": 1, "name": "prepaid" }, "serviceOptions": null, "validityDuration": "P7D", "maxStartInFutureDuration": "P6W", "isRenewable": false, "sendInvoice": false, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "sellingPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00", "salesTouchpoint": { "salesTouchpointId": 3, "name": "Website (Perplex)", "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": null, "sellingPrices": [ { "sellingPriceId": 1, "amountExclTax": 92, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "taxCode": "V09", "taxPercentageAmount": 9, "description": "BTW VERKOOP LAAG 9%" }, "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00", "internalPrice": 92.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "taxCode": "V0", "taxPercentageAmount": 0, "description": "BTW VERKOOP NUL" }, "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00" } ], "auditTrail": [ { "auditTrailId": 2, "action": "update", "user": "api", "timestamp": "2024-09-03T08:39:38.000+00:00" }, { "auditTrailId": 1, "action": "insert", "user": "api", "timestamp": "2024-09-03T08:38:24.000+00:00" } ] } getDetailsGboProductMultiplePeriods: summary: GBO product (non-renewable, multiple sellingPeriods/prices per period) value: { "productId": 2, "parentProductId": null, "productCode": "30901-WL", "gboPackageTemplateId": "30901", "tapConnectProductCode": null, "productGroupMetadata": null, "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "validityPeriod": { "validityPeriodId": 2, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2025-12-31T23:59:59.999+00:00" }, "productTranslations": [ { "language": "en", "name": "HTM pilot 90% discount", "description": "Travel with 90% discount during the first F&F pilot!" } ], "productOwner": { "productOwnerId": 1, "name": "Corneel Verstoep", "organization": "HTM" }, "marketSegments": [ { "marketSegmentId": 1, "name": "B2C" } ], "customerSegments": [ { "customerSegmentId": 2, "name": "Kind (4-11)" }, { "customerSegmentId": 3, "name": "Jongere (12-17)" }, { "customerSegmentId": 4, "name": "Volwassene (18-64)" }, { "customerSegmentId": 5, "name": "Oudere (65+)" } ], "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 1, "name": "anonymous" }, "requiredProducts": null, "incompatibleProducts": [ { "incompatibleProductId": 2, "productName": "HTM pilot 90% korting", "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItems": [ { "mandatoryCustomerDataItemId": 4, "customerDataItem": "emailAddress" }, { "mandatoryCustomerDataItemId": 5, "customerDataItem": "ovPayToken" } ], "requiredGboPersonalAttributes": null, "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" } ], "paymentMoment": { "paymentMomentId": 1, "name": "prepaid" }, "serviceOptions": null, "validityDuration": "P7D", "maxStartInFutureDuration": "P6W", "isRenewable": false, "sendInvoice": false, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "sellingPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2025-12-31T23:59:59.999+00:00", "salesTouchpoint": { "salesTouchpointId": 3, "name": "Website (Perplex)", "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": null, "sellingPrices": [ { "sellingPriceId": 1, "amountExclTax": 92, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "taxCode": "V09", "taxPercentageAmount": 9, "description": "BTW VERKOOP LAAG 9%" }, "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00", "internalPrice": 92.0000 }, { "sellingPriceId": 2, "amountExclTax": 101, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "taxCode": "V09", "taxPercentageAmount": 9, "description": "BTW VERKOOP LAAG 9%" }, "amountInclTax": 110, "fromInclusive": "2025-01-01T00:00:00.000+00:00", "toInclusive": "2025-12-31T23:59:59.999+00:00", "internalPrice": 101.0000 } ] }, { "sellingPeriodId": 2, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2025-12-31T23:59:59.999+00:00", "salesTouchpoint": { "salesTouchpointId": 2, "name": "SMP (Team Incident Masters)", "isActive": false, "retailer": { "retailerId": 1000, "name": "HTM interne 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": null, "sellingPrices": [ { "sellingPriceId": 3, "amountExclTax": 92, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "taxCode": "V09", "taxPercentageAmount": 9, "description": "BTW VERKOOP LAAG 9%" }, "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00", "internalPrice": 92.0000 }, { "sellingPriceId": 4, "amountExclTax": 101, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "taxCode": "V09", "taxPercentageAmount": 9, "description": "BTW VERKOOP LAAG 9%" }, "amountInclTax": 110, "fromInclusive": "2025-01-01T00:00:00.000+00:00", "toInclusive": "2025-12-31T23:59:59.999+00:00", "internalPrice": 101.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "taxCode": "V0", "taxPercentageAmount": 0, "description": "BTW VERKOOP NUL" }, "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2025-12-31T23:59:59.999+00:00" } ], "auditTrail": [ { "auditTrailId": 2, "action": "update", "user": "api", "timestamp": "2024-09-03T08:39:38.000+00:00" }, { "auditTrailId": 1, "action": "insert", "user": "api", "timestamp": "2024-09-03T08:38:24.000+00:00" } ] } getDetailsGboPadProduct: summary: GBO product (PAD required, renewable, serviceOptions, forbiddenPaymentMethods) value: { "productId": 3, "parentProductId": null, "productCode": "35301-MA", "gboPackageTemplateId": "35301", "tapConnectProductCode": null, "productGroupMetadata": null, "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.", "validityPeriod": { "validityPeriodId": 3, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00" }, "productTranslations": [ { "language": "en", "name": "HTM Regio Free DH73", "description": "For a fixed amount unlimited travel with EBS, HTM and RET in the chosen area in the Rotterdam The Hague region." } ], "productOwner": { "productOwnerId": 1, "name": "Corneel Verstoep", "organization": "HTM" }, "marketSegments": [ { "marketSegmentId": 1, "name": "B2C" } ], "customerSegments": [ { "customerSegmentId": 2, "name": "Kind (4-11)" }, { "customerSegmentId": 3, "name": "Jongere (12-17)" }, { "customerSegmentId": 4, "name": "Volwassene (18-64)" }, { "customerSegmentId": 5, "name": "Oudere (65+)" } ], "productCategory": { "productCategoryId": 3, "isTravelProduct": true, "name": "Afgekocht reisrecht" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 3, "name": "account" }, "requiredProducts": null, "incompatibleProducts": [ { "incompatibleProductId": 3, "productName": "HTM Regio Vrij DH73", "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItems": [ { "mandatoryCustomerDataItemId": 3, "customerDataItem": "dateOfBirth" }, { "mandatoryCustomerDataItemId": 4, "customerDataItem": "emailAddress" }, { "mandatoryCustomerDataItemId": 5, "customerDataItem": "ovPayToken" }, { "mandatoryCustomerDataItemId": 6, "customerDataItem": "directDebitMandate" } ], "requiredGboPersonalAttributes": [ { "requiredGboPersonalAttributeId": 1, "name": "NAME" }, { "requiredGboPersonalAttributeId": 2, "name": "BIRTHDATE" }, { "requiredGboPersonalAttributeId": 3, "name": "PHOTO" } ], "tokenTypes": [ { "tokenTypeId": 1, "name": "EMV" }, { "tokenTypeId": 2, "name": "OVpas physical" }, { "tokenTypeId": 3, "name": "OVpas digital" } ], "paymentMoment": { "paymentMomentId": 1, "name": "prepaid" }, "serviceOptions": [ { "serviceOptionId": 1, "action": "cancellableTermAhead", "description": "Per termijn vooruit opzegbaar" }, { "serviceOptionId": 2, "action": "cancellableWithin14Days", "description": "Binnen 14 dagen na aanschaf opzegbaar, met restitutie en herberekening ritten met product" } ], "validityDuration": "P1M", "maxStartInFutureDuration": "P6W", "isRenewable": true, "sendInvoice": true, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "sellingPeriodId": 5, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00", "salesTouchpoint": { "salesTouchpointId": 3, "name": "Website (Perplex)", "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": [ { "forbiddenPaymentMethodId": 1, "name": "Credit Card", "issuer": "American Express" } ], "sellingPrices": [ { "sellingPriceId": 5, "amountExclTax": 5413, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "taxCode": "V09", "taxPercentageAmount": 9, "description": "BTW VERKOOP LAAG 9%" }, "amountInclTax": 5900, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00", "internalPrice": 5413.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "taxMetadata": { "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "taxCode": "V0", "taxPercentageAmount": 0, "description": "BTW VERKOOP NUL" }, "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000+00:00", "toInclusive": "2024-12-31T23:59:59.999+00:00" } ], "auditTrail": [ { "auditTrailId": 2, "action": "update", "user": "api", "timestamp": "2024-09-03T08:39:38.000+00:00" }, { "auditTrailId": 1, "action": "insert", "user": "api", "timestamp": "2024-09-03T08:38:24.000+00:00" } ] } getDetailsGboProductSupplement: summary: TODO - GBO product (supplement with requirements) value: { "productName": "TODO" } getDetailsTapConnectProduct: summary: TODO - TapConnect product value: { "productName": "TODO" } getDetailsIbanMandate: summary: TODO - IBAN mandate (functional product) value: { "productName": "TODO" } '400': description: '400' content: application/json: schema: $ref: '#/components/schemas/400Response' '401': description: '401' content: application/json: schema: $ref: '#/components/schemas/401Response' '404': description: '404' content: application/json: schema: $ref: '#/components/schemas/404Response' '500': description: '500' content: application/json: schema: $ref: '#/components/schemas/500Response' put: tags: - ABTProducts CRUD summary: >- Replace the entire product (as specified by the productId) with the given raw JSON request body, after successful validation description: >- For nested JSON, including id's for reference tables indicates an update of an existing reference - no id's indicates a new reference parameters: - name: productId in: path required: true style: simple description: The id of the product to replace/update schema: type: integer example: 1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateProductRequest' examples: updateMinimalProduct: summary: >- Minimum request body (to be used as minimal parent-template for hierarchical products) value: { "productOwnerId": 1, "isRenewable": false, "isSellableAtHtm": false, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false } updateGboProduct: summary: Update existing GBO product (non-renewable) value: { "productCode": "30901-WL", "gboPackageTemplateId": "30901", "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "validityPeriod": { "validityPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" }, "productTranslations": [ { "language": "en", "name": "HTM pilot 90% discount", "description": "Travel with 90% discount during the first F&F pilot!" } ], "productOwnerId": 1, "marketSegmentIds": [ 1 ], "customerSegmentIds": [ 2, 3, 4, 5 ], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 1, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 5 ], "tokenTypeIds": [ 1 ], "paymentMomentId": 1, "validityDuration": "P7D", "maxStartInFutureDuration": "P6W", "isRenewable": false, "sendInvoice": false, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "sellingPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "salesTouchpointId": 3, "sellingPrices": [ { "sellingPriceId": 1, "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" } ] } advancedUpdateGboProduct: summary: >- Advanced update (remove mandatoryCustomerDataItem references, add new second sellingPeriod) value: { "productCode": "30901-WL", "gboPackageTemplateId": "30901", "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "validityPeriod": { "validityPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" }, "productTranslations": [ { "language": "en", "name": "HTM pilot 90% discount", "description": "Travel with 90% discount during the first F&F pilot!" } ], "productOwnerId": 1, "marketSegmentIds": [ 1 ], "customerSegmentIds": [ 2, 3, 4, 5 ], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 1, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": null, "tokenTypeIds": [ 1 ], "paymentMomentId": 1, "validityDuration": "P7D", "maxStartInFutureDuration": "P6W", "isRenewable": false, "sendInvoice": false, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "sellingPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "salesTouchpointId": 3, "sellingPrices": [ { "sellingPriceId": 1, "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 } ] }, { "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "salesTouchpointId": 2, "sellingPrices": [ { "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "amountExclTax": 101, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 110, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" } ] } updateGboProductMultiplePeriods: summary: >- Update existing GBO product (non-renewable, multiple sellingPeriods/prices per period) value: { "productCode": "30901-WL", "gboPackageTemplateId": "30901", "productName": "HTM pilot 90% korting", "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", "validityPeriod": { "validityPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999" }, "productTranslations": [ { "language": "en", "name": "HTM pilot 90% discount", "description": "Travel with 90% discount during the first F&F pilot!" } ], "productOwnerId": 1, "marketSegmentIds": [ 1 ], "customerSegmentIds": [ 2, 3, 4, 5 ], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 2, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 5 ], "tokenTypeIds": [ 1 ], "paymentMomentId": 1, "validityDuration": "P7D", "maxStartInFutureDuration": "P6W", "isRenewable": false, "sendInvoice": false, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "sellingPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "salesTouchpointId": 3, "sellingPrices": [ { "sellingPriceId": 1, "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "sellingPriceId": 2, "amountExclTax": 101, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 110, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] }, { "sellingPeriodId": 2, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "salesTouchpointId": 2, "sellingPrices": [ { "sellingPriceId": 3, "amountExclTax": 92, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 100, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "sellingPriceId": 4, "amountExclTax": 101, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 110, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999" } ] } updateGboPadProduct: summary: >- Update existing GBO product (PAD required, renewable, serviceOptions, forbiddenPaymentMethods) value: { "productCode": "35301-MA", "gboPackageTemplateId": "35301", "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.", "validityPeriod": { "validityPeriodId": 3, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" }, "productTranslations": [ { "language": "en", "name": "HTM Regio Free DH73", "description": "For a fixed amount unlimited travel with EBS, HTM and RET in the chosen area in the Rotterdam The Hague region." } ], "productOwnerId": 1, "marketSegmentIds": [ 1 ], "customerSegmentIds": [ 2, 3, 4, 5 ], "productCategoryId": 3, "requiredCustomerLevelId": 3, "requiredProducts": [ { "requiredProductId": 1, "description": "Basisproduct nodig" } ], "incompatibleProducts": [ { "incompatibleProductId": 3, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 3, 4, 5, 6 ], "requiredGboPersonalAttributeIds": [ 1, 2, 3 ], "tokenTypeIds": [ 1, 2, 3 ], "paymentMomentId": 1, "serviceOptionIds": [ 1, 2 ], "validityDuration": "P1M", "maxStartInFutureDuration": "P6W", "isRenewable": true, "sendInvoice": true, "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { "sellingPeriodId": 1, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "salesTouchpointId": 3, "forbiddenPaymentMethodIds": [ 1 ], "sellingPrices": [ { "sellingPriceId": 1, "amountExclTax": 5413, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", "amountInclTax": 5900, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 5413.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", "amountInclTax": 0, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" } ] } updateGboProductSupplement: summary: TODO - Update existing GBO product (supplement with requirements) value: { "productName": "TODO" } updateTapConnectProduct: summary: TODO - Update existing TapConnect product value: { "productName": "TODO" } updateIbanMandate: summary: TODO - Update existing IBAN mandate (functional product) value: { "productName": "TODO" } responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CreateOrUpdateProductResponse' '400': description: '400' content: application/json: schema: $ref: '#/components/schemas/400Response' '401': description: '401' content: application/json: schema: $ref: '#/components/schemas/401Response' '404': description: '404' content: application/json: schema: $ref: '#/components/schemas/404Response' '500': description: '500' content: application/json: schema: $ref: '#/components/schemas/500Response' components: schemas: TaxMetadataResponse: type: object required: - taxMetadataId - taxCode - taxPercentageAmount properties: taxMetadataId: type: string format: uuid example: 501B17EF-36C4-4039-B92C-6517969B464E taxCode: type: string example: V09 taxPercentageAmount: type: integer example: 21 description: type: string example: BTW VERKOOP LAAG 9% ProductTranslationResponse: type: object required: - language properties: language: type: string example: en name: type: string example: HTM F&F 90% korting description: type: string example: >- Travel with 90% discount for a week during the first HTM F&F OVpay pilot! SellingPriceResponse: type: object required: - sellingPriceId - amountExclTax - taxMetadata - amountInclTax - fromInclusive - toInclusive - internalPrice properties: sellingPriceId: type: integer example: 1 amountExclTax: type: integer example: 750 taxMetadata: $ref: '#/components/schemas/TaxMetadataResponse' amountInclTax: type: integer example: 908 fromInclusive: type: string format: date-time-offset example: '2022-03-01T00:00:00.000+00:00' toInclusive: type: string format: date-time-offset example: '2022-06-01T00:00:00.000+00:00' internalPrice: type: number example: 908.1234 PurchasePriceResponse: type: object required: - purchasePriceId - amountExclTax - taxMetadata - amountInclTax - fromInclusive - toInclusive properties: purchasePriceId: type: integer example: 1 amountExclTax: type: integer example: 750 taxMetadata: $ref: '#/components/schemas/TaxMetadataResponse' amountInclTax: type: integer example: 908 fromInclusive: type: string format: date-time-offset example: '2022-03-01T00:00:00.000+00:00' toInclusive: type: string format: date-time-offset example: '2022-06-01T00:00:00.000+00:00' SalesTouchpointResponse: type: object required: - salesTouchpointId - name - isActive - retailer properties: salesTouchpointId: type: integer example: 1 name: type: string example: HTM App isActive: type: boolean example: true retailer: type: object required: - retailerId - name properties: retailerId: type: integer example: 1001 name: type: string example: HTM street: type: string example: Kon. Julianaplein number: type: string example: '10' numberAddition: type: string example: a postalCode: type: string example: 2595 AA city: type: string example: Den Haag country: type: string example: Nederland emailAddress: type: string format: email example: info@htm.nl phoneNumber: type: string example: '09004864636' taxId: type: string example: '09004864636' imageReference: type: string example: https://htm.azure.net/abt/retailers/htm.svg ProductPayloadListResponse: type: object required: - Entries properties: Entries: type: array items: type: object required: - productId properties: productId: type: integer example: 1 productCode: type: string example: 30901-WL productName: type: string example: HTM pilot 90% korting productDescription: type: string example: Reis met 90% korting gedurende de eerste F&F pilot! productCategory: type: object required: - productCategoryId - isTravelProduct - name properties: productCategoryId: type: integer example: 1 isTravelProduct: type: boolean example: true name: type: string example: Kortingsabonnement tokenTypes: type: array items: type: object required: - tokenTypeId - name properties: tokenTypeId: type: integer example: 1 name: type: string example: EMV sellableTouchPointIds: type: array items: type: integer example: 3 amountInclTax: type: number example: 100 imageReference: type: string example: https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg productPageUrl: type: string format: uri example: https://www.htm.nl/nog-onbekende-product-pagina href: type: string format: uri example: https://api.htm.nl/products?page=2 ProductPayloadResponse: type: object required: - productId - productOwner - isRenewable - isSellableAtHtm - needsSolvencyCheckConsumer - needsSolvencyCheckBusiness properties: productId: type: integer example: 1 parentProductId: type: integer example: 1 productCode: type: string example: 30901-WL gboPackageTemplateId: type: string example: '30901' tapConnectProductCode: type: string example: 1234AB productGroupMetadata: type: object required: - productGroupMetadataId - productGroupCode - department - costCenter - costType - description - documentCode - user - timestampUpdated - validFrom properties: productGroupMetadataId: type: string format: uuid example: 501B17EF-36C4-4039-B92C-6517969B464E productGroupCode: type: string example: TBD department: type: string example: TBD costCenter: type: string example: TBD costType: type: string example: TBD description: type: string example: TBD documentCode: type: string example: TBD user: type: string example: TBD timestampUpdated: type: string format: date-time-offset example: '2024-09-03T10:01:34.000+00:00' validFrom: type: string format: date-time-offset example: '2024-09-03T10:01:34.000+00:00' validUntil: type: string format: date-time-offset example: '2024-09-03T10:01:34.000+00:00' productName: type: string example: HTM pilot 90% korting productDescription: type: string example: Reis met 90% korting gedurende de eerste F&F pilot! validityPeriod: type: object required: - validityPeriodId - fromInclusive - toInclusive properties: validityPeriodId: type: integer example: 1 fromInclusive: type: string format: date-time-offset example: '2024-09-03T10:01:34.000+00:00' toInclusive: type: string format: date-time-offset example: '2024-09-03T23:59:59.999+00:00' productTranslations: type: array items: $ref: '#/components/schemas/ProductTranslationResponse' productOwner: type: object required: - productOwnerId - name properties: productOwnerId: type: integer example: 1 name: type: string example: John Doe organization: type: string example: HTM marketSegmentse: type: array items: type: object required: - marketSegmentId - name properties: marketSegmentId: type: integer example: 1 name: type: string example: B2C customerSegments: type: array items: type: object required: - customerSegmentId - name properties: customerSegmentId: type: integer example: 1 name: type: string example: Kind (4-11) productCategory: type: object required: - productCategoryId - name - isTravelProduct properties: productCategoryId: type: integer example: 1 name: type: string example: Kortingsabonnement isTravelProduct: type: boolean example: true requiredCustomerLevel: type: object required: - requiredCustomerLevelId - name properties: requiredCustomerLevelId: type: integer example: 1 name: type: string example: anonymous requiredProducts: type: array items: type: object required: - requiredProductId - productName properties: requiredProductId: type: integer example: 2 productName: type: string example: Product name description: type: string description: Reason why the product is required example: Description incompatibleProducts: type: array items: type: object required: - incompatibleProductId - productName properties: incompatibleProductId: type: integer example: 4 productName: type: string example: Product name description: type: string description: >- Reason why the product is incompatible with the selected product example: Description mandatoryCustomerDataItems: type: array items: type: object required: - mandatoryCustomerDataItemId - customerDataItem properties: mandatoryCustomerDataItemId: type: integer example: 3 customerDataItem: type: string example: dateOfBirth requiredGboPersonalAttributes: type: array description: >- List of required GBO personal attributes (PAD) - should not be user-editable, but automatically populated by PMT backend, based on the selected gboPackageTemplateId (if any) items: type: object required: - requiredGboPersonalAttributeId - name properties: requiredGboPersonalAttributeId: type: integer example: 2 name: type: string example: BIRTHDATE tokenTypes: type: array items: type: object required: - tokenTypeId - name properties: tokenTypeId: type: integer example: 1 name: type: string example: EMV paymentMoment: type: object required: - paymentMomentId - name properties: paymentMomentId: type: integer example: 1 name: type: string example: prepaid serviceOptions: type: array items: type: object required: - serviceOptionId - action properties: serviceOptionId: type: integer example: 1 action: type: string example: cancellableTermAhead description: type: string example: Per termijn vooruit opzegbaar validityDuration: type: string format: duration example: P1M maxStartInFutureDuration: type: string format: duration example: P6W isRenewable: type: boolean example: true sendInvoice: type: boolean example: false imageReference: type: string format: uri example: https://htm.azure.net/abt/products/product_1.svg productPageUrl: type: string format: uri example: https://www.htm.nl/nog-onbekende-product-pagina termsUrl: type: string format: uri example: https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina isSellableAtHtm: type: boolean example: true needsSolvencyCheckConsumer: type: boolean example: false needsSolvencyCheckBusiness: type: boolean example: false sellingPeriods: type: array items: type: object required: - sellingPeriodId - fromInclusive - toInclusive - salesTouchpoint properties: sellingPeriodId: type: integer example: 1 fromInclusive: type: string format: date-time-offset example: '2022-03-01T00:00:00.000+00:00' toInclusive: type: string format: date-time-offset example: '2022-06-01T00:00:00.000+00:00' salesTouchpoint: $ref: '#/components/schemas/SalesTouchpointResponse' forbiddenPaymentMethods: type: array items: type: object required: - forbiddenPaymentMethodId - name properties: forbiddenPaymentMethodId: type: integer example: 1 name: type: string example: Credit Card issuer: type: string example: American Express sellingPrices: type: array items: $ref: '#/components/schemas/SellingPriceResponse' purchasePrices: type: array items: $ref: '#/components/schemas/PurchasePriceResponse' auditTrail: type: array items: type: object required: - auditTrailId - action - user - timestamp properties: auditTrailId: type: integer example: 1 action: type: string example: insert user: type: string example: username timestamp: type: string format: date-time-offset example: '2024-09-03T10:01:34.000+00:00' CreateProductRequest: required: - productOwnerId - isRenewable - isSellableAtHtm - needsSolvencyCheckConsumer - needsSolvencyCheckBusiness type: object properties: parentProductId: type: integer description: The ID of the parent product (if any) example: 1 productCode: type: string description: The HTM-internal product code example: 30901-WL gboPackageTemplateId: type: string description: >- The ID of the GBO SalesPackage that should be instantiated after buying this product example: '30901' tapConnectProductCode: type: string description: >- The productCode of the TapConnect product that should be issued after buying this product example: 1234AB productGroupMetadataId: type: string format: uuid description: The ID of the productGroupMetadata for administration in U4F example: 501B17EF-36C4-4039-B92C-6517969B464E productName: type: string description: The name of the product example: Test product name productDescription: type: string description: The description of the product example: Test product description validityPeriod: required: - fromInclusive - toInclusive type: object description: The validity period of the product properties: fromInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The start of the validity period example: '2022-03-01T00:00:00.000' toInclusive: type: string format: date-time description: LocalDateTime (without offset) - The end of the validity period example: '2022-06-01T00:00:00.000' productTranslations: type: array description: Translations of the product name and description items: type: object required: - language - name - description properties: language: type: string example: en name: type: string example: HTM F&F 90% korting description: type: string example: >- Travel with 90% discount for a week during the first HTM F&F OVpay pilot! productOwnerId: type: integer description: The ID of the owner of the product example: 1 marketSegmentIds: type: array description: The IDs of the market segments that the product is targeted towards items: type: integer example: 1 customerSegmentIds: type: array description: >- The IDs of the customer segments that the product is targeted towards items: type: integer example: 1 productCategoryId: type: integer description: The ID of the category the product belongs to example: 1 requiredCustomerLevelId: type: integer description: >- The ID of the required customer level to be allowed to purchase the product requiredProducts: type: array required: - requiredProductId description: >- The IDs of products that should already be owned by the customer (for travel products, the validity of the given productIds should fully overlap on the customer's travel medium) items: type: object properties: requiredProductId: type: integer example: 1 description: type: string description: Description of why the product is required example: Benodigd basisproduct incompatibleProducts: type: array required: - incompatibleProductId description: >- The IDs of products that can not be active at the same time as this product (for travel products, none of the listed productIds should have overlapping validity with this product on the customer's travel medium) items: type: object properties: incompatibleProductId: type: integer example: 1 description: type: string description: Description of why the product is incompatible example: Kan niet combineren met zichzelf mandatoryCustomerDataItemIds: type: array description: >- The IDs of the customer data items that should be filled in by the customer items: type: integer example: 1 requiredGboPersonalAttributeIds: type: array description: >- GBO specific; the IDs of the GBO Personal Attribute Data (PAD) elements that should be present (or filled during the order flow) on the customer's chosen travel medium. This attribute should not be user-editable, but only be filled by PMT, based on the chosen gboPackageTemplateId! items: type: integer example: 1 tokenTypeIds: type: array description: The IDs of the token types that the product can be instantiated on items: type: integer example: 1 paymentMomentId: type: integer description: The ID of the payment moment for the product example: 1 serviceOptionIds: type: array description: The IDs of the service options that are available for this product items: type: integer example: 1 validityDuration: type: string format: duration description: >- The validity duration of the product. Should only contain one single unit of duration (D, W, M, Y) example: P7D maxStartInFutureDuration: type: string format: duration description: >- The maximum amount of time in the future allowed for the start of the product validity. Should only contain one single unit of duration (D, W, M, Y) example: P6W isRenewable: type: boolean description: Indicates if the product is renewable example: false sendInvoice: type: boolean description: >- Indicates if an invoice should be sent to the customer after ordering this product example: false imageReference: type: string format: uri description: A reference/URL to the image of the product example: https://www.htm.nl/nog-onbekende-productafbeelding productPageUrl: type: string format: uri description: >- The URL of the product page, to be used by touchpoints which are not allowed to sell the product, to redirect the customer. If the product is sold via multiple touchpoints, this URL should point to the preferred touchpoint for sales example: https://www.htm.nl/nog-onbekende-productpagina termsUrl: type: string format: uri description: >- The URL for the webpage or document containing terms for this product example: https://www.htm.nl/nog-onbekende-productvoorwaarden isSellableAtHtm: type: boolean description: >- Indicates if the product is sellable at HTM. If false, no sellingPrices/Periods should be defined - this product may only be used for tracking/reporting purposed, or internal use needsSolvencyCheckConsumer: type: boolean description: >- Indicates if a solvency check is required for consumers purchasing the product needsSolvencyCheckBusiness: type: boolean description: >- Indicates if a solvency check is required for businesses purchasing the product sellingPeriods: type: array description: >- The sellingPeriods of the product. Can contain multiple periods for the same or different touchpoints, as long as there is no overlap for the same touchpoint items: type: object required: - fromInclusive - toInclusive - salesTouchpointId properties: fromInclusive: type: string format: date-time description: LocalDateTime (without offset) - The start date of the period example: '2020-01-01T00:00:00.000' toInclusive: type: string format: date-time description: LocalDateTime (without offset) - The end date of the period example: '2020-01-01T00:00:00.000' salesTouchpointId: type: integer description: The ID of the touchpoint this period applies to example: 1 forbiddenPaymentMethodIds: type: array description: >- The IDs of the payment methods that are not allowed to be used for this touchpoint and period items: type: integer example: 1 sellingPrices: type: array description: >- The sellingPrices of this product for the touchpoint defined in this sellingPeriod. Can contain multiple prices, as long as there is no overlap in validity items: type: object required: - amountExclTax - taxMetadataId - amountInclTax - fromInclusive - toInclusive - internalPrice properties: amountExclTax: type: integer example: 750 taxMetadataId: type: string format: uuid example: 501B17EF-36C4-4039-B92C-6517969B464E amountInclTax: type: integer example: 908 fromInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The start date of the price period example: '2022-03-01T00:00:00.000' toInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The end date of the price period example: '2022-06-01T00:00:00.000' internalPrice: type: number example: 908.1234 purchasePrices: type: array description: >- The purchasePrices of the product. Can contain multiple prices, as long as there is no overlap in validity items: type: object required: - amountExclTax - taxMetadataId - amountInclTax - fromInclusive - toInclusive properties: amountExclTax: type: integer example: 750 taxMetadataId: type: string format: uuid example: 501B17EF-36C4-4039-B92C-6517969B464E amountInclTax: type: integer example: 908 fromInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The start date of the price period example: '2022-03-01T00:00:00.000' toInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The end date of the price period example: '2022-06-01T00:00:00.000' UpdateProductRequest: required: - productOwnerId - isRenewable - isSellableAtHtm - needsSolvencyCheckConsumer - needsSolvencyCheckBusiness type: object properties: parentProductId: type: integer description: The ID of the parent product (if any) example: 1 productCode: type: string description: The HTM-internal product code example: 30901-WL gboPackageTemplateId: type: string description: >- The ID of the GBO SalesPackage that should be instantiated after buying this product example: '30901' tapConnectProductCode: type: string description: >- The productCode of the TapConnect product that should be issued after buying this product example: 1234AB productGroupMetadataId: type: string format: uuid description: The ID of the productGroupMetadata for administration in U4F example: 501B17EF-36C4-4039-B92C-6517969B464E productName: type: string description: The name of the product example: Test product name productDescription: type: string description: The description of the product example: Test product description validityPeriod: required: - fromInclusive - toInclusive type: object description: The validity period of the product properties: validityPeriodId: type: integer description: >- Including a validityPeriodId will update the existing validityPeriod for this product - if omitted, a new validityPeriod will be created example: 1 fromInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The start of the validity period example: '2022-03-01T00:00:00.000' toInclusive: type: string format: date-time description: LocalDateTime (without offset) - The end of the validity period example: '2022-06-01T00:00:00.000' productTranslations: type: array description: Translations of the product name and description items: type: object required: - language - name - description properties: language: type: string example: en name: type: string example: HTM F&F 90% korting description: type: string example: >- Travel with 90% discount for a week during the first HTM F&F OVpay pilot! productOwnerId: type: integer description: The ID of the owner of the product example: 1 marketSegmentIds: type: array description: The IDs of the market segments that the product is targeted towards items: type: integer example: 1 customerSegmentIds: type: array description: >- The IDs of the customer segments that the product is targeted towards items: type: integer example: 1 productCategoryId: type: integer description: The ID of the category the product belongs to example: 1 requiredCustomerLevelId: type: integer description: >- The ID of the required customer level to be allowed to purchase the product requiredProducts: type: array required: - requiredProductId description: >- The IDs of products that should already be owned by the customer (for travel products, the validity of the given productIds should fully overlap on the customer's travel medium) items: type: object properties: requiredProductId: type: integer example: 1 description: type: string description: Description of why the product is required example: Benodigd basisproduct incompatibleProducts: type: array required: - incompatibleProductId description: >- The IDs of products that can not be active at the same time as this product (for travel products, none of the listed productIds should have overlapping validity with this product on the customer's travel medium) items: type: object properties: incompatibleProductId: type: integer example: 1 description: type: string description: Description of why the product is incompatible example: Kan niet combineren met zichzelf mandatoryCustomerDataItemIds: type: array description: >- The IDs of the customer data items that should be filled in by the customer items: type: integer example: 1 requiredGboPersonalAttributeIds: type: array description: >- GBO specific; the IDs of the GBO Personal Attribute Data (PAD) elements that should be present (or filled during the order flow) on the customer's chosen travel medium. This attribute should not be user-editable, but only be filled by PMT, based on the chosen gboPackageTemplateId! items: type: integer example: 1 tokenTypeIds: type: array description: The IDs of the token types that the product can be instantiated on items: type: integer example: 1 paymentMomentId: type: integer description: The ID of the payment moment for the product example: 1 serviceOptionIds: type: array description: The IDs of the service options that are available for this product items: type: integer example: 1 validityDuration: type: string format: duration description: >- The validity duration of the product. Should only contain one single unit of duration (D, W, M, Y) example: P7D maxStartInFutureDuration: type: string format: duration description: >- The maximum amount of time in the future allowed for the start of the product validity. Should only contain one single unit of duration (D, W, M, Y) example: P6W isRenewable: type: boolean description: Indicates if the product is renewable example: false sendInvoice: type: boolean description: >- Indicates if an invoice should be sent to the customer after ordering this product example: false imageReference: type: string format: uri description: A reference/URL to the image of the product example: https://www.htm.nl/nog-onbekende-productafbeelding productPageUrl: type: string format: uri description: >- The URL of the product page, to be used by touchpoints which are not allowed to sell the product, to redirect the customer. If the product is sold via multiple touchpoints, this URL should point to the preferred touchpoint for sales example: https://www.htm.nl/nog-onbekende-productpagina termsUrl: type: string format: uri description: >- The URL for the webpage or document containing terms for this product example: https://www.htm.nl/nog-onbekende-productvoorwaarden isSellableAtHtm: type: boolean description: >- Indicates if the product is sellable at HTM. If false, no sellingPrices/Periods should be defined - this product may only be used for tracking/reporting purposed, or internal use needsSolvencyCheckConsumer: type: boolean description: >- Indicates if a solvency check is required for consumers purchasing the product needsSolvencyCheckBusiness: type: boolean description: >- Indicates if a solvency check is required for businesses purchasing the product sellingPeriods: type: array description: >- The sellingPeriods of the product. Can contain multiple periods for the same or different touchpoints, as long as there is no overlap for the same touchpoint items: type: object required: - fromInclusive - toInclusive - salesTouchpointId properties: sellingPeriodId: type: integer description: >- Including a sellingPeriodId will update an existing sellingPeriod for this product - if omitted, a new sellingPeriod will be created example: 1 fromInclusive: type: string format: date-time description: LocalDateTime (without offset) - The start date of the period example: '2020-01-01T00:00:00.000' toInclusive: type: string format: date-time description: LocalDateTime (without offset) - The end date of the period example: '2020-01-01T00:00:00.000' salesTouchpointId: type: integer description: The ID of the touchpoint this period applies to example: 1 forbiddenPaymentMethodIds: type: array description: >- The IDs of the payment methods that are not allowed to be used for this touchpoint and period items: type: integer example: 1 sellingPrices: type: array description: >- The sellingPrices of this product for the touchpoint defined in this sellingPeriod. Can contain multiple prices, as long as there is no overlap in validity items: type: object required: - amountExclTax - taxMetadataId - amountInclTax - fromInclusive - toInclusive - internalPrice properties: sellingPeriodId: type: integer description: >- Including a sellingPriceId will update an existing sellingPrice for this product - if omitted, a new sellingPrice will be created example: 1 amountExclTax: type: integer example: 750 taxMetadataId: type: string format: uuid example: 501B17EF-36C4-4039-B92C-6517969B464E amountInclTax: type: integer example: 908 fromInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The start date of the period example: '2022-03-01T00:00:00.000' toInclusive: type: string format: date-time description: >- LocalDateTime (without offset) - The end date of the period example: '2022-06-01T00:00:00.000' internalPrice: type: number example: 908.1234 purchasePrices: type: array description: >- The purchasePrices of the product. Can contain multiple prices, as long as there is no overlap in validity items: type: object required: - amountExclTax - taxMetadataId - amountInclTax - fromInclusive - toInclusive properties: purchasePriceId: type: integer description: >- Including a purchasePriceId will update an existing purchasePrice for this product - if omitted, a new purchasePrice will be created example: 1 amountExclTax: type: integer example: 750 taxMetadataId: type: string format: uuid example: 501B17EF-36C4-4039-B92C-6517969B464E amountInclTax: type: integer example: 908 fromInclusive: type: string format: date-time description: LocalDateTime (without offset) - The start date of the period example: '2022-03-01T00:00:00.000' toInclusive: type: string format: date-time description: LocalDateTime (without offset) - The end date of the period example: '2022-06-01T00:00:00.000' CreateOrUpdateProductResponse: type: object properties: productId: type: integer example: 22 400Response: type: object properties: code: type: string example: '400' type: type: string message: type: string example: Bad Request description: type: string example: '''2023-02-01 00:00:00'' is not a valid Datetime' apiErrorCode: type: string example: htm.api.err.40xxx 401Response: type: object properties: code: type: string example: '900901' type: type: string message: type: string example: Invalid Credentials description: type: string example: >- Invalid Credentials. Make sure you have provided the correct security credentials apiErrorCode: type: string example: htm.api.err.40xxx 403Response: type: object properties: code: type: string example: '900901' type: type: string message: type: string example: Retailer not authorized description: type: string example: The retailer is not allowed to access resource for requested apiErrorCode: type: string example: htm.api.err.40xxx touchpoint 404Response: type: object properties: code: type: string example: '404' type: type: string example: Status report message: type: string example: Not Found description: type: string example: The requested resource is not available. apiErrorCode: type: string example: htm.api.err.40xxx 500Response: type: object properties: code: type: string example: '500' type: type: string message: type: string example: Internal Server Error description: type: string apiErrorCode: type: string example: htm.api.err.40xxx