API v1 offers + status

Offers API (JSON)

Fetch available offers, filter by country/device/category, paginate results, and check API status.

Method GET Format JSON Version 1.0

Offers API Last updated: 2026-03-16

Overview

Our Offers API returns offers in JSON format with full filtering, pagination, and incremental sync support. You can save this info in your database and sort/filter it however you want.

Rate limit: 10 requests per hour per site credentials.

Request Params

Endpoint /api/v1/offers
Param Required Type Description
site_key Yes String Site public key of your placement.
site_secret Yes String Site secret key of your placement.
type No String Filter by type: offer (default) or multireward. Multireward offers include events array.
limit No Integer Number of offers to return (1-500). Default: 100. Alias: take.
offset No Integer Skip the first N results for pagination. Default: 0. Alias: skip.
country No String ISO 2-letter country code (e.g. US, DE, BR). Returns only offers available in that country.
device No String Filter by device: android, ios, or desktop.
category No String Filter by category name (e.g. games, surveys).
min_payout No Float Minimum payout in USD (e.g. 0.50). Returns only offers with payout >= this value.
updated_since No String ISO 8601 date (e.g. 2026-03-10T00:00:00Z). Returns only offers updated after this date. Useful for incremental sync.
GET REQUEST EXAMPLE
https://www.pro.adswedmedia.com/api/v1/offers?site_key=YOUR_KEY&site_secret=YOUR_SECRET
WITH FILTERS
https://www.pro.adswedmedia.com/api/v1/offers?site_key=YOUR_KEY&site_secret=YOUR_SECRET&country=US&device=android&limit=50&min_payout=0.25

Error Codes

Code HTTP Description
MISSING_CREDENTIALS 400 Both site_key and site_secret are required.
INVALID_CREDENTIALS 401 No site found with the provided key and secret.
SITE_PENDING 403 Site is pending approval. Contact support.
INVALID_TYPE 422 Invalid type value. Accepted: offer, multireward.
INVALID_DATE 422 updated_since must be a valid ISO 8601 date.
RATE_LIMIT_EXCEEDED 429 Rate limit exceeded. Maximum 10 requests per hour.
Error Response Sample
JSON
{ "success": false, "error": { "code": "MISSING_CREDENTIALS", "message": "Both site_key and site_secret are required." } }

Response Format

Content-type application/json
Success Response
{
  "success": true,
  "version": "v1",
  "total": 245,
  "offset": 0,
  "limit": 100,
  "has_more": true,
  "offers": [
    {
      "id": 1,
      "title": "Install Game App",
      "description": "Download and reach level 5",
      "image": "https://www.pro.adswedmedia.com/asset/images/offers/example.jpg",
      "payout": 0.85,
      "currency": "USD",
      "level": "easy",
      "stars": 4,
      "categories": ["games"],
      "countries": ["US", "GB", "CA"],
      "devices": ["android", "ios"],
      "payment_term": "net30",
      "android_min_os": "8.0",
      "ios_min_os": null,
      "tracking_url": "https://www.pro.adswedmedia.com/redirect/manual-offer/1/user/{user_id}/site/YOUR_KEY",
      "updated_at": "2026-03-15T14:30:00+00:00",
      "created_at": "2026-03-01T10:00:00+00:00"
    }
  ]
}
Multireward Response (with events)
Multireward Offer
{
  "id": 42,
  "title": "Reach Level 30",
  "payout": 5.00,
  "events": [
    { "offer_id": 42, "payout": 0.50, "description": "Install" },
    { "offer_id": 42, "payout": 2.00, "description": "Reach Level 10" },
    { "offer_id": 42, "payout": 2.50, "description": "Reach Level 30" }
  ]
}
Response Headers
HeaderDescription
X-Api-VersionCurrent API version (1.0)
X-RateLimit-LimitMaximum requests allowed per hour
X-RateLimit-RemainingRemaining requests in current window
Response Fields
FieldDescription
successtrue on success, false on error.
totalTotal number of offers matching filters (before pagination).
offsetCurrent offset used for pagination.
limitCurrent limit used for pagination.
has_moretrue if more offers are available beyond current page.
payoutPayout in USD (after publisher commission applied).
imageFull URL to the offer image.
countriesArray of ISO 2-letter country codes. Empty array = available worldwide.
devicesArray of devices: android, ios, desktop. Empty = all.
tracking_urlOffer tracking link. Replace {user_id} with your user's ID.
eventsMultireward offers only. Array of milestone events with individual payouts.

Status Endpoint

API Status

Endpoint /api/v1/status

