curl --request PATCH \
--url https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"maxRedemptions": 2,
"expiresAt": "2026-12-31T22:59:59Z"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({maxRedemptions: 2, expiresAt: '2026-12-31T22:59:59Z'})
};
fetch('https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}"
payload = {
"maxRedemptions": 2,
"expiresAt": "2026-12-31T22:59:59Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)HttpResponse<String> response = Unirest.patch("https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"maxRedemptions\": 2,\n \"expiresAt\": \"2026-12-31T22:59:59Z\"\n}")
.asString();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}"
payload := strings.NewReader("{\n \"maxRedemptions\": 2,\n \"expiresAt\": \"2026-12-31T22:59:59Z\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'maxRedemptions' => 2,
'expiresAt' => '2026-12-31T22:59:59Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"data": {
"id": 8017,
"resource": "redemption-link",
"token": "ExampleLinkToken000001",
"url": "https://vouchers.example-transit.example.com/r/ExampleLinkToken000001",
"name": "Jobticket November - employee 42",
"mode": "entity-bound",
"redemptionEntity": {
"id": 9030,
"resource": "redemption-entity",
"refId": "emp-42",
"_links": {
"self": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-entities/9030",
"type": "application/json"
}
}
},
"requireEmailOtp": false,
"allowedProviderIds": [
1030,
1056
],
"allowedVoucherSetIds": [],
"maxRedemptions": 2,
"maxTotalRedemptions": null,
"redemptionCount": 0,
"metadata": {
"campaign": "jobticket-nov"
},
"expiresAt": "2026-12-31T22:59:59Z",
"customDomainId": 20030,
"defaultLocale": "de",
"status": "active",
"lastRedeemedAt": null,
"revokedAt": null,
"createdBy": {
"type": "partner-user",
"id": 4069,
"label": "ops@example.com"
},
"createdAt": "2026-10-22T09:00:00Z",
"updatedAt": "2026-10-24T08:00:00Z",
"_links": {
"self": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-links/8017",
"type": "application/json"
},
"catalog": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-links/8017/catalog",
"type": "application/json"
},
"redemptionEntity": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-entities/9030",
"type": "application/json"
}
}
}
}Update a redemption link
Changes a link (JSON Merge Patch). Raising the cap of an exhausted link, or moving expiresAt of an expired link into the future, makes it active again (this needs the landing legal URLs). Setting the cap equal to redemptionCount exhausts an active link and sends redemption-link-exhausted. Revoked links cannot change. See Redemption links.
Required permissions: manage-consumer-redemption-links · API keys: allowed
curl --request PATCH \
--url https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"maxRedemptions": 2,
"expiresAt": "2026-12-31T22:59:59Z"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({maxRedemptions: 2, expiresAt: '2026-12-31T22:59:59Z'})
};
fetch('https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}"
payload = {
"maxRedemptions": 2,
"expiresAt": "2026-12-31T22:59:59Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)HttpResponse<String> response = Unirest.patch("https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"maxRedemptions\": 2,\n \"expiresAt\": \"2026-12-31T22:59:59Z\"\n}")
.asString();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}"
payload := strings.NewReader("{\n \"maxRedemptions\": 2,\n \"expiresAt\": \"2026-12-31T22:59:59Z\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voucher-staging.allride.io/consumer/v1/redemption-links/{redemptionLinkId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'maxRedemptions' => 2,
'expiresAt' => '2026-12-31T22:59:59Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"data": {
"id": 8017,
"resource": "redemption-link",
"token": "ExampleLinkToken000001",
"url": "https://vouchers.example-transit.example.com/r/ExampleLinkToken000001",
"name": "Jobticket November - employee 42",
"mode": "entity-bound",
"redemptionEntity": {
"id": 9030,
"resource": "redemption-entity",
"refId": "emp-42",
"_links": {
"self": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-entities/9030",
"type": "application/json"
}
}
},
"requireEmailOtp": false,
"allowedProviderIds": [
1030,
1056
],
"allowedVoucherSetIds": [],
"maxRedemptions": 2,
"maxTotalRedemptions": null,
"redemptionCount": 0,
"metadata": {
"campaign": "jobticket-nov"
},
"expiresAt": "2026-12-31T22:59:59Z",
"customDomainId": 20030,
"defaultLocale": "de",
"status": "active",
"lastRedeemedAt": null,
"revokedAt": null,
"createdBy": {
"type": "partner-user",
"id": 4069,
"label": "ops@example.com"
},
"createdAt": "2026-10-22T09:00:00Z",
"updatedAt": "2026-10-24T08:00:00Z",
"_links": {
"self": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-links/8017",
"type": "application/json"
},
"catalog": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-links/8017/catalog",
"type": "application/json"
},
"redemptionEntity": {
"href": "https://api.voucher.allride.io/consumer/v1/redemption-entities/9030",
"type": "application/json"
}
}
}
}Authorizations
Your API key in Authorization: Bearer <key>. Use vk_test_… keys against the sandbox and vk_live_… keys against production.
Path Parameters
Id of the Redemption Link. Unsigned 64-bit integer (ids and large counters). May exceed 2^53; parse with a BigInt-safe JSON parser in JavaScript.
0 <= x <= 18446744073709552000Body
JSON Merge Patch. mode, redemptionEntityId, requireEmailOtp and token are immutable.
1-120 characters; null clears.
120Allowed providers (added ids are checked against the catalog).
50Unsigned 64-bit integer (ids and large counters). May exceed 2^53; parse with a BigInt-safe JSON parser in JavaScript.
0 <= x <= 18446744073709552000Allowed voucher sets (added ids are checked against the catalog).
200Unsigned 64-bit integer (ids and large counters). May exceed 2^53; parse with a BigInt-safe JSON parser in JavaScript.
0 <= x <= 18446744073709552000At least redemptionCount for non-OTP links; equal to it exhausts the link.
1 <= x <= 18446744073709552000email-otp links only; at least redemptionCount.
1 <= x <= 18446744073709552000Applies to future redemptions only.
{ "orderId": "8812", "channel": "app" }
Future time, or null.
"2026-11-01T00:00:00Z"
One of your active custom domains.
0 <= x <= 18446744073709552000de or en.
de, en Response
OK
Single-object envelope around a RedemptionLink.
A shareable link to an AllRide-hosted landing page where an end customer redeems.
Show child attributes
Show child attributes