openapi: 3.0.1 info: title: Service Engine APIs for Customers description: >- Service Engine APIs for HTM Customers. These are NOT the CRUD APIs to access raw data in the database. To be used by touchpoints to get information about HTM customers. version: "1.0" servers: - url: https://services.acc.api.htm.nl/abt/touchpoint/1.0 tags: - name: Customers description: >- Service Engine APIs for HTM Customers. These are NOT the CRUD APIs to access raw data in the database. To be used by touchpoints to get information about HTM customers. paths: /customers: get: tags: - Customers summary: Get a customer profile based on search parameters description: | Get a profile based on search parameters. Only returns a profile if a single result matches for a customer the parameters; when multiple results are found, additional search parameters are required to disambiguate. If role is klantenservice, multiple customers can be returned. parameters: - name: customerProfileId in: query schema: type: integer example: 1 - name: customerNumber in: query schema: type: integer example: 1000001 - name: customerStatusId in: query schema: type: integer example: 1 - name: debtorNumber in: query schema: type: integer example: 100001 - name: debtorStatusId in: query schema: type: integer example: 1 - name: birthname in: query schema: type: string example: John - name: surname in: query schema: type: string example: Doe - name: emailAddress in: query schema: type: string format: email example: john.doe@mymailprovider.com - name: dateOfBirth in: query schema: type: string format: date example: "2000-01-01" - name: addressStreet in: query schema: type: string example: Sesamestreet - name: addressHouseNumber in: query schema: type: integer example: 1 - name: addressHouseNumberSuffix in: query schema: type: string example: A - name: addressPostalCode in: query schema: type: string example: 1234 AB - name: addressCity in: query schema: type: string example: The Hague - name: addressCountry in: query schema: type: string example: The Netherlands - name: phoneNumber in: query schema: type: string example: "0123456789" - name: ovChipcardNumber in: query schema: type: integer example: 0123456789 - name: ovChipcardAlias in: query schema: type: string example: My ovchipcard - name: ovPayTokenNumber in: query schema: type: integer example: 0123456789 - name: ovPayTokenAlias in: query schema: type: string example: My Ov Pay Token - name: ovPayTokenXTat in: query schema: type: string example: 180d04e0-a721-447e-a1d9-b416937b43bc - name: ovPayTokenXBot in: query schema: type: string example: e1307c73-676a-4d07-967b-6141276f7c7c responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/CustomersResponseList" "404": description: No customer found content: application/json: example: { "type": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers", "apiErrorCode": "400.1", "title": "Niet gevonden", "detail": "Klant niet gevonden", "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7", "errors": [{ "subApiErrorCode": "0017" }], } "409": description: Multiple customers found content: application/json: example: { "type": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers", "apiErrorCode": "409.1", "title": "Meer dan 1 klantprofiel gevonden", "detail": "Meer dan 1 klantprofiel gevonden. Verfijn je zoekcriteria.", "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7", } post: tags: - Customers parameters: - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false description: The role of the HTM employee in the case of the SMP, in this case the call can only be done through the SMP summary: Create a customer profile. description: Create a customer profile in the ABT database with status ACTIVE and debtorStatus Inactive with a start date based on the timestamp of this post call. requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: minimalCustomerProfile: value: { "person": { "emailAddress": "j.jansen@hatseflats.nl" } } fullCustomerProfile: value: { "customerPreference": { "languageId": 1 }, "person": { "birthname": "Jan", "surname": "Jansen", "prefix": "dhr", "suffix": "jr", "dateOfBirth": "1970-01-01", "emailAddress": "j.jansen@hatseflats.nl", "addresses": [ { "street": "Laan van Meerdervoort", "houseNumber": 5, "houseNumberSuffix": "B", "postalCode": "2500AA", "city": "Den Haag", "country": "NL", "isPreferred": true, "addressTypeId": 1 }, { "street": "Beeklaan", "houseNumber": 30, "houseNumberSuffix": "B", "postalCode": "2500AA", "city": "Den Haag", "country": "NL", "isPreferred": false, "addressTypeId": 2 } ], "phones": [ { "number": "6123456789", "countryCode": "0031", "phoneTypeId": 1, "isPreferred": true }, { "number": "7012345678", "countryCode": "0031", "phoneTypeId": 2, "isPreferred": false } ], "devices": [ { "externalDeviceId": "123e4567-e89b-12d3-a456-426614174000", "alias": "My iPhone", }, { "externalDeviceId": "987e6543-e21b-12d3-a456-426614174999", "alias": "My iPad", } ] } } responses: "201": description: Created content: application/json: schema: $ref: "#/components/schemas/CustomersResponse" patch: tags: - Customers parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false description: The role of the HTM employee in the case of the SMP summary: Update a customer profile description: Update a customer profile based on the sub from the JWT, or customerProfileId in case of SMP requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: patchCustomer: value: { "person": { "birthname": "Jan", "surname": "Jansen", "prefix": "dhr", "suffix": "jr", "dateOfBirth": "1970-01-01", "addresses": [ { "addressId": 2, "street": "Laan van Meerdervoort", "houseNumber": 5, "postalCode": "2500AA", "city": "Den Haag", "country": "NL" }, { "addressId": 1, "street": "Beeklaan", "houseNumber": 30, "houseNumberSuffix": "B", "postalCode": "2500AA", "city": "Den Haag", "country": "NL", "addressTypeId": 2 } ], "phones": [ { "phoneId": 1, "number": "6123456789", "countryCode": "0031", "phoneTypeId": 1, "isPreferred": true }, { "phoneId": 2, "number": "7012345678", "countryCode": "0031", "phoneTypeId": 2, "isPreferred": false } ], "devices": [ { "deviceId": "813afdd8-bf8c-4e26-bfda-4da79552bd38", "externalDeviceId": "123e4567-e89b-12d3-a456-426614174000", "alias": "My iPhone", }, { "deviceId": "4f4249a2-ac6c-44f9-b740-66e66b6f3c28", "externalDeviceId": "987e6543-e21b-12d3-a456-426614174999", "alias": "My iPad", } ] } } responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/CustomersResponse" /customers/tokens: get: tags: - Customers parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false description: The role of the HTM employee in the case of the SMP - name: ovPayTokenId in: query schema: type: integer example: 1 required: false description: The ovpay token id of a specific customer token - name: tokenTypeId in: query schema: type: array items: type: integer explode: false description: Filter on tokentype. 1 = EMV, 2 = OV-pas physical, 3 = OV-pas digital required: false - name: xTat in: query schema: type: string example: 4c2d60e2-cd03-4c80-ae70-573a301f0bff required: false description: Filter on the xTat of a customer token - name: xBot in: query schema: type: string example: 91641b54-056c-49ea-b598-ccde81d6c45a required: false description: Filter on the xBot of a customer token - name: ovpasNumber in: query schema: type: string example: 56HYRTL required: false description: Filter on the OV pasNumber of a customer token of type OV Pas - name: lastDigits in: query schema: type: string example: 1234 required: false description: Filter on the last digits of a customer token of type EMV - name: tokenStatusId in: query schema: type: array items: type: integer explode: false description: Filter on token status. 1 = Retired, 2 = Active, 3 = Replaced (*), 4 = On Stock, 5 = Suspended, 6 = Removed by customer (*), 7 = Renewed Active required: false - name: expirationDate in: query schema: type: string format: date-time example: 2027-01-01T09:00:00Z required: false description: Filter on the expirationDate of a customer token - name: replacedByTokenId in: query schema: type: integer example: 2 required: false description: Filter on the replacedByTokenId of a customer token summary: Get a list of all OvPayTokens for a certain customer. description: Get a list of all OvPayTokens for a certain customer, only returns the tokens for an identified customer through JWT or customerProfileId in the headers. responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Empty token list: summary: Empty token list description: Empty token list value: { "ovPayTokens": [], _links: { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, } EMV without PAD: summary: EMV without PAD description: EMV without PAD value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, } OV pas without PAD: summary: OV pas without PAD description: OV pas without PAD value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 350 }, "status": "ACTIVE", "originDate": "2019-07-16T11:00:00+02:00", }, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/51compare", "method": "POST", }, }, }, ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, } OV pas with PAD and autoReload: summary: OV pas with PAD and autoReload description: OV pas with PAD and autoReload value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": { "autoReloadAmount": 500, "retailerReferenceId": "abc", "arrit": "425f7fc2-1103-4822-9c79-7c4aaa2fb6aa", "autoReloadRegistrationStatus": "ACTIVE", "autoReloadRegistrationStartDateTime": "2024-06-02T15:03:46Z", }, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 350 }, "status": "ACTIVE", "originDate": "2019-07-16T11:00:00+02:00", }, "personalAccountData": { "name": { "inaccuracyFlag": false, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 0, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "birthdate": { "inaccuracyFlag": false, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 0, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "photo": { "inaccuracyFlag": false, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 0, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, }, "gboAgeProfile": { "gboAgeProfileId": 1, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageToInclusive": 11 }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "update_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "PATCH", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, }, ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, } OV pas with partial PAD: summary: OV pas with partial PAD description: OV pas with partial PAD value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 350 }, "status": "ACTIVE", "originDate": "2019-07-16T11:00:00+02:00", }, "personalAccountData": { "name": null, "birthdate": { "inaccuracyFlag": true, "inaccuracyFlagReason": "Invalid birthdate", "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "photo": null, }, "gboAgeProfile": { "gboAgeProfileId": 1, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageToInclusive": 11 }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "update_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "PATCH", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, }, ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, } OV pas with invalid PAD: summary: OV pas with invalid PAD description: OV pas with invalid PAD value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 350 }, "status": "ACTIVE", "originDate": "2019-07-16T11:00:00+02:00", }, "personalAccountData": { "name": { "inaccuracyFlag": true, "inaccuracyFlagReason": "T.B.D", "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "birthdate": { "inaccuracyFlag": true, "inaccuracyFlagReason": "T.B.D", "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "photo": { "inaccuracyFlag": true, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, }, "gboAgeProfile": { "gboAgeProfileId": 1, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageToInclusive": 11 }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "update_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "PATCH", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, }, ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, } Token list with every status for tokenTypeId = 2, role = KlantenService: summary: Token list with every status for tokenTypeId = 2, role = KlantenService description: Token list with every status for tokenTypeId = 2, role = KlantenService value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, }, { "customerProfileId": 1, "ovPayTokenId": 6, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 3, "name": "Replaced (*)" }, "expirationDate": "2028-02-01", "replacedByTokenId": 2, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null, }, { "customerProfileId": 18, "ovPayTokenId": 13, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 4, "name": "On stock" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null }, { "customerProfileId": 132, "ovPayTokenId": 21, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "Mijn OV Pas", "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null }, { "customerProfileId": 166, "ovPayTokenId": 28, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "Mijn OV Pas", "tokenStatus": { "tokenStatusId": 6, "name": "Removed by customer (*)", }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null }, { "customerProfileId": 166, "ovPayTokenId": 115, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "My retired token", "tokenStatus": { "tokenStatusId": 1, "name": "Retired" }, "expirationDate": "2025-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null }, { "customerProfileId": 1, "ovPayTokenId": 118, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "My found token", "tokenStatus": { "tokenStatusId": 7, "name": "Renewed Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null, }, "gboAgeProfile": null }, ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, } post: tags: - Customers parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false summary: Create a new OV paytoken in the database for a given customer description: Create a new OV paytoken for a customerProfile requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Add EMV token: summary: Add EMV token description: Add EMV token value: { "ovPayToken": { "tokenTypeId": 1, "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 200, "alias": "Mijn token", }, } Add OV pas physical token: summary: Add OV pas physical token description: Add OV pas physical token value: { "ovPayToken": { "tokenTypeId": 2, "ovpasNumber": "OV34567", "verificationCode": "211", "alias": "Mijn token", }, } responses: "201": description: Created content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Add EMV token: summary: Add EMV token description: Add EMV token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovPasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "POST", }, }, } Add OV pas physical token: summary: Add OV pas physical token description: Add OV pas physical token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, "ovpasNumber": "OV34567", "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 00 }, "status": "INACTIVE", "originDate": "2019-07-16T11:00:00+02:00", }, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "POST", }, }, } /customers/tokens/{ovpayTokenId}: post: tags: - Customers parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: ovpayTokenId in: path schema: type: integer example: 1 required: true summary: Replace an OVpay token with another (+ transfer products) - V1 (for touch point) description: | Transfer products from one OVpay token to another, and replace the tokens in the database. This endpoint is for touch point usage and will be replaced by `/customers/tokens/{ovpayTokenId}/transfer`. requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Replace with new EMV token by SRID: summary: Replace with new token by SRID description: Replace with new token by service reference ID and amount. value: { "ovPayToken": { "newTokenId": null, "tokenTypeId": 1, "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230, "alias": "Nieuw token", }, } Replace with existing EMV token from profile: summary: Replace with existing token from profile description: Replace with existing token from customer profile. value: { "ovPayToken": { "newTokenId": 10 } } Replace with new OV pas token: summary: Replace with new OV pas token description: Replace with new OV pas token by OV-pas number. value: { "ovPayToken": { "tokenTypeId": 2, "ovpasNumber": "OV34567", "verificationCode": "211", "alias": "Mijn token", }, } responses: "201": description: Created content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Replace with new EMV token: summary: Replace with new EMV token description: Replace with new EMV token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, } Replace with new OV pas token: summary: Replace with new OV pas token description: Replace with new OV pas token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, "ovpasNumber": "OV34567", "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 350 }, "status": "ACTIVE", "originDate": "2024-07-16T11:00:00+02:00", }, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, } "200": description: Ok content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Replace with existing EMV token: summary: Replace with existing EMV token description: Replace with existing EMV token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 10, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn bestaande token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=10", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/compare", "method": "POST", }, }, }, } patch: tags: - Customers parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: ovpayTokenId in: path schema: type: integer example: 1 required: true summary: Edit an existing OV paytoken description: Edit an existing OV paytoken in the database for a given customer requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Update an OV pay token status: summary: Update an OV pay token status description: Update an OV pay token status value: { "ovPayToken": { "tokenStatusId": 5 } } Update an OV pay token alias: summary: Update an OV pay token alias description: Update an OV pay token alias value: { "ovPayToken": { "alias": "Mijn nieuwe tokennaam" } } Update an OV pay token full: summary: Update an OV pay token full description: Update an OV pay token full value: { "ovPayToken": { "tokenStatusId": 5, "alias": "Mijn verloren pas" }, } responses: "200": description: Ok content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Update an OV pay token status: summary: Update an OV pay token status description: Update an OV pay token status value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, } Update an OV pay token alias: summary: Update an OV pay token alias description: Update an OV pay token alias value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn nieuwe tokennaam", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, } Update an OV pay token full: summary: Update an OV pay token full description: Update an OV pay token full value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn verloren pas", "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/e35977b2-52bb-48ef-aca8-297b2c1d5058", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, } delete: tags: - Customers parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: ovpayTokenId in: path schema: type: integer example: 1 required: true summary: Delete an existing OV paytoken description: Delete an existing OV paytoken for a given customer responses: "200": description: Ok /customers/tokens/{ovpayTokenId}/replace: post: tags: - Token Replace v2 parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: ovpayTokenId in: path schema: type: integer example: 1 required: true summary: Replace an OVpay token with another (+ transfer products) - V2 (for Integratielaag) description: | Transfer products from one OVpay token to another, and replace the tokens in the database. This endpoint is for usage by integratielaag only. Touch points should use `/customers/tokens/{ovpayTokenId}/transfer` instead. requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Replace with new token by XTAT: summary: Replace with new token by XTAT description: | Replace with new token by XTAT. Note however the consumer provides an XTAT to identify the new token, this token could still be an existing token linked to the customer profile. This should be checked beforehand. value: { "ovPayToken": { "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "alias": "Mijn token", }, } responses: "201": description: Created content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Replace with new EMV token: summary: Replace with new EMV token description: Replace with new EMV token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, } Replace with new OV pas token: summary: Replace with new OV pas token description: Replace with new OV pas token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, "ovpasNumber": "OV34567", "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 350 }, "status": "ACTIVE", "originDate": "2024-07-16T11:00:00+02:00", }, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, }, } "200": description: Ok content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Replace with existing EMV token: summary: Replace with existing EMV token description: Replace with existing EMV token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 10, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn bestaande token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=10", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/trips", "method": "GET", }, "add_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/compare", "method": "POST", }, }, }, } /customers/tokens/{ovPayTokenId}/productinstances: get: tags: - Customers summary: Get a list of all HTM products instantiated on the given OvPayToken description: |- Get a list of all HTM products instantiated on the given OvPayToken. Only HTM products are returned; GBO does not allow HTM to get information on non-HTM product-instances. Where relevant, operations to be performed are returned as HATEOAS links per product-instance. parameters: - name: ovPayTokenId in: path required: true style: simple description: Id of the OvPayToken to get product-instances for. schema: type: integer example: 1 responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/OvPayTokenProductInstancesResponse" examples: getEmptyProductInstances: summary: No product-instances found on token value: productInstances: [] getSingleProductInstance: summary: One non-renewable product-instance value: { "productInstances": [ { "productInstanceId": "26d41861-f77e-4666-9cde-2c5c66ace0a2", "productId": 1, "name": "HTM 90% Korting", "purchasedProductType": "GBO", "status": "Active", "isRenewable": true, "productCategory": { "productCategoryId": 1, "name": "Kortingsabonnement", }, "fromInclusive": "2024-11-25T13:25:00+01:00", "untilInclusive": "2024-12-25T03:59:59+01:00", "orderId": "501B17EF-36C4-4039-B92C-6517969B464E", "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", "contractId": "56B17EF-C436-9043-B76C-481797WEB464F", "content": null, "_links": { "get_order": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E", "method": "GET", }, "get_contract": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F", "method": "GET", }, }, }, ], } /customers/tokens/{ovPayTokenId}/compare: parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: ovPayTokenId in: path required: true style: simple description: Id of the OVpay token for the LHS of the comparison. schema: type: integer example: 1 post: summary: Compare attributes of two OVpay tokens. description: |- Compare the attributes of an existing OVpay token in the customer profile with the attributes of a new OVpay token. The new token can be passed using one of the following methods: - Compare with an existing OVpay token - Compare with an XBOT - Compare with an XTAT - Compare with SRID + amount - Compare with OVpas number + verification code The comparison results are returned in the response body. Comparison is made on the following attributes: - Token type - Token status (only if target token is known in the customer profile) - Expiry date - Instantiated GBO products - Auto reload registration - E-purse - PAD (name, birthdate, photo) - Age profile tags: - Customers requestBody: content: application/json: schema: $ref: "#/components/schemas/CompareRequest" examples: Compare with an existing OVpay token: value: { "ovPayTokenId": 1 } Compare with an xBOT: value: { "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } Compare with an xTAT: value: { "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } Compare with SRID + amount: value: { "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230 } Compare with OVpas number + verification code: value: { "ovpasNumber": "OV34567", "verificationCode": "1234" } Complete request body (for development only): value: { "ovPayTokenId": 1, "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058", "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230, "ovpasNumber": "OV34567", "verificationCode": "1234", } responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Transferable token: value: { "oldOvPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null }, "newOvPayToken": { "customerProfileId": null, "ovPayTokenId": null, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": null, "tokenStatus": null, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null }, "isTransferable": true, "transferableObjects": { "tokenType": true, "tokenStatus": true, "expirationDate": true, "productInstances": true, "autoReloadRegistration": true, "ePurse": true, "personalAccountData": { "name": true, "birthdate": true, "photo": true }, "gboAgeProfile": true }, "_links": { "transfer": { "href": "https://services.dev.api.htm.nl/abt/touchpoint/1.0/customers/tokens/1/transfer", "method": "POST", }, }, } Non-transferable token (products not compatible on new token): value: { "oldOvPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "productInstances": [ { "productId": 1, "name": "HTM 90% Korting EMV", "status": "Active", "isRenewable": true, "productCategory": { "productCategoryId": 1, "name": "Kortingsabonnement" }, "fromInclusive": "2025-11-25T13:25:00+01:00", "untilInclusive": "2025-12-25T03:59:59+01:00", "orderId": "501B17EF-36C4-4039-B92C-6517969B464E", "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", "contractId": "56B17EF-C436-9043-B76C-481797WEB464F", "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances/1", "method": "GET" }, "get_order": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E", "method": "GET" }, "get_contract": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F", "method": "GET" } } } ], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null }, "newOvPayToken": { "customerProfileId": null, "ovPayTokenId": null, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": null, "tokenStatus": null, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null }, "isTransferable": false, "transferableObjects": { "tokenType": true, "tokenStatus": true, "expirationDate": true, "productInstances": false, "autoReloadRegistration": true, "ePurse": true, "personalAccountData": { "name": true, "birthdate": true, "photo": true }, "gboAgeProfile": true, }, "_links": {}, } Non-transferable token (unsupported token type combination): value: { "oldOvPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null }, "newOvPayToken": { "customerProfileId": null, "ovPayTokenId": null, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": null, "tokenStatus": null, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null }, "isTransferable": false, "transferableObjects": { "tokenType": false, "tokenStatus": true, "expirationDate": true, "productInstances": true, "autoReloadRegistration": true, "ePurse": true, "personalAccountData": { "name": true, "birthdate": true, "photo": true }, "gboAgeProfile": true, }, "_links": {}, } Non-transferable token (marked PAD): value: { "oldOvPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": 2, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": { "inaccuracyFlag": true, "inaccuracyFlagReason": "T.B.D", "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "birthdate": { "inaccuracyFlag": true, "inaccuracyFlagReason": "T.B.D", "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "photo": { "inaccuracyFlag": true, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, }, "gboAgeProfile": { "gboAgeProfileId": 1, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageToInclusive": 11 } }, "newOvPayToken": { "customerProfileId": null, "ovPayTokenId": null, "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": null, "tokenStatus": null, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, "gboAgeProfile": null }, "isTransferable": false, "transferableObjects": { "tokenType": true, "tokenStatus": true, "expirationDate": true, "productInstances": true, "autoReloadRegistration": true, "ePurse": true, "personalAccountData": { "name": false, "birthdate": false, "photo": false, }, "gboAgeProfile": true, }, "_links": {}, } Non-transferable token (different age profile): value: { "oldOvPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": 2, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": { "inaccuracyFlag": false, "inaccuracyFlagReason": "T.B.D", "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "photo": null, }, "gboAgeProfile": { "gboAgeProfileId": 1, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageToInclusive": 11 } }, "newOvPayToken": { "customerProfileId": null, "ovPayTokenId": null, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": null, "tokenStatus": null, "expirationDate": "2028-02-01", "productInstances": [], "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": { "inaccuracyFlag": false, "inaccuracyFlagReason": "T.B.D", "inaccuracyFlagSetCounter": 1, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "photo": null, }, "gboAgeProfile": { "gboAgeProfileId": 4, "name": "Kind (19 t/m 65 jaar)", "ageFromInclusive": 19, "ageToInclusive": 65 } }, "isTransferable": false, "transferableObjects": { "tokenType": true, "tokenStatus": true, "expirationDate": true, "productInstances": true, "autoReloadRegistration": true, "ePurse": false, "personalAccountData": { "name": true, "birthdate": false, "photo": true }, "gboAgeProfile": false, }, "_links": {}, } "400": description: Bad Request content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: New token already present in other customer profile: value: { "type": "https://htm.nl/api/v1/probs/badrequest", "title": "Bad Request", "detail": "New token already present in other customer profile.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "New token already present in other customer profile.", "pointer": "#/0/ovPayTokenId", "ovPayTokenId": 2, }, ], } "404": description: Not found content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Old token not found in profile: value: { "type": "https://htm.nl/api/v1/probs/notfound", "title": "The item you requested was not found.", "detail": "The old token was not found in the customer profile.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The old token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", "ovPayTokenId": 1, }, ], } New token not found in profile: value: { "type": "https://htm.nl/api/v1/probs/notfound", "title": "The item you requested was not found.", "detail": "The new token was not found in the customer profile.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The new token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", "ovPayTokenId": 2, }, ], } XTAT for new token not found in GBO: value: { "type": "https://htm.nl/api/v1/probs/notfound", "title": "The item you requested was not found.", "detail": "The new token was not found in GBO:.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "XTAT for the new token was not found in GBO.", "pointer": "#/0/xTat", "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", }, ], } SRID for new token not found in GBO: value: { "type": "https://htm.nl/api/v1/probs/notfound", "title": "The item you requested was not found.", "detail": "The new token was not found in GBO:.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "Service Reference ID for the new token was not found in GBO.", "pointer": "#/0/serviceReferenceId", "serviceReferenceId": "NLOV1234567ABCDEFG", }, ], } /customers/tokens/{ovPayTokenId}/transfer: parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: ovPayTokenId in: path required: true style: simple description: Id of the OVpay token from which data will be transferred. schema: type: integer example: 1 post: summary: "**INTEGRATIELAAG** Transfer old OVpay token to new OVpay token." description: |- **Note that this is an integratielaag endpoint, not a Service Engine endpoint!** First transfers all personal account data (if present), then all products, of an existing OVpay token to a new OVpay token. The new token will also be persisted in the profile as a replacement of the old token. This call is asynchronous, and progress can be monitored using the `/customers/tokens/transfer/responsestatus/*` endpoint. tags: - Token Replace v2 requestBody: content: application/json: schema: $ref: "#/components/schemas/TransferRequest" examples: Transfer from a token without PAD to a new token: summary: Transfer from a token without PAD to a new token description: | Transfer of a token without PAD to a new OVpay token. Note the new token in the request is always identified by xTAT, regardless if the new token already exists in the customer profile. If the new token does not exist in the customer profile, the user needs to provide an alias for the new token, and it will be created in the customer profile. value: { "oldOvPayToken": {}, "newOvPayToken": { "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "My new token", }, } Transfer from a token with PAD to a new token without existing PAD: summary: Transfer from a token with PAD to a new token without existing PAD description: | Transfer of a token with PAD to a new token by xTAT without existing PAD. Note how this request is different, since it has an e-mail address on which the new PAD should be created. This request may optionally provide an OTP for verification of th provided email address. Also note the new token in the request is always identified by xTAT, regardless if the new token already exists in the customer profile. If the new token does not exist in the customer profile, the user needs to provide an alias for the new token, and it will be created in the customer profile. value: { "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "My new token", "padEmailAddress": "jandevries@outlook.com", "padOtp": "678901", }, } Transfer from a token with PAD to a new token with existing PAD: summary: Transfer from a token with PAD to a new token with existing PAD description: | Transfer of a token with PAD to a new token by xTAT with existing PAD. Note that the new token in the request is always identified by xTAT, regardless if the new token already exists in the customer profile. If the new token does not exist in the customer profile, the user needs to provide an alias for the new token, and it will be created in the customer profile. value: { "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "My new token", "padOtp": "678901", }, } Complete request body (for development only): summary: Complete request body (for development only) description: | Complete request body (for development only). value: { "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "My new token", "padEmailAddress": "jandevries@outlook.com", "padOtp": "678901", }, } responses: "202": description: Accepted content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Transfer of token started: description: | The transfer of the token was started successfully. The data of the token will be transferred asynchronously. In the response body the consumer will find information on how to retrieve the processing status. value: { "startTime": "2025-02-14T05:32:47.067Z", "status": "Running", "clientTrackingId": "08584620957189579629541919368CU00", "callbackurl": "https://api.integratielaag.nl/customers/tokens/transfer/responsestatus/runtime/webhooks/workflow/scaleUnits/prod-00/workflows/6fd466916c", "retryAfter": 10, } "400": description: Bad Request content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Request body validation error: value: { "type": "https://htm.nl/api/v1/probs/validation", "title": "Validation error", "detail": "The request body is not valid.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The old token is required.", "pointer": "#/oldOvPayToken", }, { "detail": "The new token is required.", "pointer": "#/newOvPayToken", }, ], } /customers/tokens/transfer/responsestatus/{clientTrackingId}: parameters: - in: path name: clientTrackingId schema: type: string required: true description: The clientTrackingId of the token transfer request. get: tags: - Token Replace v2 summary: "**INTEGRATIELAAG** Get the status of the initiated token transfer process (POST)." description: | **Note that this is an integratielaag endpoint, not a Service Engine endpoint!** Get the status of the asynchronous token transfer processing. responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: New token as a result of a successful transfer: description: | The transfer of the token was processed successfully. The response body shows the details of the new token to which the data was transferred. value: { "customerProfileId": 1, "ovPayTokenId": 2, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": null, "autoReloadRegistration": { "autoReloadAmount": 500, "retailerReferenceId": "abc", "arrit": "425f7fc2-1103-4822-9c79-7c4aaa2fb6aa", "autoReloadRegistrationStatus": "ACTIVE", "autoReloadRegistrationStartDateTime": "2024-06-02T15:03:46Z", }, "ePurse": { "e-PurseBalance": { "currency": "EUR", "amount": 350 }, "status": "ACTIVE", "originDate": "2019-07-16T11:00:00+02:00", }, "personalAccountData": { "name": { "inaccuracyFlag": false, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 0, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "birthdate": { "inaccuracyFlag": false, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 0, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, "photo": { "inaccuracyFlag": false, "inaccuracyFlagReason": null, "inaccuracyFlagSetCounter": 0, "isValidated": false, "changeCounter": 0, "maxUpdatesVerificationCount": 0, "lastChangeDate": "2024-08-24T14:15:22Z", }, }, "gboAgeProfile": { "gboAgeProfileId": 1, "name": "Kind (4 t/m 11 jaar)", "ageFromInclusive": 4, "ageToInclusive": 11 }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, "delete_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, "update_personal-data": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/e7fa3392-646b-40e2-95a6-c417dc0b0969", "method": "PATCH", }, "compare_token": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, } Token transfer in progress: description: | The transfer of the token is still in progress. The response body shows the details of the processing status. value: { "properties": { "waitEndTime": "2025-06-04T09:29:21.9641991Z", "startTime": "2025-06-04T09:29:21.9641991Z", "status": "Running", "correlation": { "clientTrackingId": "08584525775244808022011782750CU00", }, "workflow": { "id": "/workflows/9cd96b77c0b94b31832778569f8ef2f9/versions/08584532480062676349", "name": "08584532480062676349", "type": "workflows/versions", }, "trigger": { "name": "token_transfer", "inputsLink": { "uri": "https://htm-abt-logicapp-acc.azurewebsites.net:443/runtime/webhooks/workflow/scaleUnits/prod-00/workflows/9cd96b77c0b94b31832778569f8ef2f9/runs/08584525775235278538475939776CU00/contents/TriggerInputs?api-version=2022-05-01&code=C6PDQGl3MGwt8KyA9BjWDdQbzBwm-01gEmZaTp-hPJ5UAzFuPU-thg%3d%3d&se=2025-06-04T13%3A00%3A00.0000000Z&sp=%2Fruns%2F08584525775235278538475939776CU00%2Fcontents%2FTriggerInputs%2Fread&sv=1.0&sig=6Uxs33K7cQ7jONWzhv9XFPzx4RRHZ6smzfM6wNPk5Mc", "contentSize": 298, }, "outputsLink": { "uri": "https://htm-abt-logicapp-acc.azurewebsites.net:443/runtime/webhooks/workflow/scaleUnits/prod-00/workflows/9cd96b77c0b94b31832778569f8ef2f9/runs/08584525775235278538475939776CU00/contents/TriggerOutputs?api-version=2022-05-01&code=C6PDQGl3MGwt8KyA9BjWDdQbzBwm-01gEmZaTp-hPJ5UAzFuPU-thg%3d%3d&se=2025-06-04T13%3A00%3A00.0000000Z&sp=%2Fruns%2F08584525775235278538475939776CU00%2Fcontents%2FTriggerOutputs%2Fread&sv=1.0&sig=vJ6pmCsmz2aP7f73MVOmCTes3YvC1e2w0ZLqdypLXrM", "contentSize": 6110, }, "startTime": "2025-06-04T09:29:21.9497457Z", "endTime": "2025-06-04T09:29:21.9497457Z", "originHistoryName": "08584525775235278538475939776CU00", "correlation": { "clientTrackingId": "08584525775244808022011782750CU00", }, "status": "Succeeded", }, "outputs": {}, "response": { "startTime": "2025-06-04T09:29:21.9642901Z", "correlation": {}, "status": "Waiting", }, }, "id": "/workflows/9cd96b77c0b94b31832778569f8ef2f9/runs/08584525775235278538475939776CU00", "name": "08584525775235278538475939776CU00", "type": "workflows/runs", } "404": description: Not found content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Old token not found in profile: value: { "type": "https://htm.nl/api/v1/probs/notfound", "title": "The item you requested was not found.", "detail": "The old token was not found in the customer profile.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The old token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", "ovPayTokenId": 1, }, ], } New token not found in profile: value: { "type": "https://htm.nl/api/v1/probs/notfound", "title": "The item you requested was not found.", "detail": "The new token was not found in the customer profile.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The new token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", "ovPayTokenId": 2, }, ], } XTAT for new token not found in GBO: value: { "type": "https://htm.nl/api/v1/probs/notfound", "title": "The item you requested was not found.", "detail": "The new token was not found in GBO:.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "XTAT for the new token was not found in GBO.", "pointer": "#/0/xTat", "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", }, ], } "405": description: Not allowed content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Old token is wrong token type: value: { "type": "https://htm.nl/api/v1/probs/notallowed", "title": "The transfer you requested was not allowed.", "detail": "The old token has wrong token type.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The old token has token type OV-pas physical.", "pointer": "#/0/ovPayToken/tokenTypeId", "tokenTypeId": 2, }, ], } Old token has wrong token status: value: { "type": "https://htm.nl/api/v1/probs/notallowed", "title": "The transfer you requested was not allowed.", "detail": "The old token has wrong token status.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The old token has token status replaced.", "pointer": "#/0/ovPayToken/tokenStatusId", "tokenStatusId": 4, }, ], } New token is expired: value: { "type": "https://htm.nl/api/v1/probs/notallowed", "title": "The transfer you requested was not allowed.", "detail": "The new token is expired.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "The new token is expired.", "pointer": "#/0/ovPayToken/expirationDate", "expirationDate": "2022-01-01", }, ], } One or more GBO product instances not transferable: value: { "type": "https://htm.nl/api/v1/probs/notallowed", "title": "The transfer you requested was not allowed.", "detail": "One or more GBO product instances are not transferable.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "One or more GBO product instances are not transferable", "pointer": "#/0/ovPayToken/packageTemplateId", "packageTemplateId": "33613", }, ], } One or more PAD attributes marked: value: { "type": "https://htm.nl/api/v1/probs/notallowed", "title": "The transfer you requested was not allowed.", "detail": "One or more PAD attributes are not transferable.", "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", "errors": [ { "detail": "PAD attribute birthdate is marked on the old token", "pointer": "#/0/ovPayToken/padAttributes/birthdate", }, ], } /customers/devices: post: summary: Add a new device to a customer profile. description: Add a new device to a customer profile. tags: - Devices requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Add a new device: value: { "externalDeviceId": "dee7d80e-9288-4508-a3ed-c067e619179f", "alias": "My iPhone 13", } responses: "201": description: Created content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: New device added to customer profile: value: { "deviceId": "0f0981bf-6d60-4b06-bc55-de1ba325f366", "externalDeviceId": "dee7d80e-9288-4508-a3ed-c067e619179f", "alias": "My iPhone 13", } /customers/devices/{deviceId}: parameters: - name: deviceId in: path required: true style: simple description: Id of the device to be deleted. schema: type: string format: uuid example: 0f0981bf-6d60-4b06-bc55-de1ba325f366 patch: summary: Update alias of a device in a customer profile. description: Update alias of a device in a customer profile. tags: - Devices requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Update alias of a device: value: { "alias": "My old iPhone 13", } responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Device alias updated in customer profile: value: { "deviceId": "0f0981bf-6d60-4b06-bc55-de1ba325f366", "externalDeviceId": "dee7d80e-9288-4508-a3ed-c067e619179f", "alias": "My old iPhone 13", } delete: summary: Delete a device from a customer profile. description: Delete a device from a customer profile. tags: - Devices responses: "200": description: OK /customers/devices/{deviceId}/productinstances: parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: deviceId in: path required: true style: simple description: Id of the device you want to get the instantiated HTM products for. schema: type: string format: uuid example: 0f0981bf-6d60-4b06-bc55-de1ba325f366 get: summary: Get a list of all HTM products instantiated on the given device description: |- Get a list of all HTM products instantiated on the given device. Only HTM products are returned; GBO does not allow HTM to get information on non-HTM product-instances. Where relevant, operations to be performed are returned as HATEOAS links per product-instance. tags: - Devices responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: getEmptyProductInstances: summary: No product-instances found for devi value: productInstances: [] getSingleProductInstance: summary: One non-renewable product-instance value: { "productInstances": [ { "productInstanceId": "0f0981bf-6d60-4b06-bc55-de1ba325f366", "productId": 13, "name": "HTM dagkaart", "purchasedProductType": "TapConnect", "status": "Created", "isRenewable": false, "productCategory": { "productCategoryId": 2, "name": "Afgekocht reisrecht", }, "fromInclusive": "2024-11-25T13:25:00+01:00", "untilInclusive": null, "orderId": "501B17EF-36C4-4039-B92C-6517969B464E", "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", "contractId": null, "content": { "ticketReference": "KJj43nejhbTxhr897287", "issuedAt": "2020-03-21T00:00:00", "activatedAt": null, "blocked": false, "cancelledAt": null, "fraudDetected": false, "barcode": "barcodeBytes" }, "_links": { "get_order": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E", "method": "GET", }, "patch_productinstance": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/productinstances/0f0981bf-6d60-4b06-bc55-de1ba325f366", "method": "PATCH", }, }, }, ], } /customers/productinstances/{productInstanceId}: parameters: - name: X-HTM-JWT-AUTH-HEADER in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false description: The customerProfileId of a customer in the case of the SMP - name: X-HTM-ROLE-HEADER in: header schema: type: string example: Customer required: false - name: productInstanceId in: path required: true style: simple description: Id of the product instance you want to change schema: type: string format: uuid example: 0f0981bf-6d60-4b06-bc55-de1ba325f366 patch: summary: Update a productInstance description: |- Update the status of the give productInstance. tags: - Product instances requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Update a productInstance status to active: value: { "status": "Active" } responses: "200": description: OK content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Update a productInstance status to active: summary: Update a productInstance status to active value: { "productInstances": [ { "productInstanceId": "0f0981bf-6d60-4b06-bc55-de1ba325f366", "productId": 13, "name": "HTM dagkaart", "purchasedProductType": "TapConnect", "status": "Active", "isRenewable": false, "productCategory": { "productCategoryId": 2, "name": "Afgekocht reisrecht", }, "fromInclusive": "2024-11-25T13:25:00+01:00", "untilInclusive": null, "orderId": "501B17EF-36C4-4039-B92C-6517969B464E", "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", "contractId": null, "content": { "ticketReference": "KJj43nejhbTxhr897287", "issuedAt": "2020-03-21T00:00:00", "activatedAt": "2020-03-21T00:00:00", "blocked": false, "cancelledAt": null, "fraudDetected": false, "barcode": "barcodeBytes" }, "_links": { "get_order": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E", "method": "GET", }, "patch_productinstance": { "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/productinstances/0f0981bf-6d60-4b06-bc55-de1ba325f366", "method": "PATCH", }, }, }, ], } components: schemas: unavailable: type: object CompareRequest: type: object properties: ovPayTokenId: type: integer example: 1 description: When new token is already present in customer profile xBOT: type: string format: uuid example: "91641b54-056c-49ea-b598-ccde81d6c45a" xTAT: type: string format: uuid example: "4c2d60e2-cd03-4c80-ae70-573a301f0bff" serviceReferenceId: type: string example: "NLOV1234567ABCDEFG" description: When provided, amount is also required amount: type: integer example: 100 description: When provided, serviceReferenceId is also required ovpasNumber: type: string example: "OV34567" description: When provided, verificationCode is also required verificationCode: type: string example: "1234" description: When provided, ovpasNumber is also required TransferRequest: type: object required: - oldOvPayToken - newOvPayToken properties: oldOvPayToken: type: object properties: padOtp: type: string pattern: ^[0-9]{6}$ example: "023456" newOvPayToken: type: object properties: ovPayTokenId: type: integer example: 1 description: When new token is already present in customer profile xBOT: type: string format: uuid example: "91641b54-056c-49ea-b598-ccde81d6c45a" xTAT: type: string format: uuid example: "4c2d60e2-cd03-4c80-ae70-573a301f0bff" serviceReferenceId: type: string example: "NLOV1234567ABCDEFG" description: When provided, amount is also required amount: type: integer example: 100 description: When provided, serviceReferenceId is also required padOtp: type: string pattern: ^[0-9]{6}$ example: "123456" description: Can be xTAT-based OTP (for existing PAD), or email-based OTP (for new PAD). In the latter case, padEmailAddress should be the same address as used for the OTP! padEmailAddress: type: string format: email example: 8Z9dG@example.com alias: type: string example: MyNewToken CustomersResponseList: type: object properties: customers: type: array items: $ref: "#/components/schemas/CustomersResponse" CustomersResponse: type: object properties: customerProfileId: type: integer example: 1 customerNumber: type: integer example: 1000001 customerStatus: type: object properties: customerStatusId: type: integer example: 1 name: type: string example: Active debtorNumber: type: string example: DB100001 debtorStatus: type: object properties: debtorStatusId: type: integer example: 1 name: type: string example: Active person: type: object properties: prefix: type: string example: Mr birthname: type: string example: John surname: type: string example: Doe suffix: type: string example: Jr. dateOfBirth: type: string format: date example: "2023-02-01" emailAddress: type: string format: email example: 4j2dD@example.com addresses: type: array items: type: object properties: addressId: type: integer example: 1 addressType: type: object properties: addressTypeId: type: integer example: 1 name: type: string example: Shipping street: type: string example: Appelstraat houseNumber: type: integer example: 1 houseNumberSuffix: type: string example: BS postalCode: type: string example: 1234AB city: type: string example: Den Haag country: type: string example: NL phones: type: array items: type: object properties: phoneId: type: integer example: 1 isPreferred: type: boolean example: true phoneType: type: object properties: phoneTypeId: type: integer example: 1 name: type: string example: Home number: type: string example: "0123456789" countryCode: type: string example: "0031" devices: type: array items: type: object properties: deviceId: type: string format: uuid example: 1 externalDeviceId: type: string format: uuid example: dee7d80e-9288-4508-a3ed-c067e619179f alias: type: string example: My iPhone 13 _links: type: object properties: add_device: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/devices method: type: string example: POST edit_device: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/devices/1 method: type: string example: PATCH delete_device: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/devices/1 method: type: string example: DELETE _links: type: object properties: self: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers method: type: string example: GET partial_edit: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers method: type: string example: PATCH get_tokens: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens method: type: string example: GET create_token: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens method: type: string example: POST OvPayTokensResponse: type: object required: - ovPayTokens properties: ovPayTokens: type: array items: type: object properties: ovPayTokenId: type: integer example: 1 tokenType: type: object properties: tokenTypeId: type: integer example: 1 name: type: string example: EMV alias: type: string example: MyToken tokenStatus: type: object properties: tokenStatusId: type: integer example: 1 name: type: string example: Active expirationDate: type: string format: date example: "2023-02-01" replacedByTokenId: type: integer example: 1 _links: type: object properties: self: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1 method: type: string example: GET partial_edit: type: object description: External touchpoints are only allowed to change alias - SMP can also change tokenStatus properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1 method: type: string example: PATCH replace_token: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/replace method: type: string example: POST delete_token: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1 method: type: string example: DELETE get_productinstances: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances method: type: string example: GET get_trips: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips method: type: string example: GET OvPayTokenProductInstancesResponse: type: object properties: productInstances: type: array items: type: object properties: productId: type: integer example: 1 name: type: string example: HTM 90% Korting status: type: string enum: ["Active", "Ended", "Refunded"] example: Active isRenewable: type: boolean example: true productCategory: type: object description: The category of the originating HTM product definition properties: productCategoryId: type: integer example: 1 name: type: string example: Kortingsabonnement fromInclusive: type: string format: date-time-offset example: "2024-11-25T13:25:00+01:00" untilInclusive: type: string format: date-time-offset description: >- If not present, this product-instance represents a subscription/contract without a real end date. If present, it can be either the natural end date or the refund timestamp. example: "2024-12-25T03:59:59+01:00" orderId: type: string format: uuid example: 501B17EF-36C4-4039-B92C-6517969B464E orderLineId: type: string format: uuid example: 38B17EF-36C4-4039-B92C-4817969B464E contractId: type: string format: uuid example: 56B17EF-C436-9043-B76C-481797WEB464F description: Only present for subscriptions/contracts _links: type: object properties: self: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances method: type: string example: GET get_order: type: object properties: href: type: string description: Always present for any HTM product-instance example: https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E method: type: string example: GET get_contract: type: object properties: href: type: string description: Only present for subscriptions/contracts example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F method: type: string example: GET