डेवलपर

डेवलपर्स के लिए API

अपने सिस्टम (CRM, ERP, ऑनलाइन स्टोर) को 4pricing से जोड़ें और प्रतिस्पर्धियों की कीमतें, तुलना समूह और अलर्ट सीधे अपने कोड से प्राप्त करें।

बेस URL: https://4pricing.net/api/v1/pricing · OpenAPI विनिर्देश (JSON)

3 चरणों में तेज़ इंटीग्रेशन

अपने ही वेबसाइट पर 4pricing का डेटा देखने का यह सबसे छोटा रास्ता है। आप एक फ़ाइल कॉपी करेंगे, उसमें अपनी कुंजी चिपकाएँगे और उसे अपनी होस्टिंग पर अपलोड कर देंगे — न कोई फ़्रेमवर्क, न कोई इंस्टॉलेशन।

आपको क्या चाहिए
  • एक सक्रिय 4pricing सदस्यता (API हर प्लान में शामिल है)।
  • PHP वाली होस्टिंग — लगभग हर शेयर्ड होस्टिंग में यह होती है (cPanel, Plesk और ऐसे ही अन्य)।
  • फ़ाइल अपलोड करने का कोई तरीका: आपकी होस्टिंग का फ़ाइल मैनेजर या कोई FTP प्रोग्राम।
  1. चरण 1: अपनी API कुंजी बनाएँ

    panel.4pricing.net में साइन इन करें और मूल्य निगरानी → API और कुंजियाँ खोलें।

    “कुंजी बनाएँ” पर क्लिक करें, उसे कोई नाम दें (जैसे “मेरी दुकान”) और prc_live_ से शुरू होने वाली कुंजी कॉपी कर लें। वह केवल एक बार दिखाई जाती है — खो जाए तो नई कुंजी बनाएँ और पुरानी को रद्द कर दें।

    पैनल में API और कुंजियाँ खोलें →

  2. चरण 2: तैयार फ़ाइल कॉपी करें और अपनी कुंजी चिपकाएँ

    नीचे दी गई PHP फ़ाइल को किसी टेक्स्ट एडिटर (Notepad, TextEdit या VS Code) में कॉपी करें और उसे 4pricing-prices.php नाम से सेव करें।

    php4pricing-prices.php
    <?php
    // =====================================================================
    // यहाँ अपनी API कुंजी चिपकाएँ (panel.4pricing.net → API और कुंजियाँ), उद्धरण-चिह्नों के बीच
    $apiKey = 'PASTE_YOUR_KEY_HERE';
    // =====================================================================
    
    header('Content-Type: text/html; charset=utf-8');
    
    function h($text) { return htmlspecialchars((string) $text, ENT_QUOTES, 'UTF-8'); }
    function money($cents) {
        if ($cents === null) { return '—'; }
        return number_format($cents / 100, 2, '.', ',');
    }
    
    if (strpos($apiKey, 'prc_') !== 0) {
        exit('<p>' . h('API कुंजी नहीं मिली: फ़ाइल खोलें और चिह्नित पंक्ति पर अपनी कुंजी चिपकाएँ।') . '</p>');
    }
    
    $ch = curl_init('https://4pricing.net/api/v1/pricing/groups/');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_USERAGENT => 'my-shop-integration/1.0',
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTPHEADER => ['X-API-Key: ' . $apiKey, 'Accept: application/json'],
    ]);
    $body = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    if ($body === false) {
        exit('<p>' . h('4pricing से कनेक्ट नहीं हो सका:' . ' ' . curl_error($ch)) . '</p>');
    }
    if ($status !== 200) {
        $hints = [401 => 'API कुंजी गलत है या रद्द कर दी गई है', 402 => 'खाते में सक्रिय 4pricing सदस्यता नहीं है (या क्रेडिट पर्याप्त नहीं हैं)', 429 => 'एक मिनट में बहुत ज़्यादा अनुरोध, एक मिनट बाद फिर कोशिश करें'];
        $hint = isset($hints[$status]) ? ' — ' . $hints[$status] : '';
        exit('<p>' . h('4pricing ने त्रुटि के साथ जवाब दिया' . ' ' . $status . $hint) . '</p><pre>' . h($body) . '</pre>');
    }
    
    $groups = json_decode($body, true);
    $verdicts = [
        'cheapest' => 'आप सबसे सस्ते हैं',
        'too_cheap' => 'बाज़ार से काफ़ी सस्ता — आप कीमत बढ़ा सकते हैं',
        'competitive' => 'प्रतिस्पर्धी कीमत',
        'too_expensive' => 'ज़्यादातर प्रतिस्पर्धियों से महँगा',
        'no_competitors' => 'अभी किसी प्रतिस्पर्धी की कीमत नहीं है',
        'no_own_price' => 'आपकी कीमत उपलब्ध नहीं है',
    ];
    
    echo '<!doctype html><html><head><meta charset="utf-8"><title>' . h('मेरे निगरानी किए जा रहे उत्पाद') . '</title>';
    echo '<style>body{font-family:Arial,sans-serif;margin:24px}table{border-collapse:collapse}';
    echo 'th,td{border:1px solid #ddd;padding:6px 10px;text-align:left}th{background:#f5f5f5}</style>';
    echo '</head><body><h1>' . h('मेरे निगरानी किए जा रहे उत्पाद') . '</h1>';
    
    if (!$groups) {
        echo '<p>' . h('आपके पास अभी कोई तुलना किया हुआ उत्पाद नहीं है।') . '</p>';
    } else {
        echo '<table><tr><th>' . h('उत्पाद') . '</th><th>' . h('SKU') . '</th>';
        echo '<th>' . h('आपकी कीमत') . '</th><th>' . h('सबसे सस्ता प्रतिस्पर्धी') . '</th>';
        echo '<th>' . h('अंतर') . '</th><th>' . h('निष्कर्ष') . '</th></tr>';
        foreach ($groups as $g) {
            $yours = $g['own_price_cents_effective'];
            $cheapest = $g['min_competitor_cents'];
            $diff = '—';
            if ($yours !== null && $cheapest !== null) {
                $diff = ($yours > $cheapest ? '+' : '') . money($yours - $cheapest);
            }
            $verdict = isset($verdicts[$g['verdict']]) ? $verdicts[$g['verdict']] : $g['verdict'];
            echo '<tr><td>' . h($g['name']) . '</td><td>' . h($g['sku']) . '</td>';
            echo '<td>' . money($yours) . '</td><td>' . money($cheapest) . '</td>';
            echo '<td>' . $diff . '</td><td>' . h($verdict) . '</td></tr>';
        }
        echo '</table>';
    }
    echo '</body></html>';
    
    PASTE_YOUR_KEY_HERE की जगह अपनी कुंजी डालें, उसके चारों ओर के उद्धरण-चिह्न (quotes) बने रहने दें। बदलने के लिए बस यही एक पंक्ति है।
  3. चरण 3: फ़ाइल अपलोड करें और उसे ब्राउज़र में खोलें

    4pricing-prices.php को फ़ाइल मैनेजर या FTP से अपनी वेबसाइट पर अपलोड करें, उसी फ़ोल्डर में जहाँ आपकी साइट है (आमतौर पर public_html)।

    ब्राउज़र में https://your-site/4pricing-prices.php खोलें। आपको हर तुलना किए गए उत्पाद की एक तालिका दिखेगी: आपकी कीमत, सबसे सस्ते प्रतिस्पर्धी की कीमत, अंतर और निष्कर्ष।

