Skip to main content

Overview

Users are end consumers within an organization. They browse products, earn points, follow creators, collect rewards, and manage wallets. Every user belongs to a single organization (your tenant) and is uniquely identified by a CUID2 id. Users are created through Privy authentication — when a user signs in via email, Google, or wallet, the Podium backend creates a User record linked to their Privy identity.

Create a User

curl -X POST https://api.podium.build/api/v1/user \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "jane@example.com",
    "privyId": "did:privy:abc123",
    "walletAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18"
  }'

Request Body

FieldTypeRequiredDescription
emailstringYesValid email address
privyIdstringYesPrivy DID (did:privy:...)
walletAddressstringNoInitial ETH wallet address
walletIdstringNoPrivy wallet ID for embedded wallets

Response

{
  "id": "clxyz1234567890",
  "email": "jane@example.com",
  "username": null,
  "avatarUrl": null,
  "bio": null,
  "city": null,
  "state": null,
  "emailVerified": false,
  "createdAt": "2026-03-07T12:00:00.000Z",
  "updatedAt": "2026-03-07T12:00:00.000Z",
  "wallets": [
    {
      "address": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18",
      "type": "EXTERNAL"
    }
  ],
  "socialProfiles": [],
  "interests": []
}

Update a User Profile

curl -X PATCH https://api.podium.build/api/v1/user/clxyz1234567890 \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "jane_doe",
    "bio": "Clean beauty enthusiast",
    "avatarUrl": "https://cdn.example.com/avatar.jpg",
    "categoryIds": [1, 3, 7],
    "socialProfiles": [
      { "platform": "INSTAGRAM", "url": "https://instagram.com/jane_doe" },
      { "platform": "TIKTOK", "url": "https://tiktok.com/@jane_doe" }
    ]
  }'

Request Body

FieldTypeRequiredDescription
usernamestringNoUnique handle
biostring | nullNoBiography text
avatarUrlstring | nullNoValid URL for profile image
categoryIdsnumber[]NoInterest category IDs
socialProfilesarrayNoSocial platform links
All fields are optional — only include fields you want to update. Pass null to clear a field.

Lookup by Privy ID

Resolve a Privy DID to a Podium user. This is the primary way to link Privy-authenticated sessions to Podium user records.
curl https://api.podium.build/api/v1/user/privy/did:privy:abc123/profile \
  -H "Authorization: Bearer $PODIUM_API_KEY"

Wallets

Each user can have multiple wallets from different providers.

Wallet Types

ProviderDescriptionUse Case
Privy embeddedAuto-created on login, user-controlledConsumer payments, reward redemption
Privy serverPlatform-managed for automated operationsAgent-initiated x402 payments, minting
ExternalUser’s own self-custodied wallet addressDirect USDC transfers, existing Web3 users

List Wallets

curl https://api.podium.build/api/v1/user/clxyz1234567890/wallets \
  -H "Authorization: Bearer $PODIUM_API_KEY"
[
  {
    "address": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18",
    "type": "EMBEDDED",
    "chainId": 8453,
    "createdAt": "2026-03-07T12:00:00.000Z"
  },
  {
    "address": "0x1234567890abcdef1234567890abcdef12345678",
    "type": "SERVER",
    "chainId": 8453,
    "createdAt": "2026-03-07T12:00:00.000Z"
  }
]

Send from Wallet

Transfer tokens from a user’s Privy server wallet. This is used for automated x402 payments and agent-initiated transfers.
curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/wallets/0x742d.../send \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recipient": "0xabcdef1234567890abcdef1234567890abcdef12",
    "tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "1000000",
    "decimals": 6,
    "chainId": 8453
  }'
FieldTypeRequiredDescription
recipientstringYesDestination ETH address
tokenAddressstringYesERC-20 token contract address
amountstring | numberYesAmount in smallest unit (e.g., 1 USDC = 1000000)
decimalsnumberNoToken decimals (default: 18)
chainIdnumberNoTarget chain (default: Base Mainnet 8453)

