API v4.4 Publisher डैशबोर्डडैशबोर्ड
📡 पब्लिशर इंटीग्रेशन गाइड

FastCoins पब्लिशर API
दस्तावेज़ीकरण

अपनी साइट पर PTC विज्ञापन इंटीग्रेट करने के लिए आपको जो कुछ भी चाहिए — Postback S2S सूचनाएँ और पूरी API संदर्भ सामग्री।

Postback S2S PTC API Bearer Token प्रमाणीकरण PHP उदाहरण मुफ़्त और सार्वजनिक
अवलोकन

FastCoins एक PTC (Paid-To-Click) पब्लिशर नेटवर्क है। हमारे विज्ञापन अपनी साइट पर लगाएँ, आपके उपयोगकर्ता उन्हें देखने पर टोकन इनाम कमाते हैं, और आपको राजस्व का हिस्सा स्वतः मिलता है।

📡
Postback (S2S)
जब कोई उपयोगकर्ता विज्ञापन पूरा करता है तो आपके सर्वर को HTTP GET के ज़रिए सूचना मिलती है। क्लाइंट-साइड कोड के बिना इनाम स्वतः क्रेडिट करने के लिए आदर्श।
🔌
PTC API
उपलब्ध विज्ञापनों को प्रोग्रामेटिक रूप से प्राप्त करें और अपने स्वयं के यूज़र इंटरफ़ेस से दिखाएँ। किसी विजेट को एम्बेड करने की ज़रूरत नहीं।
🪙
कस्टम टोकन
अपना टोकन नाम और कन्वर्ज़न दर कॉन्फ़िगर करें। इनाम स्वतः कन्वर्ट होकर postback से भेजे जाते हैं।
💰
राजस्व विभाजन
उपयोगकर्ता को भुगतान का प्रतिशत आप तय करते हैं। बाकी आपकी पब्लिशर आय है — हर महीने निकासी संभव (1–3 तारीख़)।
🚀
शुरुआत करें

पब्लिशर अकाउंट बनाएँ, सत्यापित करें कि डोमेन आपका है, और समीक्षा के बाद अपने API क्रेडेंशियल प्राप्त करें।

  • 1
    FastCoins.com/publisher_dashboard पर पब्लिशर अकाउंट बनाएँ। आपको साइट का नाम और URL चाहिए होगा।
  • 2
    Domains टैब में डोमेन जोड़ें। हर डोमेन की अपनी API Key, Secret Key, Bearer Token, टोकन कॉन्फ़िगरेशन और postback URL होती है।
  • 3
    अपना postback URL सेट करें — आपके सर्वर पर वह endpoint जो इनाम की सूचनाएँ प्राप्त करता है (नीचे Postback सेक्शन देखें)।
  • 4
    Domains टैब से Bearer Token जनरेट करें। PTC API कॉल की प्रमाणीकरण के लिए ज़रूरी है।
  • 5
    लाइव जाने से पहले यह जाँचने के लिए कि आपका endpoint सही जवाब देता है, Domains टैब से टेस्ट postback भेजें
ℹ️
निकासी: पब्लिशर बैलेंस केवल हर महीने की 1 से 3 तारीख़ तक ही निकाला जा सकता है। अपना कैश-फ़्लो उसी हिसाब से plan करें।
📬
Postback इंटीग्रेशन (S2S)

जब कोई उपयोगकर्ता विज्ञापन देखना पूरा करता है तो आपकी वेबसाइट को भेजी जाने वाली सर्वर-टू-सर्वर सूचना, ताकि आप बिना किसी क्लाइंट-साइड कोड के इनाम स्वतः क्रेडिट कर सकें।

🔐 सुरक्षा आवश्यकताएँ