फ़ाइल: अपने उत्पादों को सबसे सस्ते प्रतिस्पर्धी की कीमत के साथ सूचीबद्ध करें

यह फ़ाइल 4pricing से आपके तुलना किए गए उत्पाद माँगती है (GET /groups/) और उन्हें तालिका के रूप में दिखाती है। डेटा पढ़ना निःशुल्क है और इसमें क्रेडिट खर्च नहीं होते।

  • “आपकी कीमत” वह कीमत है जो 4pricing के पास आपके लिए दर्ज है; “सबसे सस्ता प्रतिस्पर्धी” वह सबसे कम कीमत है जो आपके निगरानी किए जा रहे प्रतिस्पर्धियों में मिली।
  • कीमतें इकाइयों में दिखाई जाती हैं (12999 सेंट बन जाते हैं 129.99); डैश (—) का मतलब है कि 4pricing के पास अभी कोई कीमत नहीं है, शून्य नहीं।
  • अगर तालिका की जगह कोई त्रुटि दिखे, तो संदेश बताता है कि क्या ठीक करना है: गलत कुंजी, सक्रिय सदस्यता न होना या एक मिनट में बहुत ज़्यादा अनुरोध।

दूसरी विधि: अपनी कीमत भेजें

इसका उपयोग तब करें जब 4pricing को आपकी अपनी कीमत आपके स्टोर के पेज से पढ़े बिना पता होनी चाहिए — उदाहरण के लिए सीधे आपके स्टोर के डेटाबेस से। अपनी कीमतें भेजना निःशुल्क है (क्रेडिट नहीं लगते) और यह आपके प्लान की निगरानी वाले URL की सीमा में नहीं गिना जाता।

फ़ील्डमतलब
skuआपका उत्पाद कोड; 4pricing इसी से उत्पाद ढूँढता है, या पहली बार में उसे बना देता है
nameउत्पाद का नाम, जैसा आप उसे 4pricing में देखना चाहते हैं
urlवैकल्पिक: आपके स्टोर में उत्पाद के पेज का पता (इसे कभी पढ़ा नहीं जाता)
price_centsकीमत को 100 से गुणा करके, दशमलव के बिना: 49.99 → 4999
currencyमुद्रा का कोड, जैसे EUR, GBP या RON (न दिया हो तो RON)
php4pricing-send-price.php
<?php
// =====================================================================
// यहाँ अपनी API कुंजी चिपकाएँ (panel.4pricing.net → API और कुंजियाँ), उद्धरण-चिह्नों के बीच
$apiKey = 'PASTE_YOUR_KEY_HERE';
// =====================================================================

// आपके उत्पाद: हर उत्पाद के लिए एक ब्लॉक। price_cents = कीमत x 100 (49.99 बन जाता है 4999)।
$products = [
    [
        'sku' => 'WHITE-TSHIRT-M',
        'name' => 'सफ़ेद टी-शर्ट, साइज़ M',
        'url' => 'https://your-shop.example/white-tshirt-m',
        'price_cents' => 4999,
        'currency' => 'EUR',
    ],
];

header('Content-Type: text/html; charset=utf-8');

function h($text) { return htmlspecialchars((string) $text, ENT_QUOTES, 'UTF-8'); }

if (strpos($apiKey, 'prc_') !== 0) {
    exit('<p>' . h('API कुंजी नहीं मिली: फ़ाइल खोलें और चिह्नित पंक्ति पर अपनी कुंजी चिपकाएँ।') . '</p>');
}