Orders

Get Order History

curl https://api.podium.build/api/v1/user/clxyz1234567890/orders \
  -H "Authorization: Bearer $PODIUM_API_KEY"
Returns paginated list of all orders for the user, including status, line items, and payment details.

Create an Order

Create a new order by adding an initial product:
curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/order \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "productId": "clprod_abc123",
    "variantIds": ["clvar_size_m", "clvar_color_black"],
    "quantity": 2
  }'
FieldTypeRequiredDescription
productIdstringYesCUID of the product
variantIdsstring[]NoSelected variant IDs
quantitynumberNoQuantity (default: 1, must be positive integer)

Add a Product to an Existing Order

curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/order/clord_xyz/product/clprod_def456 \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "quantity": 1, "variantIds": ["clvar_size_l"] }'

Remove an Item from an Order

curl -X DELETE https://api.podium.build/api/v1/user/clxyz1234567890/order/clord_xyz/item/clitem_abc \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "quantity": 1 }'
Pass quantity to reduce the count rather than removing the entire line item.

Points

Get Points Balance

curl https://api.podium.build/api/v1/user/clxyz1234567890/points \
  -H "Authorization: Bearer $PODIUM_API_KEY"
{
  "balance": 2500,
  "creatorBalances": [
    { "creatorId": "clcreator_abc", "balance": 1500 },
    { "creatorId": "clcreator_def", "balance": 1000 }
  ]
}
Optionally scope to a single creator with ?creatorId=clcreator_abc.

Grant or Deduct Points

curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/points \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 100,
    "creatorId": "clcreator_abc",
    "details": { "source": "welcome-bonus", "campaignId": "clcamp_xyz" }
  }'
FieldTypeRequiredDescription
amountintegerYesNon-zero integer. Positive = earn, negative = deduct
creatorIdstringNoScope points to a specific creator
detailsobjectNoArbitrary metadata stored with the transaction

Points Transaction History

curl "https://api.podium.build/api/v1/user/clxyz1234567890/points/history?page=1&limit=20&creatorId=clcreator_abc" \
  -H "Authorization: Bearer $PODIUM_API_KEY"
Returns paginated transaction records with type, amount, timestamp, and linked metadata.

Rewards

Get User’s Reward Collection

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

Filter by Status

EndpointReturns
/user/{id}/nfts/earnedAll rewards earned through programs
/user/{id}/nfts/redeemableRewards available for redemption
/user/{id}/nfts/redeemedPreviously redeemed rewards

Redeem a Reward

curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/nfts/base/0xContractAddress/42/redeem \
  -H "Authorization: Bearer $PODIUM_API_KEY"
Path parameters: {network} / {contractAddress} / {tokenId}. The redeem endpoint checks eligibility, deducts any required points, and processes the reward (free product, discount code, event pass, etc.).

Check Redemption Status

curl https://api.podium.build/api/v1/user/clxyz1234567890/nfts/base/0xContractAddress/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"
  }
}

Social Graph

Follow a User

curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/followers/follow \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "followingId": "cluser_target" }'

Unfollow a User

curl -X DELETE https://api.podium.build/api/v1/user/clxyz1234567890/followers/follow \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "followingId": "cluser_target" }'

Follow a Creator

curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/creator/clcreator_abc/followers/follow \
  -H "Authorization: Bearer $PODIUM_API_KEY"

List Following

EndpointReturns
/user/{id}/followingAll users being followed
/user/{id}/following/creatorsAll creators being followed
/user/{id}/following/creators/countCreator following count
/user/{id}/followersUsers following this user

Notifications

List Notifications

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

Mark as Read

curl -X PUT https://api.podium.build/api/v1/user/clxyz1234567890/notification/clnotif_abc \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "READ" }'

Delete a Notification

