Vouchers
Introduction
The Vouchers API allows you to create and manage discount vouchers for your products on the Kaufland marketplace. Vouchers give buyers a monetary or percentage discount on selected items, helping you increase visibility and drive sales.
Each voucher is tied to a specific storefront and a set of your product listings. You control the discount type, amount, validity period, and the number of times the voucher can be used.
Prerequisites
Before you can create vouchers, you must accept the Voucher Terms and Conditions for each storefront you want to use. You can check your current acceptance status, storefront eligibility and voucher pricing via the Seller Portal
Voucher Lifecycle
Every voucher has a status field that reflects its current point in the lifecycle. Some transitions are triggered by seller actions, others happen automatically based on time or redemption activity. Knowing the current status is important because most write operations are only permitted in specific states.
Statuses
| Status | Meaning |
|---|---|
new |
The voucher has been created but its begin_at date has not yet been reached. It is not visible to buyers yet. From this state the seller can still delete or deactivate the voucher. |
active |
The current date is within the voucher's validity period (begin_at ≤ today ≤ end_at) and the voucher is visible to buyers. The seller can deactivate an active voucher, but it can no longer be deleted. |
inactive |
The seller has manually deactivated the voucher via PATCH /vouchers with status: "inactive". The voucher is no longer offered to buyers. This transition is permanent — an inactive voucher cannot be reactivated. |
expired |
The voucher's end_at date has passed. The voucher is no longer offered to buyers. This is a terminal state. |
consumed |
The voucher's usage_limit has been reached — every available redemption has been used. The voucher is no longer offered to buyers. This is a terminal state. |
deleted |
The seller has removed the voucher via DELETE /vouchers. Only vouchers in new status can be deleted. This is a terminal state. |
expired, consumed, and deleted are terminal states — no further transitions occur from them. The only seller-driven transitions are deactivation (from new or active) and deletion (from new only); every other transition is performed by the system.
Performance Metrics
The voucher and voucher-product responses include two performance metrics that are referenced throughout this page. They are also available as sort fields on the list endpoints.
acos— Advertising Cost of Sales, expressed as a percentage. Computed as(voucher_fee / total_sales) * 100. Lower values indicate a more cost-efficient voucher.roas— Return on Ad Spend, expressed as a ratio. Computed astotal_sales / voucher_fee. Higher values indicate a higher return per unit of voucher cost.
Both metrics are 0 when no sales have been generated through the voucher. On GET /vouchers/{id_voucher}/products the same formulas are applied per product (using that product's voucher fee and total sales).
Endpoint Reference
The following endpoints allow sellers to retrieve and manage vouchers.
Create Voucher
To create a new voucher, send a POST request to /vouchers. You must specify the discount type and amount, the validity period, the storefront, and either a list of product IDs or EANs the voucher applies to.
The discount_type can be PERCENTAGE or ABSOLUTE. For absolute discounts, provide the value in cents (e.g. 100 = 1 euro). The usage_limit defines the maximum number of redemptions across all participating products.
products IDs or eans. There is no way to scope a voucher to a single unit.
Request fields
| Field | Required | Allowed values / format | Notes |
|---|---|---|---|
title |
Yes | Non-empty string | Display name of the voucher. |
storefront |
Yes | Any currently-supported storefront code (see Storefronts and Locales). | Exactly one storefront per voucher. |
discount_type |
Yes | PERCENTAGE, ABSOLUTE |
|
discount_amount |
Yes | Integer ≥ 1 | For PERCENTAGE, max 85. For ABSOLUTE, value is in cents (e.g. 100 = 1 €). |
begin_at |
Yes | YYYY-MM-DD |
Must be today or later (cannot be in the past). |
end_at |
Yes | YYYY-MM-DD |
Must be today or later, and on or after begin_at. The same date can be used for begin_at and end_at to create a voucher that is active for today only. |
usage_limit |
Yes | Integer ≥ 1 | Maximum total redemptions across all participating products. |
products |
At least one of products or eans |
Array of product IDs (positive integers) | Can be combined with eans; the voucher applies to the union of items resolved from both lists. |
eans |
At least one of products or eans |
Array of EAN strings | Can be combined with products. EANs that cannot be resolved to a product return 422. |
export_to_third_parties |
No | true or false (default false) |
Share the voucher with third-party price-comparison portals. |
Example Request
{
"title": "Christmas Sale",
"storefront": "de",
"discount_type": "PERCENTAGE",
"discount_amount": 10,
"begin_at": "2025-12-16",
"end_at": "2025-12-20",
"usage_limit": 100,
"products": [306215652, 533036228],
"eans": ["4006381333931"],
"export_to_third_parties": false
}
Example Response
{
"data": {
// server-assigned unique voucher ID; use it to address the voucher in subsequent /vouchers/{id_voucher}* calls
"id_voucher": 4,
"title": "Christmas Sale",
// lifecycle state: new | active | inactive | expired | consumed | deleted
"status": "new",
"storefront": "de",
// PERCENTAGE or ABSOLUTE
"discount_type": "PERCENTAGE",
// for PERCENTAGE: integer 1–85 (percent off). For ABSOLUTE: amount in cents
"discount_amount": 10,
"begin_at": "2025-12-16",
"end_at": "2025-12-20",
// server-set creation timestamp (YYYY-MM-DD)
"created_at": "2025-12-16",
"usage_limit": 100,
// whether the voucher is shared with third-party price-comparison portals (e.g. idealo, Google Shopping)
"export_to_third_parties": false
}
}
POST /vouchers — Possible Errors
| HTTP Status | Problem Type | Cause | Resolution |
|---|---|---|---|
| 400 Bad Request | /problems/validation-error |
One or more request fields failed validation. Possible reasons: title or storefront is empty; begin_at or end_at is not a valid YYYY-MM-DD date; begin_at or end_at is in the past; end_at is before begin_at; usage_limit is below 1; discount_amount is below 1; discount_type is PERCENTAGE and discount_amount exceeds 85; neither products nor eans is provided. |
Check the errors array in the response body — each entry contains the invalid field and a descriptive message. |
| 400 Bad Request | /problems/bad-request |
The server rejected the request due to a validation rule not enforced client-side (e.g. items list empty after processing). | Check the errors array for field-level details returned from the backend. |
| 401 Unauthorized | /problems/unauthorized |
Authentication headers are missing or the request signature is invalid. | Ensure the request is correctly signed. Refer to the authentication documentation. |
| 422 Unprocessable Content | /problems/bad-request |
One or more values in the eans list could not be resolved to a product. |
Check the message field for the specific EANs that failed to resolve, and verify they are valid and belong to your account. |
| 422 Unprocessable Content | /problems/action-not-allowed |
The Voucher Terms and Conditions have not been accepted for the specified storefront. |
Accept the Voucher Terms and Conditions for the storefront in the Seller Portal before creating vouchers. |
| 503 Service Unavailable | /problems/service-unavailable |
A downstream service is temporarily unavailable or timed out. | Retry the request after a brief delay. Contact support if the issue persists. |
| 500 Internal Server Error | /problems/server-error |
An unexpected error occurred on the server side. | Contact support if the issue persists. |
Get Vouchers List
Use GET /vouchers to retrieve a paginated list of your vouchers. All query parameters are optional.
You can filter by one or more storefronts by passing storefront multiple times (e.g. ?storefront=de&storefront=cz). When omitted, vouchers across all storefronts are returned. Results can also be filtered by one or more status values (new, active, inactive, expired, consumed, deleted) — pass status multiple times to filter by several statuses (e.g. ?status=active&status=new). When omitted, vouchers of all statuses are returned. You can also filter by campaign name or ID using search_term, and sort results with sort=field:direction (e.g. ?sort=redemptions:desc).
To find vouchers that apply to a specific product, use id_product — pass the parameter multiple times to filter by several products (e.g. ?id_product=123&id_product=456). Alternatively, use ean to filter by EAN (e.g. ?ean=4006381333931&ean=4006381333948). Both parameters can be combined. When neither is provided, vouchers for all products are returned.
Use offset (number of vouchers to skip, default 0) and limit (1–100, default 30) to paginate through results.
Query parameters
| Parameter | Required | Allowed values / format | Notes |
|---|---|---|---|
storefront |
No | Any currently-supported storefront code (see Storefronts and Locales). | Repeatable. When omitted, all storefronts are included. |
status |
No | new, active, inactive, expired, consumed, deleted |
Repeatable. When omitted, all statuses are included. |
search_term |
No | String, ≤ 255 characters | Filters by campaign name or voucher ID. |
id_product |
No | Positive integer | Repeatable. Can be combined with ean — vouchers matching any of the listed products or EANs are returned. |
ean |
No | Non-empty string | Repeatable. Can be combined with id_product. |
offset |
No | Integer ≥ 0 (default 0) |
Must be a multiple of limit. |
limit |
No | Integer 1–100 (default 30) |
|
sort |
No | field:direction, where field is one of products, redemptions, beginAt, createdAt, totalSales, roas, acos, and direction is asc or desc. |
Example: ?sort=redemptions:desc. products sorts by the number of products attached to the voucher. See Performance Metrics for roas and acos. |
Example Response
{
"data": [
{
"id_voucher": 4,
"title": "Christmas Sale",
// lifecycle state: new | active | inactive | expired | consumed | deleted
"status": "new",
"storefront": "de",
// PERCENTAGE or ABSOLUTE
"discount_type": "PERCENTAGE",
// for PERCENTAGE: integer 1–85. For ABSOLUTE: amount in cents
"discount_amount": 10,
"begin_at": "2025-12-16",
"end_at": "2025-12-20",
// server-set creation timestamp (YYYY-MM-DD)
"created_at": "2025-12-16",
"usage_limit": 100,
"export_to_third_parties": false,
// total redemptions across every product attached to this voucher
"number_of_redeemed_vouchers": 0,
// total fee paid by the seller for this voucher (in cents)
"voucher_fee": 0,
// total revenue generated through this voucher (in cents)
"total_sales": 0,
// see Performance Metrics
"acos": 0,
// see Performance Metrics
"roas": 0,
// number of products currently attached to the voucher
"products_count": 2
}
],
// pagination cursor; total is the count of vouchers matching the filters, not the page size
"pagination": {
"offset": 0,
"limit": 30,
"total": 200
}
}
GET /vouchers — Possible Errors
| HTTP Status | Problem Type | Cause | Resolution |
|---|---|---|---|
| 400 Bad Request | /problems/validation-error |
One or more query parameters failed validation. Possible reasons: offset is below 0; limit is outside 1–100; offset is not a multiple of limit; sort is not in the form field:direction or its field/direction is unrecognised; status contains an unrecognised value. |
Check the errors array in the response body for the specific invalid field and constraint. |
| 401 Unauthorized | /problems/unauthorized |
Authentication headers are missing or the request signature is invalid. | Ensure the request is correctly signed. Refer to the authentication documentation. |
| 422 Unprocessable Content | /problems/bad-request |
One or more values in the ean list could not be resolved to a product. |
Check the message field for the specific EANs that failed to resolve, and verify they are valid and belong to your account. |
| 503 Service Unavailable | /problems/service-unavailable |
A downstream service is temporarily unavailable or timed out. When ean parameters are provided, this may also indicate that the EAN resolution service is temporarily unavailable. |
Retry the request after a brief delay. Contact support if the issue persists. |
| 500 Internal Server Error | /problems/server-error |
An unexpected error occurred on the server side. | Contact support if the issue persists. |
Get Voucher
To retrieve the full details and performance statistics of a specific voucher, use GET /vouchers/{id_voucher}. This endpoint returns voucher metadata only. To retrieve the associated products, use GET /vouchers/{id_voucher}/products.
Example Response
{
"data": {
"id_voucher": 4,
"title": "Christmas Sale",
// lifecycle state: new | active | inactive | expired | consumed | deleted
"status": "new",
"storefront": "de",
// PERCENTAGE or ABSOLUTE
"discount_type": "PERCENTAGE",
// for PERCENTAGE: integer 1–85. For ABSOLUTE: amount in cents
"discount_amount": 10,
"begin_at": "2025-12-16",
"end_at": "2025-12-20",
// server-set creation timestamp (YYYY-MM-DD)
"created_at": "2025-12-16",
"usage_limit": 100,
// total redemptions across every product attached to this voucher
"number_of_redeemed_vouchers": 42,
// total fee paid by the seller for this voucher (in cents)
"voucher_fee": 5,
// total revenue generated through this voucher (in cents)
"total_sales": 1500,
// see Performance Metrics
"acos": 1.25,
// see Performance Metrics
"roas": 3.75,
"export_to_third_parties": false
}
}
GET /vouchers/{id_voucher} — Possible Errors
| HTTP Status | Problem Type | Cause | Resolution |
|---|---|---|---|
| 401 Unauthorized | /problems/unauthorized |
Authentication headers are missing or the request signature is invalid. | Ensure the request is correctly signed. Refer to the authentication documentation. |
| 404 Not Found | /problems/not-found |
No voucher with the given id_voucher was found, or it does not belong to your seller account. |
Check that the voucher ID is correct and belongs to your account. |
| 503 Service Unavailable | /problems/service-unavailable |
A downstream service is temporarily unavailable or timed out. | Retry the request after a brief delay. Contact support if the issue persists. |
| 500 Internal Server Error | /problems/server-error |
An unexpected error occurred on the server side. | Contact support if the issue persists. |
Get Voucher Products
To retrieve the paginated list of products associated with a specific voucher, use GET /vouchers/{id_voucher}/products. Use offset and limit to page through results. limit must be between 1 and 100 (default: 30). Results can be filtered by one or more product IDs using id_product — pass the parameter multiple times to filter by several products (e.g. ?id_product=111&id_product=222). Results can be sorted with sort=field:direction (e.g. ?sort=redemptions:desc). Allowed fields: redemptions, acos, roas. Allowed directions: asc, desc.
Each entry in the response carries the acos and roas metrics, computed per product. See Performance Metrics for the definitions and formulas.
Query parameters
| Parameter | Required | Allowed values / format | Notes |
|---|---|---|---|
id_product |
No | Positive integer | Repeatable. When omitted, all products in the voucher are returned. |
offset |
No | Integer ≥ 0 (default 0) |
Must be a multiple of limit. |
limit |
No | Integer 1–100 (default 30) |
|
sort |
No | field:direction, where field is one of redemptions, acos, roas, and direction is asc or desc. |
Example: ?sort=redemptions:desc. See Performance Metrics for acos and roas. |
Example Response
{
"data": [
// each entry: id_product (item ID), acos (see Performance Metrics),
// roas (see Performance Metrics), number_of_redeemed_vouchers (redemptions on this product only)
{ "id_product": 306215652, "acos": 0.8, "roas": 4.1, "number_of_redeemed_vouchers": 12 },
{ "id_product": 533036228, "acos": 0, "roas": 0, "number_of_redeemed_vouchers": 0 }
],
// pagination cursor; total is the count of products attached to the voucher matching the filters
"pagination": {
"offset": 0,
"limit": 30,
"total": 2
}
}
GET /vouchers/{id_voucher}/products — Possible Errors
| HTTP Status | Problem Type | Cause | Resolution |
|---|---|---|---|
| 400 Bad Request | /problems/validation-error |
One or more query parameters failed validation. Possible reasons: offset is below 0; limit is outside 1–100; offset is not a multiple of limit; sort is not in the form field:direction or its field/direction is unrecognised; id_product contains a non-positive integer. |
Check the errors array for the specific invalid field and its constraint. |
| 401 Unauthorized | /problems/unauthorized |
Authentication headers are missing or the request signature is invalid. | Ensure the request is correctly signed. Refer to the authentication documentation. |
| 404 Not Found | /problems/not-found |
No voucher with the given id_voucher was found, or it does not belong to your seller account. |
Check that the voucher ID is correct and belongs to your account. |
| 503 Service Unavailable | /problems/service-unavailable |
A downstream service is temporarily unavailable or timed out. | Retry the request after a brief delay. Contact support if the issue persists. |
| 500 Internal Server Error | /problems/server-error |
An unexpected error occurred on the server side. | Contact support if the issue persists. |
Deactivate Voucher
To deactivate a list of vouchers and make them no longer visible to customers, send a PATCH request to /vouchers with a JSON body containing the voucher IDs and "status": "inactive". The voucher's status will be updated to inactive, and the updated vouchers will be returned in the response.
new or active can be deactivated. Vouchers in any other status (inactive, expired, consumed, deleted) are rejected with 422. The transition is permanent: once a voucher is inactive it cannot be reactivated, and all subsequent legal transitions (expired) are driven by the system, not by the seller.
Request fields
| Field | Required | Allowed values / format | Notes |
|---|---|---|---|
ids |
Yes | Array of 1–100 positive integer voucher IDs | All listed vouchers are updated atomically; if any ID does not belong to your account the request fails with 404. |
status |
Yes | inactive |
Target lifecycle status. Currently only inactive is supported (i.e. deactivation). |
Example Request
{
"ids": [4],
"status": "inactive"
}
Example Response
{
"data": [
{
"id_voucher": 4,
"title": "Christmas Sale",
// updated to `inactive` after a successful deactivation
"status": "inactive",
"storefront": "de",
// PERCENTAGE or ABSOLUTE
"discount_type": "PERCENTAGE",
// for PERCENTAGE: integer 1–85. For ABSOLUTE: amount in cents
"discount_amount": 10,
"begin_at": "2025-12-16",
"end_at": "2025-12-20",
// server-set creation timestamp (YYYY-MM-DD)
"created_at": "2025-12-16",
"usage_limit": 100,
"export_to_third_parties": false,
// total redemptions across every product attached to this voucher
"number_of_redeemed_vouchers": 0,
// total fee paid by the seller for this voucher (in cents)
"voucher_fee": 0,
// total revenue generated through this voucher (in cents)
"total_sales": 0,
// see Performance Metrics
"acos": 0,
// see Performance Metrics
"roas": 0,
// number of products currently attached to the voucher
"products_count": 2
}
]
}
PATCH /vouchers — Possible Errors
| HTTP Status | Problem Type | Cause | Resolution |
|---|---|---|---|
| 400 Bad Request | /problems/validation-error |
The request body failed validation. Possible reasons: ids is missing, empty, or contains more than 100 entries; status is missing or is not inactive. |
Provide between 1 and 100 voucher IDs in the ids array, and set status to inactive. |
| 401 Unauthorized | /problems/unauthorized |
Authentication headers are missing or the request signature is invalid. | Ensure the request is correctly signed. Refer to the authentication documentation. |
| 404 Not Found | /problems/not-found |
The provided voucher ID was not found, or does not belong to your seller account. | Check that the voucher ID is correct and belongs to your account. |
| 422 Unprocessable Content | /problems/action-not-allowed |
The voucher's current status does not permit deactivation. Only new and active vouchers can be deactivated. |
Verify the voucher's current status before retrying. |
| 503 Service Unavailable | /problems/service-unavailable |
A downstream service is temporarily unavailable or timed out. | Retry the request after a brief delay. Contact support if the issue persists. |
| 500 Internal Server Error | /problems/server-error |
An unexpected error occurred on the server side. | Contact support if the issue persists. |
Delete Vouchers
To permanently remove one or more vouchers, send a DELETE request to /vouchers with the voucher IDs passed as repeated id query parameters (e.g. ?id=1&id=2&id=3). A successful deletion returns HTTP 204 with no response body.
new can be deleted. A voucher transitions to active automatically once its begin_at time is reached. To disable an active voucher, use the deactivate vouchers endpoint instead.
Query parameters
| Parameter | Required | Allowed values / format | Notes |
|---|---|---|---|
id |
Yes | Positive integer voucher ID | Repeatable. Provide between 1 and 100 IDs in total. Every listed voucher must currently be in new status; otherwise the request fails with 404. |
Example Request
DELETE /vouchers?id=1&id=2&id=3
Example Response
HTTP 204 No Content
DELETE /vouchers — Possible Errors
| HTTP Status | Problem Type | Cause | Resolution |
|---|---|---|---|
| 400 Bad Request | /problems/validation-error |
The id query parameter is missing, contains a non-positive value, or more than 100 IDs were provided. |
Provide between 1 and 100 voucher IDs as repeated id query parameters. |
| 401 Unauthorized | /problems/unauthorized |
Authentication headers are missing or the request signature is invalid. | Ensure the request is correctly signed. Refer to the authentication documentation. |
| 404 Not Found | /problems/not-found |
One or more of the provided voucher IDs were not found, or do not belong to your seller account. | Check that all voucher IDs are correct and belong to your account. |
| 422 Unprocessable Content | /problems/action-not-allowed |
The voucher's current status does not permit deletion. Only new vouchers can be deleted; once activated, a voucher can no longer be removed. |
Verify the voucher's current status before retrying. |
| 503 Service Unavailable | /problems/service-unavailable |
A downstream service is temporarily unavailable or timed out. | Retry the request after a brief delay. Contact support if the issue persists. |
| 500 Internal Server Error | /problems/server-error |
An unexpected error occurred on the server side. | Contact support if the issue persists. |
Full endpoint documentation including all parameters and error codes is available under Vouchers.