⚠️
कोई भी इनाम क्रेडिट करने से पहले सोर्स IP और सिग्नेचर की हमेशा जाँच करें। कभी भी केवल पैरामीटर के आधार पर क्रेडिट न करें।
  • अधिकृत सर्वर IP: 62.171.140.250, 2a02:c207:2329:8601::1 — इसे केवल $_SERVER['REMOTE_ADDR'] से मिलाएँ। यह सीधा सर्वर-टू-सर्वर कॉल है, ब्राउज़र रिक्वेस्ट नहीं, हमारा कोई प्रॉक्सी/CDN बीच में नहीं होता; X-Forwarded-For जैसा हेडर क्लाइंट द्वारा भेजा जाता है और उसे बनाना आसान है, इसलिए इस जाँच के लिए उस पर भरोसा न करें।
  • userIp अनिवार्य है, केवल जानकारी के लिए नहीं — यदि वह गायब है या मान्य IP नहीं है तो callback अस्वीकार कर दें। हम हमेशा विज्ञापन पूरा करने वाले दर्शक का असली IP रिज़ॉल्व करके भेजते हैं (हमारी ओर से Cloudflare के ज़रिए) — ठीक इसीलिए, ताकि आप फ़्रॉड डिटेक्शन, IP-आधारित लिमिट और डुप्लिकेट-यूज़र जाँचों के लिए उस पर भरोसा कर सकें — जो endpoint उसे नज़रअंदाज़ करता है वह यह सिग्नल पूरी तरह खो देता है।
  • आवश्यक HTTP रिस्पॉन्स: बिल्कुल ok — लोअरकेस, बिना स्पेस, बिना HTML, HTTP 200
  • सिग्नेचर एल्गोरिद्म (अनुशंसित): signature_sha256 = HMAC-SHA256(subId + transId + reward, secret_key)secret_key HMAC की कुंजी है, मैसेज में जोड़ी नहीं जाती। userIp इसका हिस्सा नहीं है।
  • सिग्नेचर एल्गोरिद्म (पुराना, हर callback में अब भी भेजा जाता है): signature = MD5(subId + transId + reward + secret_key) — मान बिना विभाजक के जोड़े जाते हैं। signature_sha256 आने से पहले बनी इंटीग्रेशन के लिए यह अनिश्चितकाल तक चालू रखा गया है; अगर आप पहले से यही वेरिफ़ाई करते हैं तो कुछ बदलने की ज़रूरत नहीं।
  • 8 दशमलव से ज़्यादा चाहिए? हर callback में reward_precise (10 दशमलव) भी होता है, अपने signature_sha256_precise के साथ = HMAC-SHA256(subId + transId + reward_precise, secret_key) — पूरी तरह वैकल्पिक और अतिरिक्त, उसी तरह गणना, बस ज़्यादा सटीक स्ट्रिंग पर। reward/signature_sha256/signature आपके उपयोग से निरपेक्ष, पहले की तरह ही भेजे जाते रहते हैं।
  • डुप्लिकेट रोकथाम: क्रेडिट करने से पहले हमेशा अपनी DB में transId जाँचें

📋 Postback पैरामीटर (GET)

आपका postback URL ये पैरामीटर HTTP GET से प्राप्त करता है।

पैरामीटर प्रकार आवश्यक विवरण
subIdstringआवश्यकआपके सिस्टम में उपयोगकर्ता की अद्वितीय ID — वह मान जो आपने विजेट/API कॉल में भेजा था
transIdstringआवश्यकअद्वितीय ट्रांज़ैक्शन ID — डुप्लिकेट क्रेडिट रोकने के लिए इसकी हमेशा जाँच करें
rewardfloatआवश्यकआपकी टोकन मुद्रा में इनाम (आपके कॉन्फ़िगर किए token_rate से पहले से कन्वर्ट), 8 दशमलव तक फ़ॉर्मैट किया गया
reward_precisefloatवैकल्पिकreward जैसा ही इनाम, 8 की जगह 10 दशमलव तक फ़ॉर्मैट — जब 8 दशमलव आपके लिए काफ़ी सटीक न हों तब इसका उपयोग करें
reward_namestringआवश्यकआपके डोमेन के लिए कॉन्फ़िगर किया गया टोकन नाम (जैसे POINTS, COINS)
reward_valuefloatआवश्यकreward के समान — bitcotasks संगतता के लिए शामिल
offer_namestringवैकल्पिकपूर्ण हुए विज्ञापन का शीर्षक — लॉगिंग के लिए उपयोगी
offer_typestringवैकल्पिकFastCoins विज्ञापन व्यू के लिए सदैव ptc
payoutfloatवैकल्पिकreward के समान — थर्ड-पार्टी संगतता के लिए शामिल
userIpstringआवश्यकऑफ़र पूरा करने वाले उपयोगकर्ता का असली IP पता, यह callback भेजने से पहले हमारी ओर से Cloudflare के ज़रिए रिज़ॉल्व किया जाता है — यदि यह गायब हो या FILTER_VALIDATE_IP पास न करे तो callback अस्वीकार करें। फ़्रॉड डिटेक्शन, IP-आधारित लिमिट, डुप्लिकेट-यूज़र पहचान, कन्वर्ज़न ऑडिट और एनालिटिक्स के लिए इसका उपयोग करें।
statusintegerआवश्यक1 = इनाम क्रेडिट करें  |  2 = चार्जबैक (इनाम कटौती)
signature_sha256stringआवश्यकsubId + transId + reward का HMAC-SHA256, कुंजी के रूप में secret_key — नए इंटीग्रेशन के लिए अनुशंसित
signature_sha256_precisestringवैकल्पिकsubId + transId + reward_precise का HMAC-SHA256, कुंजी के रूप में secret_key — यह signature_sha256 की जगह तभी वेरिफ़ाई करें जब आप reward_precise भी पढ़ रहे हों
signaturestringआवश्यकपुराना: subId + transId + reward + secret_key को जोड़कर (बिना विभाजक) बना MD5। हर callback में अपरिवर्तित भेजा जाता रहता है — signature_sha256 से पहले बनी इंटीग्रेशन के लिए रखा गया।
testintegerवैकल्पिक1 = डैशबोर्ड से टेस्ट postback — असली इनाम क्रेडिट न करें

🧮 उदाहरण: साइन किया हुआ URL बनाना और सत्यापित करना