$ch = curl_init('https://4pricing.net/api/v1/pricing/own-products/bulk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERAGENT => 'my-shop-integration/1.0',
    CURLOPT_TIMEOUT => 60,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['X-API-Key: ' . $apiKey, 'Content-Type: application/json', 'Accept: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['items' => $products], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($body === false) {
    exit('<p>' . h('4pricing से कनेक्ट नहीं हो सका:' . ' ' . curl_error($ch)) . '</p>');
}
if ($status !== 200) {
    $hints = [401 => 'API कुंजी गलत है या रद्द कर दी गई है', 402 => 'खाते में सक्रिय 4pricing सदस्यता नहीं है (या क्रेडिट पर्याप्त नहीं हैं)', 429 => 'एक मिनट में बहुत ज़्यादा अनुरोध, एक मिनट बाद फिर कोशिश करें'];
    $hint = isset($hints[$status]) ? ' — ' . $hints[$status] : '';
    exit('<p>' . h('4pricing ने त्रुटि के साथ जवाब दिया' . ' ' . $status . $hint) . '</p><pre>' . h($body) . '</pre>');
}

$result = json_decode($body, true);
echo '<h1>' . h('4pricing को भेजी गई कीमतें') . '</h1>';
echo '<p>' . h('नए बनाए गए उत्पाद:') . ' ' . (int) $result['created'] . '</p>';
echo '<p>' . h('अपडेट किए गए उत्पाद:') . ' ' . (int) $result['updated'] . '</p>';
if (!empty($result['errors'])) {
    echo '<p>' . h('समस्या वाली पंक्तियाँ:') . '</p><ul>';
    foreach ($result['errors'] as $error) {
        echo '<li>' . h($error) . '</li>';
    }
    echo '</ul>';
}
  • इसे 4pricing-send-price.php नाम से सेव करें, अपनी कुंजी चिपकाएँ, उत्पादों की पंक्तियाँ बदलें, अपलोड करें और एक बार खोलें: पेज बताता है कि कितने उत्पाद बनाए गए और कितने अपडेट हुए।
  • हर अनुरोध में 2,000 उत्पाद तक जा सकते हैं; खराब पंक्ति की सूचना मिलती है और बाकी फिर भी सेव हो जाती हैं। वही sku दोबारा भेजने पर कीमत अपडेट हो जाती है।

वही कॉल curl से

अगर आपको टर्मिनल पसंद है, तो ये दो कमांड बिल्कुल वही काम करती हैं जो दोनों PHP फ़ाइलें करती हैं:

bash
curl https://4pricing.net/api/v1/pricing/groups/ \
  -H "X-API-Key: PASTE_YOUR_KEY_HERE"
bash
curl -X POST https://4pricing.net/api/v1/pricing/own-products/bulk \
  -H "X-API-Key: PASTE_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"sku":"WHITE-TSHIRT-M","name":"सफ़ेद टी-शर्ट, साइज़ M","url":"https://your-shop.example/white-tshirt-m","price_cents":4999,"currency":"EUR"}]}'
कुंजी को सुरक्षित रखें
  • यह कुंजी आपके पूरे 4pricing खाते तक पहुँच देती है। इसे केवल सर्वर-साइड फ़ाइलों (PHP, आपका बैकएंड) में रखें — कभी ब्राउज़र के JavaScript या किसी सार्वजनिक रिपॉज़िटरी में नहीं।
  • अपलोड किए गए पेज का पता जानने वाला कोई भी व्यक्ति कीमतों की तालिका देख सकता है (कुंजी नहीं)। फ़ाइल को ऐसा नाम दें जिसका अनुमान लगाना मुश्किल हो, फ़ोल्डर को पासवर्ड से सुरक्षित करें, या ज़रूरत न रहने पर उसे हटा दें।
  • अगर कोई कुंजी लीक हो जाए, तो उसे API और कुंजियाँ में रद्द कर दें — वह तुरंत काम करना बंद कर देती है — और नई कुंजी बनाएँ।

प्रमाणीकरण

  • हर अनुरोध में आपकी कुंजी X-API-Key हेडर में जाती है। Authorization: Bearer prc_live_… भी काम करता है (केवल उन कुंजियों के लिए जो prc_ से शुरू होती हैं)।
  • कोई स्कोप नहीं होते: एक कुंजी आपके 4pricing खाते में सब कुछ पढ़ और बदल सकती है। हर इंटीग्रेशन (स्टोर, ERP, रिपोर्ट) के लिए अलग कुंजी बनाएँ, ताकि एक को रद्द करने पर बाकी न रुकें।
  • कुंजी न होने, गलत होने या रद्द होने पर 401 मिलता है। रद्द करना तुरंत लागू हो जाता है। एक मिनट में बहुत ज़्यादा गलत कुंजियाँ भेजने पर 429 मिलता है।
  • कुंजियाँ केवल पैनल में (मूल्य निगरानी → API और कुंजियाँ) बनाई, देखी और रद्द की जाती हैं; API खुद कुंजियाँ प्रबंधित नहीं कर सकता। कुंजी बनाने के लिए सक्रिय 4pricing सदस्यता चाहिए।
http
X-API-Key: prc_live_…
# or
Authorization: Bearer prc_live_…

बेस URL और नियम

  • इस दस्तावेज़ का हर पाथ बेस URL के सापेक्ष है — /groups/ का मतलब है https://4pricing.net/api/v1/pricing/groups/।
  • अनुरोध और जवाब JSON में होते हैं (Content-Type: application/json)।
  • राशियाँ छोटी इकाई (सेंट) में पूर्ण संख्याएँ होती हैं: price_cents = 12999 का मतलब है 129.99। प्रतिशत बेसिस पॉइंट में होते हैं (100 = 1%)।
  • अज्ञात मान null होता है, कभी 0 नहीं — उसे “—” के रूप में दिखाएँ।
  • कलेक्शन को अंत में स्लैश के साथ बुलाया जाता है (/products/, /groups/, /insights/)।
  • पेज में बँटी सूचियाँ कुल संख्या X-Total-Count हेडर में लौटाती हैं (उदाहरण के लिए GET /products/?skip=0&limit=200)।
  • ऐसा User-Agent हेडर भेजें जो आपके इंटीग्रेशन का नाम बताए (उदाहरण के लिए my-shop-integration/1.0)। API के आगे लगा फ़ायरवॉल कुछ सामान्य लाइब्रेरी डिफ़ॉल्ट्स, जैसे Python-urllib, को 403 से जवाब देता है।

अनुरोध सीमा, सदस्यता और प्लान की सीमाएँ

अनुरोध सीमा

  • प्रति खाता 60 अनुरोध प्रति मिनट, स्लाइडिंग विंडो में — एक ही खाते की सभी कुंजियाँ इन्हीं 60 को साझा करती हैं।
  • हर जवाब में X-RateLimit-Limit, X-RateLimit-Remaining और X-RateLimit-Reset (विंडो की अवधि, सेकंड में) होते हैं।
  • सीमा पार करने पर आपको Retry-After हेडर (सेकंड) के साथ 429 मिलता है। उतनी देर रुकें, फिर दोबारा कोशिश करें — नीचे के उदाहरण यह आपके लिए कर देते हैं।
http
HTTP/2 200
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-ratelimit-reset: 60

HTTP/2 429
retry-after: 60
{"detail":"Rate limit exceeded"}

सदस्यता और प्लान की सीमाएँ

  • API के लिए सक्रिय 4pricing सदस्यता चाहिए; उसके बिना हर अनुरोध पर कोड plan_required के साथ 402 मिलता है।
  • हर प्लान में API उन्हीं सीमाओं के साथ शामिल है जो पैनल की हैं। कुछ जोड़ते या दोबारा चालू करते समय सीमा पार होने पर कोड plan_limit के साथ 402 मिलता है, और संदेश बताता है कि कौन-सी सीमा।
सीमामतलब
निगरानी वाले URL4pricing जो भी उत्पाद-पेज का पता पढ़ता है, वह अलग से गिना जाता है: आपका अपना पेज और हर प्रतिस्पर्धी का पेज। /own-products से भेजी गई कीमतें नहीं गिनी जातीं।
प्रतिस्पर्धी दुकानेंआप जितनी अलग-अलग प्रतिस्पर्धी वेबसाइटों (डोमेन) की निगरानी करते हैं, उनकी संख्या।
न्यूनतम जाँच अंतरालएक ही URL को कितनी बार जाँचा जा सकता है। इससे छोटे अंतराल अपने-आप आपके प्लान के न्यूनतम अंतराल तक बढ़ा दिए जाते हैं; किसी URL को बहुत जल्दी रीफ़्रेश करने पर 402 plan_limit मिलता है।

कौन-से कॉल क्रेडिट खर्च करते हैं

किसी दुकान का पेज पढ़ने में आपके खाते के वॉलेट से क्रेडिट खर्च होते हैं। नीचे के कॉल कुछ भी पढ़ने से पहले शेष राशि जाँचते हैं: अगर वह पर्याप्त नहीं है तो 402 insufficient_credits मिलता है, और अगर वॉलेट अभी नहीं पढ़ा जा सकता तो 503 credit_wallet_unavailable मिलता है (बाद में फिर कोशिश करें)। दोनों स्थितियों में न कुछ पढ़ा जाता है और न कुछ काटा जाता है।

क्रेडिट खर्च करने वाले कॉल

मेथडएंडपॉइंटक्या करता हैलागत
POST/groups/{group_id}/membersसमूह में एक URL जोड़ें, product_id से या नए पते से (नया पता तुरंत पढ़ा जाता है)क्रेडिट
POST/groups/{group_id}/refreshसमूह के हर URL की अभी जाँच करेंक्रेडिट
POST/groups/{group_id}/suggestions“प्रतिस्पर्धी खोजें”: प्रस्तावित प्रतिस्पर्धी URL, स्कोर और कारण के साथक्रेडिट
POST/products/किसी URL की निगरानी शुरू करें (url, name, role own या competitor) — वह तुरंत पढ़ा जाता हैक्रेडिट
POST/products/{product_id}/refreshइस URL की कीमत अभी जाँचें (आपके प्लान के न्यूनतम अंतराल का सम्मान करते हुए)क्रेडिट
POST/search/विक्रेताओं के यहाँ किसी उत्पाद की लाइव कीमत खोजें (खोजे गए हर विक्रेता के लिए क्रेडिट)क्रेडिट

निःशुल्क कॉल

  • हर पढ़ना (GET): उत्पाद, समूह, तुलना, इतिहास, अलर्ट, insights, briefings, क्रेडिट, आँकड़े।
  • POST /own-products/ और POST /own-products/bulk — आपकी अपनी कीमतें।
  • POST /sales/bulk — आपकी बिक्री।
  • अलर्ट, सेटिंग्स, पुष्टियाँ और बाकी सब कुछ जो किसी दुकान का पेज नहीं पढ़ता।
  • आप जिन URL को ट्रैक करते हैं उनकी निर्धारित निगरानी भी हर जाँच पर क्रेडिट खर्च करती है; GET /credits/ आपकी शेष राशि और पूर्वानुमान दिखाता है।
  • POST /products/import एक साथ कई URL जोड़ता है, उन्हें तुरंत पढ़े बिना: उनकी जाँच, और उसका शुल्क, निर्धारित निगरानी करती है।

एंडपॉइंट संदर्भ

कुंजी से पहुँचा जा सकने वाला हर ऑपरेशन, उपयोग के हिसाब से समूहों में। OpenAPI विनिर्देश हर एक को फ़ील्ड-दर-फ़ील्ड, सटीक अनुरोध और जवाब की बॉडी के साथ बताता है।

आपकी अपनी कीमतें

अपनी दुकान का पेज पढ़वाए बिना 4pricing को सीधे अपनी कीमत बताएँ। निःशुल्क।

मेथडएंडपॉइंटक्या करता हैलागत
POST/own-products/किसी एक उत्पाद की अपनी वर्तमान कीमत भेजें (sku से खोजा जाता है, नहीं मिले तो नाम से; न हो तो बना दिया जाता है)निःशुल्क
POST/own-products/bulkएक अनुरोध में 2,000 उत्पादों तक की अपनी कीमतें भेजें; खराब पंक्तियों की सूचना मिलती है, बाकी सेव हो जाती हैंनिःशुल्क

तुलना किए गए उत्पाद (समूह)

समूह का मतलब है आपका एक उत्पाद और वे प्रतिस्पर्धी पेज जो वही चीज़ बेचते हैं। उसमें निष्कर्ष और अनुशंसित कीमत होती है।

मेथडएंडपॉइंटक्या करता हैलागत
GET/groups/सभी तुलना किए गए उत्पाद, हर एक के साथ आपकी कीमत, सबसे सस्ते प्रतिस्पर्धी की कीमत, निष्कर्ष और अनुशंसित कीमतनिःशुल्क
POST/groups/तुलना किया जाने वाला उत्पाद बनाएँ (नाम, sku, आपकी कीमत, लागत, कीमत की रणनीति)निःशुल्क
GET/groups/{group_id}एक तुलना किया गया उत्पादनिःशुल्क
PUT/groups/{group_id}कीमत, लागत, रणनीति, जाँच का अंतराल या स्टोर से जुड़ाव (store_kind) अपडेट करेंनिःशुल्क
DELETE/groups/{group_id}समूह हटाएँ; उसके URL की निगरानी जारी रहती हैनिःशुल्क
GET/groups/{group_id}/comparisonहर प्रतिस्पर्धी के मुकाबले आपकी स्थिति, अनुशंसित कीमत और वह कैसे निकाली गईनिःशुल्क
GET/groups/{group_id}/historyसमूह के हर URL का कीमत इतिहासनिःशुल्क
GET/groups/seriesसभी उत्पादों में बाज़ार में आपकी स्थिति, दिन-दर-दिननिःशुल्क
POST/groups/{group_id}/membersसमूह में एक URL जोड़ें, product_id से या नए पते से (नया पता तुरंत पढ़ा जाता है)क्रेडिट
DELETE/groups/{group_id}/members/{product_id}समूह से एक URL हटाएँ (उसकी निगरानी जारी रहती है)निःशुल्क
POST/groups/{group_id}/refreshसमूह के हर URL की अभी जाँच करेंक्रेडिट
POST/groups/{group_id}/apply-recommendedअनुशंसित कीमत को 4pricing में अपनी कीमत बना दें (वही कीमत भेजें जो आपने देखी थी; बदल गई हो तो 409)निःशुल्क
GET/groups/suggestions/sources“प्रतिस्पर्धी खोजें” के लिए उपलब्ध स्रोतनिःशुल्क
POST/groups/{group_id}/suggestions“प्रतिस्पर्धी खोजें”: प्रस्तावित प्रतिस्पर्धी URL, स्कोर और कारण के साथक्रेडिट

निगरानी वाले URL

4pricing जो हर पेज का पता पढ़ता है, उसकी एक पंक्ति — आपका या किसी प्रतिस्पर्धी का (role own या competitor)।

मेथडएंडपॉइंटक्या करता हैलागत
GET/products/निगरानी वाले URL, पेजों में बँटे हुए (skip, limit अधिकतम 500; कुल संख्या X-Total-Count में)निःशुल्क
POST/products/किसी URL की निगरानी शुरू करें (url, name, role own या competitor) — वह तुरंत पढ़ा जाता हैक्रेडिट
POST/products/importएक साथ कई URL जोड़ें; उन्हें बाद में निर्धारित निगरानी पढ़ती हैनिःशुल्क
GET/products/exportसक्रिय URL का CSV एक्सपोर्टनिःशुल्क
GET/products/{product_id}एक निगरानी वाला URL, उसकी नवीनतम कीमत के साथनिःशुल्क
PATCH/products/{product_id}नाम, श्रेणी या जाँच का अंतराल बदलेंनिःशुल्क
DELETE/products/{product_id}किसी URL की निगरानी बंद करें (वह निष्क्रिय के रूप में रखा जाता है)निःशुल्क
POST/products/{product_id}/refreshइस URL की कीमत अभी जाँचें (आपके प्लान के न्यूनतम अंतराल का सम्मान करते हुए)क्रेडिट
GET/products/{product_id}/historyएक URL का कीमत इतिहासनिःशुल्क
GET/products/sparklinesएक साथ कई URL का छोटा कीमत इतिहासनिःशुल्क
GET/products/price-changesवे URL जिनकी कीमत पिछली जाँच में बदलीनिःशुल्क

किसी उत्पाद की कीमत अभी, विक्रेताओं के यहाँ देखें।

मेथडएंडपॉइंटक्या करता हैलागत
POST/search/विक्रेताओं के यहाँ किसी उत्पाद की लाइव कीमत खोजें (खोजे गए हर विक्रेता के लिए क्रेडिट)क्रेडिट

अलर्ट

कीमत के नियम और बज चुके अलर्ट का इनबॉक्स।

मेथडएंडपॉइंटक्या करता हैलागत
GET/alerts/आपके कीमत अलर्टनिःशुल्क
POST/alerts/अलर्ट बनाएँ (कीमत इससे नीचे/ऊपर, % में गिरावट, दोबारा स्टॉक में, किसी प्रतिस्पर्धी द्वारा कम कीमत…)निःशुल्क
DELETE/alerts/{alert_id}अलर्ट हटाएँनिःशुल्क
POST/alerts/{alert_id}/rearmबज चुके अलर्ट को दोबारा सक्रिय करेंनिःशुल्क
GET/alerts/eventsबज चुके अलर्ट का इनबॉक्सनिःशुल्क
GET/alerts/events/unread-countआपके कितने अलर्ट अनपढ़े हैंनिःशुल्क
POST/alerts/events/read-allअलर्ट को पढ़ा हुआ चिह्नित करें (चाहें तो केवल किसी समय से पहले वाले)निःशुल्क
POST/alerts/events/{event_id}/readएक अलर्ट को पढ़ा हुआ चिह्नित करेंनिःशुल्क

क्रेडिट

शेष राशि, पूर्वानुमान और क्रेडिट का हर लेन-देन।

मेथडएंडपॉइंटक्या करता हैलागत
GET/credits/क्रेडिट की शेष राशि और खर्च का पूर्वानुमाननिःशुल्क
GET/credits/ledgerक्रेडिट का हर लेन-देननिःशुल्क
GET/credits/by-productहर URL पर खर्च हुए क्रेडिट (कुल और पिछले 30 दिन)निःशुल्क

आपकी बिक्री

हर उत्पाद की दैनिक बिक्री, जिससे हर अवसर का मूल्य निकाला जाता है। निःशुल्क।

मेथडएंडपॉइंटक्या करता हैलागत
POST/sales/bulkहर उत्पाद की दैनिक बिक्री (sku या group_id, day, units_sold, revenue_cents; वैकल्पिक stock_units, cost_cents), 2,000 पंक्तियों तक; वही उत्पाद और दिन दोबारा भेजने पर पुराना मान बदल जाता हैनिःशुल्क

Insights, अवसर और briefings

क्या बदला, वह क्यों मायने रखता है और क्या करना है — साथ में दैनिक briefing।

मेथडएंडपॉइंटक्या करता हैलागत
GET/insights/प्रमाण और कीमत के प्रस्तावों के साथ insights (X-Total-Count)निःशुल्क
GET/insights/{insight_id}एक insight, विस्तार सेनिःशुल्क
POST/insights/{insight_id}/dismissकिसी insight को खारिज करेंनिःशुल्क
GET/opportunities/अवसरों का सारांश: आपकी बिक्री से निकला मूल्य, जो बाज़ार के अनुमान से अलग रखा जाता हैनिःशुल्क
GET/briefings/दैनिक briefings का इतिहासनिःशुल्क
GET/briefings/latestनवीनतम दैनिक briefingनिःशुल्क
POST/briefings/generateखुले insights से आज की briefing दोबारा बनाएँ (यह कुछ भेजता नहीं)निःशुल्क

कीमत की कार्रवाइयाँ

कीमत में वे बदलाव जो प्रस्तावित, भेजे, लागू या वापस किए गए। API से आप उन्हें पढ़ सकते हैं और webhook से मिली कार्रवाइयों की पुष्टि कर सकते हैं।

मेथडएंडपॉइंटक्या करता हैलागत
GET/actions/कीमत की कार्रवाइयाँ: प्रस्तावित, भेजी गई, लागू, वापस की गईनिःशुल्क
POST/actions/{action_id}/confirmपुष्टि करें कि आपके सिस्टम ने price.apply या price.revert से मिली कीमत लागू कर दीनिःशुल्क

सेटिंग्स

खाते की सेटिंग्स, जिनमें webhook का पता और secret भी शामिल है।

मेथडएंडपॉइंटक्या करता हैलागत
GET/settings/खाते की सेटिंग्स (विक्रेता, रीप्राइसिंग रणनीति, अलर्ट की डिलीवरी, webhook)निःशुल्क
PUT/settings/सेटिंग्स बदलें, जिनमें alert_webhook_url, alert_webhook_secret और alert_webhook_enabled शामिल हैंनिःशुल्क

आँकड़े

खाते का अवलोकन और कीमत जाँचों की स्थिति।

मेथडएंडपॉइंटक्या करता हैलागत
GET/stats/खाते के आँकड़े: URL, अलर्ट, 24 घंटे के बदलाव, समूहनिःशुल्क
GET/stats/scrapersहर विक्रेता के लिए कीमत जाँचों की स्थितिनिःशुल्क

53 endpoints · https://4pricing.net/api/v1/pricing/openapi.json

API क्या नहीं कर सकता

कुछ चीज़ें जानबूझकर पैनल में ही रहती हैं, जहाँ साइन इन किया हुआ व्यक्ति फ़ैसला करता है। API से इन पाथ पर 404 मिलता है:

पाथक्यों
/keys/…कुंजियाँ बनाना और रद्द करना — एक कुंजी और कुंजियाँ नहीं बना सकती।
/autopilot/…ऑटोपायलट की नीति, जो तय करती है कि किसी व्यक्ति के बिना क्या बदल सकता है; लीक हुई कुंजी इसे बढ़ा नहीं सकनी चाहिए।
/watchlists/…वॉचलिस्ट, जो हर रन पर क्रेडिट खर्च करती हैं।
/actions/{action_id}/approve · reject · revertकीमत के बदलाव को मंज़ूर करना, अस्वीकार करना या वापस लेना वह फ़ैसला है जो कोई व्यक्ति पैनल में करता है। API केवल कार्रवाइयाँ पढ़ सकता है और उनकी पुष्टि कर सकता है।
/insights/{insight_id}/act · /insights/runकिसी insight पर कार्रवाई करना (यह कीमतें लिखता है) और insights को दोबारा निकालना।
/admin/… · /internal/…प्लेटफ़ॉर्म का आंतरिक प्रशासन।

Webhooks

4pricing आपके किसी पते (webhook) पर इवेंट भेज सकता है: जब भी कुछ होता है, वह एक JSON POST करता है, ताकि आपके सिस्टम को बार-बार पूछना न पड़े।

हर खाते के लिए एक ही webhook पता होता है; हर तरह का इवेंट उसी पर आता है। उन्हें event फ़ील्ड से अलग पहचानें — अलर्ट अकेला ऐसा इवेंट है जिसमें यह फ़ील्ड नहीं होता।

इसे चालू करना

  • alert_webhook_url (पोर्ट 80 या 443 पर कोई सार्वजनिक http/https पता), alert_webhook_secret और alert_webhook_enabled: true सेट करें — पैनल में या PUT /settings/ से।
  • जो पता किसी निजी या आंतरिक नेटवर्क पर जाता है, उसे 422 के साथ अस्वीकार कर दिया जाता है। रीडायरेक्ट का पालन नहीं किया जाता।
  • briefing.ready के लिए briefing_webhook_enabled भी चालू करें। price.apply और price.revert केवल उन समूहों के लिए भेजे जाते हैं जो store_kind = webhook के साथ आपके स्टोर से जुड़े हैं, और केवल तभी जब secret सेट हो।
bash
curl -X PUT https://4pricing.net/api/v1/pricing/settings/ \
  -H "X-API-Key: PASTE_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{"alert_webhook_url":"https://your-shop.example/4pricing-webhook.php","alert_webhook_secret":"YOUR_WEBHOOK_SECRET","alert_webhook_enabled":true,"briefing_webhook_enabled":true}'

इवेंट

इवेंटमतलब
alertकोई कीमत अलर्ट बजा। बॉडी: event_id (इसी पर डुप्लिकेट हटाएँ), alert_id, alert_type, message, message_code, message_params, price_cents, currency, triggered_at, product, group, panel_url। इसमें event फ़ील्ड नहीं होता।
price.applyआपके स्टोर में लागू करने के लिए एक मंज़ूर की हुई कीमत: action_id, group (id, name, sku, ean, store_product_id), old_price_cents, new_price_cents, currency, reason_code, mode और confirm.path।
price.revertपिछली कीमत पर लौटें। बॉडी price.apply जैसी ही है; उसे उसी तरह लागू करें और उसकी पुष्टि करें।
briefing.readyदैनिक briefing तैयार है: day, headline, summary, sections, total_value_cents (केवल आपकी बिक्री से), currency, panel_url।

हर webhook अनुरोध के हेडर

हेडरमतलब
X-4Pricing-Timestampअनुरोध कब भेजा गया, Unix सेकंड में। बहुत पुराने अनुरोध अस्वीकार करें (उदाहरण के लिए 5 मिनट से ज़्यादा पुराने)।
X-4Pricing-Signaturesha256= के बाद “<timestamp>.<raw body>” पाठ का hex HMAC-SHA256, जो आपके webhook secret से निकाला गया है। secret सेट होने पर मौजूद रहता है (price.apply और price.revert पर हमेशा)।
Content-Typeapplication/json; charset=utf-8
User-Agent4pricing-alerts/1.0

हस्ताक्षर की जाँच

timestamp हेडर और आपको मिली RAW बॉडी से हस्ताक्षर दोबारा निकालें, उसे constant time में मिलाएँ और timestamp जाँचें। उसके बाद ही इवेंट को प्रोसेस करें। स्वीकार करने पर किसी भी 2xx से जवाब दें।

php
<?php
$secret = 'YOUR_WEBHOOK_SECRET';

// RAW बॉडी का उपयोग करें, ठीक वैसी जैसी मिली है — दोबारा एन्कोड किया हुआ JSON नहीं
$body = file_get_contents('php://input');
$timestamp = isset($_SERVER['HTTP_X_4PRICING_TIMESTAMP']) ? $_SERVER['HTTP_X_4PRICING_TIMESTAMP'] : '';
$signature = isset($_SERVER['HTTP_X_4PRICING_SIGNATURE']) ? $_SERVER['HTTP_X_4PRICING_SIGNATURE'] : '';
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $body, $secret);

