Skip to main content

Overview

Podium supports minting on-chain rewards on EVM chains (Base, Polygon, Arc Testnet) with a queued minting system via Privy server wallets. Rewards serve as verifiable, on-chain incentives with six distinct reward types. Reward programs are created by creators, linked to campaigns or standalone, and minted to users as ERC-721 tokens. The entire lifecycle — from program creation through minting and redemption — is managed via the API.

Create a Reward Program

curl -X POST https://api.podium.build/api/v1/nft-reward \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "creatorId": "clcreator_abc",
    "name": "Clean Beauty VIP Badge",
    "description": "Exclusive badge for loyal Clean Beauty Co customers",
    "type": "EXCLUSIVE_ACCESS",
    "imageUrl": "https://cdn.example.com/vip-badge.png",
    "points": 500,
    "maxSupply": 100
  }'

Response

{
  "id": "clreward_xyz",
  "status": "DRAFT",
  "type": "EXCLUSIVE_ACCESS",
  "creatorId": "clcreator_abc",
  "contract": {
    "id": 42,
    "name": "Clean Beauty VIP Badge",
    "symbol": "CBVIP",
    "proxyAddress": null,
    "implementationAddress": null,
    "chainId": 8453,
    "maxSupply": 100,
    "points": 500,
    "transferable": true
  },
  "createdAt": "2026-03-07T12:00:00.000Z"
}
The contract addresses are null until the reward is published, at which point the smart contract is deployed on-chain.

Reward Types

TypeDescriptionRedemption Effect
POINTSRedeem for Podium pointsCredits points to user’s balance
FREE_PRODUCTRedeem for a specific productCreates a zero-cost order
DISCOUNT_CODEUnlock a discount codeReturns a one-time discount code
EVENT_PASSAccess to an event or experienceGrants access token/ticket
CUSTOMCustom reward defined by creatorTriggers custom webhook
EXCLUSIVE_ACCESSGated content or feature accessUnlocks gated content

Update and Publish

Update Reward Details

curl -X PUT https://api.podium.build/api/v1/nft-reward/clreward_xyz \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Badge Name",
    "description": "Updated description"
  }'

Update On-Chain Metadata

curl -X PUT https://api.podium.build/api/v1/nft-reward/clreward_xyz/nft \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Clean Beauty VIP Badge",
    "description": "Exclusive badge for loyal customers",
    "imageUrl": "https://cdn.example.com/badge-v2.png",
    "animationUrl": "https://cdn.example.com/badge-v2.mp4",
    "externalUrl": "https://cleanbeautyco.com/vip",
    "points": 500
  }'
At least one of imageUrl or animationUrl is required.

Publish

curl -X PUT https://api.podium.build/api/v1/nft-reward/clreward_xyz/publish \
  -H "Authorization: Bearer $PODIUM_API_KEY"
Publishing deploys the ERC-721 contract on-chain and sets the reward status to PUBLISHED. A nft-reward-published event is emitted.

Disable

curl -X PATCH https://api.podium.build/api/v1/nft-reward/clreward_xyz/disable \
  -H "Authorization: Bearer $PODIUM_API_KEY"
Disabling prevents new mints but doesn’t affect already-minted tokens.

Grant (Mint) a Reward

Mint a reward token to a specific user:
curl -X POST https://api.podium.build/api/v1/nft-reward/clreward_xyz/grant \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "userId": "clxyz1234567890",
    "creatorId": "clcreator_abc"
  }'
FieldTypeRequiredDescription
userIdstringYesRecipient user CUID
creatorIdstringYesCreator who owns the reward

Mint Queue System

Mints go through a reliable queue to handle on-chain transaction latency and failures:

QueuedMint Statuses

StatusDescription
PENDINGMint requested, waiting for cron
PROCESSINGCron picked up, transaction in progress
COMPLETEDOn-chain mint confirmed
ERRORMint failed (error stored in message)
The mint-queue cron job runs frequently, batching pending mints and executing them via Privy server wallets.

Redeem a Reward

Users redeem rewards they’ve earned:
curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/nfts/base/0xContractAddr/42/redeem \
  -H "Authorization: Bearer $PODIUM_API_KEY"
Path parameters: /{network}/{contractAddress}/{tokenId} The redemption flow:
  1. Verify the user owns the token
  2. Check the reward type and eligibility
  3. Process the reward (create order, grant points, generate code, etc.)
  4. Record NftRedemption and emit nft-redeemed event
  5. Deduct points if the reward has a point cost