पूरा हल किया हुआ उदाहरण, ताकि लाइव जाने से पहले आप अपनी सिग्नेचर गणना को हमारे साथ मिलाकर जाँच सकें। यहाँ इस्तेमाल हुआ सीक्रेट की काल्पनिक है, केवल उदाहरण के लिए।

example
Secret Key (example only, never a real one): demo_secret_do_not_use_9f8e7d6c

Parameters for this conversion:
  subId   = user_12345
  transId = txn_987654321
  reward  = 0.50
  status  = 1
  userIp  = 127.0.0.1

signature_sha256 = HMAC-SHA256(subId + transId + reward, secret_key)
                  = HMAC-SHA256("user_12345" . "txn_987654321" . "0.50", demo_secret_do_not_use_9f8e7d6c)
                  = HMAC-SHA256("user_12345txn_9876543210.50", demo_secret_do_not_use_9f8e7d6c)
                  = df3eafaa3e8cf4fe8fb40c7bed633f34bc7b964bca58d2d691314771a042d59c

signature (legacy) = MD5(subId + transId + reward + secret_key)
                    = MD5("user_12345" . "txn_987654321" . "0.50" . "demo_secret_do_not_use_9f8e7d6c")
                    = MD5("user_12345txn_9876543210.50demo_secret_do_not_use_9f8e7d6c")
                    = d1eb68e41cbd5770de9384c5be8ebb39

Resulting callback URL:
https://yoursite.com/postback.php?subId=user_12345&transId=txn_987654321&reward=0.50&status=1&userIp=127.0.0.1&signature=d1eb68e41cbd5770de9384c5be8ebb39&signature_sha256=df3eafaa3e8cf4fe8fb40c7bed633f34bc7b964bca58d2d691314771a042d59c
⚠️
इस उदाहरण वाले सीक्रेट का उपयोग किसी असली काम के लिए कभी न करें — यह सार्वजनिक है, इस दस्तावेज़ में छपा है। अपने सिग्नेचर अपनी असली Secret Key से बनाएँ जो Domains टैब में है, और उस असली कुंजी को कभी किसी सार्वजनिक जगह (चैट टूल, डॉक्स, पब्लिक रिपो) पर न पेस्ट करें — इसे बिल्कुल पासवर्ड की तरह संभालें। यह उदाहरण संक्षिप्तता के लिए reward_name, reward_value, offer_name, offer_type, payout और test को भी छोड़ देता है — आपके असली callback में ये सब होते हैं, ऊपर की तालिका अनुसार।

📐 वैकल्पिक: 10-दशमलव सटीकता (reward_precise)

वही सीक्रेट, वही callback — बस reward के 8 दशमलवों से ज़्यादा सटीक इनाम। पूरी तरह अतिरिक्त: अगर 8 दशमलव आपके काम के लिए काफ़ी हैं तो इसे छोड़ दें।

example-precise
Same secret key and subId/transId as above, but the underlying reward this
time carries more precision:

  reward          = 0.12345679   (8 decimals, rounded)
  reward_precise  = 0.1234567890 (10 decimals)

signature_sha256_precise = HMAC-SHA256(subId + transId + reward_precise, secret_key)
                          = HMAC-SHA256("user_12345" . "txn_987654321" . "0.1234567890", demo_secret_do_not_use_9f8e7d6c)
                          = 219d2101a528b8585161bd26c3bb80c5de8a6741d60d2f1778eb805a05f7a707

💻 PHP कार्यान्वयन — postback.php

इसे अपने सर्वर पर सेव करें, Domains टैब से अपनी Secret Key सेट करें, फिर पूरा URL अपने डोमेन के Postback URL फ़ील्ड में पेस्ट करें।

postback.php
// ── 1. YOUR SECRET KEY (from Domains tab → Secret Key) ─────
$secret = "";  // ← paste your secret key here

// ── 2. IP VALIDATION (callback source) ──────────────────────
// REMOTE_ADDR only — this call comes straight from our server to
// yours, no browser and no proxy of ours in between, so it's the
// one value here that can't be spoofed by whoever is calling you.
// X-Forwarded-For (or any other header) is attacker-controlled and
// must never be trusted for this check.
$allowed_ips = ['62.171.140.250', '2a02:c207:2329:8601::1'];
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
if (!in_array($ip, $allowed_ips, true)) {
    echo "ERROR: Invalid source IP";
    exit;
}

// ── 3. COLLECT PARAMETERS ───────────────────────────────────
$userId    = $_GET['subId']     ?? null;
$transId   = $_GET['transId']   ?? null;
$status    = $_GET['status']    ?? null;
$isTest    = isset($_GET['test']) && $_GET['test'] == 1;
$userIp    = $_GET['userIp']   ?? null;  // real IP of the ad viewer — required, see step 4