curl -X DELETE https://api.podium.build/api/v1/user/clxyz1234567890/notification/clnotif_abc \
  -H "Authorization: Bearer $PODIUM_API_KEY"

Create a Creator (via User)

Users can create creator profiles (storefronts) from their account:
curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/creator \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "displayName": "Jane's Clean Beauty",
    "slug": "janes-clean-beauty",
    "categoryIds": [1, 3]
  }'
Check slug availability first:
curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/creator/check-availability \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "displayName": "Jane'\''s Clean Beauty", "slug": "janes-clean-beauty" }'

Initialize Chat

Set up a Stream Chat channel between a user and a creator:
curl -X POST https://api.podium.build/api/v1/user/clxyz1234567890/chat \
  -H "Authorization: Bearer $PODIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "requestorId": "clcreator_abc",
    "requestorType": "Creator"
  }'
FieldTypeRequiredDescription
requestorIdstringYesCUID of the other party
requestorTypestringYes"User" or "Creator"

User Model

FieldTypeDescription
idstringCUID2 identifier
usernamestring | nullUnique handle
emailstringContact email (unique)
emailVerifiedbooleanEmail verification status
avatarUrlstring | nullProfile image URL
biostring | nullUser biography
citystring | nullCity
statestring | nullState/region
createdAtdatetimeAccount creation timestamp
updatedAtdatetimeLast update timestamp
organizationIdstringParent organization (your tenant)

Endpoint Summary

MethodPathDescription
POST/userCreate a user
PATCH/user/{id}Update profile
GET/user/username/{username}Lookup by username
GET/user/privy/{privyId}/profileLookup by Privy ID
GET/user/privy/{privyId}/creatorsCreators for Privy user
GET/user/{id}/walletsList wallets
GET/user/{id}/wallets/{address}Wallet detail
POST/user/{id}/wallets/{address}/sendSend from wallet
GET/user/{id}/wallets/{address}/transactionsWallet transactions
GET/user/{id}/shipping-addressShipping address
GET/user/{id}/pointsPoints balance
POST/user/{id}/pointsGrant/deduct points
GET/user/{id}/points/historyPoints history
GET/user/{id}/ordersOrder history
GET/user/{id}/orderOpen order
POST/user/{id}/orderCreate order
GET/user/{id}/order/{orderId}Order detail
POST/user/{id}/order/{orderId}/checkoutStripe checkout
PATCH/user/{id}/order/{orderId}/checkout/embedded-walletEmbedded wallet checkout
PATCH/user/{id}/order/{orderId}/checkout/coinbaseCoinbase checkout
POST/user/{id}/order/{orderId}/product/{productId}Add product to order
DELETE/user/{id}/order/{orderId}/item/{itemId}Remove item
PUT/user/{id}/order/{orderId}/points/finalizeFinalize points
POST/user/{id}/order/{orderId}/points/revertRevert points
GET/user/{id}/nftsReward collection
GET/user/{id}/nfts/earnedEarned rewards
GET/user/{id}/nfts/redeemableRedeemable rewards
GET/user/{id}/nfts/redeemedRedeemed rewards
POST/user/{id}/nfts/{network}/{address}/{tokenId}/redeemRedeem reward
GET/user/{id}/nfts/{network}/{address}/{tokenId}/statusRedemption status
GET/user/{id}/followersFollowers
POST/user/{id}/followers/followFollow a user
DELETE/user/{id}/followers/followUnfollow a user
GET/user/{id}/followingFollowing
GET/user/{id}/following/creatorsFollowing creators
GET/user/{id}/following/creators/countFollowing count
GET/user/{id}/notificationsNotifications
PUT/user/{id}/notification/{notificationId}Mark notification read
DELETE/user/{id}/notification/{notificationId}Delete notification
POST/user/{id}/creatorCreate creator profile
POST/user/{id}/creator/check-availabilityCheck slug availability
POST/user/{id}/chatInitialize chat