Check Redemption Status

curl https://api.podium.build/api/v1/user/clxyz1234567890/nfts/base/0xContractAddr/42/status \
  -H "Authorization: Bearer $PODIUM_API_KEY"
{
  "status": "REDEEMED",
  "redeemedAt": "2026-03-07T15:30:00.000Z",
  "rewardType": "FREE_PRODUCT",
  "rewardDetails": {
    "productId": "clprod_abc123",
    "orderId": "clord_reward_xyz"
  }
}

Query User Rewards

Full Collection

curl https://api.podium.build/api/v1/user/clxyz1234567890/nfts \
  -H "Authorization: Bearer $PODIUM_API_KEY"

Filtered Views

EndpointReturns
/user/{id}/nfts/earnedRewards earned through programs and campaigns
/user/{id}/nfts/redeemableAvailable for redemption (earned but not yet redeemed)
/user/{id}/nfts/redeemedAlready redeemed rewards

Airdrops

Airdrops distribute rewards to multiple users at once.

Get Airdrop Details

curl https://api.podium.build/api/v1/airdrop/clairdrop_abc \
  -H "Authorization: Bearer $PODIUM_API_KEY"
{
  "id": "clairdrop_abc",
  "airdropDate": "2026-04-01T00:00:00.000Z",
  "status": "COMPLETED",
  "eligible": 500,
  "nftReward": {
    "id": "clreward_xyz",
    "contract": {
      "name": "Spring Collection Badge",
      "proxyAddress": "0x..."
    }
  }
}

Airdrop Status Flow

StatusDescription
PENDINGAirdrop scheduled, waiting for processing
PROCESSINGairdrop-monitor cron is minting tokens
COMPLETEDAll tokens minted successfully
FAILEDAirdrop failed (partial mints may exist)

Track Redemptions and Deliveries

EndpointReturns
/airdrop/{id}/redemptionRedemption tracking for the airdrop
/airdrop/{id}/deliveredUsers who received the airdrop

Creator Airdrops

EndpointReturns
/creator/id/{creatorId}/airdropsAll airdrops for a creator
/creator/id/{creatorId}/latest-airdropMost recent airdrop

Supported Chains

NetworkChain IDUse Case
Base Mainnet8453Production rewards
Base Sepolia84532Testnet rewards
Arc TestnetDevelopment/testing

Reward Contract Model

FieldTypeDescription
idintegerAuto-increment ID
namestringContract name
symbolstringToken symbol
proxyAddressstringDeployed proxy address
implementationAddressstringImplementation address
chainIdintegerDeployment chain ID
maxSupplyintegerMaximum mintable tokens
pointsintegerPoints cost to redeem
transferablebooleanWhether tokens can be transferred

Endpoint Summary

MethodPathDescription
POST/nft-rewardCreate reward program
GET/nft-reward/{id}Get reward details
PUT/nft-reward/{id}Update reward
DELETE/nft-reward/{id}Delete reward
PUT/nft-reward/{id}/publishPublish (deploy contract)
PUT/nft-reward/{id}/nftUpdate on-chain metadata
POST/nft-reward/{id}/grantGrant (mint) to user
PATCH/nft-reward/{id}/disableDisable reward
GET/user/{id}/nftsUser’s reward collection
GET/user/{id}/nfts/earnedEarned rewards
GET/user/{id}/nfts/redeemableRedeemable rewards
GET/user/{id}/nfts/redeemedRedeemed rewards
GET/user/{id}/nfts/{network}/{address}/{tokenId}/statusRedemption status
POST/user/{id}/nfts/{network}/{address}/{tokenId}/redeemRedeem reward
GET/airdrop/{id}Airdrop details
GET/airdrop/{id}/redemptionAirdrop redemptions
GET/airdrop/{id}/deliveredDelivered users
GET/creator/{slug}/collectiblesPublic collectibles
GET/creator/{slug}/collectibles/metadataCollectible metadata
GET/creator/id/{creatorId}/collectiblesManage collectibles
GET/creator/id/{creatorId}/nft-rewardsCreator’s rewards
GET/creator/id/{creatorId}/nft-rewards/redeemedRedeemed rewards
GET/creator/id/{creatorId}/latest-earned-rewardLatest earned
GET/creator/id/{creatorId}/latest-airdropLatest airdrop
GET/creator/id/{creatorId}/airdropsAll airdrops