// ── 3b. DYNAMIC PRECISION ────────────────────────────────────
// Prefer reward_precise (10 decimals) when the callback carries it;
// fall back to the standard reward (8 decimals) otherwise. Whichever
// pair is picked, it's verified against its own matching signature in
// step 6 — if that signature is valid, the postback is accepted.
$hasPrecise = isset($_GET['reward_precise'], $_GET['signature_sha256_precise']);
$reward    = $hasPrecise ? $_GET['reward_precise']           : ($_GET['reward'] ?? null);
$signature = $hasPrecise ? $_GET['signature_sha256_precise'] : ($_GET['signature_sha256'] ?? null);

// ── 4. VALIDATE USER IP (required) ──────────────────────────
// userIp is mandatory — this is the real IP of the person who
// completed the offer, already resolved through Cloudflare on our
// end. Reject the callback outright rather than silently accepting
// one without it, since your fraud detection / IP-limit / duplicate-
// user checks depend on this value actually being present and valid.
if (!$userIp || !filter_var($userIp, FILTER_VALIDATE_IP)) {
    echo "ERROR: Invalid user IP";
    exit;
}

// ── 5. VALIDATE REQUIRED PARAMS ─────────────────────────────
if (!$userId || !$transId || $reward === null || !$signature) {
    echo "ERROR: Missing parameters";
    exit;
}

// ── 6. VERIFY SIGNATURE ─────────────────────────────────────
// Only subId + transId + reward go into this hash — userIp is NOT
// part of it. $secret is the HMAC key, not concatenated into the
// message. Don't add userIp here unless a different provider's docs
// explicitly say their signature scheme includes it.
$expected = hash_hmac('sha256', $userId . $transId . $reward, $secret);
if (!hash_equals($expected, $signature)) {
    echo "ERROR: Signature mismatch";
    exit;
}

// ── 7. HANDLE CHARGEBACK (status = 2) ───────────────────────
if ((int)$status === 2) {
    $reward = -abs((float)$reward);  // negative = deduct
}

// ── 8. TEST CALLBACK ─────────────────────────────────────────
// Authenticated and validated like any other callback, but must not
// touch a real balance.
if ($isTest) {
    echo "ok";
    exit;
}

// ── 9. PREVENT DUPLICATES, CREDIT REWARD & STORE USER IP ──────
// Replace with your actual DB logic.
if (!isTransactionProcessed($transId)) {
    creditUserReward($userId, $reward, $transId);
    // If your credit function only takes these 3 args, store $userIp
    // with the conversion separately, e.g.:
    //   saveConversionIp($transId, $userId, $userIp);
}

// ── 10. REQUIRED RESPONSE ───────────────────────────────────
echo "ok";  // MUST return exactly this, nothing else

🕓 पुराना सत्यापन — MD5

💡
क्या आप signature को MD5 से पहले से वेरिफ़ाई करते हैं? वह हर callback में बिल्कुल अपरिवर्तित भेजा जाता रहता है — यह हिस्सा केवल संदर्भ के लिए है। कोई कार्रवाई ज़रूरी नहीं। नए इंटीग्रेशन को ऊपर दिए signature_sha256 का उपयोग करना चाहिए।
postback-legacy.php
$signature = $_GET['signature'] ?? null;
$expected  = md5($userId . $transId . $reward . $secret);
if (!hash_equals($expected, $signature)) {
    echo "ERROR: Signature mismatch";
    exit;
}
// ...same IP check, userIp check, and crediting logic as the main example above.

🔀 Callback फ़्लो

  • 1
    Callback प्राप्त हुआ
  • 2
    REMOTE_ADDR को IP व्हाइटलिस्ट से मिलाएँ
  • 3
    पैरामीटर पढ़ें, userIp सहित
  • 4
    userIp सत्यापित करें — गायब हो या मान्य IP न हो तो अस्वीकार करें
  • 5
    बाकी आवश्यक पैरामीटर सत्यापित करें
  • 6
    सिग्नेचर वेरिफ़ाई करें
  • 7
    status जाँचें — 2 होने पर चार्जबैक के रूप में लागू करें
  • 8
    यदि test=1 है तो कुछ क्रेडिट किए बिना ok लौटाएँ
  • 9
    डुप्लिकेट क्रेडिट रोकने के लिए transId को अपनी DB से मिलाएँ
  • 10
    इनाम क्रेडिट या रिवर्स करें और कन्वर्ज़न के साथ userIp सेव करें
  • 11
    ok लौटाएँ

संभावित रिस्पॉन्स:

  • ok — callback संसाधित (या टेस्ट callback के रूप में मान्य)
  • ERROR: Invalid source IP
  • ERROR: Invalid user IP
  • ERROR: Missing parameters
  • ERROR: Signature mismatch
आवश्यक रिस्पॉन्स: HTTP 200 लौटाएँ जिसका बॉडी बिल्कुल ok हो — बिना स्पेस, बिना नई लाइन, बिना HTML।
⚠️
फ़ेल हुए postback आपके डैशबोर्ड के Postback Logs टैब से दोबारा भेजे जा सकते हैं। अपने endpoint को हमेशा idempotent बनाएँ — एक ही transId के लिए बार-बार कॉल करना सुरक्षित रहे।
💡
पहले टेस्ट करें: लाइव जाने से पहले अपना endpoint जाँचने के लिए Domains टैब के Test Postback बटन का उपयोग करें। टेस्ट postback में test=1 होता है — उनके लिए क्रेडिट छोड़ दें।
🔌
PTC API — विज्ञापन प्रोग्रामेटिक रूप से प्राप्त करें

