openapi: 3.0.1
info:
  title: Service Engine APIs for Customers
  description: >-
    Service Engine APIs for HTM Customers. These are NOT the CRUD APIs to access raw data in the database.
    To be used by touchpoints to get information about HTM customers.
  version: "1.0"
servers:
  - url: https://services.acc.api.htm.nl/abt/touchpoint/1.0
tags:
  - name: Customers
    description: >-
      Service Engine APIs for HTM Customers. These are NOT the CRUD APIs to access raw data in the database.
      To be used by touchpoints to get information about HTM customers.
paths:
  /customers:
    get:
      tags:
        - Customers
      summary: Get a customer profile based on search parameters
      description: |
        Get a profile based on search parameters. Only returns a profile if a single result matches for a customer
        the parameters; when multiple results are found, additional search parameters are required to disambiguate. If role is klantenservice, multiple customers can be returned.
      parameters:
        - name: customerProfileId
          in: query
          schema:
            type: integer
            example: 1
        - name: customerNumber
          in: query
          schema:
            type: integer
            example: 1000001
        - name: customerStatusId
          in: query
          schema:
            type: integer
            example: 1
        - name: debtorNumber
          in: query
          schema:
            type: integer
            example: 100001
        - name: debtorStatusId
          in: query
          schema:
            type: integer
            example: 1
        - name: birthname
          in: query
          schema:
            type: string
            example: John
        - name: surname
          in: query
          schema:
            type: string
            example: Doe
        - name: emailAddress
          in: query
          schema:
            type: string
            format: email
            example: john.doe@mymailprovider.com
        - name: dateOfBirth
          in: query
          schema:
            type: string
            format: date
            example: "2000-01-01"
        - name: addressStreet
          in: query
          schema:
            type: string
            example: Sesamestreet
        - name: addressHouseNumber
          in: query
          schema:
            type: integer
            example: 1
        - name: addressHouseNumberSuffix
          in: query
          schema:
            type: string
            example: A
        - name: addressPostalCode
          in: query
          schema:
            type: string
            example: 1234 AB
        - name: addressCity
          in: query
          schema:
            type: string
            example: The Hague
        - name: addressCountry
          in: query
          schema:
            type: string
            example: The Netherlands
        - name: phoneNumber
          in: query
          schema:
            type: string
            example: "0123456789"
        - name: ovChipcardNumber
          in: query
          schema:
            type: integer
            example: 0123456789
        - name: ovChipcardAlias
          in: query
          schema:
            type: string
            example: My ovchipcard
        - name: ovPayTokenNumber
          in: query
          schema:
            type: integer
            example: 0123456789
        - name: ovPayTokenAlias
          in: query
          schema:
            type: string
            example: My Ov Pay Token
        - name: ovPayTokenXTat
          in: query
          schema:
            type: string
            example: 180d04e0-a721-447e-a1d9-b416937b43bc
        - name: ovPayTokenXBot
          in: query
          schema:
            type: string
            example: e1307c73-676a-4d07-967b-6141276f7c7c
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomersResponseList"
        "404":
          description: No customer found
          content:
            application/json:
              example:
                {
                  "type": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers",
                  "apiErrorCode": "400.1",
                  "title": "Niet gevonden",
                  "detail": "Klant niet gevonden",
                  "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7",
                  "errors": [{ "subApiErrorCode": "0017" }],
                }
        "409":
          description: Multiple customers found
          content:
            application/json:
              example:
                {
                  "type": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers",
                  "apiErrorCode": "409.1",
                  "title": "Meer dan 1 klantprofiel gevonden",
                  "detail": "Meer dan 1 klantprofiel gevonden. Verfijn je zoekcriteria.",
                  "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7",
                }
    post: 
      tags:
        - Customers
      parameters:     
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
          description: The role of the HTM employee in the case of the SMP, in this case the call can only be done through the SMP
      summary: Create a customer profile.
      description: Create a customer profile in the ABT database with status ACTIVE and debtorStatus Inactive with a start date based on the timestamp of this post call. 
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              minimalCustomerProfile:
                value:
                  {
                    "person": {
                      "emailAddress": "j.jansen@hatseflats.nl"
                    }
                  }
              fullCustomerProfile:
                value:
                  {
                    "customerPreference": {
                      "languageId": 1
                    },
                    "person": {
                      "birthname": "Jan",
                      "surname": "Jansen",
                      "prefix": "dhr",
                      "suffix": "jr",
                      "dateOfBirth": "1970-01-01",
                      "emailAddress": "j.jansen@hatseflats.nl",
                      "addresses": [
                        {
                          "street": "Laan van Meerdervoort",
                          "houseNumber": 5,
                          "houseNumberSuffix": "B",
                          "postalCode": "2500AA",
                          "city": "Den Haag",
                          "country": "NL",
                          "isPreferred": true,
                          "addressTypeId": 1
                        },
                        {
                          "street": "Beeklaan",
                          "houseNumber": 30,
                          "houseNumberSuffix": "B",
                          "postalCode": "2500AA",
                          "city": "Den Haag",
                          "country": "NL",
                          "isPreferred": false,
                          "addressTypeId": 2
                        }
                      ],
                      "phones": [
                        {
                          "number": "6123456789",
                          "countryCode": "0031",
                          "phoneTypeId": 1,
                          "isPreferred": true
                        },
                        {
                          "number": "7012345678",
                          "countryCode": "0031",
                          "phoneTypeId": 2,
                          "isPreferred": false
                        }
                      ],
                      "devices": [
                        {
                          "externalDeviceId": "123e4567-e89b-12d3-a456-426614174000",
                          "alias": "My iPhone",
                        },
                        {
                          "externalDeviceId": "987e6543-e21b-12d3-a456-426614174999",
                          "alias": "My iPad",
                        }
                      ]
                    }
                  }
      responses: 
        "201":
          description: Created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomersResponse"
    patch:
      tags:
        - Customers
      parameters:
        - name: X-HTM-JWT-AUTH-HEADER
          in: header
          schema:
            type: string
            example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          required: false
          description: The JWT of a customer in case of touchpoint were customer logs in themselves
        - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
          in: header
          schema:
            type: string
            example: feaaef83-a551-4283-8419-340b1ada3b55
          required: false
          description: The customerProfileId of a customer in the case of the SMP
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
          description: The role of the HTM employee in the case of the SMP
      summary: Update a customer profile
      description: Update a customer profile based on the sub from the JWT, or customerProfileId in case of SMP
      requestBody:      
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              patchCustomer:
                value:
                  {
                    "person": {
                      "birthname": "Jan",
                      "surname": "Jansen",
                      "prefix": "dhr",
                      "suffix": "jr",
                      "dateOfBirth": "1970-01-01",
                      "addresses": [
                        {
                          "addressId": 2,
                          "street": "Laan van Meerdervoort",
                          "houseNumber": 5,
                          "postalCode": "2500AA",
                          "city": "Den Haag",
                          "country": "NL"
                        },
                        {
                          "addressId": 1,
                          "street": "Beeklaan",
                          "houseNumber": 30,
                          "houseNumberSuffix": "B",
                          "postalCode": "2500AA",
                          "city": "Den Haag",
                          "country": "NL",
                          "addressTypeId": 2
                        }
                      ],
                      "phones": [
                        {
                          "phoneId": 1,
                          "number": "6123456789",
                          "countryCode": "0031",
                          "phoneTypeId": 1,
                          "isPreferred": true
                        },
                        {
                          "phoneId": 2,
                          "number": "7012345678",
                          "countryCode": "0031",
                          "phoneTypeId": 2,
                          "isPreferred": false
                        }
                      ],
                      "devices": [
                        {
                          "deviceId": "813afdd8-bf8c-4e26-bfda-4da79552bd38",
                          "externalDeviceId": "123e4567-e89b-12d3-a456-426614174000",
                          "alias": "My iPhone",
                        },
                        {
                          "deviceId": "4f4249a2-ac6c-44f9-b740-66e66b6f3c28",
                          "externalDeviceId": "987e6543-e21b-12d3-a456-426614174999",
                          "alias": "My iPad",
                        }
                      ]
                    }
                  } 
      responses: 
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomersResponse"   
  /customers/tokens:
    get:
      tags:
        - Customers
      parameters:
        - name: X-HTM-JWT-AUTH-HEADER
          in: header
          schema:
            type: string
            example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          required: false
          description: The JWT of a customer in case of touchpoint were customer logs in themselves
        - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
          in: header
          schema:
            type: string
            example: feaaef83-a551-4283-8419-340b1ada3b55
          required: false
          description: The customerProfileId of a customer in the case of the SMP
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
          description: The role of the HTM employee in the case of the SMP
        - name: ovPayTokenId
          in: query
          schema:
            type: integer
            example: 1
          required: false
          description: The ovpay token id of a specific customer token
        - name: tokenTypeId
          in: query
          schema:
            type: array
            items:
              type: integer
          explode: false
          description: Filter on tokentype. 1 = EMV, 2 = OV-pas physical, 3 = OV-pas digital
          required: false
        - name: xTat
          in: query
          schema:
            type: string
            example: 4c2d60e2-cd03-4c80-ae70-573a301f0bff
          required: false
          description: Filter on the xTat of a customer token
        - name: xBot
          in: query
          schema:
            type: string
            example: 91641b54-056c-49ea-b598-ccde81d6c45a
          required: false
          description: Filter on the xBot of a customer token
        - name: ovpasNumber
          in: query
          schema:
            type: string
            example: 56HYRTL
          required: false
          description: Filter on the OV pasNumber of a customer token of type OV Pas
        - name: lastDigits
          in: query
          schema:
            type: string
            example: 1234
          required: false
          description: Filter on the last digits of a customer token of type EMV
        - name: tokenStatusId
          in: query
          schema:
            type: array
            items:
              type: integer
          explode: false
          description: Filter on token status. 1 = Retired, 2 = Active, 3 = Replaced (*), 4 = On Stock, 5 = Suspended, 6 = Removed by customer (*), 7 = Renewed Active
          required: false
        - name: expirationDate
          in: query
          schema:
            type: string
            format: date-time
            example: 2027-01-01T09:00:00Z
          required: false
          description: Filter on the expirationDate of a customer token
        - name: replacedByTokenId
          in: query
          schema:
            type: integer
            example: 2
          required: false
          description: Filter on the replacedByTokenId of a customer token
      summary: Get a list of all OvPayTokens for a certain customer.
      description: Get a list of all OvPayTokens for a certain customer, only returns the tokens for an identified customer through JWT or customerProfileId in the headers.
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Empty token list:
                  summary: Empty token list
                  description: Empty token list
                  value:
                    {
                      "ovPayTokens": [],
                      _links:
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "GET",
                            },
                        },
                    }
                EMV without PAD:
                  summary: EMV without PAD
                  description: EMV without PAD
                  value:
                    {
                      "ovPayTokens":
                        [
                          {
                            "customerProfileId": 1,
                            "ovPayTokenId": 1,
                            "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                            "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                            "ovpasNumber": "", 
                            "alias": "MyToken",
                            "tokenStatus":
                              { "tokenStatusId": 2, "name": "Active" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse": null,
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },
                            "gboAgeProfile": null,
                            "_links":
                              {
                                "self":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                                    "method": "GET",
                                  },
                                "partial_edit":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "PATCH",
                                  },
                                "delete_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "DELETE",
                                  },
                                "get_productinstances":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                                    "method": "GET",
                                  },
                                "get_trips":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                                    "method": "GET",
                                  },
                                "add_personal-data":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                    "method": "POST",
                                  },
                                "compare_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                    "method": "POST",
                                  },
                              },
                          },
                        ],
                      _links:
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "GET",
                            },
                        },
                    }
                OV pas without PAD:
                  summary: OV pas without PAD
                  description: OV pas without PAD
                  value:
                    {
                      "ovPayTokens":
                        [
                          {
                            "customerProfileId": 1,
                            "ovPayTokenId": 1,
                            "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV34567", 
                            "alias": "MyToken",
                            "tokenStatus":
                              { "tokenStatusId": 2, "name": "Active" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse":
                              {
                                "e-PurseBalance":
                                  { "currency": "EUR", "amount": 350 },
                                "status": "ACTIVE",
                                "originDate": "2019-07-16T11:00:00+02:00",
                              },
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },                            
                            "gboAgeProfile": null,
                            "_links":
                              {
                                "self":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                                    "method": "GET",
                                  },
                                "partial_edit":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "PATCH",
                                  },
                                "delete_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "DELETE",
                                  },
                                "get_productinstances":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                                    "method": "GET",
                                  },
                                "get_trips":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                                    "method": "GET",
                                  },
                                "add_personal-data":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                    "method": "POST",
                                  },
                                "compare_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/51compare",
                                    "method": "POST",
                                  },
                              },
                          },
                        ],
                      _links:
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "GET",
                            },
                        },
                    }
                OV pas with PAD and autoReload:
                  summary: OV pas with PAD and autoReload
                  description: OV pas with PAD and autoReload
                  value:
                    {
                      "ovPayTokens":
                        [
                          {
                            "customerProfileId": 1,
                            "ovPayTokenId": 1,
                            "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV34567", 
                            "alias": "MyToken",
                            "tokenStatus":
                              { "tokenStatusId": 2, "name": "Active" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration":
                              {
                                "autoReloadAmount": 500,
                                "retailerReferenceId": "abc",
                                "arrit": "425f7fc2-1103-4822-9c79-7c4aaa2fb6aa",
                                "autoReloadRegistrationStatus": "ACTIVE",
                                "autoReloadRegistrationStartDateTime": "2024-06-02T15:03:46Z",
                              },
                            "ePurse":
                              {
                                "e-PurseBalance":
                                  { "currency": "EUR", "amount": 350 },
                                "status": "ACTIVE",
                                "originDate": "2019-07-16T11:00:00+02:00",
                              },
                            "personalAccountData":
                              {
                                "name":
                                  {
                                    "inaccuracyFlag": false,
                                    "inaccuracyFlagReason": null,
                                    "inaccuracyFlagSetCounter": 0,
                                    "isValidated": false,
                                    "changeCounter": 0,
                                    "maxUpdatesVerificationCount": 0,
                                    "lastChangeDate": "2024-08-24T14:15:22Z",
                                  },
                                "birthdate":
                                  {
                                    "inaccuracyFlag": false,
                                    "inaccuracyFlagReason": null,
                                    "inaccuracyFlagSetCounter": 0,
                                    "isValidated": false,
                                    "changeCounter": 0,
                                    "maxUpdatesVerificationCount": 0,
                                    "lastChangeDate": "2024-08-24T14:15:22Z",
                                  },
                                "photo":
                                  {
                                    "inaccuracyFlag": false,
                                    "inaccuracyFlagReason": null,
                                    "inaccuracyFlagSetCounter": 0,
                                    "isValidated": false,
                                    "changeCounter": 0,
                                    "maxUpdatesVerificationCount": 0,
                                    "lastChangeDate": "2024-08-24T14:15:22Z",
                                  },
                              },
                            "gboAgeProfile":
                              {
                                "gboAgeProfileId": 1,
                                "name": "Kind (4 t/m 11 jaar)",
                                "ageFromInclusive": 4,
                                "ageToInclusive": 11
                              },
                            "_links":
                              {
                                "self":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                                    "method": "GET",
                                  },
                                "partial_edit":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "PATCH",
                                  },
                                "delete_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "DELETE",
                                  },
                                "get_productinstances":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                                    "method": "GET",
                                  },
                                "get_trips":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                                    "method": "GET",
                                  },
                                "update_personal-data":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                    "method": "PATCH",
                                  },
                                "compare_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare",
                                    "method": "POST",
                                  },
                              },
                          },
                        ],
                      _links:
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "GET",
                            },
                        },
                    }
                OV pas with partial PAD:
                  summary: OV pas with partial PAD
                  description: OV pas with partial PAD
                  value:
                    {
                      "ovPayTokens":
                        [
                          {
                            "customerProfileId": 1,
                            "ovPayTokenId": 1,
                            "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV34567", 
                            "alias": "MyToken",
                            "tokenStatus":
                              { "tokenStatusId": 2, "name": "Active" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse":
                              {
                                "e-PurseBalance":
                                  { "currency": "EUR", "amount": 350 },
                                "status": "ACTIVE",
                                "originDate": "2019-07-16T11:00:00+02:00",
                              },
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate":
                                  {
                                    "inaccuracyFlag": true,
                                    "inaccuracyFlagReason": "Invalid birthdate",
                                    "inaccuracyFlagSetCounter": 1,
                                    "isValidated": false,
                                    "changeCounter": 0,
                                    "maxUpdatesVerificationCount": 0,
                                    "lastChangeDate": "2024-08-24T14:15:22Z",
                                  },
                                "photo": null,
                              },
                            "gboAgeProfile":
                              {
                                "gboAgeProfileId": 1,
                                "name": "Kind (4 t/m 11 jaar)",
                                "ageFromInclusive": 4,
                                "ageToInclusive": 11
                              },
                            "_links":
                              {
                                "self":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                                    "method": "GET",
                                  },
                                "partial_edit":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "PATCH",
                                  },
                                "delete_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "DELETE",
                                  },
                                "get_productinstances":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                                    "method": "GET",
                                  },
                                "get_trips":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                                    "method": "GET",
                                  },
                                "update_personal-data":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                    "method": "PATCH",
                                  },
                                "compare_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare",
                                    "method": "POST",
                                  },
                              },
                          },
                        ],
                      _links:
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "GET",
                            },
                        },
                    }
                OV pas with invalid PAD:
                  summary: OV pas with invalid PAD
                  description: OV pas with invalid PAD
                  value:
                    {
                      "ovPayTokens":
                        [
                          {
                            "customerProfileId": 1,
                            "ovPayTokenId": 1,
                            "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV34567", 
                            "alias": "MyToken",
                            "tokenStatus":
                              { "tokenStatusId": 2, "name": "Active" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse":
                              {
                                "e-PurseBalance":
                                  { "currency": "EUR", "amount": 350 },
                                "status": "ACTIVE",
                                "originDate": "2019-07-16T11:00:00+02:00",
                              },
                            "personalAccountData":
                              {
                                "name":
                                  {
                                    "inaccuracyFlag": true,
                                    "inaccuracyFlagReason": "T.B.D",
                                    "inaccuracyFlagSetCounter": 1,
                                    "isValidated": false,
                                    "changeCounter": 0,
                                    "maxUpdatesVerificationCount": 0,
                                    "lastChangeDate": "2024-08-24T14:15:22Z",
                                  },
                                "birthdate":
                                  {
                                    "inaccuracyFlag": true,
                                    "inaccuracyFlagReason": "T.B.D",
                                    "inaccuracyFlagSetCounter": 1,
                                    "isValidated": false,
                                    "changeCounter": 0,
                                    "maxUpdatesVerificationCount": 0,
                                    "lastChangeDate": "2024-08-24T14:15:22Z",
                                  },
                                "photo":
                                  {
                                    "inaccuracyFlag": true,
                                    "inaccuracyFlagReason": null,
                                    "inaccuracyFlagSetCounter": 1,
                                    "isValidated": false,
                                    "changeCounter": 0,
                                    "maxUpdatesVerificationCount": 0,
                                    "lastChangeDate": "2024-08-24T14:15:22Z",
                                  },
                              },
                              "gboAgeProfile":
                              {
                                "gboAgeProfileId": 1,
                                "name": "Kind (4 t/m 11 jaar)",
                                "ageFromInclusive": 4,
                                "ageToInclusive": 11
                              },
                            "_links":
                              {
                                "self":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                                    "method": "GET",
                                  },
                                "partial_edit":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "PATCH",
                                  },
                                "delete_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                    "method": "DELETE",
                                  },
                                "get_productinstances":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                                    "method": "GET",
                                  },
                                "get_trips":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                                    "method": "GET",
                                  },
                                "update_personal-data":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                    "method": "PATCH",
                                  },
                                "compare_token":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare",
                                    "method": "POST",
                                  },
                              },
                          },
                        ],
                      _links:
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "GET",
                            },
                        },
                    }
                Token list with every status for tokenTypeId = 2, role = KlantenService:
                  summary: Token list with every status for tokenTypeId = 2, role = KlantenService
                  description: Token list with every status for tokenTypeId = 2, role = KlantenService
                  value:
                    {
                      "ovPayTokens":
                        [
                          {
                            "customerProfileId": 1,
                            "ovPayTokenId": 1,
                            "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV34567", 
                            "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" },
                            "ovpasNumber": "OV31236", 
                            "alias": "MyToken",
                            "tokenStatus":
                              { "tokenStatusId": 3, "name": "Replaced (*)" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": 2,
                            "autoReloadRegistration": null,
                            "ePurse": null,
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },
                            "gboAgeProfile": null,
                          },
                          {
                            "customerProfileId": 18,
                            "ovPayTokenId": 13,
                            "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV36897", 
                            "alias": "MyToken",
                            "tokenStatus":
                              { "tokenStatusId": 4, "name": "On stock" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse": null,
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },
                            "gboAgeProfile": null
                          },
                          {
                            "customerProfileId": 132,
                            "ovPayTokenId": 21,
                            "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV33489", 
                            "alias": "Mijn OV Pas",
                            "tokenStatus":
                              { "tokenStatusId": 5, "name": "Suspended" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse": null,
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },
                            "gboAgeProfile": null
                          },
                          {
                            "customerProfileId": 166,
                            "ovPayTokenId": 28,
                            "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV48965", 
                            "alias": "Mijn OV Pas",
                            "tokenStatus":
                              {
                                "tokenStatusId": 6,
                                "name": "Removed by customer (*)",
                              },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse": null,
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },
                            "gboAgeProfile": null
                          },
                          {
                            "customerProfileId": 166,
                            "ovPayTokenId": 115,
                            "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "alias": "My retired token",
                            "tokenStatus":
                              { "tokenStatusId": 1, "name": "Retired" },
                            "expirationDate": "2025-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse": null,
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },
                            "gboAgeProfile": null
                          },
                          {
                            "customerProfileId": 1,
                            "ovPayTokenId": 118,
                            "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                            "tokenType":
                              { "tokenTypeId": 2, "name": "OV-pas physical" },
                            "ovpasNumber": "OV13458", 
                            "alias": "My found token",
                            "tokenStatus":
                              { "tokenStatusId": 7, "name": "Renewed Active" },
                            "expirationDate": "2028-02-01",
                            "replacedByTokenId": null,
                            "autoReloadRegistration": null,
                            "ePurse": null,
                            "personalAccountData":
                              {
                                "name": null,
                                "birthdate": null,
                                "photo": null,
                              },
                            "gboAgeProfile": null
                          },
                        ],
                      _links:
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "GET",
                            },
                        },
                    }
    post:
      tags:
        - Customers
      parameters:
        - name: X-HTM-JWT-AUTH-HEADER
          in: header
          schema:
            type: string
            example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          required: false
          description: The JWT of a customer in case of touchpoint were customer logs in themselves
        - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
          in: header
          schema:
            type: string
            example: feaaef83-a551-4283-8419-340b1ada3b55
          required: false
          description: The customerProfileId of a customer in the case of the SMP
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
      summary: Create a new OV paytoken in the database for a given customer
      description: Create a new OV paytoken for a customerProfile
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              Add EMV token:
                summary: Add EMV token
                description: Add EMV token
                value:
                  {
                    "ovPayToken":
                      {
                        "tokenTypeId": 1,
                        "serviceReferenceId": "NLOV1234567ABCDEFG",
                        "amount": 200,
                        "alias": "Mijn token",
                      },
                  }
              Add OV pas physical token:
                summary: Add OV pas physical token
                description: Add OV pas physical token
                value:
                  {
                    "ovPayToken":
                      {
                        "tokenTypeId": 2,
                        "ovpasNumber": "OV34567",
                        "verificationCode": "211",
                        "alias": "Mijn token",
                      },
                  }
      responses:
        "201":
          description: Created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Add EMV token:
                  summary: Add EMV token
                  description: Add EMV token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 1,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovPasNumber": null,
                          "alias": "Mijn token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare",
                                  "method": "POST",
                                },
                            },
                        },
                      "_links":
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "POST",
                            },
                        },
                    }
                Add OV pas physical token:
                  summary: Add OV pas physical token
                  description: Add OV pas physical token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 1,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType":
                            { "tokenTypeId": 2, "name": "OV-pas physical" },
                          "lastDigits": null,
                          "ovpasNumber": "OV34567",
                          "alias": "Mijn token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse":
                            {
                              "e-PurseBalance":
                                { "currency": "EUR", "amount": 00 },
                              "status": "INACTIVE",
                              "originDate": "2019-07-16T11:00:00+02:00",
                            },
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare",
                                  "method": "POST",
                                },
                            },
                        },
                      "_links":
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens",
                              "method": "POST",
                            },
                        },
                    }
  /customers/tokens/{ovpayTokenId}:
    post:
      tags:
        - Customers
      parameters:
        - name: X-HTM-JWT-AUTH-HEADER
          in: header
          schema:
            type: string
            example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          required: false
          description: The JWT of a customer in case of touchpoint were customer logs in themselves
        - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
          in: header
          schema:
            type: string
            example: feaaef83-a551-4283-8419-340b1ada3b55
          required: false
          description: The customerProfileId of a customer in the case of the SMP
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
        - name: ovpayTokenId
          in: path
          schema:
            type: integer
            example: 1
          required: true
      summary: Replace an OVpay token with another (+ transfer products) - V1 (for touch point)
      description: |
        Transfer products from one OVpay token to another, and replace the tokens in the database.
        This endpoint is for touch point usage and will be replaced by `/customers/tokens/{ovpayTokenId}/transfer`.
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              Replace with new EMV token by SRID:
                summary: Replace with new token by SRID
                description: Replace with new token by service reference ID and amount.
                value:
                  {
                    "ovPayToken":
                      {
                        "newTokenId": null,
                        "tokenTypeId": 1,
                        "serviceReferenceId": "NLOV1234567ABCDEFG",
                        "amount": 230,
                        "alias": "Nieuw token",
                      },
                  }
              Replace with existing EMV token from profile:
                summary: Replace with existing token from profile
                description: Replace with existing token from customer profile.
                value: { "ovPayToken": { "newTokenId": 10 } }
              Replace with new OV pas token:
                summary: Replace with new OV pas token
                description: Replace with new OV pas token by OV-pas number.
                value:
                  {
                    "ovPayToken":
                      {
                        "tokenTypeId": 2,
                        "ovpasNumber": "OV34567",
                        "verificationCode": "211",
                        "alias": "Mijn token",
                      },
                  }
      responses:
        "201":
          description: Created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Replace with new EMV token:
                  summary: Replace with new EMV token
                  description: Replace with new EMV token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 5,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovpasNumber": null,
                          "alias": "Mijn token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
                Replace with new OV pas token:
                  summary: Replace with new OV pas token
                  description: Replace with new OV pas token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 5,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType":
                            { "tokenTypeId": 2, "name": "OV-pas physical" },
                          "lastDigits": null,
                          "ovpasNumber": "OV34567",
                          "alias": "Mijn token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse":
                            {
                              "e-PurseBalance":
                                { "currency": "EUR", "amount": 350 },
                              "status": "ACTIVE",
                              "originDate": "2024-07-16T11:00:00+02:00",
                            },
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
        "200":
          description: Ok
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Replace with existing EMV token:
                  summary: Replace with existing EMV token
                  description: Replace with existing EMV token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 10,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovpasNumber": null,
                          "alias": "Mijn bestaande token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=10",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
    patch:
      tags:
        - Customers
      parameters:
        - name: X-HTM-JWT-AUTH-HEADER
          in: header
          schema:
            type: string
            example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          required: false
          description: The JWT of a customer in case of touchpoint were customer logs in themselves
        - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
          in: header
          schema:
            type: string
            example: feaaef83-a551-4283-8419-340b1ada3b55
          required: false
          description: The customerProfileId of a customer in the case of the SMP
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
        - name: ovpayTokenId
          in: path
          schema:
            type: integer
            example: 1
          required: true
      summary: Edit an existing OV paytoken
      description: Edit an existing OV paytoken in the database for a given customer
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              Update an OV pay token status:
                summary: Update an OV pay token status
                description: Update an OV pay token status
                value: { "ovPayToken": { "tokenStatusId": 5 } }
              Update an OV pay token alias:
                summary: Update an OV pay token alias
                description: Update an OV pay token alias
                value: { "ovPayToken": { "alias": "Mijn nieuwe tokennaam" } }
              Update an OV pay token full:
                summary: Update an OV pay token full
                description: Update an OV pay token full
                value:
                  {
                    "ovPayToken":
                      { "tokenStatusId": 5, "alias": "Mijn verloren pas" },
                  }
      responses:
        "200":
          description: Ok
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Update an OV pay token status:
                  summary: Update an OV pay token status
                  description: Update an OV pay token status
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 5,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovpasNumber": null,
                          "alias": "Mijn token",
                          "tokenStatus":
                            { "tokenStatusId": 5, "name": "Suspended" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
                Update an OV pay token alias:
                  summary: Update an OV pay token alias
                  description: Update an OV pay token alias
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 5,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovpasNumber": null,
                          "alias": "Mijn nieuwe tokennaam",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
                Update an OV pay token full:
                  summary: Update an OV pay token full
                  description: Update an OV pay token full
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 5,
                          "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovpasNumber": null,
                          "alias": "Mijn verloren pas",
                          "tokenStatus":
                            { "tokenStatusId": 5, "name": "Suspended" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/e35977b2-52bb-48ef-aca8-297b2c1d5058",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
    delete:
      tags:
        - Customers
      parameters:
        - name: X-HTM-JWT-AUTH-HEADER
          in: header
          schema:
            type: string
            example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          required: false
          description: The JWT of a customer in case of touchpoint were customer logs in themselves
        - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
          in: header
          schema:
            type: string
            example: feaaef83-a551-4283-8419-340b1ada3b55
          required: false
          description: The customerProfileId of a customer in the case of the SMP
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
        - name: ovpayTokenId
          in: path
          schema:
            type: integer
            example: 1
          required: true
      summary: Delete an existing OV paytoken
      description: Delete an existing OV paytoken for a given customer
      responses:
        "200":
          description: Ok
  /customers/tokens/{ovpayTokenId}/replace:
    post:
      tags:
        - Token Replace v2
      parameters:
        - name: X-HTM-JWT-AUTH-HEADER
          in: header
          schema:
            type: string
            example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          required: false
          description: The JWT of a customer in case of touchpoint were customer logs in themselves
        - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
          in: header
          schema:
            type: string
            example: feaaef83-a551-4283-8419-340b1ada3b55
          required: false
          description: The customerProfileId of a customer in the case of the SMP
        - name: X-HTM-ROLE-HEADER
          in: header
          schema:
            type: string
            example: Customer
          required: false
        - name: ovpayTokenId
          in: path
          schema:
            type: integer
            example: 1
          required: true
      summary: "**INTERNAL USE ONLY** Replace an OVpay token with another (+ transfer products) - V2"
      description: |
        Transfer products from one OVpay token to another, and replace the tokens in the database.
        This endpoint is for usage by integratielaag only. Touch points should use 
        `/customers/tokens/{ovpayTokenId}/transfer` instead.
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              Replace with new token by XTAT:
                summary: Replace with new token by XTAT
                description: |
                  Replace with new token by XTAT. Note however the consumer provides an XTAT to identify
                  the new token, this token could still be an existing token linked to the customer profile. This should
                  be checked beforehand.
                value:
                  {
                    "ovPayToken":
                      {
                        "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                        "alias": "Mijn token",
                      },
                  }
      responses:
        "201":
          description: Created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Replace with new EMV token:
                  summary: Replace with new EMV token
                  description: Replace with new EMV token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 5,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovpasNumber": null,
                          "alias": "Mijn token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
                Replace with new OV pas token:
                  summary: Replace with new OV pas token
                  description: Replace with new OV pas token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 5,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType":
                            { "tokenTypeId": 2, "name": "OV-pas physical" },
                          "lastDigits": null,
                          "ovpasNumber": "OV34567",
                          "alias": "Mijn token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse":
                            {
                              "e-PurseBalance":
                                { "currency": "EUR", "amount": 350 },
                              "status": "ACTIVE",
                              "originDate": "2024-07-16T11:00:00+02:00",
                            },
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
        "200":
          description: Ok
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Replace with existing EMV token:
                  summary: Replace with existing EMV token
                  description: Replace with existing EMV token
                  value:
                    {
                      "ovPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 10,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "lastDigits": null,
                          "ovpasNumber": null,
                          "alias": "Mijn bestaande token",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-08-31T23:59:00+02:00",
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null,
                          "_links":
                            {
                              "self":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=10",
                                  "method": "GET",
                                },
                              "partial_edit":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10",
                                  "method": "PATCH",
                                },
                              "delete_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10",
                                  "method": "DELETE",
                                },
                              "get_productinstances":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/productinstances",
                                  "method": "GET",
                                },
                              "get_trips":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/trips",
                                  "method": "GET",
                                },
                              "add_personal-data":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811",
                                  "method": "POST",
                                },
                              "compare_token":
                                {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/compare",
                                  "method": "POST",
                                },
                            },
                        },
                    }
  /customers/tokens/{ovPayTokenId}/productinstances:
    get:
      tags:
        - Customers
      summary: Get a list of all HTM products instantiated on the given OvPayToken
      description: |-
        Get a list of all HTM products instantiated on the given OvPayToken.
        Only HTM products are returned; GBO does not allow HTM to get information on non-HTM product-instances.
        Where relevant, operations to be performed are returned as HATEOAS links per product-instance.
      parameters:
        - name: ovPayTokenId
          in: path
          required: true
          style: simple
          description: Id of the OvPayToken to get product-instances for.
          schema:
            type: integer
            example: 1
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/OvPayTokenProductInstancesResponse"
              examples:
                getEmptyProductInstances:
                  summary: No product-instances found on token
                  value:
                    productInstances: []
                getSingleProductInstance:
                  summary: One non-renewable product-instance
                  value:
                    {
                      "productInstances":
                        [
                          {
                            "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":
                              {
                                "get_order":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E",
                                    "method": "GET",
                                  },
                                "get_contract":
                                  {
                                    "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F",
                                    "method": "GET",
                                  },
                              },
                          },
                        ],
                    }
  /customers/tokens/{ovPayTokenId}/compare:
    parameters:
      - name: X-HTM-JWT-AUTH-HEADER
        in: header
        schema:
          type: string
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
        required: false
        description: The JWT of a customer in case of touchpoint were customer logs in themselves
      - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
        in: header
        schema:
          type: string
          example: feaaef83-a551-4283-8419-340b1ada3b55
        required: false
        description: The customerProfileId of a customer in the case of the SMP
      - name: X-HTM-ROLE-HEADER
        in: header
        schema:
          type: string
          example: Customer
        required: false
      - name: ovPayTokenId
        in: path
        required: true
        style: simple
        description: Id of the OVpay token for the LHS of the comparison.
        schema:
          type: integer
          example: 1
    post:
      summary: Compare attributes of two OVpay tokens.
      description: |-
        Compare the attributes of an existing OVpay token in the customer profile with the
        attributes of a new OVpay token. The new token can be passed using one of the following
        methods:

        - Compare with an existing OVpay token
        - Compare with an XBOT
        - Compare with an XTAT
        - Compare with SRID + amount
        - Compare with OVpas number + verification code

        The comparison results are returned in the response body. Comparison is made on the following
        attributes:

        - Token type
        - Token status (only if target token is known in the customer profile)
        - Expiry date
        - Instantiated GBO products
        - Auto reload registration
        - E-purse
        - PAD (name, birthdate, photo)
        - Age profile
      tags:
        - Customers
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CompareRequest"
            examples:
              Compare with an existing OVpay token:
                value: { "ovPayTokenId": 1 }
              Compare with an xBOT:
                value: { "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058" }
              Compare with an xTAT:
                value: { "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058" }
              Compare with SRID + amount:
                value:
                  { "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230 }
              Compare with OVpas number + verification code:
                value: { "ovpasNumber": "OV34567", "verificationCode": "1234" }
              Complete request body (for development only):
                value:
                  {
                    "ovPayTokenId": 1,
                    "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058",
                    "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058",
                    "serviceReferenceId": "NLOV1234567ABCDEFG",
                    "amount": 230,
                    "ovpasNumber": "OV34567",
                    "verificationCode": "1234",
                  }
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Transferable token:
                  value:
                    {
                      "oldOvPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 1,
                          "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": "MyToken",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null
                        },
                      "newOvPayToken":
                        {
                          "customerProfileId": null,
                          "ovPayTokenId": null,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": null,
                          "tokenStatus": null,
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null
                        },
                      "isTransferable": true,
                      "transferableObjects":
                        {
                          "tokenType": true,
                          "tokenStatus": true,
                          "expirationDate": true,
                          "productInstances": true,
                          "autoReloadRegistration": true,
                          "ePurse": true,
                          "personalAccountData":
                            { "name": true, "birthdate": true, "photo": true },
                          "gboAgeProfile": true
                        },
                      "_links":
                        {
                          "transfer":
                            {
                              "href": "https://services.dev.api.htm.nl/abt/touchpoint/1.0/customers/tokens/1/transfer",
                              "method": "POST",
                            },
                        },
                    }
                Non-transferable token (products not compatible on new token):
                  value:
                    {
                      "oldOvPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 1,
                          "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": "MyToken",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-02-01",
                          "productInstances": [
                            {
                              "productId": 1,
                              "name": "HTM 90% Korting EMV",
                              "status": "Active",
                              "isRenewable": true,
                              "productCategory": {
                                "productCategoryId": 1,
                                "name": "Kortingsabonnement"
                              },
                              "fromInclusive": "2025-11-25T13:25:00+01:00",
                              "untilInclusive": "2025-12-25T03:59:59+01:00",
                              "orderId": "501B17EF-36C4-4039-B92C-6517969B464E",
                              "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E",
                              "contractId": "56B17EF-C436-9043-B76C-481797WEB464F",
                              "_links": {
                                "self": {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances/1",
                                  "method": "GET"
                                },
                                "get_order": {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E",
                                  "method": "GET"
                                },
                                "get_contract": {
                                  "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F",
                                  "method": "GET"
                                }
                              }
                            }
                          ],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null
                        },
                      "newOvPayToken":
                        {
                          "customerProfileId": null,
                          "ovPayTokenId": null,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" },
                          "alias": null,
                          "tokenStatus": null,
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null
                        },
                      "isTransferable": false,
                      "transferableObjects":
                        {
                          "tokenType": true,
                          "tokenStatus": true,
                          "expirationDate": true,
                          "productInstances": false,
                          "autoReloadRegistration": true,
                          "ePurse": true,
                          "personalAccountData":
                            { "name": true, "birthdate": true, "photo": true },
                          "gboAgeProfile": true,
                        },
                      "_links": {},
                    }
                Non-transferable token (unsupported token type combination):
                  value:
                    {
                      "oldOvPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 1,
                          "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                          "tokenType":
                            { "tokenTypeId": 2, "name": "OV-pas physical" },
                          "alias": "MyToken",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null
                        },
                      "newOvPayToken":
                        {
                          "customerProfileId": null,
                          "ovPayTokenId": null,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": null,
                          "tokenStatus": null,
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null
                        },
                      "isTransferable": false,
                      "transferableObjects":
                        {
                          "tokenType": false,
                          "tokenStatus": true,
                          "expirationDate": true,
                          "productInstances": true,
                          "autoReloadRegistration": true,
                          "ePurse": true,
                          "personalAccountData":
                            { "name": true, "birthdate": true, "photo": true },
                          "gboAgeProfile": true,
                        },
                      "_links": {},
                    }
                Non-transferable token (marked PAD):
                  value:
                    {
                      "oldOvPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 1,
                          "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": "MyToken",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": 2,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            {
                              "name":
                                {
                                  "inaccuracyFlag": true,
                                  "inaccuracyFlagReason": "T.B.D",
                                  "inaccuracyFlagSetCounter": 1,
                                  "isValidated": false,
                                  "changeCounter": 0,
                                  "maxUpdatesVerificationCount": 0,
                                  "lastChangeDate": "2024-08-24T14:15:22Z",
                                },
                              "birthdate":
                                {
                                  "inaccuracyFlag": true,
                                  "inaccuracyFlagReason": "T.B.D",
                                  "inaccuracyFlagSetCounter": 1,
                                  "isValidated": false,
                                  "changeCounter": 0,
                                  "maxUpdatesVerificationCount": 0,
                                  "lastChangeDate": "2024-08-24T14:15:22Z",
                                },
                              "photo":
                                {
                                  "inaccuracyFlag": true,
                                  "inaccuracyFlagReason": null,
                                  "inaccuracyFlagSetCounter": 1,
                                  "isValidated": false,
                                  "changeCounter": 0,
                                  "maxUpdatesVerificationCount": 0,
                                  "lastChangeDate": "2024-08-24T14:15:22Z",
                                },
                            },
                          "gboAgeProfile":
                            {
                              "gboAgeProfileId": 1,
                              "name": "Kind (4 t/m 11 jaar)",
                              "ageFromInclusive": 4,
                              "ageToInclusive": 11
                            }
                        },
                      "newOvPayToken":
                        {
                          "customerProfileId": null,
                          "ovPayTokenId": null,
                          "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": null,
                          "tokenStatus": null,
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            { "name": null, "birthdate": null, "photo": null },
                          "gboAgeProfile": null
                        },
                      "isTransferable": false,
                      "transferableObjects":
                        {
                          "tokenType": true,
                          "tokenStatus": true,
                          "expirationDate": true,
                          "productInstances": true,
                          "autoReloadRegistration": true,
                          "ePurse": true,
                          "personalAccountData":
                            {
                              "name": false,
                              "birthdate": false,
                              "photo": false,
                            },
                          "gboAgeProfile": true,
                        },
                      "_links": {},
                    }
                Non-transferable token (different age profile):
                  value:
                    {
                      "oldOvPayToken":
                        {
                          "customerProfileId": 1,
                          "ovPayTokenId": 1,
                          "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": "MyToken",
                          "tokenStatus":
                            { "tokenStatusId": 2, "name": "Active" },
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": 2,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            {
                              "name": null,
                              "birthdate":
                                {
                                  "inaccuracyFlag": false,
                                  "inaccuracyFlagReason": "T.B.D",
                                  "inaccuracyFlagSetCounter": 1,
                                  "isValidated": false,
                                  "changeCounter": 0,
                                  "maxUpdatesVerificationCount": 0,
                                  "lastChangeDate": "2024-08-24T14:15:22Z",
                                },
                              "photo": null,
                            },
                          "gboAgeProfile":
                              {
                                "gboAgeProfileId": 1,
                                "name": "Kind (4 t/m 11 jaar)",
                                "ageFromInclusive": 4,
                                "ageToInclusive": 11
                              }
                        },
                      "newOvPayToken":
                        {
                          "customerProfileId": null,
                          "ovPayTokenId": null,
                          "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                          "tokenType": { "tokenTypeId": 1, "name": "EMV" },
                          "alias": null,
                          "tokenStatus": null,
                          "expirationDate": "2028-02-01",
                          "productInstances": [],
                          "replacedByTokenId": null,
                          "autoReloadRegistration": null,
                          "ePurse": null,
                          "personalAccountData":
                            {
                              "name": null,
                              "birthdate":
                                {
                                  "inaccuracyFlag": false,
                                  "inaccuracyFlagReason": "T.B.D",
                                  "inaccuracyFlagSetCounter": 1,
                                  "isValidated": false,
                                  "changeCounter": 0,
                                  "maxUpdatesVerificationCount": 0,
                                  "lastChangeDate": "2024-08-24T14:15:22Z",
                                },
                              "photo": null,
                            },
                            "gboAgeProfile":
                              {
                                "gboAgeProfileId": 4,
                                "name": "Kind (19 t/m 65 jaar)",
                                "ageFromInclusive": 19,
                                "ageToInclusive": 65
                              }
                        },
                      "isTransferable": false,
                      "transferableObjects":
                        {
                          "tokenType": true,
                          "tokenStatus": true,
                          "expirationDate": true,
                          "productInstances": true,
                          "autoReloadRegistration": true,
                          "ePurse": false,
                          "personalAccountData":
                            { "name": true, "birthdate": false, "photo": true },
                          "gboAgeProfile": false,
                        },
                      "_links": {},
                    }
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                New token already present in other customer profile:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/badrequest",
                      "title": "Bad Request",
                      "detail": "New token already present in other customer profile.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "New token already present in other customer profile.",
                            "pointer": "#/0/ovPayTokenId",
                            "ovPayTokenId": 2,
                          },
                        ],
                    }
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Old token not found in profile:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notfound",
                      "title": "The item you requested was not found.",
                      "detail": "The old token was not found in the customer profile.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The old token was not found in the customer profile.",
                            "pointer": "#/0/ovPayTokenId",
                            "ovPayTokenId": 1,
                          },
                        ],
                    }
                New token not found in profile:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notfound",
                      "title": "The item you requested was not found.",
                      "detail": "The new token was not found in the customer profile.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The new token was not found in the customer profile.",
                            "pointer": "#/0/ovPayTokenId",
                            "ovPayTokenId": 2,
                          },
                        ],
                    }
                XTAT for new token not found in GBO:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notfound",
                      "title": "The item you requested was not found.",
                      "detail": "The new token was not found in GBO:.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "XTAT for the new token was not found in GBO.",
                            "pointer": "#/0/xTat",
                            "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058",
                          },
                        ],
                    }
                SRID for new token not found in GBO:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notfound",
                      "title": "The item you requested was not found.",
                      "detail": "The new token was not found in GBO:.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "Service Reference ID for the new token was not found in GBO.",
                            "pointer": "#/0/serviceReferenceId",
                            "serviceReferenceId": "NLOV1234567ABCDEFG",
                          },
                        ],
                    }
  /customers/tokens/{ovPayTokenId}/transfer:
    parameters:
      - name: X-HTM-JWT-AUTH-HEADER
        in: header
        schema:
          type: string
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
        required: false
        description: The JWT of a customer in case of touchpoint were customer logs in themselves
      - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER
        in: header
        schema:
          type: string
          example: feaaef83-a551-4283-8419-340b1ada3b55
        required: false
        description: The customerProfileId of a customer in the case of the SMP
      - name: X-HTM-ROLE-HEADER
        in: header
        schema:
          type: string
          example: Customer
        required: false
      - name: ovPayTokenId
        in: path
        required: true
        style: simple
        description: Id of the OVpay token from which data will be transferred.
        schema:
          type: integer
          example: 1
    post:
      summary: "**INTEGRATIELAAG** Transfer old OVpay token to new OVpay token."
      description: |-
        **Note that this is an integratielaag endpoint, not a Service Engine endpoint!**
        First transfers all personal account data (if present), then all products, of an existing OVpay token 
        to a new OVpay token. The new token will also be persisted in the profile as a replacement
        of the old token. This call is asynchronous, and progress can be monitored using the 
        `/customers/tokens/transfer/responsestatus/*` endpoint.
      tags:
        - Token Replace v2
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TransferRequest"
            examples:
              Transfer from a token without PAD to a new token:
                summary: Transfer from a token without PAD to a new token
                description: |
                  Transfer of a token without PAD to a new OVpay token. Note the new token in the request is always 
                  identified by xTAT, regardless if the new token already exists in the customer profile. If the new 
                  token does not exist in the customer profile, the user needs to provide an alias for the new token, 
                  and it will be created in the customer profile.
                value:
                  {
                    "oldOvPayToken": {},
                    "newOvPayToken":
                      {
                        "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                        "alias": "My new token",
                      },
                  }
              Transfer from a token with PAD to a new token without existing PAD:
                summary: Transfer from a token with PAD to a new token without existing PAD
                description: |
                  Transfer of a token with PAD to a new token by xTAT without existing PAD. Note how this request is 
                  different, since it has an e-mail address on which the new PAD should be created. This request may 
                  optionally provide an OTP for verification of th provided email address.
                  Also note the new token in the request is always identified by xTAT, regardless if the new token 
                  already exists in the customer profile. If the new token does not exist in the customer profile, the 
                  user needs to provide an alias for the new token, and it will be created in the customer profile.
                value:
                  {
                    "oldOvPayToken": { "padOtp": "123456" },
                    "newOvPayToken":
                      {
                        "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                        "alias": "My new token",
                        "padEmailAddress": "jandevries@outlook.com",
                        "padOtp": "678901",
                      },
                  }
              Transfer from a token with PAD to a new token with existing PAD:
                summary: Transfer from a token with PAD to a new token with existing PAD
                description: |
                  Transfer of a token with PAD to a new token by xTAT with existing PAD.
                  Note that the new token in the request is always identified by xTAT, regardless if the new token 
                  already exists in the customer profile. If the new token does not exist in the customer profile, the 
                  user needs to provide an alias for the new token, and it will be created in the customer profile.
                value:
                  {
                    "oldOvPayToken": { "padOtp": "123456" },
                    "newOvPayToken":
                      {
                        "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                        "alias": "My new token",
                        "padOtp": "678901",
                      },
                  }
              Complete request body (for development only):
                summary: Complete request body (for development only)
                description: |
                  Complete request body (for development only).
                value:
                  {
                    "oldOvPayToken": { "padOtp": "123456" },
                    "newOvPayToken":
                      {
                        "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                        "alias": "My new token",
                        "padEmailAddress": "jandevries@outlook.com",
                        "padOtp": "678901",
                      },
                  }
      responses:
        "202":
          description: Accepted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Transfer of token started:
                  description: |
                    The transfer of the token was started successfully. The data of the token will be transferred
                    asynchronously. In the response body the consumer will find information on how to retrieve the 
                    processing status.
                  value:
                    {
                      "startTime": "2025-02-14T05:32:47.067Z",
                      "status": "Running",
                      "clientTrackingId": "08584620957189579629541919368CU00",
                      "callbackurl": "https://api.integratielaag.nl/customers/tokens/transfer/responsestatus/runtime/webhooks/workflow/scaleUnits/prod-00/workflows/6fd466916c",
                      "retryAfter": 10,
                    }
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Request body validation error:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/validation",
                      "title": "Validation error",
                      "detail": "The request body is not valid.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The old token is required.",
                            "pointer": "#/oldOvPayToken",
                          },
                          {
                            "detail": "The new token is required.",
                            "pointer": "#/newOvPayToken",
                          },
                        ],
                    }
  /customers/tokens/transfer/responsestatus/{clientTrackingId}:
    parameters:
      - in: path
        name: clientTrackingId
        schema:
          type: string
        required: true
        description: The clientTrackingId of the token transfer request.
    get:
      tags:
        - Token Replace v2
      summary: "**INTEGRATIELAAG** Get the status of the initiated token transfer process (POST)."
      description: |
        **Note that this is an integratielaag endpoint, not a Service Engine endpoint!** Get the status of the 
        asynchronous token transfer processing.
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                New token as a result of a successful transfer:
                  description: |
                    The transfer of the token was processed successfully. The response body shows the details of the new
                    token to which the data was transferred.
                  value:
                    {
                      "customerProfileId": 1,
                      "ovPayTokenId": 2,
                      "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969",
                      "tokenType":
                        { "tokenTypeId": 2, "name": "OV-pas physical" },
                      "alias": "MyToken",
                      "tokenStatus": { "tokenStatusId": 2, "name": "Active" },
                      "expirationDate": "2028-02-01",
                      "replacedByTokenId": null,
                      "autoReloadRegistration":
                        {
                          "autoReloadAmount": 500,
                          "retailerReferenceId": "abc",
                          "arrit": "425f7fc2-1103-4822-9c79-7c4aaa2fb6aa",
                          "autoReloadRegistrationStatus": "ACTIVE",
                          "autoReloadRegistrationStartDateTime": "2024-06-02T15:03:46Z",
                        },
                      "ePurse":
                        {
                          "e-PurseBalance":
                            { "currency": "EUR", "amount": 350 },
                          "status": "ACTIVE",
                          "originDate": "2019-07-16T11:00:00+02:00",
                        },
                      "personalAccountData":
                        {
                          "name":
                            {
                              "inaccuracyFlag": false,
                              "inaccuracyFlagReason": null,
                              "inaccuracyFlagSetCounter": 0,
                              "isValidated": false,
                              "changeCounter": 0,
                              "maxUpdatesVerificationCount": 0,
                              "lastChangeDate": "2024-08-24T14:15:22Z",
                            },
                          "birthdate":
                            {
                              "inaccuracyFlag": false,
                              "inaccuracyFlagReason": null,
                              "inaccuracyFlagSetCounter": 0,
                              "isValidated": false,
                              "changeCounter": 0,
                              "maxUpdatesVerificationCount": 0,
                              "lastChangeDate": "2024-08-24T14:15:22Z",
                            },
                          "photo":
                            {
                              "inaccuracyFlag": false,
                              "inaccuracyFlagReason": null,
                              "inaccuracyFlagSetCounter": 0,
                              "isValidated": false,
                              "changeCounter": 0,
                              "maxUpdatesVerificationCount": 0,
                              "lastChangeDate": "2024-08-24T14:15:22Z",
                            },
                        },
                      "gboAgeProfile":
                        {
                         "gboAgeProfileId": 1,
                         "name": "Kind (4 t/m 11 jaar)",
                         "ageFromInclusive": 4,
                         "ageToInclusive": 11
                        },
                      "_links":
                        {
                          "self":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1",
                              "method": "GET",
                            },
                          "partial_edit":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                              "method": "PATCH",
                            },
                          "delete_token":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1",
                              "method": "DELETE",
                            },
                          "get_productinstances":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances",
                              "method": "GET",
                            },
                          "get_trips":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips",
                              "method": "GET",
                            },
                          "update_personal-data":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/e7fa3392-646b-40e2-95a6-c417dc0b0969",
                              "method": "PATCH",
                            },
                          "compare_token":
                            {
                              "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare",
                              "method": "POST",
                            },
                        },
                    }
                Token transfer in progress:
                  description: |
                    The transfer of the token is still in progress. The response body shows the details of the 
                    processing status.
                  value:
                    {
                      "properties":
                        {
                          "waitEndTime": "2025-06-04T09:29:21.9641991Z",
                          "startTime": "2025-06-04T09:29:21.9641991Z",
                          "status": "Running",
                          "correlation":
                            {
                              "clientTrackingId": "08584525775244808022011782750CU00",
                            },
                          "workflow":
                            {
                              "id": "/workflows/9cd96b77c0b94b31832778569f8ef2f9/versions/08584532480062676349",
                              "name": "08584532480062676349",
                              "type": "workflows/versions",
                            },
                          "trigger":
                            {
                              "name": "token_transfer",
                              "inputsLink":
                                {
                                  "uri": "https://htm-abt-logicapp-acc.azurewebsites.net:443/runtime/webhooks/workflow/scaleUnits/prod-00/workflows/9cd96b77c0b94b31832778569f8ef2f9/runs/08584525775235278538475939776CU00/contents/TriggerInputs?api-version=2022-05-01&code=C6PDQGl3MGwt8KyA9BjWDdQbzBwm-01gEmZaTp-hPJ5UAzFuPU-thg%3d%3d&se=2025-06-04T13%3A00%3A00.0000000Z&sp=%2Fruns%2F08584525775235278538475939776CU00%2Fcontents%2FTriggerInputs%2Fread&sv=1.0&sig=6Uxs33K7cQ7jONWzhv9XFPzx4RRHZ6smzfM6wNPk5Mc",
                                  "contentSize": 298,
                                },
                              "outputsLink":
                                {
                                  "uri": "https://htm-abt-logicapp-acc.azurewebsites.net:443/runtime/webhooks/workflow/scaleUnits/prod-00/workflows/9cd96b77c0b94b31832778569f8ef2f9/runs/08584525775235278538475939776CU00/contents/TriggerOutputs?api-version=2022-05-01&code=C6PDQGl3MGwt8KyA9BjWDdQbzBwm-01gEmZaTp-hPJ5UAzFuPU-thg%3d%3d&se=2025-06-04T13%3A00%3A00.0000000Z&sp=%2Fruns%2F08584525775235278538475939776CU00%2Fcontents%2FTriggerOutputs%2Fread&sv=1.0&sig=vJ6pmCsmz2aP7f73MVOmCTes3YvC1e2w0ZLqdypLXrM",
                                  "contentSize": 6110,
                                },
                              "startTime": "2025-06-04T09:29:21.9497457Z",
                              "endTime": "2025-06-04T09:29:21.9497457Z",
                              "originHistoryName": "08584525775235278538475939776CU00",
                              "correlation":
                                {
                                  "clientTrackingId": "08584525775244808022011782750CU00",
                                },
                              "status": "Succeeded",
                            },
                          "outputs": {},
                          "response":
                            {
                              "startTime": "2025-06-04T09:29:21.9642901Z",
                              "correlation": {},
                              "status": "Waiting",
                            },
                        },
                      "id": "/workflows/9cd96b77c0b94b31832778569f8ef2f9/runs/08584525775235278538475939776CU00",
                      "name": "08584525775235278538475939776CU00",
                      "type": "workflows/runs",
                    }
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Old token not found in profile:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notfound",
                      "title": "The item you requested was not found.",
                      "detail": "The old token was not found in the customer profile.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The old token was not found in the customer profile.",
                            "pointer": "#/0/ovPayTokenId",
                            "ovPayTokenId": 1,
                          },
                        ],
                    }
                New token not found in profile:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notfound",
                      "title": "The item you requested was not found.",
                      "detail": "The new token was not found in the customer profile.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The new token was not found in the customer profile.",
                            "pointer": "#/0/ovPayTokenId",
                            "ovPayTokenId": 2,
                          },
                        ],
                    }
                XTAT for new token not found in GBO:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notfound",
                      "title": "The item you requested was not found.",
                      "detail": "The new token was not found in GBO:.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "XTAT for the new token was not found in GBO.",
                            "pointer": "#/0/xTat",
                            "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058",
                          },
                        ],
                    }
        "405":
          description: Not allowed
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Old token is wrong token type:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notallowed",
                      "title": "The transfer you requested was not allowed.",
                      "detail": "The old token has wrong token type.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The old token has token type OV-pas physical.",
                            "pointer": "#/0/ovPayToken/tokenTypeId",
                            "tokenTypeId": 2,
                          },
                        ],
                    }
                Old token has wrong token status:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notallowed",
                      "title": "The transfer you requested was not allowed.",
                      "detail": "The old token has wrong token status.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The old token has token status replaced.",
                            "pointer": "#/0/ovPayToken/tokenStatusId",
                            "tokenStatusId": 4,
                          },
                        ],
                    }
                New token is expired:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notallowed",
                      "title": "The transfer you requested was not allowed.",
                      "detail": "The new token is expired.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "The new token is expired.",
                            "pointer": "#/0/ovPayToken/expirationDate",
                            "expirationDate": "2022-01-01",
                          },
                        ],
                    }
                One or more GBO product instances not transferable:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notallowed",
                      "title": "The transfer you requested was not allowed.",
                      "detail": "One or more GBO product instances are not transferable.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "One or more GBO product instances are not transferable",
                            "pointer": "#/0/ovPayToken/packageTemplateId",
                            "packageTemplateId": "33613",
                          },
                        ],
                    }
                One or more PAD attributes marked:
                  value:
                    {
                      "type": "https://htm.nl/api/v1/probs/notallowed",
                      "title": "The transfer you requested was not allowed.",
                      "detail": "One or more PAD attributes are not transferable.",
                      "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b",
                      "errors":
                        [
                          {
                            "detail": "PAD attribute birthdate is marked on the old token",
                            "pointer": "#/0/ovPayToken/padAttributes/birthdate",
                          },
                        ],
                    }
  /customers/devices:
    post:
      summary: Add a new device to a customer profile.
      description: Add a new device to a customer profile.
      tags:
        - Devices
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              Add a new device:
                value:
                  {
                    "externalDeviceId": "dee7d80e-9288-4508-a3ed-c067e619179f",
                    "alias": "My iPhone 13",
                  }
      responses:
        "201":
          description: Created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                New device added to customer profile:
                  value:
                    {
                      "deviceId": "0f0981bf-6d60-4b06-bc55-de1ba325f366",
                      "externalDeviceId": "dee7d80e-9288-4508-a3ed-c067e619179f",
                      "alias": "My iPhone 13",
                    }
  /customers/devices/{deviceId}:
    parameters:
      - name: deviceId
        in: path
        required: true
        style: simple
        description: Id of the device to be deleted.
        schema:
          type: string
          format: uuid
          example: 0f0981bf-6d60-4b06-bc55-de1ba325f366
    patch:
      summary: Update alias of a device in a customer profile.
      description: Update alias of a device in a customer profile.
      tags:
        - Devices
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/unavailable"
            examples:
              Update alias of a device:
                value:
                  {
                    "alias": "My old iPhone 13",
                  }
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/unavailable"
              examples:
                Device alias updated in customer profile:
                  value:
                    {
                      "deviceId": "0f0981bf-6d60-4b06-bc55-de1ba325f366",
                      "externalDeviceId": "dee7d80e-9288-4508-a3ed-c067e619179f",
                      "alias": "My old iPhone 13",
                    }
    delete:
      summary: Delete a device from a customer profile.
      description: Delete a device from a customer profile.
      tags:
        - Devices
      responses:
        "200":
          description: OK