// हस्ताक्षर गलत है या 5 मिनट से पुराना है: अस्वीकार करें
if (!hash_equals($expected, $signature) || abs(time() - (int) $timestamp) > 300) {
    http_response_code(401);
    exit;
}

$event = json_decode($body, true);
if (isset($event['event']) && ($event['event'] === 'price.apply' || $event['event'] === 'price.revert')) {
    // new_price_cents को अपने स्टोर के उत्पाद पर लागू करें (उसे sku या store_product_id से मिलाएँ)
    // $event['group']['sku'], $event['new_price_cents'], $event['currency']
    // फिर पुष्टि करें: अपनी API कुंजी के साथ POST /actions/{action_id}/confirm
}
http_response_code(200);
echo 'ok';
javascript
// Node.js, no package needed
const http = require("http");
const crypto = require("crypto");
const SECRET = process.env.WEBHOOK_SECRET; // YOUR_WEBHOOK_SECRET

http.createServer((req, res) => {
  const chunks = [];
  req.on("data", (c) => chunks.push(c));
  req.on("end", () => {
    // RAW बॉडी का उपयोग करें, ठीक वैसी जैसी मिली है — दोबारा एन्कोड किया हुआ JSON नहीं
    const body = Buffer.concat(chunks);
    const ts = String(req.headers["x-4pricing-timestamp"] || "");
    const sig = String(req.headers["x-4pricing-signature"] || "");
    const expected = "sha256=" + crypto.createHmac("sha256", SECRET).update(ts + ".").update(body).digest("hex");
    const fresh = Math.abs(Date.now() / 1000 - Number(ts)) <= 300;
    const same = sig.length === expected.length && crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
    if (!same || !fresh) {
      // हस्ताक्षर गलत है या 5 मिनट से पुराना है: अस्वीकार करें
      res.writeHead(401);
      return res.end();
    }
    const event = JSON.parse(body.toString("utf8"));
    if (event.event === "price.apply" || event.event === "price.revert") {
      // new_price_cents को अपने स्टोर के उत्पाद पर लागू करें (उसे sku या store_product_id से मिलाएँ)
      // फिर पुष्टि करें: अपनी API कुंजी के साथ POST /actions/{action_id}/confirm
    }
    res.writeHead(200);
    res.end("ok");
  });
}).listen(3000);
python
# Python 3, standard library only
import hashlib
import hmac
import time