उपलब्ध PTC विज्ञापनों को REST API से क्वेरी करें और अपने स्वयं के यूज़र इंटरफ़ेस से रेंडर करें। किसी विजेट को एम्बेड करने की ज़रूरत नहीं।

🌐 Endpoint

GET https://FastCoins.com/api/[API_KEY]/[USER_ID]/[USER_IP]/[DEVICE]
सेगमेंटविवरण
API_KEYआपके डोमेन की API Key — आपके Publisher डैशबोर्ड के Domains टैब में मिलती है
USER_IDआपके सिस्टम में उपयोगकर्ता की अद्वितीय पहचान। Postback में subId के रूप में लौटाया जाता है
USER_IPउपयोगकर्ता का असली IP पता — विज्ञापन टारगेटिंग और फ़्रॉड रोकथाम के लिए उपयोगी। क्लाइंट का असली IP भेजें
DEVICEठीक desktop या mobile — कोई तीसरा मान नहीं। टैबलेट (iPad, Android टैबलेट) mobile गिने जाते हैं। विज़िटर का असली डिवाइस तब आवश्यक हो जाता है जब कोई भी विज्ञापनदाता डिवाइस-टारगेटेड कैंपेन चला रहा हो: चूँकि आप यह API अपने ही सर्वर से कॉल करते हैं, आपके सर्वर का User-Agent विज़िटर का नहीं होता, हम उसे आपके लिए नहीं पहचान सकते — आपको स्वयं पहचान कर आगे भेजना होगा। desktop/mobile के अलावा कुछ भी भेजना (सीधे "tablet" लिखना भी) इसे न भेजने जैसा ही माना जाता है — स्वयं इसे mobile पर मैप करें। ऐसे में यह मान गायब या ग़लत स्पेलिंग वाला रिक्वेस्ट HTTP 400 लौटाता है।
⚠️
महत्वपूर्ण बदलाव: यदि आपका इंटीग्रेशन अभी [DEVICE] नहीं भेजता तो अभी जोड़ दें। आज यह चुपचाप नज़रअंदाज़ किया जाता है, लेकिन डिवाइस टारगेटिंग लाइव होते ही HTTP 400 लौटाना शुरू कर देगा — ऐसा होने और आपका फ़ीड टूटने का इंतज़ार न करें।

🔑 प्रमाणीकरण — Bearer Token

⚠️
हर API रिक्वेस्ट को Authorization हेडर में एक Bearer Token चाहिए। हर डोमेन के लिए Domains टैब से एक जनरेट करें ("Bearer Token" के बगल का 🔄 बटन)।
Authorization: Bearer [YOUR_BEARER_TOKEN]
ℹ️
यदि किसी डोमेन का Bearer Token कॉन्फ़िगर नहीं है तो प्रमाणीकरण छोड़ दिया जाता है। प्रोडक्शन वातावरण के लिए हमेशा एक सेट करें।

💻 PHP उदाहरण

get-ads.php
// ── YOUR CREDENTIALS (from Domains tab) ─────────────────────
$apiKey      = 'YOUR_API_KEY';
$bearerToken = 'YOUR_BEARER_TOKEN';

// ── USER DATA ────────────────────────────────────────────────
$userId = $_SESSION['user_id'];  // your user's unique ID
// REMOTE_ADDR by default — it's the one value here that can't be
// spoofed by the visitor. Only read a proxy header instead (e.g.
// CF-Connecting-IP) if your own server sits behind a reverse proxy
// you control and trust — never a client-supplied header like
// X-Forwarded-For, which the visitor's own browser can set to
// anything.
$userIp = $_SERVER['REMOTE_ADDR'] ?? '';

// Required once any advertiser runs a device-targeted campaign — this
// script call happens during the visitor's own page load, so THIS
// server's incoming User-Agent is theirs. Don't skip this: a call from a
// background job/cron with no real visitor attached has no correct value
// to send here.
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$device    = preg_match('/Mobi|Android|iPhone|iPod|iPad|BlackBerry|IEMobile|Opera Mini/i', $userAgent)
    ? 'mobile' : 'desktop';

// ── BUILD URL ────────────────────────────────────────────────
$url = 'https://FastCoins.com/api/' . $apiKey
     . '/' . urlencode($userId)
     . '/' . urlencode($userIp)
     . '/' . $device;

// ── CURL REQUEST ─────────────────────────────────────────────
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 10,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $bearerToken,
        'Accept: application/json',
    ],
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$data = json_decode($response, true);

