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

curl --get 'https://publishers.revenueuniverse.com/api/v1/offers' \
  --header 'X-API-Key: YOUR_PUBLISHER_API_KEY' \
  --data-urlencode 'wall=YOUR_WALL_ID' \
  --data-urlencode 'limit=100'
curl --get 'https://publishers.revenueuniverse.com/api/v1/offers' \
  --header 'X-API-Key: YOUR_PUBLISHER_API_KEY' \
  --data-urlencode 'wall=YOUR_WALL_ID' \
  --data-urlencode 'limit=100'
curl --get 'https://publishers.revenueuniverse.com/api/v1/offers' \
  --header 'X-API-Key: YOUR_PUBLISHER_API_KEY' \
  --data-urlencode 'wall=YOUR_WALL_ID' \
  --data-urlencode 'limit=100'

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

wall

integer

Yes

Numeric wall ID. The wall and publisher must be active.

api_key

string

Unless supplied in a header

Publisher account API key.

offer_id

integer

No

Positive campaign ID. Returns only that offer if available to the wall and matching the filters; otherwise HTTP 404 OFFER_NOT_FOUND. Works on both URLs.

limit

integer

No

Maximum offers after filtering; supplied values are clamped to 1 through 10000. Omission applies no limit and the response reports null.

offset

integer

No

Number of filtered offers to skip. Defaults to 0; negative values become 0. Also works without limit.

ip

string

No

IP used for geographic context; defaults to the caller’s IP.

filter[tag]

string

No

Exact match on the single tag badge.

filter[tags]

string

No

Comma-separated tag names. Matches any supplied name, ignoring case but preserving accent distinctions. Separate from filter[tag].

filter[platform]

string

No

Supported platform: desktop, android or ios; case-insensitive.

filter[category]

string

No

Exact offer_type label, such as Purchase or Mobile Apps.

filter[country]

string

No

ISO alpha-2 country code. Matches an offer containing that country or a wildcard country.

filter[conversion_type]

integer

No

Requires at least one event with this crediting-timing code.

filter[is_sequential]

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 true, false, 1, 0, yes and no; invalid values return 400.

filter[capped_only]

boolean

No

true, 1 or yes returns capped-out offers; false, 0 or no returns offers with capacity. Considers lead, click and publisher caps.

filter[cap]

boolean

No

Legacy alias of filter[capped_only], used only when the canonical parameter is absent.

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

status

string

success.

publisher_id

integer

Publisher account ID.

wall_id

integer

Requested wall ID.

total

integer

Number of matching offers before offset and limit.

offset

integer

Applied offset.

limit

integer or null

Effective maximum requested; null when omitted. It is not the returned count.

offers

array

Offers on this page. An unmatched catalog filter can return an empty array with total: 0.

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

offer_id

integer

Campaign ID.

offer_name

string

Campaign name.

headline

string

Short headline.

description

string

Offer description.

offer_terms

string

Additional terms and conditions. Display these with the event requirements.

offer_type

string

Category label: Undefined, Free, Purchase, Trial, Other, Mobile Apps, Clicks and Videos, Studies or Contest.

offer_category

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.

offer_flow

string

Undefined, Mobile App Store or Web Landing Page.

payment_model

string

Undefined, CPC, CPI, CPE, MRCPE or CPI with MR Funnel.

tag

string

Single campaign badge.

tags

array of strings

Free-form tags in canonical spelling, ordered by name. Empty when none are configured.

user_restricted

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

total_user_reward

number

Sum of events[].user_reward in wall display units. May be fractional.

reward_expiration_date

null

Always null in Get Offers because this static catalog has no user click anchor. Read reward_window_days for the duration.

reward_window_days

integer or null

Campaign-level user-facing reward-window duration in days. Null when no applicable reward window is configured.

multiple_leads

string or null

Configured repeat policy, described below. It does not by itself establish user eligibility.

events

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

event_id

string

Configured RevU event identifier, such as install. May be empty. Matches $event_id$; independent from sid4. No base prefix is generated.

sid4

string

Raw offer/tier identifier used for conversion matching. Matches $sid4$. An empty value can be valid.

event_description

string

What the user must do for this step.

user_reward

number

Wall-currency reward; may be fractional.

payout

number

Publisher payout for the event in USD. Tracking-only events have zero payout.

conversion_type

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.

reward_expiration_date

null

Always null in Get Offers, including events with their own reward-window override.

reward_window_days

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.

event_order

integer or false

Sequence position when ordered; false for an independent event.

is_sequential

boolean

Whether the step is sequential.

is_non_crediting

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:

multiple_leads

Meaning

not_permitted

