ovpay/src/openapi/customers/SE-customers.yaml

3478 lines
155 KiB
YAML

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 search 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/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",
}
/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,
},
"_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,
},
"_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",
},
},
"_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,
},
"_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",
},
},
"_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,
},
},
{
"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,
},
},
{
"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,
},
},
{
"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,
},
},
{
"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,
},
},
{
"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,
},
},
],
_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 },
"_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 },
"_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 },
"_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 },
"_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 },
"_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 },
"_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 },
"_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 },
"_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 },
"_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 },
"_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":
[
{
"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/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",
},
},
},
],
}
/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",
"replacedByTokenId": null,
"autoReloadRegistration": null,
"ePurse": null,
"personalAccountData":
{ "name": null, "birthdate": null, "photo": 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",
"replacedByTokenId": null,
"autoReloadRegistration": null,
"ePurse": null,
"personalAccountData":
{ "name": null, "birthdate": null, "photo": null },
},
"isTransferable": true,
"transferableObjects":
{
"tokenType": true,
"tokenStatus": true,
"expirationDate": true,
"productInstances": true,
"autoReloadRegistration": true,
"ePurse": true,
"personalAccountData":
{ "name": true, "birthdate": true, "photo": 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",
"replacedByTokenId": null,
"autoReloadRegistration": null,
"ePurse": null,
"personalAccountData":
{ "name": null, "birthdate": null, "photo": 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",
"replacedByTokenId": null,
"autoReloadRegistration": null,
"ePurse": null,
"personalAccountData":
{ "name": null, "birthdate": null, "photo": null },
},
"isTransferable": false,
"transferableObjects":
{
"tokenType": true,
"tokenStatus": true,
"expirationDate": true,
"productInstances": false,
"autoReloadRegistration": true,
"ePurse": true,
"personalAccountData":
{ "name": true, "birthdate": true, "photo": 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",
"replacedByTokenId": null,
"autoReloadRegistration": null,
"ePurse": null,
"personalAccountData":
{ "name": null, "birthdate": null, "photo": 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",
"replacedByTokenId": null,
"autoReloadRegistration": null,
"ePurse": null,
"personalAccountData":
{ "name": null, "birthdate": null, "photo": null },
},
"isTransferable": false,
"transferableObjects":
{
"tokenType": false,
"tokenStatus": true,
"expirationDate": true,
"productInstances": true,
"autoReloadRegistration": true,
"ePurse": true,
"personalAccountData":
{ "name": true, "birthdate": true, "photo": 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",
"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",
},
},
},
"newOvPayToken":
{
"customerProfileId": null,
"ovPayTokenId": null,
"xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
"tokenType": { "tokenTypeId": 1, "name": "EMV" },
"alias": null,
"tokenStatus": null,
"expirationDate": "2028-02-01",
"replacedByTokenId": null,
"autoReloadRegistration": null,
"ePurse": null,
"personalAccountData":
{ "name": null, "birthdate": null, "photo": null },
},
"isTransferable": false,
"transferableObjects":
{
"tokenType": true,
"tokenStatus": true,
"expirationDate": true,
"productInstances": true,
"autoReloadRegistration": true,
"ePurse": true,
"personalAccountData":
{
"name": false,
"birthdate": false,
"photo": false,
},
},
"_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",
"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,
},
},
"newOvPayToken":
{
"customerProfileId": null,
"ovPayTokenId": null,
"xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
"tokenType": { "tokenTypeId": 1, "name": "EMV" },
"alias": null,
"tokenStatus": null,
"expirationDate": "2028-02-01",
"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,
},
},
"isTransferable": false,
"transferableObjects":
{
"tokenType": true,
"tokenStatus": true,
"expirationDate": true,
"productInstances": true,
"autoReloadRegistration": true,
"ePurse": false,
"personalAccountData":
{ "name": true, "birthdate": false, "photo": true },
},
"_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",
},
},
"_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",
},
],
}
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
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
_links:
type: object
properties:
self:
type: object
properties:
href:
type: string
example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/addresses/1
method:
type: string
example: GET
delete_address:
type: object
properties:
href:
type: string
example: https://api.integratielaag.nl/abt/touchpoint/1.0/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/touchpoint/1.0/customers/phones/1
method:
type: string
example: GET
delete_phone:
type: object
properties:
href:
type: string
example: https://api.integratielaag.nl/abt/touchpoint/1.0/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/touchpoint/1.0/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/touchpoint/1.0/customers/statuses
method:
type: string
example: POST
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