SECRET = "YOUR_WEBHOOK_SECRET"


def is_valid(raw_body: bytes, timestamp: str, signature: str) -> bool:
    # RAW बॉडी का उपयोग करें, ठीक वैसी जैसी मिली है — दोबारा एन्कोड किया हुआ JSON नहीं
    if not timestamp.isdigit() or abs(time.time() - int(timestamp)) > 300:
        return False
    expected = "sha256=" + hmac.new(
        SECRET.encode(), timestamp.encode() + b"." + raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

डिलीवरी और दोबारा कोशिशें

  • अलर्ट: कनेक्शन या DNS त्रुटि, 429 या 5xx पर अनुरोध exponential backoff के साथ दोबारा भेजा जाता है, अधिकतम 5 कोशिशें। कोई भी अन्य 4xx अंतिम होता है।
  • अगर अनुरोध चला गया पर 10 सेकंड में जवाब नहीं आया, तो उसे दोबारा नहीं भेजा जाता (डुप्लिकेट से बचने के लिए) — फिर भी कभी-कभी डुप्लिकेट आ सकता है, इसलिए event_id पर डुप्लिकेट हटाएँ।
  • price.apply और price.revert एक ही बार भेजे जाते हैं: डिलीवरी विफल होने पर कार्रवाई failed हो जाती है। action_id पर डुप्लिकेट हटाएँ।
  • briefing.ready दिन में एक बार भेजा जाता है।

लागू की गई कीमत की पुष्टि

  • price.apply तब तक लागू नहीं माना जाता जब तक आपका सिस्टम ऐसा न कहे। अपने स्टोर में कीमत बदलने के बाद, अपनी API कुंजी के साथ POST /actions/{action_id}/confirm कॉल करें: कार्रवाई “भेजी गई” से “लागू” हो जाती है।
  • दो बार पुष्टि करने में कोई हानि नहीं — जो कार्रवाई पहले ही लागू हो चुकी है, वह जैसी है वैसी लौटा दी जाती है।
bash
curl -X POST https://4pricing.net/api/v1/pricing/actions/ACTION_ID/confirm \
  -H "X-API-Key: PASTE_YOUR_KEY_HERE"

उदाहरण बॉडी

json · price.apply
{
  "event": "price.apply",
  "action_id": "8d0f2c4e-0b7a-4f7e-9d61-3c2b1a0e9f55",
  "tenant_id": "…",
  "group": {
    "id": "2fa912df-440c-4ddf-896a-5d558d56085f",
    "name": "Canon RF 50mm F1.8 STM",
    "sku": "4515C005AA",
    "ean": "4549292181623",
    "store_product_id": "1042"
  },
  "old_price_cents": 124900,
  "new_price_cents": 118699,
  "currency": "RON",
  "reason_code": "undercut",
  "mode": "manual",
  "confirm": { "method": "POST", "path": "/api/v1/pricing/actions/8d0f2c4e-0b7a-4f7e-9d61-3c2b1a0e9f55/confirm" }
}
json · alert
{
  "event_id": 18342,
  "alert_id": "c1b5…",
  "alert_type": "competitor_undercut",
  "tenant_id": "…",
  "message_code": "competitor_undercut",
  "message": "…",
  "message_params": { "…": "…" },
  "price_cents": 118990,
  "currency": "RON",
  "triggered_at": "2026-10-13T07:05:12",
  "product": { "id": "…", "name": "…", "url": "https://…", "retailer": "…", "current_price_cents": 118990, "in_stock": true },
  "group": { "id": "…", "name": "Canon RF 50mm F1.8 STM", "sku": "4515C005AA" },
  "panel_url": "https://panel.4pricing.net/…"
}

त्रुटियाँ

त्रुटियाँ सही HTTP स्टेटस और JSON बॉडी {"detail": …} के साथ आती हैं। detail या तो एक पाठ होता है, या कोड वाला ऑब्जेक्ट जिसे आप अपने प्रोग्राम में संभाल सकते हैं, या — 422 पर — गलत फ़ील्ड की सूची।

स्टेटसकोडमतलब
401—API कुंजी नहीं दी गई, गलत है या रद्द कर दी गई है।
402plan_requiredखाते में सक्रिय 4pricing सदस्यता नहीं है।
402plan_limitप्लान की कोई सीमा पार हो जाती (निगरानी वाले URL, प्रतिस्पर्धी दुकानें) या रीफ़्रेश न्यूनतम अंतराल से पहले आया। संदेश बताता है कि कौन-सी।
402insufficient_creditsकिसी दुकान का पेज पढ़ने वाले कॉल के लिए क्रेडिट पर्याप्त नहीं हैं। कुछ पढ़ा या काटा नहीं गया।
403—API तक पहुँचने से पहले फ़ायरवॉल ने ब्लॉक कर दिया — आमतौर पर Python-urllib जैसा सामान्य User-Agent होने से। अपना User-Agent भेजें।
404—संसाधन मौजूद नहीं है, आपके खाते का नहीं है, या वह पाथ API से उपलब्ध नहीं है।
409recommendation_moved · own_from_listing · invalid_state · webhook_secret_requiredटकराव: अनुशंसित कीमत बदल गई (recommendation_moved), कार्रवाई किसी और स्थिति में है (invalid_state), webhook secret ज़रूरी है, या ऑपरेशन इस आइटम पर लागू नहीं होता।
422—अमान्य डेटा, जैसे http/https के बिना URL या कोई ज़रूरी फ़ील्ड न होना। detail फ़ील्ड की सूची देता है।
429—खाते के लिए प्रति मिनट 60 से ज़्यादा अनुरोध (या बहुत ज़्यादा गलत कुंजियाँ)। Retry-After में लिखे सेकंड तक रुकें।
503credit_wallet_unavailableक्रेडिट वॉलेट अभी नहीं पढ़ा जा सकता। बाद में फिर कोशिश करें; कुछ नहीं काटा गया।

त्रुटि की बॉडी

json
{"detail": "Invalid or missing API key"}
{"detail": {"code": "plan_required", "message": "…"}}
{"detail": {"code": "insufficient_credits", "message": "…"}}
{"detail": [{"loc": ["body", "price_cents"], "msg": "…", "type": "…"}]}

कोड के उदाहरण

वही पढ़ना चार भाषाओं में, 429 पर रुककर दोबारा कोशिश के साथ, फिर बिक्री भेजना। PASTE_YOUR_KEY_HERE की जगह अपनी कुंजी डालें (या PRICING_API_KEY एनवायरनमेंट वेरिएबल सेट करें)।

Node.js: अपने तुलना किए गए उत्पाद पढ़ें

javascript
// Node.js 18+ (fetch is built in, no package needed)
const API_KEY = process.env.PRICING_API_KEY; // PASTE_YOUR_KEY_HERE
const BASE = "https://4pricing.net/api/v1/pricing";

async function call(path, options = {}) {
  for (let attempt = 0; attempt < 3; attempt++) {
    const res = await fetch(BASE + path, {
      ...options,
      headers: { "X-API-Key": API_KEY, "Content-Type": "application/json", ...(options.headers || {}) },
    });
    if (res.status === 429) {
      // 60 अनुरोध/मिनट से ज़्यादा: Retry-After में लिखे सेकंड तक रुकें, फिर दोबारा कोशिश करें
      const wait = Number(res.headers.get("Retry-After") || 60);
      await new Promise((r) => setTimeout(r, wait * 1000));
      continue;
    }
    if (!res.ok) throw new Error(res.status + " " + (await res.text()));
    return res.status === 204 ? null : res.json();
  }
  throw new Error("rate limited");
}

async function main() {
  // आपके तुलना किए गए उत्पाद: आपकी कीमत, सबसे सस्ता प्रतिस्पर्धी, निष्कर्ष
  const groups = await call("/groups/");
  for (const g of groups) {
    console.log(g.name, g.own_price_cents_effective, g.min_competitor_cents, g.verdict);
  }
}

main().catch((err) => {
  console.error(err.message);
  process.exit(1);
});

Python: अपने तुलना किए गए उत्पाद पढ़ें

python
# Python 3, standard library only
import json
import os
import time
import urllib.error
import urllib.request

API_KEY = os.environ["PRICING_API_KEY"]  # PASTE_YOUR_KEY_HERE
BASE = "https://4pricing.net/api/v1/pricing"


def call(path, method="GET", payload=None):
    data = json.dumps(payload).encode() if payload is not None else None
    for _ in range(3):
        req = urllib.request.Request(BASE + path, data=data, method=method, headers={
            "X-API-Key": API_KEY, "Content-Type": "application/json", "Accept": "application/json",
            # अपना User-Agent सेट करें: कुछ HTTP लाइब्रेरी (Python urllib) का डिफ़ॉल्ट User-Agent 403 के साथ ब्लॉक हो जाता है
            "User-Agent": "my-shop-integration/1.0",
        })
        try:
            with urllib.request.urlopen(req, timeout=30) as res:
                body = res.read()
                return json.loads(body) if body else None
        except urllib.error.HTTPError as err:
            if err.code == 429:
                # 60 अनुरोध/मिनट से ज़्यादा: Retry-After में लिखे सेकंड तक रुकें, फिर दोबारा कोशिश करें
                time.sleep(int(err.headers.get("Retry-After", "60")))
                continue
            raise
    raise RuntimeError("rate limited")


# आपके तुलना किए गए उत्पाद: आपकी कीमत, सबसे सस्ता प्रतिस्पर्धी, निष्कर्ष
for g in call("/groups/"):
    print(g["name"], g["own_price_cents_effective"], g["min_competitor_cents"], g["verdict"])

curl: अपनी दैनिक बिक्री भेजें

bash
curl -X POST https://4pricing.net/api/v1/pricing/sales/bulk \
  -H "X-API-Key: PASTE_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{"rows":[{"sku":"WHITE-TSHIRT-M","day":"2026-10-12","units_sold":7,"revenue_cents":34993}]}'

PHP: अपनी दैनिक बिक्री भेजें

php
<?php
$apiKey = 'PASTE_YOUR_KEY_HERE';

// हर उत्पाद की दैनिक बिक्री (sku या group_id से), प्रति अनुरोध 2,000 पंक्तियों तक
$rows = [
    ['sku' => 'WHITE-TSHIRT-M', 'day' => '2026-10-12', 'units_sold' => 7, 'revenue_cents' => 34993],
];

$ch = curl_init('https://4pricing.net/api/v1/pricing/sales/bulk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERAGENT => 'my-shop-integration/1.0',
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['X-API-Key: ' . $apiKey, 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['rows' => $rows]),
]);
$body = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . ' ' . $body;   // 200 {"upserted": 1, "skipped": []}