Repeats are restricted. This is not a guaranteed lifetime limit; tiered offers can credit each event.

once_per_day

Normally counts conversions on the current calendar date.

unlimited

No frequency-count limit; other eligibility rules still apply.

once_per_two_days

Normally counts today and yesterday, not an exact rolling 48-hour interval.

five_per_day

Normally allows five conversions on the current calendar date.

once_per_seven_days

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 enabled: true

When enabled: false

Other fields returned when true

lead_cap

A lead cap is configured. Check the remaining count to determine whether it is reached.

No lead cap. The entire object is {"enabled": false}.

cap_scope: "all_conversions", event_id: null, integer remaining_leads_available, integer current_lead_count, and capping_period.

click_cap

A click cap is configured. Check the remaining count to determine whether it is reached.

No click cap. The entire object is {"enabled": false}.

Integer remaining_clicks_available, integer current_clicks_count, and capping_period: "daily_cst".

publisher_cap

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 {"enabled": false}.

Only cap_scope: "publisher" and capping_period: "daily_cst". No count fields.

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:

  1. lead_cap.enabled == true and lead_cap.remaining_leads_available <= 0.

  2. click_cap.enabled == true and click_cap.remaining_clicks_available <= 0.

  3. publisher_cap.enabled == true.

Combine the conditions with OR. For an offer returned by the API:

const { lead_cap, click_cap, publisher_cap } = offer.capping;
const capReached =
  (lead_cap.enabled === true && lead_cap.remaining_leads_available <= 0) ||
  (click_cap.enabled === true && click_cap.remaining_clicks_available <= 0) ||
  publisher_cap.enabled === true;
const { lead_cap, click_cap, publisher_cap } = offer.capping;
const capReached =
  (lead_cap.enabled === true && lead_cap.remaining_leads_available <= 0) ||
  (click_cap.enabled === true && click_cap.remaining_clicks_available <= 0) ||
  publisher_cap.enabled === true;
const { lead_cap, click_cap, publisher_cap } = offer.capping;
const capReached =
  (lead_cap.enabled === true && lead_cap.remaining_leads_available <= 0) ||
  (click_cap.enabled === true && click_cap.remaining_clicks_available <= 0) ||
  publisher_cap.enabled === true;

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.

curl --get 'https://publishers.revenueuniverse.com/api/v1/offers' \
  --header 'X-API-Key: YOUR_PUBLISHER_API_KEY' \
  --data-urlencode 'wall=YOUR_WALL_ID' \
  --data-urlencode 'filter[capped_only]=false' \
  --data-urlencode 'limit=100'
curl --get 'https://publishers.revenueuniverse.com/api/v1/offers' \
  --header 'X-API-Key: YOUR_PUBLISHER_API_KEY' \
  --data-urlencode 'wall=YOUR_WALL_ID' \
  --data-urlencode 'filter[capped_only]=false' \
  --data-urlencode 'limit=100'
curl --get 'https://publishers.revenueuniverse.com/api/v1/offers' \
  --header 'X-API-Key: YOUR_PUBLISHER_API_KEY' \
  --data-urlencode 'wall=YOUR_WALL_ID' \
  --data-urlencode 'filter[capped_only]=false' \
  --data-urlencode 'limit=100'

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:

{
  "lead_cap": {
    "enabled": false
  },
  "click_cap": {
    "enabled": false
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": false
  },
  "click_cap": {
    "enabled": false
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": false
  },
  "click_cap": {
    "enabled": false
  },
  "publisher_cap": {
    "enabled": false
  }
}

Configured lead and click caps with room left. The offer is not capped out:

{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 25,
    "current_lead_count": 75,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 200,
    "current_clicks_count": 800,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 25,
    "current_lead_count": 75,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 200,
    "current_clicks_count": 800,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 25,
    "current_lead_count": 75,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 200,
    "current_clicks_count": 800,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}

Lead cap reached. Stop showing the offer even though the click cap still has room and the publisher cap is not reached:

{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 0,
    "current_lead_count": 100,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 200,
    "current_clicks_count": 800,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 0,
    "current_lead_count": 100,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 200,
    "current_clicks_count": 800,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 0,
    "current_lead_count": 100,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 200,
    "current_clicks_count": 800,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}

Click cap reached. Stop showing the offer even though the lead cap still has room and the publisher cap is not reached:

