Integration APIs
POSTClaim Creator Rewards
Last updated April 23, 2026
Claim accrued creator rewards for a wallet across every Genesis bonding-curve and Raydium CPMM bucket the wallet is entitled to, in a single call. The endpoint returns a list of base64-encoded Solana transactions that the wallet (or a designated payer) must sign and submit.
SDK wrapper available
Most integrators should use claimCreatorRewards from the Genesis JavaScript SDK — it deserializes the transactions, handles error parsing, and plugs directly into a Umi identity for signing. Call this endpoint directly only if you cannot depend on the SDK.
Summary
POST /v1/creator-rewards/claim returns the Solana transactions needed to claim a wallet's accrued creator rewards across every bonding-curve and Raydium CPMM bucket in a single call.
- Aggregation — one request claims across all eligible buckets; one transaction is returned per bucket
- Signing — response is base64-encoded Solana transactions the wallet (or optional
payer) must sign and submit - Errors — HTTP
400"No rewards available to claim"when nothing has accrued; callers must branch on the error, not an empty array - SDK wrapper —
claimCreatorRewardshandles deserialization, typed errors, and Umi signing
Endpoint
POST /v1/creator-rewards/claim
| Environment | Base URL |
|---|---|
| Devnet & Mainnet | https://api.metaplex.com |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
wallet | string | Yes | Base58-encoded public key of the creator fee wallet to claim for. This is the wallet set as creatorFeeWallet on the bucket — or the launching wallet if no override was configured. |
network | string | No | 'solana-mainnet' (default) or 'solana-devnet'. Must match the base URL's cluster. |
payer | string | No | Base58-encoded public key that covers transaction fees and any rent on the returned transactions. Defaults to wallet when omitted. |
When to set payer
Set payer to a different wallet when the creator fee wallet does not hold SOL (for example, an agent PDA or a cold wallet). The payer must sign the returned transactions, so it is typically the wallet submitting the claim on behalf of the creator. The creator fee recipient still receives the claimed SOL — payer only covers fees and rent.
Example Request
1import { claimCreatorRewards } from '@metaplex-foundation/genesis'
2import { base58 } from '@metaplex-foundation/umi/serializers'
3import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
4import { keypairIdentity } from '@metaplex-foundation/umi'
5
6const umi = createUmi('https://api.mainnet-beta.solana.com')
7const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
8umi.use(keypairIdentity(keypair))
9
10const result = await claimCreatorRewards(umi, {}, {
11 wallet: umi.identity.publicKey,
12 network: 'solana-mainnet',
13 // payer is optional — defaults to `wallet` on the server.
14 // Set it to have a different wallet cover rent and transaction fees.
15 // payer: umi.identity.publicKey,
16})
17
18for (const tx of result.transactions) {
19 const signed = await umi.identity.signTransaction(tx)
20 const signature = await umi.rpc.sendTransaction(signed, {
21 preflightCommitment: 'confirmed',
22 })
23 await umi.rpc.confirmTransaction(signature, {
24 strategy: { type: 'blockhash', ...result.blockhash },
25 commitment: 'confirmed',
26 })
27 console.log('Claimed:', base58.deserialize(signature)[0])
28}
29
30// Claimed: 5uGGYEMmjP2HpyFCvLPNpVDSQEBtUE3LR6ZQFqhJxQSh5FbKacSyN8nQmAJowuFs6BTCdwzoFyyJz8Y2hQx8kPxo
31// Claimed: 3TAroVovEap1ZEAJYq3WiDZoMK3GU3soCdrhvZJNg6b9EANqvWrVcDGNffm7mD8wvtpR7ynWQBcbrmz8AK6nrhfy
1# Claim creator rewards. Response contains base64-encoded transactions
2# the wallet (or payer) must sign and send.
3curl -X POST https://api.metaplex.com/v1/creator-rewards/claim \
4 -H "Content-Type: application/json" \
5 -d '{
6 "wallet": "CREATOR_FEE_WALLET_ADDRESS_HERE",
7 "network": "solana-mainnet"
8 }'
9
10# Add "payer" when the creator fee wallet does not hold SOL (e.g. an agent PDA):
11# "payer": "PAYER_WALLET_ADDRESS_HERE"
Success Response
{
"data": {
"transactions": ["<base64 transaction>", "<base64 transaction>"],
"blockhash": {
"blockhash": "ERKYmtrmNSKaw3VpnFYAfK3jvWGnd15Nf9kJxZqJ7JHx",
"lastValidBlockHeight": 445407640
}
}
}
| Field | Type | Description |
|---|---|---|
data.transactions | string[] | Base64-encoded Solana transactions. Each must be deserialized, signed by the payer (and the creator fee wallet if it is a separate signer), and submitted. |
data.blockhash.blockhash | string | Recent blockhash the transactions were built against. Use this with confirmTransaction — do not replace it with a freshly fetched blockhash. |
data.blockhash.lastValidBlockHeight | number | Slot height after which the blockhash expires. |
The API returns one transaction per bucket being claimed — often two (bonding-curve plus Raydium). Submit them sequentially; their order is not significant.
Error Response
Errors are returned with HTTP status 400 and the shape:
{ "error": { "message": "No rewards available to claim" } }
Known Error Messages
| Message | HTTP | Cause |
|---|---|---|
No rewards available to claim | 400 | The wallet has no accrued-and-unclaimed creator rewards on any bucket. This is returned instead of an empty transactions array, so callers must handle it as a non-exceptional outcome. |
✖ Invalid wallet address | 400 | wallet is not a valid base58 Solana public key. |
No-rewards is a 400, not an empty array
The endpoint returns HTTP 400 with the message No rewards available to claim when a wallet has nothing to claim — it does not return 200 with transactions: []. Callers must catch the error (or inspect response.status and body.error.message) and treat this case as "nothing to do" rather than a failure. The SDK surfaces this as a typed GenesisApiError; see error handling.
Notes
- The endpoint is idempotent at the bucket level — calling it again immediately after a successful claim returns
No rewards available to claimuntil new fees accrue. - The returned transactions use the blockhash in
data.blockhash. If confirmation takes longer than ~60–90 seconds, the blockhash will expire and the call must be repeated to get a fresh set of transactions. - Creator rewards accrue on every swap (bonding curve) and from LP trading activity (Raydium CPMM) — this endpoint aggregates both. For the underlying accrual mechanics and per-bucket fetch helpers, see Creator Fees on the Genesis Bonding Curve.
- The creator fee wallet is set at bucket creation via
creatorFeeWalletand cannot be changed after a curve goes live.
Recommended: Use the SDK
Instead of calling this endpoint directly, use claimCreatorRewards from @metaplex-foundation/genesis:
1import { claimCreatorRewards } from '@metaplex-foundation/genesis'
2import { base58 } from '@metaplex-foundation/umi/serializers'
3import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
4import { keypairIdentity } from '@metaplex-foundation/umi'
5
6const umi = createUmi('https://api.mainnet-beta.solana.com')
7const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
8umi.use(keypairIdentity(keypair))
9
10const result = await claimCreatorRewards(umi, {}, {
11 wallet: umi.identity.publicKey,
12 network: 'solana-mainnet',
13 // payer is optional — defaults to `wallet` on the server.
14 // Set it to have a different wallet cover rent and transaction fees.
15 // payer: umi.identity.publicKey,
16})
17
18for (const tx of result.transactions) {
19 const signed = await umi.identity.signTransaction(tx)
20 const signature = await umi.rpc.sendTransaction(signed, {
21 preflightCommitment: 'confirmed',
22 })
23 await umi.rpc.confirmTransaction(signature, {
24 strategy: { type: 'blockhash', ...result.blockhash },
25 commitment: 'confirmed',
26 })
27 console.log('Claimed:', base58.deserialize(signature)[0])
28}
29
30// Claimed: 5uGGYEMmjP2HpyFCvLPNpVDSQEBtUE3LR6ZQFqhJxQSh5FbKacSyN8nQmAJowuFs6BTCdwzoFyyJz8Y2hQx8kPxo
31// Claimed: 3TAroVovEap1ZEAJYq3WiDZoMK3GU3soCdrhvZJNg6b9EANqvWrVcDGNffm7mD8wvtpR7ynWQBcbrmz8AK6nrhfy
See the API Client page for the full SDK surface, and Creator Fees for the end-to-end claim guide.
