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://api.integratielaag.nl/v1/touchpoint 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 single customer profile based on search parameters description: Get a single customer profile based on search parameters. Only returns a profile if a single result matches the parameters; when multiple results are found, additional seach parameters are required to disambiguate. 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/CustomersResponse' '404': description: No customer found content: application/json: example: { "type": "https://api.integratielaag.nl/abt/1.0/touchpoint/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/1.0/touchpoint/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" } /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/1.0/touchpoint/customers/tokens", "method": "GET" } } } EMV without PAD: summary: EMV without PAD description: EMV without PAD value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": 2, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/tokenPersonalizations?ovpaytokenId=1", "method": "POST" } } } ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", "method": "GET" } } } OV pas without PAD: summary: OV pas without PAD description: OV pas without PAD value: { "ovPayTokens": [ { "customerProfileId": 1, "ovPayTokenId": 1, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": 2, "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 }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", "method": "POST" } } } ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/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, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": 2, "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" } }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", "method": "GET" }, "update_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", "method": "PUT" } } } ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/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, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": 2, "autoReloadRegistration": null, "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": true, "inaccuracyFlagReason": "Invalid birthDate", "inaccuracyFlagSetCounter": 1, "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" } }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", "method": "GET" }, "update_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", "method": "PUT" } } } ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/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, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": 2, "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" } }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", "method": "GET" }, "update_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", "method": "PUT" } } } ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/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, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthDate": null, "photo": null, } }, { "customerProfileId": 1, "ovPayTokenId": 6, "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 } }, { "customerProfileId": 18, "ovPayTokenId": 13, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 4, "name": "On stock" }, "expirationDate": "2028-02-01", "replacedByTokenId": 2, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null } }, { "customerProfileId": 132, "ovPayTokenId": 21, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "Mijn OV Pas", "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-02-01", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthDate": null, "photo": null, } }, { "customerProfileId": 166, "ovPayTokenId": 28, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "Mijn OV Pas", "tokenStatus": { "tokenStatusId": 6, "name": "Removed by customer (*)" }, "expirationDate": "2028-02-01", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthDate": null, "photo": null, } }, { "customerProfileId": 166, "ovPayTokenId": 115, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "My retired token", "tokenStatus": { "tokenStatusId": 1, "name": "Retired" }, "expirationDate": "2025-02-01", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthDate": null, "photo": null, } }, { "customerProfileId": 1, "ovPayTokenId": 118, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "My found token", "tokenStatus": { "tokenStatusId": 7, "name": "Renewed Active" }, "expirationDate": "2028-02-01", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthDate": null, "photo": null, } } ], _links: { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/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, "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "OV pasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", "method": "POST" } } }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", "method": "POST" } } } Add OV pas physical token: summary: Add EMV token description: Add EMV token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, "OV pasNumber": "OV34567", "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "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 }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", "method": "POST" } } }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/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 OV paytoken with another description: Replace an OV paytoken in the database for a given customer with another token requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: Replace with new EMV token: summary: Replace with new token description: Replace with new token value: { "ovPayToken": { "newTokenId": null, "tokenTypeId": 1, "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230, "alias": "Nieuw token" } } Replace with existing EMV token: summary: Replace with existing token description: Replace with existing token value: { "ovPayToken": { "newTokenId": 10 } } Replace with new OV pas token: summary: Replace with new OV pas token description: Replace with new OV pas 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: Replace with new EMV token: summary: Replace with new EMV token description: Replace with new EMV token value: { "ovPayToken": { "customerProfileId": 1, "ovPayTokenId": 5, "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "OV pasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "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, "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, "OV pasNumber":"OV34567", "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "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 }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "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, "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "OV pasNumber": null, "alias": "Mijn bestaandetoken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=10", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=10", "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": 1, "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "OV pasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "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": 1, "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "OV pasNumber": null, "alias": "Mijn nieuwe tokennaam", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "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": 1, "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "OV pasNumber": null, "alias": "Mijn verloren pas", "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, "personalAccountData":{ "name": null, "birthDate": null, "photo": null }, "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", "method": "GET" }, "partial_edit": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "PATCH" }, "replace_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "POST" }, "delete_token": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", "method": "DELETE" }, "get_productinstances": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", "method": "GET" }, "get_trips": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", "method": "GET" }, "create_tokenPersonalization": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "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}/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": [ { "productId": 1, "name": "HTM 90% Korting", "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", "_links": { "self": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances/1", "method": "GET" }, "get_order": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/orders/501B17EF-36C4-4039-B92C-6517969B464E", "method": "GET" }, "get_contract": { "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F", "method": "GET" } } } ] } components: schemas: unavailable: type: object 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 isPreferred: type: boolean example: true addressType: type: object properties: addressTypeId: type: integer example: 1 name: type: string example: Home 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: Nederland _links: type: object properties: self: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/addresses/1 method: type: string example: GET delete_address: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/addresses/1 method: type: string example: DELETE 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" _links: type: object properties: self: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/phones/1 method: type: string example: GET delete_phone: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/phones/1 method: type: string example: DELETE _links: type: object properties: self: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers method: type: string example: GET create_customer_status: type: object description: ONLY ALLOWED FOR SMP - Create a new customer status properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/statuses method: type: string example: POST partial_edit: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers method: type: string example: PATCH get_tokens: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens method: type: string example: GET create_token: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/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/1.0/touchpoint/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/1.0/touchpoint/customers/tokens/1 method: type: string example: PATCH replace_token: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace method: type: string example: POST delete_token: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1 method: type: string example: DELETE get_productinstances: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances method: type: string example: GET get_trips: type: object properties: href: type: string example: https://api.integratielaag.nl/abt/1.0/touchpoint/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/1.0/touchpoint/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/1.0/touchpoint/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/1.0/touchpoint/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F method: type: string example: GET