ovpay/src/openapi/products/SE-vouchers-supplier.yaml

1185 lines
55 KiB
YAML

openapi: 3.0.1
info:
title: Service Engine APIs for HTM voucher suppliers
description: Service Engine APIs for HTM voucher suppliers, this means all instances responsible for supplying vouchers. These are NOT the CRUD APIs to the data hub. These are ALSO NOT the api's for sales touchpoints.
version: "1.0"
servers:
- url: https://services.acc.api.htm.nl/abt/abtvouchers/1.0
paths:
/voucherdefinitions:
get:
tags:
- Vouchers
summary: Get a list of all voucher definitions that a touchpoint is allowed to issue
description: |-
Get a list of all voucher definitions that the calling touchpoint is allowed to issue.\
Essentially, this means that only voucher definitions that have active sellingPeriods for touchpoints within the same
retailer as the calling touchpoint are returned.
Voucher definitions are modeled using the same model as HTM products. This means that voucher definitions look like "products" (have a productId, mostly the same attributes as HTM products, etc.) but most attributes need to be interpreted differently.\
For vouchers:
- productCategory should always be "voucher"
- requiredProduct contains the productId of the product that is acquired when redeeming the voucher
- sellingPeriods denote which touchpoints are allowed to issue vouchers from a given definition and what their issuance limits are
- MandatoryCustomerDataItems denote the "voucher claims" which are checked against known values that should match the customer input, to be allowed to redeem the voucher
When a requiredProduct is configured, all attributes of the requiredProduct are also prerequisites for redeeming the voucher; thus they do not need to also be configured for the voucher definition. The requiredProduct itself is the single source of truth for this; and voucher definitions do not need to be updated if the requirements of the requiredProduct change. For example, if the requiredProduct requires an OVpay token, an OVpay token is automatically required to redeem issued vouchers.
parameters:
- name: touchpointId
in: query
required: false
description: |
Filter the voucher definitions on a specific touchpointId. This means that only voucher definitions with active selling periods for the specified touchpoint are returned.
This query parameter is only intended for administrative purposes, since the touchpoint associated with the access token used in the request is used to determine which voucher definitions are returned. This query parameter can be used to retrieve voucher definitions for other touchpoints within the same retailer, for example to retrieve voucher definitions for a specific sales touchpoint that is different from the calling touchpoint.
schema:
type: integer
example: 12
- name: productId
in: query
required: false
description: Return a specific voucher definition by its productId.
schema:
type: integer
example: 321
- name: requiredProductId
in: query
required: false
description: Filter the voucher definitions on a specific requiredProductId (denoting the product that is acquired when redeeming the voucher). This means that only voucher definitions that have the specified productId in their requiredProducts array are returned.
schema:
type: integer
example: 126
- name: showOnlyActive
in: query
required: false
description: Filter the voucher definitions on active selling periods. If true, only voucher definitions with at least one active selling period are returned. If false, all voucher definitions are returned regardless of their selling periods.
schema:
type: boolean
example: true
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/supplierTouchpointVoucherDefinitionsListResponse"
examples:
No products / Empty list:
summary: No products / Empty list
description: No products
value: { "voucherDefinitions": [] }
List containing one voucher definition (called by touchpointId 12):
summary: List containing one voucher definition (called by touchpointId 12)
description: |-
List containing one voucher definition for a voucher that can be redeemed for the product "Ooievaarspas voor AOW-ers in Den Haag".\
In this case, the voucher definition has a sellingPrice of 0, which means that vouchers issued from this voucher definition can be redeemed to acquire the requiredProduct for free. The requiredProduct also has a sellingPrice of 0, so no "discount" is shown to the customer; just the voucher's amountInclTax.\
To issue vouchers for this voucher definition, the calling touchpoint must also provide voucherClaims (values to be checked against customer input when redeeming the voucher) for each of the mandatoryCustomerDataItems of the voucher definition (in this case, a PAD birthdate).\
To redeem the voucher, the customer must provide a valid PAD birthdate (that is checked against the PAD of the actual OVpay-token and against the voucherClaim provided by the voucher issuer).
value:
{
"voucherDefinitions":
[
{
"productId": 263,
"productName": "Voucher Ooievaarspas-product AOW",
"productDescription": "Voucher voor AOW-ers in Den Haag met een Ooievaarspas, die ingewisseld kan worden voor het product \"Ooievaarspas voor AOW-ers in Den Haag\"",
"validityPeriod":
{
"validityPeriodId": 144,
"fromInclusive": "2026-01-01T00:00:00.000+00:00",
"toInclusive": "2030-12-31T23:59:59.000+00:00",
},
"productCategory":
{
"productCategoryId": 9,
"isTravelProduct": false,
"name": "Voucher",
},
"requiredProducts":
[
{
"productId": 982,
"productName": "Ooievaarspas voor AOW-ers in Den Haag",
"productDescription": "Vrij reizen bij HTM voor Haagse AOW-gerechtigden met een Ooievaarspas.",
},
],
"mandatoryCustomerDataItems":
[
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
}
],
"imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg",
"termsUrl": "https://www.htm.nl/voorwaarden/vouchers/voucher-xxx-voorwaarden.pdf",
"sellingPeriods":
[
{
"sellingPeriodId": 78,
"fromInclusive": "2026-01-01T00:00:00.000+00:00",
"toInclusive": "2030-12-31T23:59:59.000+00:00",
"salesTouchpoint":
{
"salesTouchpointId": 12,
"name": "Gemeente Den Haag",
"isActive": true,
"retailer":
{
"retailerId": 1001,
"name": "Gemeente Den Haag",
"street": "Koningin Julianaplein",
"number": "10",
"numberAddition": null,
"postalCode": "2595 AA",
"city": "Den Haag",
"country": "Nederland",
"emailAddress": "info@denhaag.nl",
"phoneNumber": "070 374 9002",
"taxId": "572309345923",
"imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg",
},
},
"forbiddenPaymentMethods": [],
"sellingPrices":
[
{
"sellingPriceId": 91,
"amountInclTax": 0,
"fromInclusive": "2026-01-01T00:00:00.000+00:00",
"toInclusive": "2030-12-31T23:59:59.000+00:00",
"internalPrice": 0.0000,
"taxCode": "V09",
"taxPercentage": 9.0000,
}
]
}
]
}
]
}
"403":
description: Forbidden
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Access denied due to insufficient permissions:
summary: Access denied due to insufficient permissions
value:
{
"type": "https://example.com/probs/forbidden",
"title": "Access denied",
"detail": "You do not have permission to access this resource.",
"instance": "/voucherdefinitions",
}
"404":
description: Not found
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Voucher not found:
summary: Voucher not found
value:
{
"type": "https://example.com/probs/not-found",
"title": "Voucher not found",
"detail": "The voucher definition does not exist.",
"instance": "/voucherdefinitions",
}
"500":
description: Internal server error
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Unexpected server error:
summary: Unexpected server error
value:
{
"type": "https://example.com/probs/internal-server-error",
"title": "Internal Server Error",
"detail": "An unexpected error occurred while processing your request.",
"instance": "/voucherdefinitions",
}
/issuedvouchers:
get:
summary: Get a list of issued vouchers that were issued for a specific touch point
description:
Retrieve all issued vouchers for a specific touchpoint. This means that only vouchers that were issued by a touchpoint within the same retailer as the calling touchpoint are returned.
parameters:
- name: touchpointId
in: query
required: false
description: |-
Filter the issued vouchers on a specific touchpointId. This means that only vouchers that were issued by the specified touchpoint are returned.
This query parameter is only intended for administrative purposes, since the touchpoint associated with the access token used in the request is used to determine which issued vouchers are returned. This query parameter can be used to retrieve issued vouchers for other touchpoints within the same retailer, for example to retrieve issued vouchers for a specific sales touchpoint that is different from the calling touchpoint.
schema:
type: integer
example: 12
- name: issuedVoucherId
in: query
required: false
description: The unique identifier of the issued voucher instance to retrieve.
schema:
type: string
format: uuid
example: d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90
- name: voucherCode
in: query
required: false
description: The unique code (that the customer uses for redeeming the voucher) of the issued voucher to retrieve.
schema:
type: string
example: HTM-A7J-128-PYT
- name: productId
in: query
required: false
description: Return only issued vouchers that were issued for the given voucher definition (by its productId).
schema:
type: integer
example: 321
- name: voucherStatusId
in: query
required: false
explode: false
description: |-
Return only issued vouchers that currently have the given voucher status(es).
Possible voucher statuses are:
- 1 = new
- 2 = issued
- 3 = redeemed
- 4 = revoked
- 5 = expired
- 6 = pendingRedemption
schema:
type: array
items:
type: integer
example: [4,5]
tags:
- Vouchers
responses:
"200":
description: Successful retrieval of voucher instance
content:
application/json:
schema:
$ref: "#/components/schemas/supplierTouchpointIssuedVouchersListResponse"
examples:
List containing one issued voucher that grants a product for free:
summary: List containing one issued voucher that grants a product for free
description: |-
List containing one issued voucher that can be redeemed for the product "Ooievaarspas voor AOW-ers in Den Haag" for free.\
In this case, the voucher has an amountInclTax of 0. The requiredProduct also has a sellingPrice of 0, so no "discount" is shown to the customer; just the voucher's amountInclTax.
To redeem it, the customer must provide a valid PAD birthdate (that is checked against the PAD of the actual OVpay-token and against the voucherClaim provided by the voucher issuer). The birthdate value that is checked against, can be found in the "voucherClaims" array of the issued voucher.
value:
{
"issuedVouchers":
[
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"product":
{
"productId": 263,
"productName": "Voucher Ooievaarspas-product AOW",
"productDescription": "Voucher voor AOW-ers in Den Haag met een Ooievaarspas, die ingewisseld kan worden voor het product \"Ooievaarspas voor AOW-ers in Den Haag\"",
"amountInclTax": 0,
"requiredProducts":
[
{
"productId": 982,
"productName": "Ooievaarspas voor AOW-ers in Den Haag",
"productDescription": "Vrij reizen bij HTM voor Haagse AOW-gerechtigden met een Ooievaarspas.",
"productCategory":
{
"productCategoryId": 2,
"isTravelProduct": true,
"name": "Afgekocht reisrecht",
},
"amountInclTax": 0
},
],
"_links":
{
"get_voucher_definition_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/voucherdefinitions/263",
"method": "GET",
},
},
},
"voucherClaims":
[
{
"mandatoryCustomerDataItem":
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
},
"value": "1980-06-31",
}
]
}
]
}
List containing one issued voucher that grants a product for a reduced price:
summary: List containing one issued voucher that grants a product for a reduced price
description: |-
List containing one issued voucher that can be redeemed for the product "Ooievaarspas voor AOW-ers in Den Haag" for a reduced price.\
In this case, the voucher has an amountInclTax > 0, which dictates the (modified) total amount that needs to be paid for said product. If the requiredProduct has a non-zero sellingPrice (amountInclTax), the difference between sellingPrice and voucher amountInclTax represents the granted discount. If the requiredProduct has a sellingPrice of 0, no "discount" is shown; just the voucher's amountInclTax.\
Specifically, in this example, the product "HTM 20% Korting" can be purchased for 1 euro instead of 5 euro.
To redeem it, the customer needs to provide only the voucher code; there are no voucherClaims to be checked against.
value:
{
"issuedVouchers":
[
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"product":
{
"productId": 264,
"productName": "Kortingsvoucher HTM 20% Korting ",
"productDescription": "Voucher waarmee het product \"HTM 20% Korting\" voor een lagere prijs kan worden aangeschaft.",
"amountInclTax": 100,
"requiredProducts":
[
{
"productId": 984,
"productName": "HTM 20% Korting",
"productDescription": "Reis met 20% korting op je betaalpas bij HTM.",
"productCategory":
{
"productCategoryId": 1,
"isTravelProduct": true,
"name": "Kortingsabonnement",
},
"amountInclTax": 500
}
],
"_links":
{
"get_voucher_definition_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/voucherdefinitions/264",
"method": "GET",
}
}
},
"voucherClaims":[]
},
]
}
List containing one issued voucher that grants a discount for a whole order:
summary: List containing one issued voucher that grants a discount for a whole order
description: |-
List containing one issued voucher that can be redeemed for the product "Ooievaarspas voor AOW-ers in Den Haag" for a reduced price.\
In this case, no requiredProduct is specified, and the voucher has an amountInclTax < 0. The (negative) amountInclTax dictates the value of the voucher, that is subtracted from the total order value as a discount (with a minimum order total of 0).
To redeem it, the customer needs to provide only the voucher code; there are no voucherClaims to be checked against.
value:
{
"issuedVouchers":
[
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"product":
{
"productId": 265,
"productName": "Voucher 10 euro korting",
"productDescription": "Voucher die 10 euro korting geeft op je gehele winkelmand.",
"amountInclTax": -1000,
"requiredProducts": [],
"_links":
{
"get_voucher_definition_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/voucherdefinitions/265",
"method": "GET",
}
}
},
"voucherClaims":[]
}
]
}
"403":
description: Forbidden
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Access denied due to insufficient permissions:
summary: Access denied due to insufficient permissions
value:
{
"type": "https://example.com/probs/forbidden",
"title": "Access denied",
"detail": "You do not have permission to access this resource.",
"instance": "/issuedvouchers",
}
"404":
description: Not found
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Voucher not found:
summary: Voucher not found
value:
{
"type": "https://example.com/probs/not-found",
"title": "Voucher not found",
"detail": "The voucher with code VOUCHER123 does not exist.",
"instance": "/issuedvouchers",
}
"500":
description: Internal server error
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Unexpected server error:
summary: Unexpected server error
value:
{
"type": "https://example.com/probs/internal-server-error",
"title": "Internal Server Error",
"detail": "An unexpected error occurred while processing your request.",
"instance": "/issuedvouchers",
}
post:
summary: Issue a voucher for a specific voucher definition
description: |
Issue a voucher for a specific voucher definition. Vouchers can only be issued on a one-by-one basis, so that it is always clear what voucher code has been issued for specific voucher claims (which by itself my not uniquely identify the voucher; however the voucher code is guaranteed to be unique). The voucher can only be issued if the calling touchpoint (recognized by the access token) has an active selling period for the voucher definition (recognized by the productId).\
The \"fromInclusive\" and \"untilInclusive\" fields specify the date-time range in which the voucher can be redeemed by the customer. This has nothing to do with the allowed start date of a requiredProduct (for this, the existing order flow logic is applied).\
If the voucher definition contains mandatoryCustomerDataItems, a value (to be checked against customer input when redeeming the voucher) has to be provided for each of these items.
tags:
- Vouchers
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/supplierTouchpointCreateIssuedVoucherRequest"
examples:
Issue a voucher and supply own voucher code:
summary: Issue a voucher and supply own voucher code
description: This allows the voucher supplier to supply its own voucher code, which can be useful if the supplier already has its own (internal or external) source for voucher codes. The supplied voucher code must be unique - if this code is already in use, the request will fail.
value:
{
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2026-01-01T00:00:00.000+00:00",
"untilInclusive": "2030-12-31T23:59:59.000+00:00",
"productId": 263,
"voucherClaims":
[
{
"mandatoryCustomerDataItemId": 8,
"value": "1980-06-31",
}
],
}
Issue a voucher and receive a voucher code (generated by ABT backend) in response:
summary: Issue a voucher and receive a voucher code (generated by ABT backend) in response
description: If the supplier is not able to generate its own unique voucher codes, it can issue a voucher without supplying any voucher code - the ABT backend will then receive a unique voucher code and return it in response.
value:
{
"fromInclusive": "2026-01-01T00:00:00.000+00:00",
"untilInclusive": "2030-12-31T23:59:59.000+00:00",
"productId": 264
}
responses:
"201":
description: Created
content:
application/json:
schema:
$ref: "#/components/schemas/supplierTouchpointIssuedVoucherResponse"
examples:
Successfully issued a voucher:
summary: Successfully issued a voucher
value:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 2, "name": "issued" },
"product":
{
"productId": 263,
"productName": "Voucher Ooievaarspas-product AOW",
"productDescription": "Voucher voor AOW-ers in Den Haag met een Ooievaarspas, die ingewisseld kan worden voor het product \"Ooievaarspas voor AOW-ers in Den Haag\"",
"amountInclTax": 0,
"requiredProducts":
[
{
"productId": 982,
"productName": "Ooievaarspas voor AOW-ers in Den Haag",
"productDescription": "Vrij reizen bij HTM voor Haagse AOW-gerechtigden met een Ooievaarspas.",
"productCategory":
{
"productCategoryId": 2,
"isTravelProduct": true,
"name": "Afgekocht reisrecht",
},
"amountInclTax": 0
},
],
"_links":
{
"get_voucher_definition_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/voucherdefinitions/263",
"method": "GET",
},
},
},
"voucherClaims":
[
{
"mandatoryCustomerDataItem":
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
},
"value": "1980-06-31",
}
],
}
"400":
description: Bad request
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Voucher code already in use:
summary: Voucher code already in use
value:
{
"type": "https://example.com/probs/bad-request",
"title": "Invalid voucher code",
"detail": "This voucher code is already in use.",
"instance": "/issuedvouchers"
}
Missing mandatory voucher claims:
summary: Missing mandatory voucher claims
value:
{
"type": "https://example.com/probs/bad-request",
"title": "Missing mandatory voucher claims",
"detail": "Please provide a value for all mandatoryCustomerDataItems as defined in the voucher definition.",
"instance": "/issuedvouchers"
}
Voucher validity period out of allowed range:
summary: Voucher validity period out of allowed range
value:
{
"type": "https://example.com/probs/bad-request",
"title": "Invalid voucher validity period",
"detail": "The validity period of the voucher is outside the allowed range for this voucher definition's sellingPeriod.",
"instance": "/issuedvouchers"
}
/issuedvouchers/{issuedVoucherId}:
parameters:
- name: issuedVoucherId
in: path
required: true
description: The unique identifier of the issued voucher instance to update the status for.
schema:
type: string
format: uuid
example: d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90
patch:
summary: Update the status of an issued voucher
description: |-
Update the status of an issued voucher. Not every state change is allowed; an error will be returned if an invalid state change is attempted.\
Possible voucher statuses are:
- 1 = new
- 2 = issued
- 3 = redeemed
- 4 = revoked
- 5 = expired
- 6 = pendingRedemption
tags:
- Vouchers
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/supplierTouchpointUpdateIssuedVoucherRequest"
examples:
Mark a voucher as revoked:
summary: Mark a voucher as revoked
value:
{
"voucherStatusId": 4
}
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/supplierTouchpointIssuedVoucherResponse"
examples:
Successfully updated the status of a voucher:
summary: Successfully updated the status of a voucher
value:
{
"issuedVoucherId": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"voucherCode": "HTM-A7J-128-PYT",
"fromInclusive": "2024-10-04T00:00:00.000",
"untilInclusive": "2024-11-04T00:00:00.000",
"voucherStatus": { "voucherStatusId": 4, "name": "revoked" },
"product":
{
"productId": 263,
"productName": "Voucher Ooievaarspas-product AOW",
"productDescription": "Voucher voor AOW-ers in Den Haag met een Ooievaarspas, die ingewisseld kan worden voor het product \"Ooievaarspas voor AOW-ers in Den Haag\"",
"amountInclTax": 0,
"requiredProducts":
[
{
"productId": 982,
"productName": "Ooievaarspas voor AOW-ers in Den Haag",
"productDescription": "Vrij reizen bij HTM voor Haagse AOW-gerechtigden met een Ooievaarspas.",
"productCategory":
{
"productCategoryId": 2,
"isTravelProduct": true,
"name": "Afgekocht reisrecht",
},
"amountInclTax": 0
},
],
"_links":
{
"get_voucher_definition_details":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/voucherdefinitions/263",
"method": "GET",
},
},
},
"voucherClaims":
[
{
"mandatoryCustomerDataItem":
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate",
},
"value": "1980-06-31",
}
]
}
"400":
description: Bad request
content:
application/problem+json:
schema:
$ref: "#/components/schemas/rfc9457"
examples:
Illegal state change:
summary: Illegal state change
value:
{
"type": "https://example.com/probs/bad-request",
"title": "Bad request",
"detail": "This state change is not allowed.",
"instance": "/issuedvouchers/d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
}
components:
securitySchemes:
bearerToken:
type: http
scheme: bearer
bearerFormat: JWT
schemas:
supplierTouchpointVoucherDefinitionsListResponse:
type: object
properties:
voucherDefinitions:
type: array
items:
$ref: "#/components/schemas/supplierTouchpointVoucherDefinitionResponse"
supplierTouchpointVoucherDefinitionResponse:
type: object
properties:
productId:
type: integer
example: 263
productName:
type: string
example: "Voucher Ooievaarspas-product AOW"
productDescription:
type: string
example: "Voucher voor AOW-ers in Den Haag met een Ooievaarspas, die ingewisseld kan worden voor het product \"Ooievaarspas voor AOW-ers in Den Haag\""
validityPeriod:
type: object
required:
- validityPeriodId
- fromInclusive
- toInclusive
properties:
validityPeriodId:
type: integer
example: 1
fromInclusive:
type: string
format: date-time-offset
example: "2024-09-03T10:01:34.000+00:00"
toInclusive:
type: string
format: date-time-offset
example: "2024-09-03T23:59:59.999+00:00"
productCategory:
type: object
required:
- productCategoryId
- name
- isTravelProduct
properties:
productCategoryId:
type: integer
example: 1
name:
type: string
example: Kortingsabonnement
isTravelProduct:
type: boolean
example: true
requiredProducts:
type: array
description: |-
Currently, only one requiredProduct for vouchers is supported and thus, this array can contain at most one element.
items:
type: object
required:
- requiredProductId
- productName
properties:
requiredProductId:
type: integer
example: 2
productName:
type: string
example: Product name
mandatoryCustomerDataItems:
type: array
items:
type: object
required:
- mandatoryCustomerDataItemId
- customerDataItem
properties:
mandatoryCustomerDataItemId:
type: integer
example: 8
customerDataItem:
type: string
example: padBirthdate
imageReference:
type: string
description: Can be a URL or a base64 encoded image
example: https://htm.azure.net/abt/products/product_1.svg
termsUrl:
type: string
example: https://www.htm.nl/voorwaarden/vouchers/voucher-xxx-voorwaarden.pdf
sellingPeriods:
type: array
items:
type: object
required:
- sellingPeriodId
- fromInclusive
- toInclusive
- salesTouchpoint
properties:
sellingPeriodId:
type: integer
example: 1
fromInclusive:
type: string
format: date-time-offset
example: "2022-03-01T00:00:00.000+00:00"
toInclusive:
type: string
format: date-time-offset
example: "2022-06-01T00:00:00.000+00:00"
salesTouchpoint:
type: object
required:
- salesTouchpointId
- name
- isActive
- retailer
properties:
salesTouchpointId:
type: integer
example: 1
name:
type: string
example: HTM App
isActive:
type: boolean
example: true
retailer:
type: object
required:
- retailerId
- name
properties:
retailerId:
type: integer
example: 1001
name:
type: string
example: HTM
street:
type: string
example: Kon. Julianaplein
number:
type: string
example: "10"
numberAddition:
type: string
example: a
postalCode:
type: string
example: 2595 AA
city:
type: string
example: Den Haag
country:
type: string
example: Nederland
emailAddress:
type: string
format: email
example: info@htm.nl
phoneNumber:
type: string
example: "09004864636"
taxId:
type: string
example: "09004864636"
imageReference:
type: string
example: https://htm.azure.net/abt/retailers/htm.svg
sellingPrices:
type: array
items:
type: object
required:
- sellingPriceId
- amountInclTax
- fromInclusive
- toInclusive
- internalPrice
properties:
sellingPriceId:
type: integer
example: 1
taxCode:
type: string
example: "V09"
taxPercentage:
type: number
example: 9.0000
amountInclTax:
type: integer
example: 908
fromInclusive:
type: string
format: date-time-offset
example: "2022-03-01T00:00:00.000+00:00"
toInclusive:
type: string
format: date-time-offset
example: "2022-06-01T00:00:00.000+00:00"
internalPrice:
type: number
example: 908.1234
supplierTouchpointCreateIssuedVoucherRequest:
type: object
required:
- fromInclusive
- untilInclusive
- productId
properties:
voucherCode:
type: string
description: The voucher code that is shared with the customer and uniquely identifies this voucher. When not provided, a random voucher code will be generated by the backend system and returned in the response.
example: "HTM-A7J-128-PYT"
fromInclusive:
type: string
format: date-time-offset
description: |-
The date and time the voucher becomes valid for redemption. This has nothing to do with
the allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
example: "2024-10-04T00:00:00.000+02:00"
untilInclusive:
type: string
format: date-time-offset
description: |-
The date and time the voucher becomes invalid for redemption. This has nothing to do with
the maximum allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
example: "2024-11-04T00:00:00.000+01:00"
productId:
type: integer
description: The productId for the voucher definition for which this voucher instance is issued.
example: 263
voucherClaims:
type: array
items:
type: object
required:
- mandatoryCustomerDataItemId
- value
properties:
mandatoryCustomerDataItemId:
type: integer
description: The mandatoryCustomerDataItemId for the mandatoryCustomerDataItem for which this value is provided.
example: 8
value:
type: string
description: The value that the customer must provide for this mandatoryCustomerDataItem to be able to redeem the voucher.
example: "1970-01-01"
supplierTouchpointUpdateIssuedVoucherRequest:
type: object
required:
- voucherStatusId
properties:
voucherStatusId:
type: integer
description: The new status of the voucher.
example: 4
supplierTouchpointIssuedVouchersListResponse:
type: object
properties:
issuedVouchers:
type: array
items:
$ref: "#/components/schemas/supplierTouchpointIssuedVoucherResponse"
supplierTouchpointIssuedVoucherResponse:
type: object
required:
- issuedVoucherId
- voucherCode
- fromInclusive
- untilInclusive
- voucherStatus
- product
- mandatoryCustomerDataItems
properties:
issuedVoucherId:
type: string
description: The unique (technical) identifier of the issued voucher instance.
example: "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90"
voucherCode:
type: string
description: The voucher code that is shared with the customer and uniquely identifies this voucher.
example: "HTM-A7J-128-PYT"
fromInclusive:
type: string
format: date-time-offset
description: |-
The date and time the voucher becomes valid for redemption. This has nothing to do with
the allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
example: "2024-10-04T00:00:00.000+02:00"
untilInclusive:
type: string
format: date-time-offset
description: |-
The date and time the voucher becomes invalid for redemption. This has nothing to do with
the maximum allowed start date of a requiredProduct (for this, the existing order flow logic is applied).
example: "2024-11-04T00:00:00.000+01:00"
voucherStatus:
type: object
required:
- voucherStatusId
- name
description: |-
The current status of the voucher. Can be any of the following:
- 1 = new
- 2 = issued
- 3 = redeemed
- 4 = revoked
- 5 = expired
- 6 = pendingRedemption
properties:
voucherStatusId:
type: integer
example: 2
name:
type: string
example: "issued"
product:
type: object
description: The "product" referencing the voucher definition that this voucher instance is based on
required:
- productId
- productName
- productDescription
- amountInclTax
properties:
productId:
type: integer
example: 263
productName:
type: string
example: Voucher Ooievaarspas-product AOW
productDescription:
type: string
example: |-
Voucher voor AOW-ers in Den Haag met een Ooievaarspas, die ingewisseld kan worden
voor het product "Ooievaarspas voor AOW-ers in Den Haag".
amountInclTax:
type: integer
description: |-
When combined with a requiredProduct, the (positive or zero) amountInclTax dictates
the (modified) total amount that needs to be paid for said product. When the requiredProduct
has a sellingPrice > 0, the difference between sellingPrice and voucher amountInclTax
represents the granted discount.
When not combined with a required product, the (negative) amountInclTax dictates
the value of the voucher, that is subtracted from the total order value as a discount
(with a minimum order total of 0).
example: 0
requiredProducts:
type: array
description: |-
Currently, only one requiredProduct is supported and thus, this array can contain at
most one element.
items:
type: object
required:
- productId
properties:
productId:
type: integer
example: 892
productName:
type: string
example: "Ooievaarspas voor AOW-ers in Den Haag"
productDescription:
type: string
example: "Vrij reizen bij HTM voor Haagse AOW-gerechtigden met een Ooievaarspas."
productCategory:
type: object
required:
- productCategoryId
- isTravelProduct
- name
properties:
productCategoryId:
type: integer
example: 2
isTravelProduct:
type: boolean
example: true
name:
type: string
example: "Afgekocht reisrecht"
amountInclTax:
type: integer
description: |-
Selling price of the product in cents (including tax, if applicable) that is
currently active for the calling touchpoint. When 0, the product is free of charge.
example: 0
imageReference:
type: string
description: Can be a URL or a base64 encoded image
example: https://www.htm.nl/nog-onbekende-productafbeelding
_links:
type: object
properties:
get_voucher_definition_details:
type: object
description: Link to get more details for the voucher definition that this voucher is instanced from
properties:
href:
type: string
example: https://api.integratielaag.nl/abt/touchpoint/1.0/voucherdefinitions/263
method:
type: string
example: GET
voucherClaims:
type: array
description: |-
List of pairs, each containing a mandatoryCustomerDataItem and the value that the customer must provide for this mandatoryCustomerDataItem to be able to redeem the voucher.
The values to be checked against are provided by the voucher issuer/supplier.
items:
type: object
required:
- mandatoryCustomerDataItem
- value
properties:
mandatoryCustomerDataItem:
type: object
required:
- mandatoryCustomerDataItemId
- customerDataItem
properties:
mandatoryCustomerDataItemId:
type: integer
example: 8
customerDataItem:
type: string
example: padBirthdate
value:
type: string
example: 1970-01-01
unavailable:
type: object
rfc9457:
type: object
properties:
type:
type: string
format: url
example: https://example.com/probs/out-of-credit
title:
type: string
example: You do not have enough credit.
detail:
type: string
example: Your current balance is 30, but that costs 50.
instance:
type: string
example: /account/12345/msgs/abc
balance:
type: string
example: 30
accounts:
type: array
items:
type: string
example:
- /account/12345
- /account/67890