// ── HANDLE RESPONSE ──────────────────────────────────────────
if ($httpCode === 200 && $data['status'] === '200') {
    foreach ($data['data'] as $ad) {
        // $ad['url'] already contains the user subId encoded
        echo '<a href="' . htmlspecialchars($ad['url']) . '" target="_blank">';
        echo htmlspecialchars($ad['title']);
        echo ' — ' . $ad['reward'] . ' ' . $ad['currency_name'];
        echo '</a><br>';
    }
} else {
    echo 'No ads available.';
}

📦 रिस्पॉन्स फ़ॉर्मैट

सफल रिस्पॉन्स इस JSON संरचना के साथ HTTP 200 लौटाते हैं:

{ "status": "200", "message": "success", "data": [ { "id": "123", "image": "https://FastCoins.com/banners/ad.png", "title": "Visit Our Site & Earn", "description": "Watch this ad for 30 seconds", "duration": "30", "reward": "100.0000", "currency_name": "Coins", "url": "https://FastCoins.com/view/abc123", "boosted_campaign": false, "ad_type": "Iframe" } ] }
फ़ील्डप्रकारविवरण
idstringविज्ञापन की अद्वितीय पहचान
imagestringविज्ञापन बैनर इमेज का पूरा URL — खाली हो सकता है
titlestringदिखाने वाला शीर्षक — यह अपने उपयोगकर्ताओं को दिखाएँ
descriptionstringविज्ञापन का संक्षिप्त विवरण
durationstringआवश्यक देखने का समय (सेकंड): 2, 30 या 60
rewardfloatआपके डोमेन की टोकन मुद्रा में इनाम की राशि (पहले से कन्वर्ट)
currency_namestringआपके डोमेन के लिए कॉन्फ़िगर किया गया टोकन नाम (जैसे COINS, USDT)
urlstringविज्ञापन देखने के लिए उपयोगकर्ता को यहाँ रीडायरेक्ट करें। पूरा होने पर postback स्वतः फायर होता है। उपयोगकर्ता का subId पहले से एनकोड है।
boosted_campaignbooleanक्या यह प्रमोटेड विज्ञापन है — अपने यूज़र इंटरफ़ेस में ऐसे विज्ञापनों को हाइलाइट करने पर विचार करें
ad_typestringIframe = फ़्रेम के अंदर चलता है  |  Redirect = उपयोगकर्ता विज्ञापनदाता के पेज पर जाता है

⚠️ एरर कोड

एरर रिस्पॉन्स वही JSON संरचना साझा करते हैं, बस status फ़ील्ड 200 के अलावा होता है।

HTTPstatusकारण और समाधान
401401अमान्य API key — URL में API_KEY सेगमेंट जाँचें, या डोमेन के अपेक्षित होने पर Bearer Token गायब है
403403Bearer Token मेल नहीं खाता — नया जनरेट करें और Domains टैब में अपडेट करें
400400अमान्य USER_ID फ़ॉर्मैट — अल्फ़ान्यूमेरिक होना चाहिए (a-z, 0-9, _, -, .), अधिकतम 255 वर्ण
400400DEVICE सेगमेंट गायब या अमान्य — केवल डिवाइस टारगेटिंग लाइव होने के बाद लौटाया जाता है। बिल्कुल desktop या mobile होना चाहिए
500500आंतरिक सर्वर त्रुटि — message फ़ील्ड में डिबग विवरण हैं। बना रहे तो सपोर्ट से संपर्क करें।
🔄
इंटीग्रेशन फ़्लो

API कॉल से लेकर आपकी साइट पर इनाम क्रेडिट होने तक का पूरा फ़्लो।

📡 API + Postback फ़्लो

आपकी साइट कॉल करती है
GET /api/…
उपयोगकर्ता विज्ञापन के url पर क्लिक करता है
उपयोगकर्ता FastCoins.com पर विज्ञापन देखता है
FastCoins फायर करता है
GET postback.php
सत्यापन और इनाम क्रेडिट
ok लौटाएँ

🧩 विजेट एम्बेड (विकल्प)

अगर आप API का उपयोग नहीं करना चाहते तो विजेट को iframe के रूप में एम्बेड करें — यह सब कुछ स्वतः संभाल लेता है, और इसकी स्टाइल आपके पेज के बाकी हिस्सों से अलग-थलग रहती है।

widget-embed.php
<iframe src="https://fastcoins.click/widget-embed.php?api_key=YOUR_API_KEY&sub_id={USER_ID}"
    style="width:100%;height:640px;border:none;" loading="lazy"></iframe>
ℹ️
YOUR_API_KEY की जगह अपने डोमेन की API Key और {USER_ID} की जगह मौजूदा उपयोगकर्ता की ID डालें (सर्वर-साइड रेंडर की हुई)। विजेट उपलब्ध विज्ञापन और टास्क इनलाइन दिखाता है और पूरा होने पर postback स्वतः फायर करता है। अपने लेआउट के हिसाब से iframe लंबा या छोटा करने के लिए style में दिया 640px बदलें।
⚠️
हर असली उपयोगकर्ता के लिए एक ही अद्वितीय sub_id (= {USER_ID}) — सफ़िक्स जोड़कर बाँटना मना है। आपके हर उपयोगकर्ता की पहचान एक ही स्थिर id से होनी चाहिए। फ़ॉर्मैट आप चुनते हैं — कोई अपारदर्शी id, यूज़रनेम, ईमेल (जैसे ABD01230A23, [email protected]) — लेकिन एक असली उपयोगकर्ता हमेशा के लिए ठीक एक id से मैप होता है।

