Private Offers
π Traffic Quality Reports
FreeCash CPI Quality Reports
D0 Quality by Country
Note: All dates and times are in UTC timezone. Quality goals: D0 β₯2.5%
π Offers API v1
Programmatic access to your offers with pre-built tracking links
Your API Key
Loadingβ¦
β οΈ Keep this private. Rotating generates a new key and permanently invalidates the old one.
The TapRain Offers API lets you programmatically retrieve every offer available to your account β complete with pre-built tracking links that already contain your user ID. Use it to power custom offer pages, mobile apps, content lockers, or automated traffic routing.
Every offer includes a ready-to-use link with your user ID already encoded inside. Just serve it β no extra work.
Payouts are returned after your revenue-share percentage is applied, including any heightened payouts set for your account.
Filter by country, device, partial name, offer type β or search "freecash" to get all FreeCash variants at once.
https://taprain.com/api/offers/developer
Authentication
Include your API key on every request using one of these two headers:
X-API-Key: your_api_key_here
Authorization: Bearer your_api_key_here
Endpoints
/api/offers/developer/offers
Fetch available offers
Returns all offers your account can access: public offers plus any private offers you've been approved for. Each offer includes a pre-built tracking URL with your user ID.
/api/offers/developer/api-key
Get your API key (session auth)
/api/offers/developer/rotate-api-key
Rotate API key (session auth)
Query Parameters β GET /developer/offers
| Parameter | Type | Default | Description |
|---|---|---|---|
countries |
string | all |
Comma-separated ISO 3166-1 alpha-2 codes. Returns only offers available in at least one of the listed countries. e.g. US Β· US,GB,CA Β· DE,AT,CH
|
devices |
string | all |
Comma-separated device types. Returns offers available on at least one listed device. Allowed values: android Β· ios Β· desktop
|
search |
string | none |
Case-insensitive partial match against offer name and description. e.g. freecash returns "FreeCash CPI", "FreeCash SOI", "FreeCash CPI B"
|
type |
string | all |
Filter by conversion type. Allowed: cpi Β· cpe Β· soi Β· rev-share Β· all
|
limit |
integer | 50 | Maximum offers to return per request. Range: 1β200. |
offset |
integer | 0 | Number of offers to skip for pagination. Combine with limit to page through large result sets. |
domain |
string | raintrks.com |
Tracking domain embedded in all returned tracking_url values.Allowed: raintrks.com Β· rainawards.com Β· raintrcks.com Β· taptrcks.com
|
include_api_offers |
boolean | false |
When true, also fetches live offers from the direct offer network in addition to your approved DB offers.β‘ Adds ~2β4 s of latency per request. |
Response Schema
{
"success": true,
"total": 14, // total matching offers (before pagination)
"offset": 0,
"limit": 50,
"has_more": false, // true when more pages exist
"offers": [
{
"id": "freecash-cpi",
"name": "FreeCash CPI",
"description": "Sign up on FreeCash and complete the install",
"conversion": "Install app and create account",
"payout": 8.50, // after your rev-share %. null for RevShare offers
"currency": "USD",
"payout_type": "CPA", // or e.g. "RevShare (85/15)"
"image_url": "https://taprain.com/previews/freecash.png",
"tracking_url": "https://raintrks.com/r/eyJ0IjoiZnJlZWNhc2...",
"countries": ["US","GB","CA","AU","DE","FR","NL","BE","SE"],
"devices": ["android","ios"],
"network": "Direct Offers",
"daily_cap": null, // null = no cap; integer when capped
"is_private": true,
"is_approved": true,
"source": "database" // "database" | "network"
}
]
}
Offer Object Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique offer identifier. Use this to reference a specific offer. |
name | string | Human-readable display name suitable for showing to end users. |
description | string | Brief offer description. |
conversion | string | The specific action a user must complete to generate a conversion. |
payout | number | null | Your payout per conversion in USD, after your revenue-share percentage. null for RevShare offers. |
payout_type | string | "CPA" for flat-rate. "RevShare (85/15)" for revenue-sharing (your % / house %). |
image_url | string | null | Absolute URL of the offer icon. Can be used directly in <img> tags. |
tracking_url | string | Ready-to-use tracking link. Your user ID is encoded inside. Send users directly to this URL β do not modify it. |
countries | string[] | ISO 3166-1 alpha-2 codes of countries where this offer is available. |
devices | string[] | Supported device types. Values: android, ios, desktop. |
daily_cap | number | null | Maximum conversions per day. null means no cap. |
is_private | boolean | Whether this offer required an approval request to access. |
source | string | "database" = curated offer with heightened payout support. "network" = live network offer (requires include_api_offers=true). |
Error Responses
X-API-Key header.Code Examples
# Fetch all approved offers curl -X GET "https://taprain.com/api/offers/developer/offers" \ -H "X-API-Key: YOUR_API_KEY" # Filter: US + GB, Android only, CPI type curl -X GET "https://taprain.com/api/offers/developer/offers?countries=US,GB&devices=android&type=cpi" \ -H "X-API-Key: YOUR_API_KEY" # Search for all FreeCash offer variants curl -X GET "https://taprain.com/api/offers/developer/offers?search=freecash" \ -H "X-API-Key: YOUR_API_KEY" # Paginate: page 2 (50 per page) curl -X GET "https://taprain.com/api/offers/developer/offers?limit=50&offset=50" \ -H "X-API-Key: YOUR_API_KEY" # Use a specific tracking domain curl -X GET "https://taprain.com/api/offers/developer/offers?domain=rainawards.com" \ -H "X-API-Key: YOUR_API_KEY"
const API_KEY = 'YOUR_API_KEY'; const BASE_URL = 'https://taprain.com/api/offers/developer'; /** * Fetch offers with optional filters. * @param {Object} filters - { countries, devices, search, type, limit, offset, domain } */ async function getOffers(filters = {}) { const params = new URLSearchParams( Object.fromEntries(Object.entries(filters).filter(([, v]) => v !== undefined && v !== '')) ); const res = await fetch(`${BASE_URL}/offers?${params}`, { headers: { 'X-API-Key': API_KEY } }); if (!res.ok) throw new Error(`API error ${res.status}: ${await res.text()}`); return res.json(); } // ββ Usage examples ββββββββββββββββββββββββββββββββββββββββββββ // All approved offers const { total, offers } = await getOffers(); console.log(`${total} offers available`); // US Android CPI only const cpiUS = await getOffers({ countries: 'US', devices: 'android', type: 'cpi' }); // All FreeCash variants const freecash = await getOffers({ search: 'freecash' }); freecash.offers.forEach(o => console.log(`${o.name} $${o.payout} ${o.tracking_url}`) ); // Fetch all pages (full list) async function getAllOffers(filters = {}) { const all = []; let offset = 0; while (true) { const page = await getOffers({ ...filters, limit: 200, offset }); all.push(...page.offers); if (!page.has_more) break; offset += 200; } return all; }
import requests API_KEY = "YOUR_API_KEY" BASE_URL = "https://taprain.com/api/offers/developer" HEADERS = {"X-API-Key": API_KEY} def get_offers(**filters) -> dict: """Fetch offers with optional keyword filters.""" resp = requests.get(f"{BASE_URL}/offers", params=filters, headers=HEADERS, timeout=15) resp.raise_for_status() return resp.json() # ββ Usage examples ββββββββββββββββββββββββββββββββββββββββββββ # All approved offers data = get_offers() print(f"{data['total']} offers available") # US Android CPI offers only cpi = get_offers(countries="US", devices="android", type="cpi") for offer in cpi["offers"]: print(f"{offer['name']:30s} ${offer['payout']:.2f} {offer['tracking_url']}") # Search: all FreeCash variants freecash = get_offers(search="freecash") print(f"FreeCash variants found: {freecash['total']}") # Offers available in Germany on iOS de_ios = get_offers(countries="DE", devices="ios") def get_all_offers(**filters) -> list: """Paginate through the full offer catalogue.""" all_offers, offset = [], 0 while True: page = get_offers(limit=200, offset=offset, **filters) all_offers.extend(page["offers"]) if not page["has_more"]: break offset += 200 return all_offers
<?php define('TAPRAIN_API_KEY', 'YOUR_API_KEY'); define('TAPRAIN_BASE_URL', 'https://taprain.com/api/offers/developer'); function taprain_get_offers(array $filters = []): array { $url = TAPRAIN_BASE_URL . '/offers'; if ($filters) $url .= '?' . http_build_query($filters); $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 15, CURLOPT_HTTPHEADER => [ 'X-API-Key: ' . TAPRAIN_API_KEY, 'Accept: application/json', ], ]); $body = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($code !== 200) { throw new RuntimeException("API error HTTP $code: $body"); } return json_decode($body, true); } // All approved offers $data = taprain_get_offers(); echo "{$data['total']} offers available\n"; // US + GB CPI on Android $cpi = taprain_get_offers(['countries' => 'US,GB', 'devices' => 'android', 'type' => 'cpi']); foreach ($cpi['offers'] as $offer) { echo "{$offer['name']} \${$offer['payout']} {$offer['tracking_url']}\n"; } // Search: all TesterUp variants $tu = taprain_get_offers(['search' => 'testerup']); // Paginate through everything function taprain_get_all_offers(array $filters = []): array { $all = []; $offset = 0; do { $page = taprain_get_offers(array_merge($filters, ['limit' => 200, 'offset' => $offset])); $all = array_merge($all, $page['offers']); $offset += 200; } while ($page['has_more']); return $all; }
Live API Tester
Build a request and fire it against the real API using your key.