Health check endpoint. Returns API status, offer counts, and your site status. Requires site_key and site_secret.

GET REQUEST
https://www.pro.adswedmedia.com/api/v1/status?site_key=YOUR_KEY&site_secret=YOUR_SECRET
Response
{
  "success": true,
  "status": "operational",
  "version": "1.0",
  "data": {
    "offers_available": 245,
    "multireward_available": 38,
    "site_status": "active",
    "rate_limit_per_hour": 10
  },
  "timestamp": "2026-03-16T10:30:00+00:00"
}

Report API Last updated: 2026-04-03

Fetch traffic and conversion reports for your site. Ideal for server-side integration where you cache and serve offers from your own backend.

Overview

The Report API returns all active offers (regular + multireward) in a single JSON response — no pagination needed. This is the recommended way to integrate if you want to cache offers on your server.

Endpoint
GET https://www.pro.adswedmedia.com/api/v1/reports?site_key={site_key}&site_secret={site_secret}
ParameterRequiredDescription
site_keyYesYour site key from the dashboard
site_secretYesYour site secret from the dashboard

Rate Limit: Same as the standard API. Cache the response on your server to avoid hitting limits.

Request & Response

Response Example
{
  "success": true,
  "offers": [
    {
      "id": "37345660",
      "name": "Download App",
      "description": { "en": "Install and open the app to earn rewards" },
      "payout": 0.50,
      "events": [
        { "eventId": "1", "action": { "en": "Install app" }, "payout": 0.25 },
        { "eventId": "2", "action": { "en": "Complete tutorial" }, "payout": 0.25 }
      ],
      "multiEvent": true,
      "multiComplete": false,
      "trackingType": "CPE",
      "previewUrl": null,
      "icon": "https://demo.adswedmedia.com/asset/images/offers/xxx.jpg",
      "category": "app",
      "country": ["US", "GB"],
      "url": "https://demo.adswedmedia.com/redirect/manual-offer/123/user/[USER_ID]/site/YOUR_KEY",
      "device": ["android", "ios"],
      "dailyCap": null,
      "dailyClickCap": null,
      "epc": 0,
      "cvr": 0
    }
  ]
}
Response Fields
FieldTypeDescription
idstringUnique offer identifier
namestringDisplay name of the offer
descriptionobjectLocalized descriptions { "en": "text" }
payoutnumberTotal reward in USD (after commission)
eventsarrayArray of completion events with individual payouts
multiEventbooleantrue if the offer has multiple payable events
multiCompletebooleantrue if user can complete the offer multiple times
trackingTypestringCPI (install), CPE (event), CPA (action), CPL (lead)
iconstringURL to offer icon/image
categorystringapp, web, survey, game
countryarrayCountry codes where offer is available
urlstringTracking URL — replace [USER_ID] with your click/user ID
devicearraySupported devices: android, ios, pc
dailyCapnumber|nullMax daily conversions (null = unlimited)
Event Object Fields
FieldTypeDescription
eventIdstringEvent identifier
actionobjectLocalized event description { "en": "Install app" }
payoutnumberReward for completing this event (USD)

Implementation Example

Node.js
const axios = require("axios");

const PLACEMENT_ID = "your_site_key";
const API_KEY      = "your_site_secret";

async function fetchOffers() {
  const { data } = await axios.get(
    "https://www.pro.adswedmedia.com/api/v1/reports",
    { params: { site_key: PLACEMENT_ID, site_secret: API_KEY } }
  );

  if (data.success) {
    console.log(`Found ${data.offers.length} offers`);

    data.offers.forEach(offer => {
      // Build tracking URL for each user
      const userId = "user_123";
      const trackingUrl = offer.url.replace("[USER_ID]", userId);

      console.log(`${offer.name}: $${offer.payout} → ${trackingUrl}`);

      // Check for multireward events
      if (offer.multiEvent) {
        offer.events.forEach(ev => {
          console.log(`  Step: ${ev.action.en} → $${ev.payout}`);
        });
      }
    });
  }
}

fetchOffers();
PHP (Laravel)
$response = Http::get("https://www.pro.adswedmedia.com/api/v1/reports", [
    "site_key" => "your_site_key",
    "site_secret"       => "your_site_secret",
]);

$offers = $response->json()["offers"];

foreach ($offers as $offer) {
    $trackingUrl = str_replace("[USER_ID]", $userId, $offer["url"]);
    // Display offer to user...
}
Tracking URL Parameters

Replace [USER_ID] in the tracking URL with your unique click/user identifier. Optionally append &sub1=source&sub2=campaign for additional tracking.