openapi: 3.0.1 info: title: ABTProducts description: >- CRUD APIs for HTM products (based on the new domainmodel v2.6). 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://services.acc.api.htm.nl/abt/abtproducts/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 that refer to a given parentProductId (or without parent, if not specified), without any other filters. \ Only a few details are returned per product - use the `GET /products/{productId}` endpoint to get more details. \ Two attributes are only returned if no touchpoint HTTP header is present: `isValid` and `isArchived`. \ 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": [] } getListOneValidProductNoSellingPeriodsNoTouchpointId: summary: List containing one (valid) product without any SellingPeriods (no touchpointId in HTTP-headers) description: All products are returned, even if they have no active sellingPeriods or are invalid or archived value: { "Entries": [ { "productId": 1, "isValid": true, "isArchived": false, "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" } ] } getListOneInvalidProductNoSellingPeriodsNoTouchpointId: summary: List containing one (invalid) product without any SellingPeriods (no touchpointId in HTTP-headers) description: All products are returned, even if they have no active sellingPeriods or are invalid or archived value: { "Entries": [ { "productId": 1, "isValid": false, "isArchived": false, "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" } ] } 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 or are invalid or archived value: { "Entries": [ { "productId": 2, "isValid": true, "isArchived": false, "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 5, "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" } ] } 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 and/or 4 (part of same retailer) are returned value: { "Entries": [ { "productId": 2, "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 5, "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" } ] } getListMultipleProductsNoTouchpointId: summary: List containing multiple products (no touchpointId in HTTP-headers) description: All products are returned, even if they have no active SellingPeriods or are invalid or archived value: { "Entries": [ { "productId": 1, "isValid": true, "isArchived": false, "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, "isValid": true, "isArchived": false, "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 5, "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, "isValid": true, "isArchived": false, "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, "isValid": true, "isArchived": false, "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" } ] } getListMultipleProductsTouchpointId1: summary: List containing multiple products (touchpointId 3 in HTTP-headers) description: Only products that have active SellingPeriods for touchpoint 3 and/or 4 (part of same retailer) are returned value: { "Entries": [ { "productId": 2, "productName": "HTM dagkaart", "productDescription": "Reis een dag met het openbaar vervoer bij HTM", "productCategory": { "productCategoryId": 5, "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, "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" } ] } '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, "isValid": false, "isArchived": false, "isSellableAtHtm": false } postGboProduct: summary: Add new GBO product (non-renewable) value: { "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "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": [ 5, 6 ], "allowedGboAgeProfileIds": [], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 1, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 7 ], "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 } ] } ], "purchasePrices": [ { "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" } ] } postGboProductWithParent: summary: Add new GBO product with parent and layerInfo (non-renewable) value: { "parentProductId": 1, "layerInfoId": 1, "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "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": [ 5, 6 ], "allowedGboAgeProfileIds": [], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 2, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 7 ], "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 } ] } ], "purchasePrices": [ { "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "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: { "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "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": [ 5, 6 ], "allowedGboAgeProfileIds": [], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 2, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 7 ], "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "amountExclTax": 101, "amountInclTax": 110, "taxCode": "V09", "taxPercentage": 9.0000, "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "amountExclTax": 101, "amountInclTax": 110, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] } ], "purchasePrices": [ { "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999" } ] } postGboPadProduct: summary: >- Add new GBO product (PAD required, renewable, allowedGboAgeProfiles, padBirthDate) value: { "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "gboPackageTemplateId": "33610", "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": [ 5, 6 ], "allowedGboAgeProfileIds": [ 2, 3, 4, 5 ], "productCategoryId": 2, "requiredCustomerLevelId": 3, "requiredProducts": [ { "requiredProductId": 1, "description": "Basisproduct nodig" } ], "incompatibleProducts": [ { "incompatibleProductId": 3, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 8 ], "requiredGboPersonalAttributeIds": [ 1, 2, 3 ], "tokenTypeIds": [ 1, 2, 3 ], "paymentMomentId": 1, "serviceOptionIds": [], "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": [ 3 ], "sellingPrices": [ { "amountExclTax": 5413, "amountInclTax": 5900, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 5413.0000 } ] } ], "purchasePrices": [ { "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "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, "layerInfo": null, "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "gboPackageTemplateId": "30901", "tapConnectProductCode": 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": 5, "name": "Student" }, { "customerSegmentId": 6, "name": "Ooievaarspas-gerechtigde" } ], "allowedGboAgeProfiles": null, "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 1, "name": "guest" }, "requiredProducts": null, "incompatibleProducts": [ { "incompatibleProductId": 1, "productName": "HTM pilot 90% korting", "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItems": [ { "mandatoryCustomerDataItemId": 4, "customerDataItem": "emailAddress" }, { "mandatoryCustomerDataItemId": 7, "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "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, "taxCode": "V09", "taxPercentage": 9.0000, "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, "layerInfo": null, "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "gboPackageTemplateId": "30901", "tapConnectProductCode": 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": 5, "name": "Student" }, { "customerSegmentId": 6, "name": "Ooievaarspas-gerechtigde" } ], "allowedGboAgeProfiles": [ { "gboAgeProfileId": 2, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageUntilInclusive": 11 }, { "gboAgeProfileId": 3, "name": "Jongere (12 t/m 18 jaar)", "ageFromInclusive": 12, "ageUntilInclusive": 18 } ], "productCategory": { "productCategoryId": 1, "isTravelProduct": true, "name": "Kortingsabonnement" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 1, "name": "guest" }, "requiredProducts": null, "incompatibleProducts": [ { "incompatibleProductId": 2, "productName": "HTM pilot 90% korting", "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItems": [ { "mandatoryCustomerDataItemId": 4, "customerDataItem": "emailAddress" }, { "mandatoryCustomerDataItemId": 7, "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, "taxCode": "V09", "taxPercentage": 9.0000, "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, "taxCode": "V09", "taxPercentage": 9.0000, "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "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, "amountInclTax": 110, "taxCode": "V09", "taxPercentage": 9.0000, "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, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "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, allowedGboAgeProfiles, padBirthDate) value: { "productId": 3, "parentProductId": null, "layerInfo": null, "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "gboPackageTemplateId": "33610", "tapConnectProductCode": 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": 5, "name": "Student" }, { "customerSegmentId": 6, "name": "Ooievaarspas-gerechtigde" } ], "allowedGboAgeProfiles": [ { "gboAgeProfileId": 2, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageToInclusive": 11 }, { "gboAgeProfileId": 3, "name": "Jongere (12 t/m 18 jaar)", "ageFromInclusive": 12, "ageToInclusive": 18 }, { "gboAgeProfileId": 4, "name": "Volwassene (19 t/m 64 jaar)", "ageFromInclusive": 19, "ageToInclusive": 64 }, { "gboAgeProfileId": 5, "name": "Oudere (65 jaar of ouder)", "ageFromInclusive": 65, "ageToInclusive": 999 } ], "productCategory": { "productCategoryId": 2, "isTravelProduct": true, "name": "Afgekocht reisrecht" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 3, "name": "profile" }, "requiredProducts": null, "incompatibleProducts": [ { "incompatibleProductId": 3, "productName": "HTM Regio Vrij DH73", "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItems": [ { "mandatoryCustomerDataItemId": 4, "customerDataItem": "emailAddress" }, { "mandatoryCustomerDataItemId": 8, "customerDataItem": "padBirthDate" } ], "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": [], "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": 3, "name": "creditcard", "issuer": "American Express" } ], "sellingPrices": [ { "sellingPriceId": 5, "amountExclTax": 5413, "amountInclTax": 5900, "taxCode": "V09", "taxPercentage": 9.0000, "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, "taxCode": "V09", "taxPercentage": 9.0000, "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" } ] } getDetailsProductVariantWithParent: summary: GBO product-variant, meaning that parentProductId and layerInfo are present description: >- This product is not a top-level parent, but a product-variant that refers to another product (via `parentProductId`). This means that the `layerInfo` should be present for this product-variant. The parent product references is `productId 3`, so the product in this example is an extension of that product-definition. MOre specifically: in this product-variant, we removed some `allowedGboAgeProfiles` from the definition - this means that the customer has to provide the birthdate of the token-owner (padBirthdate) in order to be able to buy this product-variant. value: { "productId": 4, "parentProductId": 3, "layerInfoId": { "layerInfoId": 1, "choiceKey": "allowedGboAgeProfiles", "choiceLabel": "Wat is uw geboortedatum?", "isCustomChoice": false }, "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "gboPackageTemplateId": "33610", "tapConnectProductCode": null, "productName": "HTM Regio Vrij DH73 Reductietarief", "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": 5, "name": "Student" }, { "customerSegmentId": 6, "name": "Ooievaarspas-gerechtigde" } ], "allowedGboAgeProfiles": [ { "gboAgeProfileId": 2, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageUntilInclusive": 11 }, { "gboAgeProfileId": 3, "name": "Jongere (12 t/m 18 jaar)", "ageFromInclusive": 12, "ageUntilInclusive": 18 } ], "productCategory": { "productCategoryId": 2, "isTravelProduct": true, "name": "Afgekocht reisrecht" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 3, "name": "profile" }, "requiredProducts": null, "incompatibleProducts": [ { "incompatibleProductId": 4, "productName": "HTM Regio Vrij DH73 Reductietarief", "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItems": [ { "mandatoryCustomerDataItemId": 4, "customerDataItem": "emailAddress" }, { "mandatoryCustomerDataItemId": 8, "customerDataItem": "padBirthDate" }, ], "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": null, "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": 3, "name": "creditcard", "issuer": "American Express" } ], "sellingPrices": [ { "sellingPriceId": 5, "amountExclTax": 5413, "amountInclTax": 5900, "taxCode": "V09", "taxPercentage": 9.0000, "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, "taxCode": "V09", "taxPercentage": 9.0000, "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, "isValid": false, "isArchived": false, "isSellableAtHtm": false } updateGboProduct: summary: Update existing GBO product (non-renewable) value: { "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "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": [ 5, 6 ], "allowedGboAgeProfileIds": [], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 1, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 7 ], "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999" } ] } updateGboProductWithParent: summary: Update existing GBO product with parent and layerInfo (non-renewable) value: { "parentProductId": 1, "layerInfoId": 1, "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "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": [ 5, 6 ], "allowedGboAgeProfileIds": [], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 2, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 7 ], "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "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: { "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "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": [ 5, 6 ], "allowedGboAgeProfileIds": [], "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, "taxCode": "V09", "taxPercentage": 9.0000, "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "amountExclTax": 101, "amountInclTax": 110, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "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: { "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "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": [ 5, 6 ], "allowedGboAgeProfileIds": [], "productCategoryId": 1, "requiredCustomerLevelId": 1, "incompatibleProducts": [ { "incompatibleProductId": 2, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 7 ], "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "sellingPriceId": 2, "amountExclTax": 101, "amountInclTax": 110, "taxCode": "V09", "taxPercentage": 9.0000, "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, "amountInclTax": 100, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 92.0000 }, { "sellingPriceId": 4, "amountExclTax": 101, "amountInclTax": 110, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2025-01-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999", "internalPrice": 101.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2025-12-31T23:59:59.999" } ] } updateGboPadProduct: summary: >- Update existing GBO product (PAD required, renewable, allowedGboAgeProfiles, padBirthDate) value: { "fikoArticleNumber": "1234", "isValid": true, "isArchived": false, "gboPackageTemplateId": "33610", "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": [ 5, 6 ], "allowedGboAgeProfileIds": [ 2, 3, 4, 5 ], "productCategoryId": 2, "requiredCustomerLevelId": 3, "requiredProducts": [ { "requiredProductId": 1, "description": "Basisproduct nodig" } ], "incompatibleProducts": [ { "incompatibleProductId": 3, "description": "Kan niet combineren met zichzelf" } ], "mandatoryCustomerDataItemIds": [ 4, 8 ], "requiredGboPersonalAttributeIds": [ 1, 2, 3 ], "tokenTypeIds": [ 1, 2, 3 ], "paymentMomentId": 1, "serviceOptionIds": [], "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": [ 3 ], "sellingPrices": [ { "sellingPriceId": 1, "amountExclTax": 5413, "amountInclTax": 5900, "taxCode": "V09", "taxPercentage": 9.0000, "fromInclusive": "2024-09-01T00:00:00.000", "toInclusive": "2024-12-31T23:59:59.999", "internalPrice": 5413.0000 } ] } ], "purchasePrices": [ { "purchasePriceId": 1, "amountExclTax": 0, "amountInclTax": 0, "taxCode": "V09", "taxPercentage": 9.0000, "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: LayerInfoResponse: type: object description: >- Gives information on the choice that the customer has to make, to enable the touchpoint to proceed further "down the product-tree" by selecting (PATCH-ing) the correct product-variant. LayerInfo is not a mandatory product-attribute, but it should always be present on all product for which `parentProductId != null`. (LayerInfo makes no sense for top-level parents as there is always a single starting point). \ **PMT should ensure that all products in the same "product-branch" (same `parentProductId`) have the same `layerInfoId` referenced. If a product is found to be in violation of this rule, its attribtue `isValid` should be set to `false`.** required: - layerInfoId - choiceKey - choiceLabel - isCustomChoice properties: layerInfoId: example: 1 type: integer choiceKey: example: isRenewable type: string description: >- Contains the JSON Key of the product-attribute that the customer has to make some choice on (determined by PMT), so that te correct product-variant can be selected by the touchpoint. For some decisions (like region), there is no product attribute, and thus `isCustomChoice` will be set to `true`, and `choiceKey` can then be set to any string on which touchpoints can also trigger behaviour if desired (think "region picker tool"). Therefore, reuse of choiceKeys should be the goal, so touchoints can keep their triggers simple and prevent duplication of similar choiceKeys to trigger the same behaviour. choiceLabel: example: Kies voor een doorlopend abonnement of een enkele termijn type: string description: >- Contains a human-readable label for the choice that the customer has to make - this label should be something that is easy to understand for the customer. Only one label (and thus, one language) is supported; label translations should be handled by the touchpoint. isCustomChoice: example: false type: boolean description: >- Indicates if the choice is a custom choice. If `false`, the PMT should fill `choiceKey` with the "differing attribute for this product-layer" and the user should not be able to override this. When no single attribute can be pinpointed by PMT, the product will become invalid (`isValid == false`) until either a situation with a single differing attribute is created, or if `isCustomChoice` is set to `true` - this would, however, also mean that touchpoints should be notified of this, especially if the configured LayerInfo contains a new, not previously used, `choiceKey`. GboAgeProfileResponse: type: object required: - gboAgeProfileId - name - ageFromInclusive - ageUntilInclusive properties: gboAgeProfileId: type: integer example: 1 name: type: string example: Kind (4 t/m 11 jaar) ageFromInclusive: type: integer description: The minimum age that the GBO age profile applies to example: 4 ageUntilInclusive: type: integer description: The maximum age that the GBO age profile applies to example: 11 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 - taxCode - taxPercentage - amountInclTax - fromInclusive - toInclusive - internalPrice properties: sellingPriceId: type: integer example: 1 amountExclTax: type: integer example: 750 taxCode: type: string example: 'V09' taxPercentage: type: number example: 9.0000 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 - amountInclTax - fromInclusive - toInclusive properties: purchasePriceId: type: integer example: 1 amountExclTax: type: integer example: 750 taxCode: type: string example: 'V09' taxPercentage: type: number example: 9.0000 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 - productName - productDescription - productCategory - tokenTypes - sellableTouchpointIds - amountInclTax - imageReference - productPageUrl properties: productId: type: integer example: 1 isValid: type: boolean description: Not returned for external touchpoints example: true isArchived: type: boolean description: Not returned for external touchpoints example: false 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 ProductPayloadResponse: type: object required: - productId - productOwner - isValid - isArchived - isSellableAtHtm properties: productId: type: integer example: 1 parentProductId: type: integer example: 1 layerInfo: $ref: '#/components/schemas/LayerInfoResponse' fikoArticleNumber: type: string description: The article number of the product in FIKO example: 1234 isValid: type: boolean description: Indicates if the product is valid - if false, the Service Engine will prevent touchpoints from seeing this product example: true isArchived: type: boolean description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product example: false gboPackageTemplateId: type: string example: '30901' tapConnectProductCode: type: string example: 1234AB 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) allowedGboAgeProfiles: type: array items: type: object $ref: '#/components/schemas/GboAgeProfileResponse' 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: guest 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: 3 name: type: string example: creditcard 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 - isValid - isArchived - isSellableAtHtm type: object properties: parentProductId: type: integer description: The ID of the parent product (if any) example: 1 layerInfoId: type: integer description: Only relevant when `parentProductId != null`; the ID of the layerInfo reference, giving information on why this layer of product-variants exists (PMT should enforce that this is filled for all products for which `parentProductId != null`) example: 1 fikoArticleNumber: type: string description: The article number of the product in FIKO example: 1234 isValid: type: boolean description: Indicates if the product is valid - if false, the Service Engine will prevent touchpoints from seeing this product example: true isArchived: type: boolean description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product example: false 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 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 allowedGboAgeProfileIds: type: array description: The IDs of the allowed GBO age profiles 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 - taxCode - taxPercentage - amountInclTax - fromInclusive - toInclusive - internalPrice properties: amountExclTax: type: integer example: 750 taxCode: type: string example: 'V09' taxPercentage: type: number example: 9.0000 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 - taxCode - taxPercentage - amountInclTax - fromInclusive - toInclusive properties: amountExclTax: type: integer example: 750 taxCode: type: string example: 'V09' taxPercentage: type: number example: 9.0000 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 - isValid - isArchived - isSellableAtHtm type: object properties: parentProductId: type: integer description: The ID of the parent product (if any) example: 1 layerInfoId: type: integer description: Only relevant when `parentProductId != null`; the ID of the layerInfo reference, giving information on why this layer of product-variants exists (PMT should enforce that this is filled for all products for which `parentProductId != null`) example: 1 fikoArticleNumber: type: string description: The article number of the product in FIKO example: 1234 isValid: type: boolean description: Indicates if the product is valid - if false, the Service Engine will prevent touchpoints from seeing this product example: true isArchived: type: boolean description: Indicates if the product is archived - if true, the Service Engine will prevent touchpoints from seeing this product example: false 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 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 allowedGboAgeProfileIds: type: array description: The IDs of the allowed GBO age profiles 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 - amountInclTax - taxCode - taxPercentage - 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 amountInclTax: type: integer example: 908 taxCode: type: string example: V09 taxPercentage: type: number example: 9.0000 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 - amountInclTax - taxCode - taxPercentage - 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 amountInclTax: type: integer example: 908 taxCode: type: string example: V09 taxPercentage: type: number example: 9.0000 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