अक्सर पूछे जाने वाले प्रश्न

क्या 4pricing API इस्तेमाल करने के लिए मुझे प्रोग्रामर होना ज़रूरी है?

नहीं। क्विक स्टार्ट आपको एक तैयार PHP फ़ाइल देता है: आप पैनल में कुंजी बनाते हैं, उसे फ़ाइल में चिपकाते हैं, फ़ाइल को अपनी होस्टिंग पर अपलोड करते हैं और ब्राउज़र में खोल देते हैं। गहरे इंटीग्रेशन (ERP, स्टोर प्लेटफ़ॉर्म) के लिए कोई डेवलपर एंडपॉइंट संदर्भ और OpenAPI विनिर्देश का उपयोग कर सकता है।

4pricing API की कीमत कितनी है?

API हर 4pricing सदस्यता में शामिल है, उन्हीं सीमाओं के साथ जो पैनल की हैं। अपना डेटा पढ़ना निःशुल्क है; केवल वही कॉल क्रेडिट खर्च करते हैं जो किसी दुकान का पेज पढ़ते हैं (नया URL जोड़ना, रीफ़्रेश, लाइव खोज, प्रतिस्पर्धी खोजना), जैसे पैनल में।

कौन-से कॉल क्रेडिट खर्च करते हैं?

