API Integration (Advanced)
Get Offers API - Technical Docs
Get Offers returns a static offer catalog for your wall. Use it to ingest inventory and inspect rewards, targeting and caps. Use Get Personalized to evaluate offers for an individual user.
Quick start
The method is GET over HTTPS. The legacy URL /getoffers_api.php accepts the same parameters, including offer_id.
Authentication
Send both your numeric wall ID and your publisher account API key. The publisher key differs from a wall-specific key. Supply it through X-API-Key, Authorization: ApiKey YOUR_KEY, Authorization: Bearer YOUR_KEY, or the api_key query parameter. A nonempty query key takes precedence over the headers; X-API-Key takes precedence over Authorization.
The rate limit is five requests per minute per API key, with a burst allowance of five. Share that budget across clients and both URL forms. Handle HTTP 429 before attempting to parse JSON.
Request parameters
Filters apply before pagination. All parameters are query parameters except the alternative authentication headers.
Parameter | Type | Required | Meaning |
|---|---|---|---|
| integer | Yes | Numeric wall ID. The wall and publisher must be active. |
| string | Unless supplied in a header | Publisher account API key. |
| integer | No | Positive campaign ID. Returns only that offer if available to the wall and matching the filters; otherwise HTTP 404 |
| integer | No | Maximum offers after filtering; supplied values are clamped to 1 through 10000. Omission applies no limit and the response reports |
| integer | No | Number of filtered offers to skip. Defaults to 0; negative values become 0. Also works without |
| string | No | IP used for geographic context; defaults to the caller’s IP. |
| string | No | Exact match on the single |
| string | No | Comma-separated tag names. Matches any supplied name, ignoring case but preserving accent distinctions. Separate from |
| string | No | Supported platform: |
| string | No | Exact |
| string | No | ISO alpha-2 country code. Matches an offer containing that country or a wildcard country. |
| integer | No | Requires at least one event with this crediting-timing code. |
| boolean | No | Requires a matching event. On multi-event offers the synthetic base event is excluded from the check; single-event offers are also checked. Accepts values such as |
| boolean | No |
|
| boolean | No | Legacy alias of |
The compatibility parameter include=SID4 does not expand the response. Every event already contains sid4. State and dayparting restrictions are returned for your integration to apply; they are not separate server-side filters.
Response and pagination
Field | Type | Meaning |
|---|---|---|
| string |
|
| integer | Publisher account ID. |
| integer | Requested wall ID. |
| integer | Number of matching offers before |
| integer | Applied offset. |
| integer or null | Effective maximum requested; |
| array | Offers on this page. An unmatched catalog filter can return an empty array with |
For pagination, send an explicit limit and advance offset until it reaches total. Omitting limit returns all remaining matching offers in one response. A specific offer_id that does not match returns 404 instead of an empty success.
Identity and content
Each entry in offers contains these fields. The Swagger reference provides the complete machine-readable schema and examples.
Field | Type | Meaning |
|---|---|---|
| integer | Campaign ID. |
| string | Campaign name. |
| string | Short headline. |
| string | Offer description. |
| string | Additional terms and conditions. Display these with the event requirements. |
| string | Category label: |
| integer | Internal content category: 0 Undefined, 1 Casino/Gambling, 2 Loyalty Offers, 3 Non Branded Submits, 4 Games, 5 Trial/Purchase, 6 Surveys, 7 Branded, 8 Mobile Non Gaming, 9 Alcohol/Tobacco/Drugs, 10 Other Mature, 11 Social Casinos. |
| string |
|
| string |
|
| string | Single campaign badge. |
| array of strings | Free-form tags in canonical spelling, ordered by name. Empty when none are configured. |
| boolean | Whether the offer has a positive minimum user-revenue or completed-offer-count requirement. This is not a numeric user level or a complete eligibility decision. A false value does not rule out other restrictions. |
Rewards and events
Field | Type | Meaning |
|---|---|---|
| number | Sum of |
| null | Always null in Get Offers because this static catalog has no user click anchor. Read |
| integer or null | Campaign-level user-facing reward-window duration in days. Null when no applicable reward window is configured. |
| string or null | Configured repeat policy, described below. It does not by itself establish user eligibility. |
| array | Reward or tracking steps. Single-step offers have one entry. |
These durations describe completion windows, not calendar deadlines. Do not add a duration to the API response time and present it as the user's deadline. Use Get Personalized after a click or Get Progress for click-backed expiration dates. An event with a null duration uses the offer-level duration, which may also be null. reward_expiration_date is not deprecated. Get Offers returns it as JSON null, not an empty string, because a deadline only exists once a user clicks.
Each event contains:
Field | Type | Meaning |
|---|---|---|
| string | Configured RevU event identifier, such as |
| string | Raw offer/tier identifier used for conversion matching. Matches |
| string | What the user must do for this step. |
| number | Wall-currency reward; may be fractional. |
| number | Publisher payout for the event in USD. Tracking-only events have zero payout. |
| integer | Crediting-timing code: 0 unset, 1 Instant, 2 Daily, 3 2-3 Days, 4 3-5 Days, 5 5-7 Days, 6 Weekly, 7 Bi-Weekly, 8 Monthly, 9 Instant pixel/loop, 10 Hourly, 11 Undisclosed. |
| null | Always null in Get Offers, including events with their own reward-window override. |
| integer or null | User-facing duration in days for this event's own override. Null means no separate applicable override; use the offer-level duration. |
| integer or false | Sequence position when ordered; false for an independent event. |
| boolean | Whether the step is sequential. |
| boolean | Tracking-only step. Such events have zero reward and are distinct from payable events. |
Configured repeat policy
The multiple_leads field contains one of these text values, or null:
| Meaning |
|---|---|
| Repeats are restricted. This is not a guaranteed lifetime limit; tiered offers can credit each event. |
| Normally counts conversions on the current calendar date. |
| No frequency-count limit; other eligibility rules still apply. |
| Normally counts today and yesterday, not an exact rolling 48-hour interval. |
| Normally allows five conversions on the current calendar date. |
| Normally counts today and the previous six dates; no fixed weekday reset. |
multiple_leads is null for a missing or unrecognized setting. Date boundaries use the service's configured time zone; daylight-saving behavior and other eligibility rules can affect availability. The named policy is not an elapsed-hour promise.
multiple_leads: "once_per_day" means the user may normally complete the offer again on a later service calendar date, provided the offer and user still meet all other requirements. It does not promise a reward for every attempt or require exactly 24 elapsed hours.
To check a specific user, call Get Progress with the same wall/user IDs and offer_id. Read offers[].repeat_available for the current repeat-count result and each event's completion timestamp with its reward status. Get Offers does not return repeat_available or user completion history. Use Get Personalized for current user-specific selection.
Targeting and capping
platform.desktop is a boolean. platform.android and platform.ios each contain enabled, os_version_min and os_version_max; version values are nullable strings. countries lists allowed country codes. states contains state restrictions; * means all. Apply dayparting.available_start_time, available_end_time and weekdays_only using its timezone, currently America/Chicago.
The three cap flags have different meanings:
Object | Meaning of | When | Other fields returned when true |
|---|---|---|---|
| A lead cap is configured. Check the remaining count to determine whether it is reached. | No lead cap. The entire object is |
|
| A click cap is configured. Check the remaining count to determine whether it is reached. | No click cap. The entire object is | Integer |
| This publisher has reached its cap. Stop showing the offer. | Either no publisher cap or a configured publisher cap with room left. The entire object is | Only |
Publisher caps never return a remaining count, current count or configured maximum. A configured publisher cap of 45 per day with zero conversions and an offer with no publisher cap both return {"enabled": false}. You cannot distinguish those states or calculate the publisher’s remaining quota from this response. Once a publisher cap is reached, the entire object is {"enabled": true, "cap_scope": "publisher", "capping_period": "daily_cst"}.
Lead caps cover all conversions, so lead_cap.event_id is null. Lead and click counts are integers; remaining counts are clamped to zero. Adding current and remaining counts cannot reliably reconstruct a configured maximum after overdelivery. Lead-cap periods include unlimited, hourly, daily_cst, daily_est, daily_pst, daily_gmt, weekly, monthly and total.
When to stop showing an offer
Stop showing an offer if any one of these conditions is true:
lead_cap.enabled == trueandlead_cap.remaining_leads_available <= 0.click_cap.enabled == trueandclick_cap.remaining_clicks_available <= 0.publisher_cap.enabled == true.
Combine the conditions with OR. For an offer returned by the API:
These are capacity checks. A false capReached value does not establish that an individual user is eligible. Capacity can change after a response; a cap snapshot does not reserve capacity.
Excluding capped offers in Get Offers
Send filter[capped_only]=false to exclude an offer if any of its lead, click or publisher caps is reached. The filter uses the same three conditions above. Use true to return only capped-out offers. The legacy alias filter[cap] is used only when filter[capped_only] is absent.
Get Offers responses may be cached for up to 120 seconds when server caching is active. Refresh inventory within the rate limit, and use Get Personalized for current user-specific selection. The cap filter does not check a user’s repeat availability or guarantee eligibility.
Cap-state examples
The following are complete capping objects from illustrative responses. IDs and counts in examples are fictional.
No lead/click cap and no publisher cap reached. The publisher could have no cap or have a configured cap with room:
Configured lead and click caps with room left. The offer is not capped out:
Lead cap reached. Stop showing the offer even though the click cap still has room and the publisher cap is not reached:
Click cap reached. Stop showing the offer even though the lead cap still has room and the publisher cap is not reached:
Full response with a publisher cap reached
This illustrative response comes from a Get Offers request without filter[capped_only]=false. The publisher cap is reached even though lead and click capacity remain. Stop showing this offer. A request with filter[capped_only]=false would exclude it. Example IDs, amounts and URLs are fictional; use the URLs actually returned by your API response.
Performance and creatives
Field | Type | Meaning |
|---|---|---|
| string | Configured crediting-delay label. Values can include Instant, Daily, Weekly, longer delays, descriptive suffixes, or an empty string. Do not restrict it to three labels. |
| number or null | Historical network-wide conversion rate from the seven-day statistics. |
| number or null | Historical network-wide earnings per click from the seven-day statistics. |
| array | Objects with |
| string | Offer preview destination. |
| string | Mobile app identifier when available; may be empty. |
Get Offers currently does not return estimated_completion_time. Get Personalized exposes that field when completion-time data is available, with null for unknown values.
Click URLs and postbacks
click_url_base is a tracking template. Set its sid2 parameter to your URL-encoded user ID before serving it. Use a consistent ASCII user ID of at most 255 characters.
Optional additions include idfa for iOS and correlation values sid3, sid5 and sid6. Before URL encoding, keep ASCII values within 200 characters for SID3 and 255 each for SID5/SID6. The complete encoded callback URL must also fit the supported delivery and receiver limits. Do not set SID4 yourself; it identifies the offer or tier.
Use $sid4$ to correlate the raw offer/tier identifier. $event_id$ and its alias $eventid$ carry the independently configured RevU event identifier. Neither is an alias of $sid4$. See API Setup for callback variables.
$sid4_event_id$ is a compatibility alias of $sid4$, not of $event_id$. Preserve both identifiers as returned, including empty strings. Correlate raw SID4 with the campaign ID because it is not globally unique. SID4 remains supported for conversion matching; do not replace its value with event_id.
Errors
Most errors return status: failure and a message. An unavailable offer_id returns status: error with error.code: OFFER_NOT_FOUND. A 405 contains both the legacy fields and a structured error:
HTTP | Example or code | Meaning |
|---|---|---|
400 |
| A required or optional input is invalid. |
401 |
| Supply the publisher key. |
403 |
| Key or account restriction. Preserve the actual response wording. |
404 |
| Wall or publisher not available. |
404 |
| Requested offer does not match the wall and filters. |
405 |
| Use GET. |
429 | HTML response | Rate limit exceeded. Back off and retry; do not assume a JSON body. |
Integration practices
Cache catalog responses, share the rate-limit budget, and refresh inventory regularly. For a user-facing list, obtain current user-specific eligibility from Get Personalized and apply relevant targeting, time and capacity restrictions. Display event requirements and additional terms together. Handle fractional rewards and nullable fields, and preserve identifiers exactly, including empty identifiers.
Share feedback on this documentation