{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 25,
    "current_lead_count": 75,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 0,
    "current_clicks_count": 1000,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 25,
    "current_lead_count": 75,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 0,
    "current_clicks_count": 1000,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}
{
  "lead_cap": {
    "enabled": true,
    "cap_scope": "all_conversions",
    "event_id": null,
    "remaining_leads_available": 25,
    "current_lead_count": 75,
    "capping_period": "daily_cst"
  },
  "click_cap": {
    "enabled": true,
    "remaining_clicks_available": 0,
    "current_clicks_count": 1000,
    "capping_period": "daily_cst"
  },
  "publisher_cap": {
    "enabled": false
  }
}

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.

{
  "status": "success",
  "publisher_id": 2,
  "wall_id": 420,
  "total": 1,
  "offset": 0,
  "limit": 100,
  "offers": [
    {
      "offer_id": 12345,
      "offer_name": "Example repeat offer",
      "headline": "",
      "description": "Complete the daily task.",
      "offer_terms": "Complete the stated task and meet the offer requirements.",
      "offer_type": "Purchase",
      "offer_category": 0,
      "reporting": "Instant",
      "total_user_reward": 100,
      "reward_expiration_date": null,
      "reward_window_days": 27,
      "click_url_base": "https://example.com/offer?sid2=USER_ID",
      "preview_url": "",
      "mobile_package_id": "",
      "creatives": [],
      "user_restricted": false,
      "platform": {
        "desktop": true,
        "android": {
          "enabled": false,
          "os_version_min": null,
          "os_version_max": null
        },
        "ios": {
          "enabled": false,
          "os_version_min": null,
          "os_version_max": null
        }
      },
      "countries": [
        "US"
      ],
      "states": [
        "*"
      ],
      "capping": {
        "lead_cap": {
          "enabled": true,
          "cap_scope": "all_conversions",
          "event_id": null,
          "remaining_leads_available": 25,
          "current_lead_count": 75,
          "capping_period": "daily_cst"
        },
        "click_cap": {
          "enabled": true,
          "remaining_clicks_available": 200,
          "current_clicks_count": 800,
          "capping_period": "daily_cst"
        },
        "publisher_cap": {
          "enabled": true,
          "cap_scope": "publisher",
          "capping_period": "daily_cst"
        }
      },
      "conversion_rate": 0.05,
      "epc": 1.23,
      "tag": "",
      "tags": [],
      "events": [
        {
          "event_id": "daily_task",
          "sid4": "raw-task-12345",
          "event_description": "Complete the daily task.",
          "user_reward": 100,
          "payout": 1.0,
          "conversion_type": 1,
          "reward_expiration_date": null,
          "reward_window_days": null,
          "event_order": false,
          "is_sequential": false,
          "is_non_crediting": false
        }
      ],
      "dayparting": {
        "available_start_time": "00:00:00",
        "available_end_time": "23:59:59",
        "weekdays_only": false,
        "timezone": "America/Chicago"
      },
      "multiple_leads": "once_per_day",
      "offer_flow": "Web Landing Page",
      "payment_model": "CPE"
    }
  ]
}
{
  "status": "success",
  "publisher_id": 2,
  "wall_id": 420,
  "total": 1,
  "offset": 0,
  "limit": 100,
  "offers": [
    {
      "offer_id": 12345,
      "offer_name": "Example repeat offer",
      "headline": "",
      "description": "Complete the daily task.",
      "offer_terms": "Complete the stated task and meet the offer requirements.",
      "offer_type": "Purchase",
      "offer_category": 0,
      "reporting": "Instant",
      "total_user_reward": 100,
      "reward_expiration_date": null,
      "reward_window_days": 27,
      "click_url_base": "https://example.com/offer?sid2=USER_ID",
      "preview_url": "",
      "mobile_package_id": "",
      "creatives": [],
      "user_restricted": false,
      "platform": {
        "desktop": true,
        "android": {
          "enabled": false,
          "os_version_min": null,
          "os_version_max": null
        },
        "ios": {
          "enabled": false,
          "os_version_min": null,
          "os_version_max": null
        }
      },
      "countries": [
        "US"
      ],
      "states": [
        "*"
      ],
      "capping": {
        "lead_cap": {
          "enabled": true,
          "cap_scope": "all_conversions",
          "event_id": null,
          "remaining_leads_available": 25,
          "current_lead_count": 75,
          "capping_period": "daily_cst"
        },
        "click_cap": {
          "enabled": true,
          "remaining_clicks_available": 200,
          "current_clicks_count": 800,
          "capping_period": "daily_cst"
        },
        "publisher_cap": {
          "enabled": true,
          "cap_scope": "publisher",
          "capping_period": "daily_cst"
        }
      },
      "conversion_rate": 0.05,
      "epc": 1.23,
      "tag": "",
      "tags": [],
      "events": [
        {
          "event_id": "daily_task",
          "sid4": "raw-task-12345",
          "event_description": "Complete the daily task.",
          "user_reward": 100,
          "payout": 1.0,
          "conversion_type": 1,
          "reward_expiration_date": null,
          "reward_window_days": null,
          "event_order": false,
          "is_sequential": false,
          "is_non_crediting": false
        }
      ],
      "dayparting": {
        "available_start_time": "00:00:00",
        "available_end_time": "23:59:59",
        "weekdays_only": false,
        "timezone": "America/Chicago"
      },
      "multiple_leads": "once_per_day",
      "offer_flow": "Web Landing Page",
      "payment_model": "CPE"
    }
  ]
}
{
  "status": "success",
  "publisher_id": 2,
  "wall_id": 420,
  "total": 1,
  "offset": 0,
  "limit": 100,
  "offers": [
    {
      "offer_id": 12345,
      "offer_name": "Example repeat offer",
      "headline": "",
      "description": "Complete the daily task.",
      "offer_terms": "Complete the stated task and meet the offer requirements.",
      "offer_type": "Purchase",
      "offer_category": 0,
      "reporting": "Instant",
      "total_user_reward": 100,
      "reward_expiration_date": null,
      "reward_window_days": 27,
      "click_url_base": "https://example.com/offer?sid2=USER_ID",
      "preview_url": "",
      "mobile_package_id": "",
      "creatives": [],
      "user_restricted": false,
      "platform": {
        "desktop": true,
        "android": {
          "enabled": false,
          "os_version_min": null,
          "os_version_max": null
        },
        "ios": {
          "enabled": false,
          "os_version_min": null,
          "os_version_max": null
        }
      },
      "countries": [
        "US"
      ],
      "states": [
        "*"
      ],
      "capping": {
        "lead_cap": {
          "enabled": true,
          "cap_scope": "all_conversions",
          "event_id": null,
          "remaining_leads_available": 25,
          "current_lead_count": 75,
          "capping_period": "daily_cst"
        },
        "click_cap": {
          "enabled": true,
          "remaining_clicks_available": 200,
          "current_clicks_count": 800,
          "capping_period": "daily_cst"
        },
        "publisher_cap": {
          "enabled": true,
          "cap_scope": "publisher",
          "capping_period": "daily_cst"
        }
      },
      "conversion_rate": 0.05,
      "epc": 1.23,
      "tag": "",
      "tags": [],
      "events": [
        {
          "event_id": "daily_task",
          "sid4": "raw-task-12345",
          "event_description": "Complete the daily task.",
          "user_reward": 100,
          "payout": 1.0,
          "conversion_type": 1,
          "reward_expiration_date": null,
          "reward_window_days": null,
          "event_order": false,
          "is_sequential": false,
          "is_non_crediting": false
        }
      ],
      "dayparting": {
        "available_start_time": "00:00:00",
        "available_end_time": "23:59:59",
        "weekdays_only": false,
        "timezone": "America/Chicago"
      },
      "multiple_leads": "once_per_day",
      "offer_flow": "Web Landing Page",
      "payment_model": "CPE"
    }
  ]
}

