manage-consumer-redemption-links; reading them needs view-consumer-redemption-links. Both can be granted to API keys.
Link modes
The mode is decided when you create the link and never changes:
Sending an entity together with
requireEmailOtp: true answers 422 link-mode-conflict. An email-otp link needs the Email OTP Gate to be set up first, else 422 email-otp-not-configured; see Email OTP links.
Create a link with POST /consumer/v1/redemption-links:
token, url, mode, status and counters. To create many links at once, for example one entity-bound link per employee, use POST /consumer/v1/redemption-links:batch with up to 100 items: it is all-or-nothing and returns a summary per link (id, token, url, name, mode, redemptionEntity, status).
Before your first link, set the privacy and imprint URLs of your landing page in Workspace Branding; otherwise creating a link answers 422 landing-legal-urls-missing. See Landing pages and custom domains.
Restricting providers and voucher sets
allowedProviderIds(up to 50) limits the link to these providers. Each must have at least one visible, switched-on set in your catalog.allowedVoucherSetIds(up to 200) limits the link to these sets. Each must be visible with both Catalog Toggles on; if you also sendallowedProviderIds, each set’s provider must be among them.- Empty lists mean “everything in my catalog that is switched on”.
data-failed-validation with the constraint provider-not-in-catalog, voucher-set-not-in-catalog or voucher-set-provider-not-allowed for the offending list item.
The restriction is checked again whenever the customer opens the link. The landing catalog shows a set only when it is active or deactivation-scheduled, both toggles are on, it is not depleted and you have a redeemable Price Acceptance for it. Sets you have not accepted prices for are silently left out, because customers never see prices. Check what a link offers right now with GET /consumer/v1/redemption-links/{redemptionLinkId}/catalog: it returns the entries in landing order (at most 200) and lists in hiddenForPriceAcceptance the sets that are missing only because of prices.
Creating a link is never blocked by missing Price Acceptances; the link offers those sets as soon as you accept their prices.
Limits and expiry
maxRedemptions(1 or more,null= unlimited) caps redemptions as described per mode above. When ananonymousorentity-boundlink reaches it, the link becomesexhaustedand further redemptions answer 409redemption-link-exhausted. On anemail-otplink, a visitor who reached their own cap gets 409redemption-link-entity-limit-reachedwhile the link staysactive.maxTotalRedemptions(only foremail-otplinks) caps the whole link; reaching it makes the linkexhausted. Sending it for another mode answers 400data-failed-validationwith the constraintnot-allowed-for-mode. Set it for publicemail-otplinks: without it, anyone with an email address can redeem.expiresAt(in the future) ends the link. From that moment it isexpired, also before the status is persisted, and the landing page answers 410redemption-link-expired.- Per-set entity limits (
entityLimitin your catalog settings) apply on top whenever the link knows the entity.
PATCH: name, the allowed lists, maxRedemptions, maxTotalRedemptions, metadata, expiresAt, customDomainId and defaultLocale. The mode, entity, requireEmailOtp and token are fixed. Raising the cap of an exhausted link or moving expiresAt of an expired link into the future makes it active again; lowering a cap below the current redemptionCount answers 422 max-below-count; a cap equal to the count makes the link exhausted.
POST …/{redemptionLinkId}:revoke ends a link immediately and for good: the landing page answers 410 redemption-link-revoked, and open visitor sessions stop working. Erasing an entity revokes all of its entity-bound links.
You receive the webhooks redemption-link-exhausted and redemption-link-expired.
Metadata forwarding
metadata on the link is your own JSON object (up to 16 KiB). Every redemption made through the link takes a snapshot of it, and the redemption-created webhook carries it as redemptionLink.metadata, together with redemptionEntity.refId for entity-bound and email-otp links:
payload; see the event page for the full payload. Changing a link’s metadata affects future redemptions only. Never put personal data in link metadata.
Sharing the link
The link’surl is https://<host>/r/<token>. The host is the link’s customDomainId when that domain is active, else your default landing domain, else redeem.voucher.allride.io. See Custom domains.
The 22-character token is a bearer capability: anyone who has the URL can use the link within its limits. Send it only to the intended customer, over a channel you trust, and do not post entity-bound links publicly. If a link leaks, revoke it and create a new one.
What the customer sees
- The customer opens the URL and sees a landing page with your logo, colours and texts, your terms, privacy and imprint links, and the link’s
defaultLocale(German or English). - For an
email-otplink, they enter their email address, receive a 6-digit code from your SMTP server and enter it. See Email OTP links. - They browse the offered providers and voucher sets and pick one.
- If you turned on bot protection in Workspace Branding (
landing.botProtection: turnstile), the page runs a Cloudflare Turnstile check before each redemption and each code request; with the defaultoff, no check is shown. - They receive the code or link, with the provider’s redemption instructions and validity.
anonymous and entity-bound links the visitor’s session lasts as long as the link is valid: no “session ended” message while the link can be used. Revoking the link, its expiry or blocking the entity still ends access at once. On email-otp links the session lasts as long as you set in Email OTP links. An exhausted link still shows the vouchers issued earlier; an expired or revoked link shows a branded “link unavailable” page with your support contacts.