Skip to main content
The smallest useful integration: one request, one field, no wallet and no key. If you only ever ship one thing from these docs, ship this.

The Short Version

Read boostApyBps. It is the reward APR in basis points, so "1550" means 15.50%. Show it next to your own APR figures.

Find Your Campaign

If the Boost team gave you campaign IDs, hardcode them. Otherwise discover them by target:
Match on the event chain, not the reward chain: target.chainId is where the position lives. The target filter above does that correctly, because targetChainId and targetAddress both describe the event chain.
The bare chainId filter is the reward chain, not the event chain. campaigns.active({ chainId: 42161 }) returns campaigns that pay on Arbitrum, so it misses a pool tracked on Arbitrum that pays on Base. There is also no event-chain-only filter: passing targetChainId without targetAddress is rejected with INVALID_PARAMS.
For a Uniswap v4 pool you match on target.poolId (the bytes32 pool ID) rather than an address, so there is no address to pair with targetChainId. Page through the unfiltered list and match client-side:

Read the Stats

The raw response:
campaigns.stats returns only the numbers that move, so it is the cheap call to poll. Use campaigns.get when you also need the schedule, modes, target, or reward token.

Handling Rules

Three rules keep the row honest. 1. boostApyBps can be null. It happens before a campaign starts, after it ends, when TVL is zero, and briefly if the reward-token price feed lags.
Hide the reward line when boostApyBps is null. Do not render 0.00%: a live campaign showing zero reads as broken, and a finished one showing zero reads as a bug.
2. Values are strings on the wire. They can exceed float precision elsewhere in the API, so they are serialized as decimal strings. Parse as an integer and divide by 100 for the percentage. The SDK gives you bigint instead.
3. Never sum the two APYs silently. boostApyBps and protocolApyBps measure different things and can each be null independently. Show them as separate lines, or combine them only where your UI explicitly presents a total estimate and says so.

Polling and Caching

Stats update on the reward checkpoint cadence of minutes, not seconds. Cache responses for 60 seconds or more. There is no API key, so there is no per-partner quota to raise; the ceiling is shared and rate limits are per-IP.

Try It Live

This campaign is finalized, so it returns the exact shape above with boostApyBps: null, a useful way to check your null handling before a live campaign exists:

Keep Exploring

Show User Rewards

Move from campaign-level numbers to per-user earnings.

Campaigns, IDs, and Chains

Target shapes, event versus reward chains, and campaign modes.