The Short Version
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:target.chainId is where the position lives. The target filter above does that correctly, because targetChainId and targetAddress both describe the event chain.
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
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.
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.
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 withboostApyBps: 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.