components:
  schemas:
    unavailable:
      type: object
    CompareRequest:
      type: object
      properties:
        ovPayTokenId:
          type: integer
          example: 1
          description: When new token is already present in customer profile
        xBOT:
          type: string
          format: uuid
          example: "91641b54-056c-49ea-b598-ccde81d6c45a"
        xTAT:
          type: string
          format: uuid
          example: "4c2d60e2-cd03-4c80-ae70-573a301f0bff"
        serviceReferenceId:
          type: string
          example: "NLOV1234567ABCDEFG"
          description: When provided, amount is also required
        amount:
          type: integer
          example: 100
          description: When provided, serviceReferenceId is also required
        ovpasNumber:
          type: string
          example: "OV34567"
          description: When provided, verificationCode is also required
        verificationCode:
          type: string
          example: "1234"
          description: When provided, ovpasNumber is also required
    TransferRequest:
      type: object
      required:
        - oldOvPayToken
        - newOvPayToken
      properties:
        oldOvPayToken:
          type: object
          properties:
            padOtp:
              type: string
              pattern: ^[0-9]{6}$
              example: "023456"
        newOvPayToken:
          type: object
          properties:
            ovPayTokenId:
              type: integer
              example: 1
              description: When new token is already present in customer profile
            xBOT:
              type: string
              format: uuid
              example: "91641b54-056c-49ea-b598-ccde81d6c45a"
            xTAT:
              type: string
              format: uuid
              example: "4c2d60e2-cd03-4c80-ae70-573a301f0bff"
            serviceReferenceId:
              type: string
              example: "NLOV1234567ABCDEFG"
              description: When provided, amount is also required
            amount:
              type: integer
              example: 100
              description: When provided, serviceReferenceId is also required
            padOtp:
              type: string
              pattern: ^[0-9]{6}$
              example: "123456"
              description: Can be xTAT-based OTP (for existing PAD), or email-based OTP (for new PAD). In the latter case, padEmailAddress should be the same address as used for the OTP!
            padEmailAddress:
              type: string
              format: email
              example: 8Z9dG@example.com
            alias:
              type: string
              example: MyNewToken
    CustomersResponseList:
      type: object
      properties:
        customers: 
          type: array
          items:
            $ref: "#/components/schemas/CustomersResponse"      
    CustomersResponse:   
      type: object
      properties:
          customerProfileId:
            type: integer
            example: 1
          customerNumber:
            type: integer
            example: 1000001
          customerStatus:
            type: object
            properties:
              customerStatusId:
                type: integer
                example: 1
              name:
                type: string
                example: Active
          debtorNumber:
            type: string
            example: DB100001
          debtorStatus:
            type: object
            properties:
              debtorStatusId:
                type: integer
                example: 1
              name:
                type: string
                example: Active
          person:
            type: object
            properties:
              prefix:
                type: string
                example: Mr
              birthname:
                type: string
                example: John
              surname:
                type: string
                example: Doe
              suffix:
                type: string
                example: Jr.
              dateOfBirth:
                type: string
                format: date
                example: "2023-02-01"
              emailAddress:
                type: string
                format: email
                example: 4j2dD@example.com
              addresses:
                type: array
                items:
                  type: object
                  properties:
                    addressId:
                      type: integer
                      example: 1
                    addressType:
                      type: object
                      properties:
                        addressTypeId:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: Shipping
                    street:
                      type: string
                      example: Appelstraat
                    houseNumber:
                      type: integer
                      example: 1
                    houseNumberSuffix:
                      type: string
                      example: BS
                    postalCode:
                      type: string
                      example: 1234AB
                    city:
                      type: string
                      example: Den Haag
                    country:
                      type: string
                      example: NL
              phones:
                type: array
                items:
                  type: object
                  properties:
                    phoneId:
                      type: integer
                      example: 1
                    isPreferred:
                      type: boolean
                      example: true
                    phoneType:
                      type: object
                      properties:
                        phoneTypeId:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: Home
                    number:
                      type: string
                      example: "0123456789"
                    countryCode:
                      type: string
                      example: "0031"
              devices:
                type: array
                items:
                  type: object
                  properties:
                    deviceId:
                      type: string
                      format: uuid
                      example: 1
                    externalDeviceId:
                      type: string
                      format: uuid
                      example: dee7d80e-9288-4508-a3ed-c067e619179f
                    alias:
                      type: string
                      example: My iPhone 13
                    _links:
                      type: object
                      properties:
                        add_device:
                          type: object
                          properties:
                            href:
                              type: string
                              example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/devices
                            method:
                              type: string
                              example: POST
                        edit_device:
                          type: object
                          properties:
                            href:
                              type: string
                              example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/devices/1
                            method:
                              type: string
                              example: PATCH
                        delete_device:
                          type: object
                          properties:
                            href:
                              type: string
                              example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/devices/1
                            method:
                              type: string
                              example: DELETE
          _links:
            type: object
            properties:
              self:
                type: object
                properties:
                  href:
                    type: string
                    example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers
                  method:
                    type: string
                    example: GET
              partial_edit:
                type: object
                properties:
                  href:
                    type: string
                    example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers
                  method:
                    type: string
                    example: PATCH
              get_tokens:
                type: object
                properties:
                  href:
                    type: string
                    example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens
                  method:
                    type: string
                    example: GET
              create_token:
                type: object
                properties:
                  href:
                    type: string
                    example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens
                  method:
                    type: string
                    example: POST
    OvPayTokensResponse:
      type: object
      required:
        - ovPayTokens
      properties:
        ovPayTokens:
          type: array
          items:
            type: object
            properties:
              ovPayTokenId:
                type: integer
                example: 1
              tokenType:
                type: object
                properties:
                  tokenTypeId:
                    type: integer
                    example: 1
                  name:
                    type: string
                    example: EMV
              alias:
                type: string
                example: MyToken
              tokenStatus:
                type: object
                properties:
                  tokenStatusId:
                    type: integer
                    example: 1
                  name:
                    type: string
                    example: Active
              expirationDate:
                type: string
                format: date
                example: "2023-02-01"
              replacedByTokenId:
                type: integer
                example: 1
              _links:
                type: object
                properties:
                  self:
                    type: object
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1
                      method:
                        type: string
                        example: GET
                  partial_edit:
                    type: object
                    description: External touchpoints are only allowed to change alias - SMP can also change tokenStatus
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1
                      method:
                        type: string
                        example: PATCH
                  replace_token:
                    type: object
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/replace
                      method:
                        type: string
                        example: POST
                  delete_token:
                    type: object
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1
                      method:
                        type: string
                        example: DELETE
                  get_productinstances:
                    type: object
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances
                      method:
                        type: string
                        example: GET
                  get_trips:
                    type: object
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips
                      method:
                        type: string
                        example: GET
    OvPayTokenProductInstancesResponse:
      type: object
      required:
        - productInstances
      properties:
        productInstances:
          type: array
          items:
            type: object
            required:
              - productId
              - name
              - status
              - isRenewable
              - productCategory
              - fromInclusive
              - orderId
              - orderLineId
              - _links
            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
                    description: Always present for any HTM product-instance
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E
                      method:
                        type: string
                        example: GET
                  get_contract:
                    type: object
                    description: Only present for subscriptions/contracts
                    properties:
                      href:
                        type: string
                        example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F
                      method:
                        type: string
                        example: GET