Performance and creatives

Field

Type

Meaning

reporting

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.

conversion_rate

number or null

Historical network-wide conversion rate from the seven-day statistics.

epc

number or null

Historical network-wide earnings per click from the seven-day statistics.

creatives

array

Objects with url, integer width and integer height.

preview_url

string

Offer preview destination.

mobile_package_id

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.

const clickUrl = new URL(offer.click_url_base);
clickUrl.searchParams.set('sid2', userId);
const clickUrl = new URL(offer.click_url_base);
clickUrl.searchParams.set('sid2', userId);
const clickUrl = new URL(offer.click_url_base);
clickUrl.searchParams.set('sid2', userId);

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:

{"status":"failure","message":"Method Not Allowed","error":{"code":"METHOD_NOT_ALLOWED","message":"Method Not Allowed"}}
{"status":"failure","message":"Method Not Allowed","error":{"code":"METHOD_NOT_ALLOWED","message":"Method Not Allowed"}}
{"status":"failure","message":"Method Not Allowed","error":{"code":"METHOD_NOT_ALLOWED","message":"Method Not Allowed"}}

HTTP

Example or code

Meaning

400

Missing or invalid wall parameter; invalid offer or filter message

A required or optional input is invalid.

401

API key is required

Supply the publisher key.

403

Invalid API key / This API is incompatible with your affiliate account status.

Key or account restriction. Preserve the actual response wording.

404

Invalid or inactive wall / Invalid affiliate

Wall or publisher not available.

404

OFFER_NOT_FOUND

Requested offer does not match the wall and filters.

405

METHOD_NOT_ALLOWED

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

On this page

On this page