अनुमत नहीं: एक बेस id लेकर उसमें संख्यात्मक सफ़िक्स जोड़कर एक ही असली व्यक्ति से कई "उपयोगकर्ता" बनाना। पहचान सेपरेटर-निरपेक्ष है — यह अंत में लगी और उसके बाद अंक आने वाली -, _ या . हटा देता है और बाकी हिस्से को उपयोगकर्ता की पहचान मानता है। इनमें से कोई भी जोड़ी अस्वीकार की जाती है:
  • 123-1 & 123-2
  • ABC_1 & ABC_2
  • A23-23 & A23-24
  • order.1 & order.2
बिना सेपरेटर वाला लगातार id एक ही अद्वितीय पहचान है और कभी विभाजित नहीं होता (ABD01230A23, 1001, [email protected] — सब ठीक हैं)।

पैटर्न पकड़े जाने पर API फिर भी ok जवाब देता है लेकिन एक मैसेज लौटाता है कि यह id अनुमत नहीं है और कोई इनाम क्रेडिट नहीं होता; कोशिश फ़्रॉड के रूप में लॉग होती है।
टास्क (CPA) — विज्ञापनदाताओं के लिए

एक टास्क बनाएँ (जैसे "मेरी साइट पर रजिस्टर करें"), N पूर्णताओं के लिए फंड डालें, और हर एक की पुष्टि साइन किए हुए सर्वर-टू-सर्वर postback से करें। आपका postback आते ही उपयोगकर्ता को स्वतः क्रेडिट मिल जाता है — कोई मैन्युअल मंज़ूरी नहीं, कोई प्लेटफ़ॉर्म रोक नहीं।

📡 यह कैसे काम करता है

आप टास्क बनाते हैं
/create-task
उपयोगकर्ता आपका URL cka_cid के साथ खोलता है
उपयोगकर्ता कार्य पूरा करता है
आपका सर्वर हमारा postback कॉल करता है
उपयोगकर्ता को तुरंत क्रेडिट

1) Postback URL

GET https://fastcoins.click/webhooks/task-postback.php?cka_cid={CLICK_ID}&sign={SIGN}
  • cka_cid — वह click id जो हमने उपयोगकर्ता के शुरू करते समय आपकी डेस्टिनेशन URL में जोड़ा था (your-url?cka_cid=…)। इसे बिना बदले वापस भेजें।
  • signhash_hmac('sha256', $cka_cid, $task_secret) (लोअरकेस हेक्स)। हर टास्क का सीक्रेट Create Task → My Tasks में दिखता है।

2) सिग्नेचर

// PHP
$sign = hash_hmac('sha256', $cka_cid, $task_secret);

// Node.js
const sign = crypto.createHmac('sha256', taskSecret).update(ckaCid).digest('hex');

# Python
import hmac, hashlib
sign = hmac.new(task_secret.encode(), cka_cid.encode(), hashlib.sha256).hexdigest()
ℹ️
Postback केवल आपके व्हाइटलिस्ट किए हुए सर्वर IP कॉल कर सकते हैं (हर टास्क के लिए कॉन्फ़िगर)। कोई अन्य IP मान्य सिग्नेचर के बावजूद 403 पाता है। यह और HMAC — पूरी प्रामाणिकता का मॉडल यही है। अपना सीक्रेट सुरक्षित रखें।
⚠️
आपके postback पर क्रेडिट तुरंत और अंतिम है — कोई चार्जबैक नहीं। पूर्णता उसी क्षण क्रेडिट होती है जब आपका साइन किया postback वेरिफ़ाई होता है, क्योंकि आपका postback ही यह सबूत है कि उपयोगकर्ता ने काम किया। सुनिश्चित करें कि आपकी अपनी फ़्रॉड जाँचें postback कॉल करने से पहले चलें: भेजने के बाद वह पलट नहीं सकता। केवल उन्हीं पूर्णताओं के लिए कॉल करें जिनके असली होने का आपको भरोसा हो।

3) वैकल्पिक एनालिटिक्स पिक्सेल

अपने खुद के एनालिटिक्स के लिए इसे अपने कन्वर्ज़न पेज पर लगाएँ। यह कभी क्रेडिट नहीं करता — क्रेडिट करने वाली एकमात्र चीज़ ऊपर वाला postback है।

<img src="https://fastcoins.click/task-pixel.php?cid={CLICK_ID}" width="1" height="1" alt="">
💡
सर्वोत्तम प्रथाएँ

एक विश्वसनीय, सुरक्षित और अधिक आय देने वाले इंटीग्रेशन के लिए सुझाव।

