Reward object
The complete reward resource, its status fields and its nullable transfer evidence.
A Reward preserves the original exact allocation and exposes a mutable projection of its approval and transfer state. Read and issuance HTTP responses wrap it in {data: Reward}.
Fields#
All top-level fields below are required in a reward response. Nullable fields are included with null until their value exists.
| Field | Type | Description |
|---|---|---|
id | String | Opaque Slices reward ID. |
campaignId | String | Campaign that fixes the asset and controls. |
recipient | Object | walletAddress, the normalized authorized earning wallet; verificationStatus: not_required, unverified, verified, expired or blocked; and verificationUrl, the link to the verification page while the recipient still has to verify, otherwise null. |
asset | Object | chainId, tokenAddress, symbol, and decimals. |
amountBaseUnits | Positive integer string | Original exact net entitlement. |
event | Object | The original case-sensitive id and type. |
source | String | Always partner_attested in this version. |
status | Enum | accepted, queued, approved, sent, delivered, failed, or cancelled. |
statusReason | String or null | Why a reward is failed or cancelled: the wallet's error, the preflight message, or the close reason. Display it; do not branch on it. |
payoutCampaignId | String or null | The draft campaign the grant was queued into, once it was. |
deliveredAmountBaseUnits | Integer string | "0" or the full original amount; there is no partial delivery. |
deliveryEvidence | Object or null | The transfer Slices is tracking or has verified. |
createdAt | Date-time string | Time the instruction was accepted. |
updatedAt | Date-time string | Time the current Slices projection last changed. |
Recipient verification#
recipient.verificationStatus explains a reward that stays accepted. not_required means the campaign's verification setting is off (the v1 default): the partner attested eligibility and the reward queued at once. unverified means the recipient has not yet proved control of the wallet and their location; expired means an earlier verification lapsed before approval and must be renewed; blocked means the recipient's location is outside the campaign's policy, and the reward cannot be queued until that changes. Only verified recipients enter a draft campaign.
While a reward is accepted with an unverified or expired recipient, recipient.verificationUrl carries the verification page for that wallet and campaign. Slices issues it when the reward is accepted, and again when a verification expires; it is null once the recipient is verified, when they are blocked, and on a cancelled reward. The link holds an unguessable token, so show it only to the authenticated user who owns that wallet. See Recipients.
Asset shape#
chainId is a positive JSON integer. tokenAddress is the approved contract address. symbol is a display label of 1–32 characters. decimals is an integer from 0 through 255; actual token support is determined by the approved profile.
Use chain ID and contract address together for asset identity. Decimal metadata does not change the stored base-unit amount.
Delivery evidence#
deliveryEvidence is null until a transaction hash is known. It is populated while the reward is sent, complete when it is delivered, and carries the reverted hash with logIndex: null when a sent transfer failed onchain. When non-null it contains all of these fields:
| Field | Type | Description |
|---|---|---|
transactionHash | 32-byte hex string | The transfer transaction the operator's wallet sent. |
blockNumber | Integer string or null | Block height, preserved without number coercion; null until the transaction is included. |
blockHash | 32-byte hex string or null | Block identity used for finality and canonical-inclusion checks. |
confirmations | Integer string or null | Confirmations observed at checkedAt. |
finality | Enum | l2_included, l2_finalized, or unknown. |
logIndex | Integer or null | Index of the verified Transfer log within the receipt; null until verified. |
checkedAt | Date-time string | When Slices last checked this transaction against the chain. |
The evidence is one transfer receipt for one reward. It is not a current wallet balance and not a complete standalone proof bundle; the API does not expose every preflight and reconciliation record as a field on Reward.
Immutability and corrections#
The original campaign, recipient, amount, asset, and event do not change after acceptance. status, statusReason, payoutCampaignId, deliveredAmountBaseUnits and deliveryEvidence change as work progresses. A retry after a failed attempt keeps the same reward and replaces the evidence with the new attempt's transaction.
A correction to evidence is not a new reward instruction and does not authorize a second transfer. Keep the ID and historical records rather than treating a status change as a new payable event.
Common interpretation errors#
source: partner_attested does not mean Slices independently verified the activity. payoutCampaignId does not mean the operator approved the draft. status: sent is not delivered; the receipt has not been verified yet. status: failed is not final in the way cancelled is: the operator may retry. updatedAt does not prove chain freshness; deliveryEvidence.checkedAt does.
Related: Reward states, Get a reward, and Approval and sending.