POST /products/, POST /products/{product_id}/refresh, POST /groups/{group_id}/refresh, नए URL के साथ POST /groups/{group_id}/members, POST /groups/{group_id}/suggestions और POST /search/। शेष राशि पर्याप्त न हो तो 402 insufficient_credits मिलता है और कुछ पढ़ा नहीं जाता।

क्या API से मेरी भेजी हुई कीमतें मेरे प्लान की URL सीमा में गिनी जाती हैं?

नहीं। केवल वे पते गिने जाते हैं जिन्हें 4pricing किसी पेज से पढ़ता है — आपके अपने उत्पाद पेज और हर प्रतिस्पर्धी का पेज, अलग-अलग। POST /own-products/ या /own-products/bulk से भेजी गई कीमतें न URL के रूप में गिनी जाती हैं और न क्रेडिट के रूप में।

क्या मैं सीमित कर सकता हूँ कि एक कुंजी क्या-क्या एक्सेस करे?

नहीं, स्कोप नहीं होते: एक कुंजी आपका पूरा 4pricing खाता देख और बदल सकती है। हर इंटीग्रेशन के लिए अलग कुंजी रखें और जिसका उपयोग न हो उसे रद्द कर दें; रद्द करना तुरंत लागू हो जाता है।

अगर मैं प्रति मिनट 60 से ज़्यादा अनुरोध भेजूँ तो क्या होता है?

