Skip to main content
Version: v2

Static offer feed API

Use this API only with a STATIC_API ad slot. It is intended for an approved publisher network or server integration. It returns eligible campaign inventory for a country and platform, not a user-bound reward decision. Keep the key on your server.

Issue a slot key​

An authenticated publisher console session calls:

POST /publisher/v2/placements/PLACEMENT_ID/ad-slots/SLOT_ID/static-key
Authorization: Bearer SESSION_TOKEN
Content-Type: application/json

{"expiresAt":"2027-01-01T00:00:00.000Z","reason":"Scheduled key rotation"}

The slot must be STATIC_API. expiresAt must be in the future and no more than one year ahead. A successful 201 response includes staticKeyId, token, expiresAt, and displayedOnce: true. Creating a new active key deactivates prior active keys for that slot. Save the token once in protected server configuration.

Poll inventory​

GET /publisher/v2/ad-slots/SLOT_ID/static-offers?country=US&platform=android
X-RapidoReach-Static-Key: STATIC_SLOT_TOKEN
If-None-Match: "PREVIOUS_ETAG"

The feed checks that the key is active, unexpired, and bound to the requested slot; the slot is READY or ACTIVE; and the placement is VERIFIED. country is a two-letter code, and platform must be compatible with the placement. The result contains items, generatedAt, expiresAt, etag, cache.maxAgeSeconds, and contractVersion. The response also sets ETag and Cache-Control; an unchanged feed can return 304 with no body. Current cache duration is 60 seconds.

{
"items": [{
"campaignId": "CAMPAIGN_ID",
"title": "Complete the verified action",
"requirements": "Follow the listed steps",
"goals": [{"id": "signup_verified", "name": "Verified signup", "reward": 50}],
"impressionEndpoint": "/sdk/v2/offers/CAMPAIGN_ID/impressions",
"launchEndpoint": "/sdk/v2/offers/CAMPAIGN_ID/launch"
}],
"generatedAt": "2026-09-29T08:00:00.000Z",
"expiresAt": "2026-09-29T08:01:00.000Z",
"etag": "\"HASH_OF_ITEMS\"",
"cache": {"maxAgeSeconds": 60},
"contractVersion": "2.0.0"
}

The example omits other public offer fields; the actual item can also contain headline, description, CTA, disclaimer, artwork, goal windows, total reward, creative revision, and availability. The static feed intentionally omits the internal providerCode. It is sorted from current live campaigns, limited to 100 candidate campaigns, and filtered by campaign schedule, budget, target country/platform, publisher blacklist, and slot policy. Always treat its expiry as a maximum freshness window: an offer can become unavailable between poll and launch.

A feed item may show impression and launch endpoint paths, but using those paths requires the appropriate user-bound session and eligibility checks. Do not mark a conversion or credit a user from the static response. Refresh the feed when its cache expires; campaigns can change status, schedule, budget, caps, and targeting.

Requests are rate limited. On 429, honor Retry-After and reduce poll frequency. See API errors.

The static feed allows 120 requests per minute per slot/key/source-IP combination. country may be omitted, but supply targeting then has less precise geography; send the user's actual country when the network contract permits. A key cannot be refreshed from this feed. Rotate it through the dashboard, update the server securely, and discard the old token. A lost one-time token requires issuing a new key.