⚡ परफ़ॉर्मेंस

  • API रिस्पॉन्स को प्रति उपयोगकर्ता कम से कम 60 सेकंड कैश करें। हर पेज लोड पर API कॉल न करें — विज्ञापन अधिकतम कुछ मिनट में एक बार बदलते हैं।
  • उपयोगकर्ता का असली IP भेजें। डिफ़ॉल्ट रूप से REMOTE_ADDR उपयोग करें — यही एकमात्र मान है जिसे विज़िटर बना नहीं सकता। प्रॉक्सी हेडर (जैसे CF-Connecting-IP) तभी पढ़ें जब आपका सर्वर खुद उस रिवर्स प्रॉक्सी के पीछे हो जिसे आप नियंत्रित करते और भरोसा करते हैं; क्लाइंट-सप्लाइड हेडर जैसे X-Forwarded-For कभी नहीं। ग़लत IP विज्ञापन टारगेटिंग की गुणवत्ता घटाते हैं।
  • अगर हमारी API कभी धीमी हो जाए तो धीमे पेज लोड रोकने के लिए अपने cURL कॉल पर 10 सेकंड का टाइमआउट सेट करें

🔒 सुरक्षा

  • अपनी Secret Key क्लाइंट-साइड कोड या सार्वजनिक रिपॉज़िटरी में कभी उजागर न करें। वह केवल सर्वर-साइड पर सिग्नेचर सत्यापन के लिए उपयोग होती है।
  • क्रेडिट करने से पहले अपनी डेटाबेस से हमेशा transId जाँचें — इससे गलती से दोबारा भेजे गए postback से होने वाले डुप्लिकेट इनाम रुक जाते हैं।
  • कोई भी postback संसाधित करने से पहले सोर्स IP सत्यापित करें। रिक्वेस्ट केवल इनसे स्वीकार करें: 62.171.140.250 या 2a02:c207:2329:8601::1.
  • अपने postback endpoint के लिए HTTPS उपयोग करें। HTTP endpoint ब्लॉक हो सकते हैं।
  • हर असली उपयोगकर्ता के लिए एक ही अद्वितीय sub_id भेजें। किसी बेस id पर संख्यात्मक सफ़िक्स न जोड़ें (123-1/123-2, ABC_1/ABC_2, order.1/order.2) — कोई भी सेपरेटर (- _ .) फ़्रॉड माना जाता है और बिना इनाम अस्वीकार हो जाता है। ऊपर दिया नियम देखें।

💰 राजस्व

  • बूस्टेड विज्ञापन (boosted_campaign: true) ज़्यादा देते हैं — क्लिक दर बढ़ाने के लिए अपने यूज़र इंटरफ़ेस में इन्हें हाइलाइट करें।
  • लंबे विज्ञापन (60 सेकंड) छोटे विज्ञापनों (2 सेकंड) से काफ़ी ज़्यादा देते हैं। जब उपयोगकर्ता जुड़ाव अधिक हो तो इन्हें प्राथमिकता दें।
  • उपयोगकर्ता हिस्सा संतुलित रखें — ज़्यादा भुगतान ज़्यादा सक्रिय उपयोगकर्ता खींचता है; कम भुगतान आपका अपना मार्जिन बढ़ाता है।
  • निकासी हर महीने की 1 से 3 तारीख़ तक खुली रहती है — अपने कैलेंडर में नोट करें।

🐛 डिबगिंग

  • यह जाँचने के लिए कि आपका endpoint HTTP 200 के साथ बिल्कुल ok लौटाता है, Domains टैब के Test Postback बटन का उपयोग करें।
  • हर postback कोशिश के पूरे HTTP रिस्पॉन्स के लिए Postback Logs टैब देखें — उसमें स्टेटस कोड और सर्वर के जवाब दिखते हैं।
  • फ़ेल हुए postback Logs टैब से एक-एक करके या बैच में दोबारा भेजे जा सकते हैं। कोई डेटा कभी स्थायी रूप से नहीं खोता।
  • अगर सिग्नेचर हमेशा फ़ेल हो: signature_sha256 के लिए जाँचें कि secret_key HMAC कुंजी के रूप में दी गई है (मैसेज में नहीं जुड़ी) और आप subId + transId + reward को बिना विभाजक हैश करते हैं; पुराने signature के लिए जाँचें कि आप subId + transId + reward + secret को बिना विभाजक जोड़ते हैं। दोनों ही स्थिति में सुनिश्चित करें कि reward GET पैरामीटर वाली सटीक स्ट्रिंग से मेल खाता है (बिना राउंडिंग)।
  • यदि आप signature_sha256_precise वेरिफ़ाई कर रहे हैं: उसका हैश reward_precise पर होता है, reward पर नहीं — दोनों फ़ील्ड को ग़लत सिग्नेचर से मिलाना यहाँ की सबसे आम गलती है।

कमाना शुरू करने के लिए तैयार?

2 मिनट से भी कम में अपना पब्लिशर अकाउंट बनाएँ, फिर शुरू करने के लिए अपना डोमेन वेरिफ़ाई करें।

Publisher डैशबोर्ड खोलें →
✓ क्लिपबोर्ड पर कॉपी हो गया