Set the reward
const url = 'https://api.keliplay.com/v1/game-instances/example/reward';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"tiers":[{"id":"0192f3a1-0000-7000-8000-000000071001","match":{"when":"won"},"display":{"title":"Free coffee","description":"One regular coffee at any store."},"codeStrategy":"pool"},{"match":{"when":"everyone"},"display":{"title":"10% off"},"codeStrategy":"shared"}],"grantOncePerParticipant":true,"validForSeconds":2592000}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://api.keliplay.com/v1/game-instances/example/reward \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "tiers": [ { "id": "0192f3a1-0000-7000-8000-000000071001", "match": { "when": "won" }, "display": { "title": "Free coffee", "description": "One regular coffee at any store." }, "codeStrategy": "pool" }, { "match": { "when": "everyone" }, "display": { "title": "10% off" }, "codeStrategy": "shared" } ], "grantOncePerParticipant": true, "validForSeconds": 2592000 }'Replaces the campaign’s prizes, in priority order. A player receives the
first prize whose match they meet.
To keep a prize and its codes, send it back with its id. A prize left
out is removed, which is refused (409) while it still holds codes. A
prize’s codeStrategy cannot change once it has given out coupons
(409). Send null as the whole body to remove the reward.
A prize that could never be given out is refused (400): a won match
on any game but Spin the Wheel, or an outcome match naming a segment
the wheel does not have.
Animations on the reward page must come from your media library.
Permission: rewards.write. Plan feature: Rewards.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The campaign’s id.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Prizes in priority order. A player gets the first one they match.
object
An existing prize’s id, to keep it and its codes. Leave out for a new prize.
How the prize is described to the player.
object
Where the prize’s codes come from.
pool: codes you upload or generate, each given out up to its issue limit.shared: one code given to everyone who earns the prize.generated: a fresh code made for each player when they earn it.
Give each player at most one coupon from this campaign.
How long a coupon stays valid after it is given. Null means no expiry.
The page shown after the game. At most 20 blocks, 8 images, videos and animations, 1 video, 2 animations, 2,000 characters of text and 16 KB in all.
object
A block on the reward page. Any shared block type, plus:
outcome: the result of the play. Optionalprefix(up to 40 characters).coupon: the player’s coupon. Optionalcaption(up to 120 characters),copyable(default true) for a copy button, andshow:code(the default),name(the coupon’s name) orboth. A coupon with no name shows its code. The copy button appears only when the code is shown.
when is one of always (default), win or not_win.
object
An https URL, or a file from your media library.
For coupon. What the player sees.
Example
{ "tiers": [ { "id": "0192f3a1-0000-7000-8000-000000071001", "match": { "when": "won" }, "display": { "title": "Free coffee", "description": "One regular coffee at any store." }, "codeStrategy": "pool" }, { "match": { "when": "everyone" }, "display": { "title": "10% off" }, "codeStrategy": "shared" } ], "grantOncePerParticipant": true, "validForSeconds": 2592000}Responses
Section titled “Responses”The saved reward, or null when removed.
object
object
One prize, with its stock.
object
How the prize is described to the player.
object
Where the prize’s codes come from.
pool: codes you upload or generate, each given out up to its issue limit.shared: one code given to everyone who earns the prize.generated: a fresh code made for each player when they earn it.
Codes stored for this prize.
Codes that can still be given out. Null when a code has no issue limit.
Coupons given out for this prize.
The page shown after the game. At most 20 blocks, 8 images, videos and animations, 1 video, 2 animations, 2,000 characters of text and 16 KB in all.
object
A block on the reward page. Any shared block type, plus:
outcome: the result of the play. Optionalprefix(up to 40 characters).coupon: the player’s coupon. Optionalcaption(up to 120 characters),copyable(default true) for a copy button, andshow:code(the default),name(the coupon’s name) orboth. A coupon with no name shows its code. The copy button appears only when the code is shown.
when is one of always (default), win or not_win.
object
An https URL, or a file from your media library.
For coupon. What the player sees.
Example
{ "reward": { "tiers": [ { "id": "0192f3a1-0000-7000-8000-000000071001", "match": { "when": "won" }, "display": { "title": "Free coffee", "description": "One regular coffee at any store." }, "codeStrategy": "pool", "coupons": 0, "couponsRemaining": 0, "granted": 0 } ], "grantOncePerParticipant": true, "validForSeconds": 2592000, "page": { "blocks": [ { "id": "heading", "type": "heading", "when": "always", "text": "Free coffee", "align": "center" }, { "id": "outcome", "type": "outcome", "when": "always" }, { "id": "coupon", "type": "coupon", "when": "always", "copyable": true } ] } }}The request is not valid. details lists each field that failed, where there is one.
object
object
Stable and safe to branch on.
invalid_request(400): the request is not valid.unauthorized(401): missing, malformed or revoked API key.upgrade_required(402): not in your plan, or a plan limit is reached.forbidden(403): the key lacks a permission, or the action is not allowed.not_found(404): nothing with that id in your account.conflict(409): clashes with the current state.confirmation_required(409): repeat withconfirm=true. Folder deletion only.rate_limited(429): wait forRetry-Afterseconds.internal_error(500) andservice_unavailable(503): try again later.
Written for a person. May change; do not parse it.
object
The failing field, dot separated, such as prize.label.
object
Example
{ "error": { "code": "invalid_request", "message": "Invalid request json.", "details": [ { "path": "name", "message": "Too small, expected string to have >=1 characters" } ] }}The API key is missing, malformed or revoked.
object
object
Stable and safe to branch on.
invalid_request(400): the request is not valid.unauthorized(401): missing, malformed or revoked API key.upgrade_required(402): not in your plan, or a plan limit is reached.forbidden(403): the key lacks a permission, or the action is not allowed.not_found(404): nothing with that id in your account.conflict(409): clashes with the current state.confirmation_required(409): repeat withconfirm=true. Folder deletion only.rate_limited(429): wait forRetry-Afterseconds.internal_error(500) andservice_unavailable(503): try again later.
Written for a person. May change; do not parse it.
object
The failing field, dot separated, such as prize.label.
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or revoked API key." }}Your plan does not include this feature, or you have reached a plan limit.
object
object
Stable and safe to branch on.
invalid_request(400): the request is not valid.unauthorized(401): missing, malformed or revoked API key.upgrade_required(402): not in your plan, or a plan limit is reached.forbidden(403): the key lacks a permission, or the action is not allowed.not_found(404): nothing with that id in your account.conflict(409): clashes with the current state.confirmation_required(409): repeat withconfirm=true. Folder deletion only.rate_limited(429): wait forRetry-Afterseconds.internal_error(500) andservice_unavailable(503): try again later.
Written for a person. May change; do not parse it.
object
The failing field, dot separated, such as prize.label.
object
Example
{ "error": { "code": "upgrade_required", "message": "Rewards is not included in your plan. Ask whoever manages your account to add it." }}The API key does not carry the permission this needs, or the request is not allowed.
object
object
Stable and safe to branch on.
invalid_request(400): the request is not valid.unauthorized(401): missing, malformed or revoked API key.upgrade_required(402): not in your plan, or a plan limit is reached.forbidden(403): the key lacks a permission, or the action is not allowed.not_found(404): nothing with that id in your account.conflict(409): clashes with the current state.confirmation_required(409): repeat withconfirm=true. Folder deletion only.rate_limited(429): wait forRetry-Afterseconds.internal_error(500) andservice_unavailable(503): try again later.
Written for a person. May change; do not parse it.
object
The failing field, dot separated, such as prize.label.
object
Example
{ "error": { "code": "forbidden", "message": "Your role does not allow this (draws.run)." }}Nothing with that id exists in your account.
object
object
Stable and safe to branch on.
invalid_request(400): the request is not valid.unauthorized(401): missing, malformed or revoked API key.upgrade_required(402): not in your plan, or a plan limit is reached.forbidden(403): the key lacks a permission, or the action is not allowed.not_found(404): nothing with that id in your account.conflict(409): clashes with the current state.confirmation_required(409): repeat withconfirm=true. Folder deletion only.rate_limited(429): wait forRetry-Afterseconds.internal_error(500) andservice_unavailable(503): try again later.
Written for a person. May change; do not parse it.
object
The failing field, dot separated, such as prize.label.
object
Example
{ "error": { "code": "not_found", "message": "Channel 0192f3a1-0000-7000-8000-00000000c009 not found." }}The request clashes with the current state. The message says what to change.
object
object
Stable and safe to branch on.
invalid_request(400): the request is not valid.unauthorized(401): missing, malformed or revoked API key.upgrade_required(402): not in your plan, or a plan limit is reached.forbidden(403): the key lacks a permission, or the action is not allowed.not_found(404): nothing with that id in your account.conflict(409): clashes with the current state.confirmation_required(409): repeat withconfirm=true. Folder deletion only.rate_limited(429): wait forRetry-Afterseconds.internal_error(500) andservice_unavailable(503): try again later.
Written for a person. May change; do not parse it.
object
The failing field, dot separated, such as prize.label.
object
Example
{ "error": { "code": "conflict", "message": "An archived campaign cannot be edited. Restore it first, then make the change." }}