आपको Retry-After हेडर के साथ 429 मिलता है। सीमा प्रति खाता है और आपकी सभी कुंजियाँ उसे साझा करती हैं। Retry-After में लिखे सेकंड तक रुकें और फिर कोशिश करें; कई उत्पादों के लिए bulk कॉल (प्रति अनुरोध 2,000 पंक्तियों तक) इस्तेमाल करें।

अनुशंसित कीमत अपने-आप अपने स्टोर में कैसे पहुँचाऊँ?

समूह को store_kind = webhook के साथ अपने स्टोर से जोड़ें, webhook का पता और secret सेट करें, और price.apply इवेंट को संभालें: अपने स्टोर में कीमत बदलें, फिर POST /actions/{action_id}/confirm कॉल करें। कीमत के बदलाव को मंज़ूर करना पैनल में लिया जाने वाला फ़ैसला ही रहता है।

क्या कोई SDK या तैयार प्लगइन है?

कोई आधिकारिक SDK या प्लगइन नहीं है। API सादा REST है और JSON में काम करता है, इसलिए HTTPS अनुरोध कर सकने वाली कोई भी भाषा चलती है; OpenAPI विनिर्देश को ऐसे टूल में लोड किया जा सकता है जो क्लाइंट अपने-आप बनाते हैं।