डेवलपर दस्तावेज़
API दस्तावेज़
इनवॉइस, चेकआउट और भुगतान सूचनाएँ इंटीग्रेट करें।
खोज परिणाम
कोई परिणाम नहीं। एंडपॉइंट, फ़ील्ड या गाइड के नाम से खोजें।
त्वरित शुरुआत
अपना पहला इनवॉइस बनाएँ।
- दुकान तैयार करें
उसके भुगतान तरीके सक्षम करें, प्रदाता कॉन्फ़िगर करें और प्रोजेक्ट वॉलेट का बैकअप लें।
- API क्रेडेंशियल बनाएँ
अपने कंसोल की सेटिंग → API पहुँच में रीड/राइट चुनें और प्रोजेक्ट असाइन करें।
- अनुरोध भेजें
अपना API होस्ट इस्तेमाल करें और अपने प्रोजेक्ट और दुकान के ID कॉपी करें। दशमलव राशियाँ स्ट्रिंग के रूप में भेजें।
- चेकआउट खोलें
रीडायरेक्ट करें
links.checkoutजवाब से मिले पते पर। ऑर्डर पूरा करने से पहले निपटान सत्यापित करें।
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"exchange_rate_spread_percent": "0.5"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"exchange_rate_spread_percent": "0.5"
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"exchange_rate_spread_percent": "0.5"
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"exchange_rate_spread_percent": "0.5"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))उदाहरण प्लेसहोल्डर इस्तेमाल करते हैं और इस पृष्ठ से अनुरोध नहीं भेजते। हर इनवॉइस फ़ील्ड और जवाब का फ़ॉर्मैट देखें →
प्रोजेक्ट और दुकान के ID
YOUR_PROJECT_ID और YOUR_STORE_ID कहाँ मिलेंगे।
अपने कंसोल के UUID इस्तेमाल करें, प्रोजेक्ट या दुकान के नाम या उनके पठनीय पहचानकर्ता नहीं।
| प्लेसहोल्डर | कहाँ मिलेगा | किस काम आता है |
|---|---|---|
| YOUR_PROJECT_ID | प्रोजेक्ट → सेटिंग → API ID → प्रोजेक्ट API ID → कॉपी करें। दुकान के मूल टैब में भी दिखता है। | प्रोजेक्ट-स्तरीय और दुकान-स्तरीय अनुरोध। |
| YOUR_STORE_ID | प्रोजेक्ट → दुकानें → दुकान चुनें → मूल → API ID → दुकान API ID → कॉपी करें। | इनवॉइस बनाने और दुकान के भुगतान तरीकों के अनुरोध। |
- इनवॉइस बनाने के लिए दोनों ID चाहिए, डिफ़ॉल्ट दुकान के लिए भी। दुकान उस प्रोजेक्ट की होनी चाहिए और API क्रेडेंशियल को प्रोजेक्ट की पहुँच होनी चाहिए।
- इनवॉइस बनाना, सूची, विवरण और चेकआउट invoice_id लौटाते हैं: वही UUID जो IPN/वेबहुक में भेजा जाता है। इनवॉइस पथ में इसे इस्तेमाल करें, आंतरिक id या order_id को नहीं। मर्चेंट 4.0.0 से पुराना public_id जवाब फ़ील्ड हटा दिया गया है; अपग्रेड से पहले इंटीग्रेशन अपडेट करें।
- REST API प्रोजेक्ट/दुकान सूची के रूट नहीं देता। कंसोल में ID कॉपी करें या मर्चेंट 5.0.0+ में सीमित दायरे वाले list_projects और list_stores MCP टूल इस्तेमाल करें।
- दुकान → मूल → दुकान डोमेन सक्रिय मर्चेंट, pay और API होस्टनाम चुनता है। लौटाए गए चेकआउट लिंक और नए कॉलबैक लिंक पहले उस दुकान, फिर डिफ़ॉल्ट दुकान, फिर सिस्टम डिफ़ॉल्ट को प्राथमिकता देते हैं। हटाए गए या सक्रिय न किए नाम कभी नहीं चुने जाते। SDK में पसंदीदा API होस्टनाम कॉन्फ़िगर करें; प्राथमिकता बदलने से अन्य सक्रिय उपनाम रीडायरेक्ट नहीं होते।
प्रमाणीकरण और दायरा
क्रेडेंशियल अपने सर्वर पर रखें और केवल ज़रूरी पहुँच दें।
| डिफ़ॉल्ट होस्ट | उद्देश्य |
|---|---|
| merchant.example.com | मर्चेंट कंसोल और सेटिंग |
| pay.example.com | ग्राहक चेकआउट |
| api.example.com | मर्चेंट API अनुरोध |
बदलें example.com अपने डोमेन से। मौजूदा इंस्टॉलेशन अपने कॉन्फ़िगर किए नाम रखते हैं; सेटिंग → सिस्टम में उपनाम सँभालें।
Authorization: Bearer YOUR_MERCHANT_API_TOKEN| सेटिंग | यह कैसे काम करता है |
|---|---|
| पहुँच स्तर | केवल पढ़ने वाले क्रेडेंशियल सूची और विवरण प्राप्त कर सकते हैं। रीड/राइट क्रेडेंशियल इनवॉइस बना सकते हैं और दस्तावेज़ में दी गई एसेट नीतियाँ भी अपडेट कर सकते हैं। |
| प्रोजेक्ट | वे प्रोजेक्ट असाइन करें जिन तक क्रेडेंशियल की पहुँच हो सकती है। दुकान और इनवॉइस के ID असाइन किए प्रोजेक्ट के होने चाहिए। |
| IP प्रतिबंध | चाहें तो सेटिंग → API पहुँच में सटीक सार्वजनिक IPv4 या IPv6 आउटगोइंग पतों की अनुमति दें। |
| क्रेडेंशियल स्टोरेज | टोकन अपने बैकएंड कॉन्फ़िगरेशन में रखें। ब्राउज़र या चेकआउट लिंक में bearer क्रेडेंशियल कभी शामिल न करें। |
सार्वजनिक चेकआउट रूट इनवॉइस का सार्वजनिक ID इस्तेमाल करते हैं और केवल चेकआउट के लिए सुरक्षित डेटा दिखाते हैं। कंसोल सेशन और प्रशासनिक नियंत्रण मर्चेंट API क्रेडेंशियल से अलग हैं।
एसेट और वॉलेट
हर दुकान के भुगतान तरीके अलग चुनें।
- पढ़ें प्रोजेक्ट के भुगतान एसेट और उनकी तैयारी की स्थिति।
- नेटिव चेन सक्षम करें और उसका वॉलेट व प्रदाता कॉन्फ़िगर करें।
- देखें संभावित टोकन और कॉन्ट्रैक्ट या मिंट सत्यापित करें टोकन सक्षम करने से पहले।
- दुकान के क्रमबद्ध चुनें भुगतान तरीके। नए इनवॉइस उसके तैयार विकल्प इस्तेमाल करते हैं।
टोकन अपनी नेटिव चेन का वॉलेट साझा करते हैं। वॉलेट बैलेंस सटीक परमाणु इकाई राशियाँ और संकेतात्मक फ़िएट मूल्य लौटाते हैं। कौन-से तरीके भुगतान प्राप्त कर सकते हैं, यह तय करने के लिए लौटाए गए तैयारी फ़ील्ड इस्तेमाल करें।
सत्यापित ERC-20 टोकन समर्थित EVM नेटवर्क इस्तेमाल करते हैं; सत्यापित SPL टोकन Solana इस्तेमाल करते हैं। नेटिव भुगतान तरीके 30 इंटीग्रेटेड नेटवर्क पर उपलब्ध हैं। Monero प्रोजेक्ट से बँधा बाहरी केवल-दृश्य वॉलेट कनेक्शन इस्तेमाल करता है।
प्राप्ति API और नेटिव/टोकन समर्थन
| भुगतान प्रणाली | समर्थन | प्रमाण | ज़रूरतें |
|---|---|---|---|
| नेटिव भुगतान प्रणालियाँ | समर्थित | लेनदेन स्कैन पर आधारित | BTC, SOL, ETH (Ethereum/Base/Arbitrum/OP), BNB, HYPE, AVAX और POL; Bitcoin आउटपुट, कैनॉनिकल EVM लेनदेन/रसीदें और पार्स किए Solana ट्रांसफ़र इनवॉइस प्रमाण देते हैं। |
| ERC-20 टोकन भुगतान प्रणालियाँ | समर्थित | लेनदेन स्कैन पर आधारित | Ethereum, Base, BNB Chain, HyperEVM, Avalanche, Polygon, Arbitrum और Optimism में ऑन-चेन सत्यापन चाहिए; इंडेक्स किए Transfer लॉग भुगतान का संबंध तय करते हैं। |
| SPL टोकन भुगतान प्रणालियाँ | समर्थित | लेनदेन स्कैन पर आधारित | Solana के संभावित टोकन के लिए mainnet और मिंट सत्यापन चाहिए; पार्स किए लेनदेन में टोकन बैलेंस का सटीक बदलाव भुगतान का संबंध तय करता है। |
| अतिरिक्त UTXO नेटिव भुगतान प्रणालियाँ | समर्थित | लेनदेन स्कैन पर आधारित | BCH/LTC/DOGE Esplora इस्तेमाल करते हैं; BCH/DOGE Bitcore भी स्वीकार करते हैं, LTC/DOGE/DASH BlockCypher, Dash Insight और पारदर्शी ZEC zcash-explorer स्वीकार करते हैं। सभी पूर्ण सहेजे गए Core-संगत node-rpc ब्लॉक भी स्वीकार करते हैं। रॉ मोड में 1–48 पुष्टियाँ चाहिए, mempool में पता चलना नहीं। शील्डेड Zcash समर्थित नहीं है। |
| इंडेक्स की गई खाता-आधारित नेटिव भुगतान प्रणालियाँ | समर्थित | लेनदेन स्कैन पर आधारित | TRON tron-indexer या solidified node-rpc इस्तेमाल करता है; XRP xrpl-jsonrpc; Stellar stellar-horizon या सहेजे गए Stellar node-rpc लेजर; Cosmos Hub cometbft-jsonrpc; Algorand algorand-indexer या algod node-rpc इस्तेमाल करता है; Hedera को hedera-mirror चाहिए, EVM रिले नहीं। |
| नेटिव लेजर भुगतान प्रणालियाँ | समर्थित | लेनदेन स्कैन पर आधारित | Aptos aptos-rest, Sui sui-graphql, NEAR near-jsonrpc और Kaspa kaspa-rest इस्तेमाल करते हैं। Polkadot Asset Hub substrate-rest या मेटाडेटा-सचेत finalized node-rpc स्वीकार करता है; Tezos tezos-tzkt या पूर्ण Octez node-rpc ऑपरेशन स्वीकार करता है। केवल नेटिव प्राप्तियाँ; पुराने इनवॉइस के लिए संग्रहित इतिहास रखना ज़रूरी है। |
| Cardano और TON नेटिव भुगतान प्रणालियाँ | समर्थित | लेनदेन स्कैन पर आधारित | Cardano को cardano-koios और TON को toncenter-v3 चाहिए। XRP टैग, Stellar memo ID और TON इनवॉइस टिप्पणियाँ destination_tag के रूप में लौटती हैं और बिल्कुल वैसी ही भेजनी चाहिए। |
| निपटान की अखंडता | समर्थित | स्वतंत्र सत्यापन | डिफ़ॉल्ट रूप से अंतिम निपटान के लिए दो स्वतंत्र प्रदाताओं को सटीक लेनदेन/इवेंट, राशि, कैनॉनिकल ब्लॉक या स्लॉट और अंतिमता पर सहमत होना चाहिए। रॉ और साझा EVM विंडो पूरे कवरेज को भी सत्यापित करती हैं। एडमिनिस्ट्रेटर स्पष्ट रूप से किसी चेन के लिए एक विश्वसनीय प्रदाता चुन सकता है; इससे स्वतंत्र क्रॉस-जाँच हटती है, पहचान, पूर्णता या अंतिमता की जाँच नहीं। |
| Monero नेटिव भुगतान प्रणाली | समर्थित | प्रोजेक्ट से बँधा केवल-दृश्य वॉलेट RPC | HTTPS मेथड-अनुमति-सूची गेटवे के पीछे एक समर्पित बाहरी watch-only wallet-RPC account-0 के उपपते बनाता है। कॉन्फ़िगर किया mainnet डेमन थ्रेशोल्ड (डिफ़ॉल्ट 2 स्वतंत्र स्रोत, वैकल्पिक 1) निपटान प्रमाण देता है। नेटिव --restricted-rpc, create_address के साथ असंगत है; वॉलेट बैकअप और खर्च करने की कुंजी न होने की पुष्टि ऑपरेटर स्पष्ट रूप से करता है, जबकि Wholly Crypto को कोई कुंजी सामग्री नहीं भेजी जाती। |
एक्सचेंज बैलेंस और हर एसेट के वॉलेट-या-एक्सचेंज स्वीप विकल्प कंसोल में उपलब्ध हैं, सार्वजनिक v1 API से नहीं। एक्सचेंज सेटअप देखें.
इनवॉइस का जीवनचक्र
भुगतान प्रमाण, निपटान और ऑर्डर पूरा करना।
| स्थिति | मतलब |
|---|---|
| new | भुगतान का इंतज़ार |
| processing | भुगतान दिखा; स्वीकृत राशि या अंतिमता लंबित |
| settled | इनवॉइस निपटान नीति के तहत या मैन्युअल रूप से स्वीकार किया गया |
| expired | समय-सीमा बीती; देर से भुगतान की निगरानी जारी रह सकती है |
| invalid | भुगतान अपने आप स्वीकार नहीं किया जा सकता |
| cancelled | रद्द; केवल स्पष्ट मिलान प्रक्रिया से फिर खुल सकता है |
amount_status दर्ज करता है none, partial, paid या overpaid. timing_status समय पर और देर से हुए भुगतान में अंतर करता है। दुकान के नियम ज़रूरी पुष्टियाँ और स्वीकार्य कम भुगतान की सहनशीलता तय करते हैं।
इनवॉइस का इस्तेमाल करें invoice_id इसके साथ इनवॉइस विवरण रूट। केवल चेकआउट रीडायरेक्ट निपटान का प्रमाण नहीं है। अपवादों की समीक्षा करें इसके ज़रिए मिलान.
सुरक्षित पुनः प्रयास
इनवॉइस बनाने के लिए चाहिए Idempotency-Key। टाइमआउट के बाद उसी क्रेडेंशियल, कुंजी और बिल्कुल उसी अनुरोध बॉडी से फिर प्रयास करें। केवल नए इनवॉइस के लिए नई कुंजी इस्तेमाल करें।
EVM भुगतान स्कैनिंग
साझा नेटिव-ब्लॉक और ERC-20 खोज हाल के इनवॉइस को पुराने इतिहास पूरा करने वाले कार्य से अलग समूह में रखती है। हर इनवॉइस अपना स्थायी इतिहास कर्सर रखता है। टोकन क्वेरी हर अनुरोध में अधिकतम 100 ब्लॉक लेती है और प्रदाता की सख़्त सीमाओं के लिए छोटी होती है। डिफ़ॉल्ट रूप से दो स्वतंत्र प्रदाता हर विंडो सत्यापित करते हैं। सेटिंग → चेन कनेक्शन → विवरण में किसी चेन के लिए एक विश्वसनीय स्रोत चुन सकते हैं, जिसमें स्वतंत्र क्रॉस-जाँच नहीं होती; कैनॉनिकल लेनदेन, राशि और पुष्टि की जाँच बनी रहती है। कनेक्शन विवरण स्कैनर की देरी, इतिहास प्रतिबंध और कोटा कूलडाउन को नोड की मूल स्थिति से अलग दिखाता है। सार्वजनिक RPC क्षमता की गारंटी नहीं है।
IPN और वेबहुक
भुगतान इवेंट प्राप्त करें और सत्यापित करें।
IPN को इनवॉइस के प्रभावी ipn_url पर हर उत्पन्न इनवॉइस इवेंट मिलता है। वेबहुक को हर सक्षम दुकान एंडपॉइंट के लिए चुने गए इवेंट ही मिलते हैं। दोनों एक ही JSON स्नैपशॉट POST करते हैं; वे स्वतंत्र हैं, इसलिए दोनों सक्षम करने पर आपके एप्लिकेशन को दो बार सूचना मिल सकती है।
सेट करें ipn_url इनवॉइस बनाते समय या दुकान का डिफ़ॉल्ट अपनाएँ। IPN इस्तेमाल करता है स्टोर → IPN सीक्रेट; हर स्टोर → वेबहुक एंडपॉइंट का अपना सीक्रेट होता है। इनमें से कोई भी आपकी API कुंजी नहीं है।
ऑर्डर कब पूरा करना चाहिए?
इवेंट-आधारित प्रबंधन में ऑर्डर जाँच शुरू करने के लिए event_type = invoice.settled के साथ status = settled इस्तेमाल करें। वर्तमान इनवॉइस सत्यापित करें और हर ऑर्डर केवल एक बार पूरा करें।
status इवेंट बनते समय इनवॉइस की स्थिति है। event_type बताता है कि क्या हुआ। payment.received में processing या settled हो सकता है; इसका मतलब दूसरा भुगतान नहीं है और यह अपने आप ऑर्डर पूरा करने का संकेत नहीं है।
कौन-से इवेंट और स्थितियाँ भेजी जाती हैं?
| सेटिंग/इतिहास में इवेंट | बॉडी का status | मतलब |
|---|---|---|
| invoice.created | new | इनवॉइस बना और भुगतान का इंतज़ार है। नियंत्रित रूप से दोबारा खोलने पर इनवॉइस new में लौटे, तब भी इस्तेमाल होता है। |
| payment.received | Resulting invoice status | भुगतान दर्ज हुआ या प्राप्त राशि बढ़ी। आम तौर पर processing या settled; केवल यह इवेंट निपटान का प्रमाण नहीं है। |
| invoice.processing | processing | भुगतान का पता चला, लेकिन स्वीकार्य राशि या ज़रूरी अंतिमता अभी पूरी नहीं हुई। आंशिक भुगतान भी शामिल हैं। |
| invoice.settled | settled | निपटान नीति पूरी हुई या मैन्युअल रूप से स्वीकार किया गया। ऑर्डर पूरा करने से पहले resolution और अपना ऑर्डर जाँचें। |
| invoice.expired | expired | भुगतान की समय-सीमा बीती। निगरानी जारी रहने पर देर से भुगतान अब भी स्थिति बदल सकता है। |
| invoice.invalid | invalid | अपने आप स्वीकार नहीं हो सकता, भुगतान प्रमाण खो गया या मर्चेंट ने अस्वीकार किया। इनवॉइस की समीक्षा करें। |
| invoice.cancelled | cancelled | इनवॉइस रद्द। ऑर्डर पूरा न करें; रद्द करने से ऑन-चेन भुगतान का रिफ़ंड नहीं होता। |
Ethereum और Solana अलग इवेंट प्रवाह क्यों भेज सकते हैं
पुष्टियाँ बाद में आती हैं (Ethereum का उदाहरण)
| क्रम | event_type | status |
|---|---|---|
| 1 | invoice.created | new |
| 2 | payment.received | processing |
| 2 | invoice.processing | processing |
| 3 | invoice.settled | settled |
पता चलते ही अंतिम है (Solana का उदाहरण)
| क्रम | event_type | status |
|---|---|---|
| 1 | invoice.created | new |
| 2 | payment.received | settled |
| 2 | invoice.settled | settled |
ये इवेंट बनना दिखाते हैं, डिलीवरी के क्रम की गारंटी नहीं। पता चलने के समय और निपटान नीति के अनुसार दूसरी चेन पर भी कोई भी प्रवाह हो सकता है। settled से पहले processing इवेंट की शर्त न रखें।
एक बार पूरा करें: रिसीवर उदाहरण और डुप्लिकेट सुरक्षा
| तरीका | कैसे सँभालें |
|---|---|
| इवेंट-आधारित रिसीवर | हस्ताक्षरित event_id से अलग-अलग इवेंट रखें, फिर status = settled के साथ invoice.settled चुनें। उसी sequence वाला payment.received पहले आने के कारण इस इवेंट को न हटाएँ। |
| SDK ऑर्डर-स्थिति इनबॉक्स | दिए गए PHP, Python और Node रिसीवर उदाहरण project + invoice_id + sequence को एक करते हैं। event_type की परवाह किए बिना सहेजी स्थिति प्रोसेस करें, वर्तमान इनवॉइस प्राप्त करें और settled हो तो एक बार पूरा करें। इस एकीकरण के बाद केवल invoice.settled वाला फ़िल्टर न जोड़ें। |
पुनः प्रयास में event_id और मूल बॉडी वही रहते हैं। अलग इवेंट का sequence एक हो सकता है लेकिन event_id अलग होता है। इवेंट-आधारित प्रबंधन के लिए हस्ताक्षरित event_id से डिलीवरी के डुप्लिकेट हटाएँ; अलग से कॉन्फ़िगर किए इंस्टॉलेशन/प्रोजेक्ट + invoice_id और अपने ऑर्डर के आधार पर दोबारा पूरा होने से बचाएँ। बाद के दोबारा निपटान से ऑर्डर दो बार क्रेडिट नहीं होना चाहिए।
HTTP receiver:
Verify raw-body signature, timestamp and configured project/store scope.
Save to a durable inbox; deduplicate the signed event_id.
Return HTTP 2xx only after persistence succeeds.
Event-based background worker:
Other events go to status/reconciliation handling, not fulfilment.
Continue here only for event_type = invoice.settled and status = settled.
Fetch the current invoice from your configured API origin.
Check settled status, project/store, order, amount, currency and review policy.
In one database transaction:
Lock the order and check the scoped invoice has not been fulfilled.
Credit/complete once and save the fulfilment record.
Queue any external fulfilment with the same business idempotency key.
SDK order-state worker:
Use the same current-invoice checks and fulfil-once transaction.
Do not filter event_type after collapsing events by invoice revision.छद्म कोड, सीधे लगाने योग्य रिसीवर नहीं।
सभी इनवॉइस स्थितियाँ और भुगतान अपवाद
| फ़ील्ड | मान | मतलब |
|---|---|---|
| status | new, processing, settled, expired, invalid, cancelled | इवेंट बनते समय इनवॉइस की स्थिति; ज़रूरी नहीं कि डिलीवरी के समय भी यही स्थिति हो। |
| amount_status | none, partial, paid, overpaid | प्राप्त राशि, जिसमें स्वीकार्य सहनशीलता शामिल है। paid पुष्टि की अंतिमता नहीं है। |
| timing_status | on_time, late | क्या भुगतान इनवॉइस की समय-सीमा के भीतर हुआ। |
| resolution | automatic, manually_settled, manually_invalidated | क्या सामान्य नियमों या मैन्युअल स्वीकार/अस्वीकार ने परिणाम तय किया। |
| requires_review | false, true | अपवाद का संकेत, कोई और इनवॉइस स्थिति या अपने आप पूरा करने/रिफ़ंड की अनुमति नहीं। |
| परिस्थिति | प्रबंधन |
|---|---|
| कम भुगतान / सहनशीलता | स्वचालित नियमों में partial से निपटान नहीं होता। paid में स्वीकार्य कमी शामिल हो सकती है, लेकिन अंतिमता तब भी ज़रूरी है। केवल राशि की तुलना नहीं, इनवॉइस की स्थिति इस्तेमाल करें। |
| अधिक भुगतान | overpaid के साथ settled और requires_review = true हो सकते हैं। अतिरिक्त भुगतान की अपनी नीति लागू करें; ऑर्डर कभी दो बार क्रेडिट न करें और असत्यापित पते पर अपने आप रिफ़ंड न करें। |
| देर से भुगतान | निगरानी जारी रहने पर expired बाद में बदल सकता है। timing_status = late समीक्षा का संकेत देता है; रद्द ऑर्डर अपने आप दोबारा न खोलें या भेजें। |
| मैन्युअल स्वीकृति | योग्य ऑन-चेन फंड के बिना भी invoice.settled में resolution = manually_settled हो सकता है। तय करें कि आपका इंटीग्रेशन यह ओवरराइड स्वीकार करता है या नहीं; भुगतान सारांश फ़ील्ड null हो सकते हैं। |
| चेन पुनर्गठन / अमान्य होना | नया संशोधन पुराने भुगतान प्रमाण को अमान्य कर सकता है। वर्तमान स्थिति फिर प्राप्त करें और मिलान के ज़रिए उलटाव सँभालें। केवल इसलिए अनदेखा न करें कि ऑर्डर कभी settled था। |
| शून्य पुष्टियाँ / शून्य राशि | शून्य-पुष्टि निपटान भुगतान का पता चलते ही हो सकता है और इसमें चेन पुनर्गठन का जोखिम है। स्पष्ट अनुमति वाला शून्य-राशि इनवॉइस बिना भुगतान के निपट जाता है। दोनों में पहले payment.received इवेंट की ज़रूरत नहीं। |
ऑर्डर पूरा करने के लिए status = settled इस्तेमाल करें, amount_status = paid या चेकआउट रीडायरेक्ट नहीं। शून्य आवश्यक पुष्टियों पर पता चलते ही निपटान हो सकता है; इसमें चेन पुनर्गठन का जोखिम है।
कम भुगतान amount_status = partial है; अधिक भुगतान overpaid है। paid का मतलब है कि इनवॉइस की कम-भुगतान सहनशीलता सहित स्वीकृत न्यूनतम राशि आ गई। ये राशि की अवस्थाएँ हैं, इनवॉइस स्थितियाँ नहीं। late एक timing_status है, अलग इवेंट नहीं।
सामान्य प्रवाह new → processing → settled है, लेकिन बीच की अवस्थाएँ छूट सकती हैं। स्पष्ट अनुमति वाला शून्य-राशि इनवॉइस बिना भुगतान निपटता है और amount_status = none रखता है। मैन्युअल स्वीकृति manually_settled से चिह्नित होती है।
कॉलबैक अपरिवर्तनीय स्नैपशॉट हैं, लाइव स्थिति जवाब नहीं। वे देर से, क्रम से बाहर या एक से अधिक बार आ सकते हैं। भुगतान और स्थिति इवेंट में इनवॉइस sequence और स्थिति फ़ील्ड समान हो सकते हैं, लेकिन हस्ताक्षरित event_id और event_type अलग होते हैं। पुष्टि की संख्या हर ब्लॉक पर कॉलबैक की गारंटी नहीं देती।
आपको क्या मिलता है
{
"invoice_id": "11111111-2222-4333-8444-555555555555",
"status": "settled",
"amount_status": "paid",
"timing_status": "on_time",
"resolution": "automatic",
"sequence": 3,
"amount": "49.9",
"currency": "EUR",
"order_id": "order-1042",
"payload_version": 2,
"event_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"event_type": "invoice.settled",
"occurred_at": "2026-09-14T12:05:00Z",
"project_id": "11111111-1111-4111-8111-111111111111",
"store_id": "22222222-2222-4222-8222-222222222222",
"description": "Annual plan",
"email": "ada@example.test",
"customer": {
"firstname": "Ada",
"lastname": "Lovelace",
"countryiso2": "GB"
},
"metadata": {
"firstname": "Ada",
"lastname": "Lovelace",
"countryiso2": "GB",
"cart_id": "cart-681"
},
"created_at": "2026-09-14T12:00:00Z",
"updated_at": "2026-09-14T12:05:00Z",
"expires_at": "2026-09-14T12:15:00Z",
"monitoring_expires_at": "2026-09-21T12:15:00Z",
"settled_at": "2026-09-14T12:05:00Z",
"paid_chain": "ethereum",
"paid_asset": "USDC",
"paid_asset_amount": "58.17342",
"paid_asset_amount_received": "58.17342",
"paid_payment_method_id": "33333333-3333-4333-8333-333333333333",
"settlement_exchange_rate": {
"rate": "1.17",
"units": "asset_per_invoice_currency",
"currency": "EUR",
"symbol": "USDC",
"observed_at": "2026-09-14T12:05:00Z",
"as_of": "2026-09-14T12:04:30Z",
"pricing_provider": "kraken",
"asset_provider": "kraken",
"pricing_fetched_at": "2026-09-14T12:04:30Z",
"asset_fetched_at": "2026-09-14T12:04:30Z",
"stale": false,
"is_fixed": false,
"reference_currency": "USD",
"uses_reference_proxy": false
},
"cancelled_at": null,
"exchange_rate_spread_percent": "0.5",
"underpayment_tolerance_percent": "1",
"reason_code": "payment_confirmed",
"requires_review": false,
"links": {
"checkout": "https://pay.example.com/invoice/11111111-2222-4333-8444-555555555555",
"invoice": "https://api.example.com/v1/projects/11111111-1111-4111-8111-111111111111/invoices/11111111-2222-4333-8444-555555555555",
"payments": "https://api.example.com/v1/projects/11111111-1111-4111-8111-111111111111/invoices/11111111-2222-4333-8444-555555555555/payments"
},
"payment_info": {
"active_payment_method_id": "33333333-3333-4333-8333-333333333333",
"method_count": 1,
"methods_truncated": false,
"methods": [
{
"payment_method_id": "33333333-3333-4333-8333-333333333333",
"payment_rail": "onchain",
"chain_slug": "ethereum",
"network": "mainnet",
"caip_network_id": "eip155:1",
"asset_id": "44444444-4444-4444-8444-444444444444",
"asset_key": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"caip_asset_id": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"asset_name": "USD Coin",
"symbol": "USDC",
"asset_kind": "token",
"asset_decimals": 6,
"contract_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"token_standard": "erc20",
"destination_address": "0x1111111111111111111111111111111111111111",
"destination_tag": null,
"status": "paid",
"amounts": {
"expected_amount": "58.17342",
"expected_amount_atomic": "58173420",
"received_amount": "58.17342",
"received_amount_atomic": "58173420",
"confirmed_amount": "58.17342",
"confirmed_amount_atomic": "58173420",
"unconfirmed_amount": "0",
"unconfirmed_amount_atomic": "0",
"minimum_payment_amount": "57.591686",
"minimum_payment_amount_atomic": "57591686",
"remaining_amount": "0",
"remaining_amount_atomic": "0",
"remaining_to_full_amount": "0",
"remaining_to_full_amount_atomic": "0",
"overpaid_amount": "0",
"overpaid_amount_atomic": "0"
},
"acceptance": {
"finality_mode": "confirmations",
"required_confirmations": 2,
"observed_confirmations": 2,
"underpayment_tolerance_percent": "1"
},
"quote": {
"effective_rate": "1.1658",
"reference_rate": "1.16",
"units": "asset_per_invoice_currency",
"currency": "EUR",
"symbol": "USDC",
"exchange_rate_spread_percent": "0.5",
"quote_expires_at": "2026-09-14T12:15:00Z",
"provenance_available": true,
"rounding": "up",
"unrounded_payment_amount": "58.17342",
"rounding_adjustment": "0",
"pricing_provider": "kraken",
"asset_provider": "kraken",
"pricing_fetched_at": "2026-09-14T11:59:30Z",
"asset_fetched_at": "2026-09-14T11:59:30Z"
},
"market_rate_at_event": {
"rate": "1.17",
"units": "asset_per_invoice_currency",
"currency": "EUR",
"symbol": "USDC",
"observed_at": "2026-09-14T12:05:00Z",
"pricing_provider": "kraken",
"asset_provider": "kraken",
"pricing_fetched_at": "2026-09-14T12:04:30Z",
"asset_fetched_at": "2026-09-14T12:04:30Z",
"as_of": "2026-09-14T12:04:30Z",
"stale": false,
"is_fixed": false,
"reference_currency": "USD",
"uses_reference_proxy": false
},
"payment_count": 1,
"payments_truncated": false,
"payments": [
{
"payment_id": "55555555-5555-4555-8555-555555555555",
"payment_method_id": "33333333-3333-4333-8333-333333333333",
"transaction_id": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"payment_hash": null,
"event_index": 0,
"payment_rail": "onchain",
"chain_slug": "ethereum",
"network": "mainnet",
"asset_id": "44444444-4444-4444-8444-444444444444",
"asset_key": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"caip_asset_id": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"symbol": "USDC",
"asset_decimals": 6,
"amount": "58.17342",
"amount_atomic": "58173420",
"status": "final",
"counts_towards_received": true,
"confirmations": 2,
"block_height": 26000000,
"observed_at": "2026-09-14T12:04:30Z",
"chain_time": "2026-09-14T12:04:20Z",
"finalized_at": "2026-09-14T12:05:00Z",
"explorer_name": "Etherscan",
"explorer_url": "https://etherscan.io/tx/0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
],
"links": {
"payments": "https://api.example.com/v1/projects/11111111-1111-4111-8111-111111111111/invoices/11111111-2222-4333-8444-555555555555/payments?payment_method_id=33333333-3333-4333-8333-333333333333"
}
}
]
}
}amount मूल इनवॉइस कुल राशि है। payment_info देखे गए क्रिप्टो ट्रांसफ़र, अभी कम राशि और लॉक की गई दरें बताता है। संस्करण 2 इवेंट के नाम, इवेंट ID और प्रोजेक्ट/दुकान के दायरे पर भी हस्ताक्षर करता है।
सभी कॉलबैक फ़ील्ड और अतिरिक्त इनवॉइस डेटा
| फ़ील्ड | प्रकार | मतलब |
|---|---|---|
| invoice_id | UUID | सार्वजनिक इनवॉइस UUID, जिसे प्रमाणित इनवॉइस विवरण रूट इस्तेमाल करता है |
| status | string | स्नैपशॉट इनवॉइस स्थिति: new, processing, settled, expired, invalid, cancelled |
| amount_status | string | none, partial, paid या overpaid; paid में स्वीकार्य कम-भुगतान सहनशीलता शामिल है, पुष्टि की अंतिमता नहीं |
| timing_status | string | on_time या late |
| resolution | string | automatic, manually_settled या manually_invalidated |
| sequence | integer | बढ़ता इनवॉइस संशोधन; अलग इवेंट एक संशोधन साझा कर सकते हैं। पूर्णांक सटीकता खोए बिना तुलना करें |
| amount | decimal string | मूल इनवॉइस कुल राशि, प्राप्त क्रिप्टो राशि नहीं; दशमलव सटीकता बनाए रखें |
| currency | string | amount की मुद्रा, जैसे USDC से चुकाए EUR इनवॉइस के लिए EUR |
| order_id | string | null | मर्चेंट ऑर्डर संदर्भ |
| payload_version | integer | 4.1.0+ के नए बनाए इवेंट के लिए 2; सहेजे गए पुराने इवेंट में अनुपस्थित |
| event_id | UUID | हस्ताक्षरित इवेंट पहचान, पुनः प्रयास और मैन्युअल दोबारा डिलीवरी पर अपरिवर्तित |
| event_type | string | सात सब्सक्रिप्शन इवेंट में से एक |
| occurred_at | timestamp | यह अपरिवर्तनीय इवेंट कब बना, डिलीवरी का समय नहीं |
| project_id | UUID | मर्चेंट प्रोजेक्ट दायरा; कॉन्फ़िगर किए रिसीवर से मिलाएँ |
| store_id | UUID | मर्चेंट दुकान दायरा; कॉन्फ़िगर किए रिसीवर से मिलाएँ |
| description | string | null | मूल इनवॉइस विवरण |
| string | null | इवेंट बनते समय वैकल्पिक ग्राहक ईमेल | |
| customer | object | पहचाने गए वैकल्पिक ग्राहक मेटाडेटा फ़ील्ड; अनुमानित या अतिरिक्त रूप से जुटाया निजी डेटा नहीं |
| metadata | object | इवेंट बनते समय जैसा था, वैसा मूल मर्चेंट मेटाडेटा |
| created_at | timestamp | इनवॉइस बनने का समय |
| updated_at | timestamp | इनवॉइस स्थिति अपडेट होने का समय |
| expires_at | timestamp | इनवॉइस भुगतान की समय-सीमा |
| monitoring_expires_at | timestamp | देर से भुगतान की निगरानी की समय-सीमा |
| settled_at | timestamp | null | निपटान का समय |
| paid_chain | string | null | 4.1.2+: प्रमाणित निपटान तरीके का चेन स्लग, जैसे ethereum; सहेजा गया योग्य निपटान न हो तो null |
| paid_asset | string | null | 4.1.2+: नेटिव कॉइन या टोकन टिकर, जैसे BTC, ETH या USDC; दिखाने का लेबल, विशिष्ट एसेट पहचान नहीं |
| paid_asset_amount | decimal string | null | 5.0.1+: सहनशीलता घटाने से पहले paid_asset इकाइयों में माँगी गई पूरी लॉक राशि; निपटान पर सहेजी जाती है |
| paid_asset_amount_received | decimal string | null | 5.0.1+: निपटान पर सफल तरीके से मिली कुल वैध राशि, जिसमें स्वीकार्य कमी/अधिकता शामिल है; स्थिर, लाइव बैलेंस नहीं |
| paid_payment_method_id | UUID | null | 4.1.2+: निपटान इंटेंट ID; payment_info.methods[].payment_method_id और उसके सटीक नेटवर्क/कॉन्ट्रैक्ट से मेल खाता है |
| settlement_exchange_rate | object | null | 4.1.2+: निपटान पर सहेजा गया स्प्रेड से पहले का बाज़ार स्नैपशॉट, स्पष्ट इकाइयों, मुद्रा, स्रोत टाइमस्टैम्प और गुणवत्ता संकेतों के साथ; डिलीवरी पर कीमत कभी दोबारा नहीं लगती |
| cancelled_at | timestamp | null | रद्द करने का समय |
| exchange_rate_spread_percent | decimal string | लॉक किया स्प्रेड, दुकान का वर्तमान डिफ़ॉल्ट नहीं |
| underpayment_tolerance_percent | decimal string | लॉक की गई इनवॉइस सहनशीलता; हर तरीका अपनी प्रभावी सहनशीलता भी बताता है |
| reason_code | string | null | मशीन द्वारा पढ़ने योग्य स्थिति-बदलाव कारण |
| requires_review | boolean | भुगतान अपवाद का संकेत; अपने आप ऑर्डर पूरा करने या रिफ़ंड की अनुमति नहीं |
| links | object | इवेंट बनते समय चेकआउट, प्रमाणित इनवॉइस और भुगतान URL। दुकान → मूल की डोमेन प्राथमिकताएँ लागू होती हैं, फिर डिफ़ॉल्ट दुकान, फिर वैश्विक प्राथमिक; केवल सक्रिय भूमिका-मिलान वाले डोमेन इस्तेमाल होते हैं। पुनः प्रयास में मूल हस्ताक्षरित लिंक रहते हैं; कोई सक्रिय होस्ट रिकॉर्ड न हो तो null। |
| payment_info | object | वास्तव में देखे गए तरीके, सटीक राशियाँ, लॉक की गई दर, संकेतात्मक बाज़ार स्नैपशॉट और सीमित भुगतान अवलोकन; नीचे फ़ील्ड समूह देखें |
निपटान सारांश: settlement_exchange_rate
| फ़ील्ड | प्रकार | मतलब |
|---|---|---|
| rate / units / currency / symbol | strings | इनवॉइस मुद्रा की एक इकाई के प्रति स्प्रेड से पहले की एसेट इकाइयाँ। दशमलव स्ट्रिंग, भुगतान राशि या निष्पादित ट्रेड नहीं। |
| observed_at / as_of | timestamps | निपटान कैप्चर का समय / पुराना स्रोत टाइमस्टैम्प। कैश डेटा को लाइव दर न मानें। |
| pricing_provider / asset_provider / pricing_fetched_at / asset_fetched_at | strings / timestamps | फ़िएट और एसेट मूल्य स्रोत और उन्हें प्राप्त करने के समय, निपटान पर सहेजे गए। |
| stale / is_fixed / uses_reference_proxy / reference_currency | booleans / string | market_rate_at_event जैसे ही गुणवत्ता संकेत। तय प्रोजेक्ट कीमतें चिह्नित हैं; संदर्भ मुद्रा USD है। |
| Missing snapshot or price | null | अनुमानित ऐतिहासिक दर नहीं। निपटान से पहले सभी सारांश फ़ील्ड null हैं; केवल कीमतें न मिलने पर प्रमाणित paid_* पहचानकर्ता उपलब्ध रहते हैं। |
भुगतान तरीके: payment_info
| फ़ील्ड | प्रकार | मतलब |
|---|---|---|
| active_payment_method_id | UUID | null | सफल या चुना गया देखा हुआ तरीका। पता चलने से पहले या अमान्य होने के बाद null; कोई डिफ़ॉल्ट तरीका अनुमान से नहीं चुना जाता। |
| method_count / methods_truncated | integer / boolean | देखे गए तरीकों की कुल संख्या और क्या शामिल तरीकों की सूची अधूरी है। |
| methods[] | object[] | अधिकतम आठ देखे गए तरीके, सक्रिय तरीका पहले। अलग एसेट की राशियों का जोड़ नहीं। |
| payment_method_id / payment_rail | UUID / string | इनवॉइस इंटेंट पहचान और onchain या lightning ट्रांसपोर्ट। |
| chain_slug / network / caip_network_id | string | नेटवर्क पहचान। टोकन की पहचान हमेशा उसके नेटवर्क के साथ रखें। |
| asset_id / asset_key / caip_asset_id | UUID / string / nullable string | सत्यापित रजिस्ट्री पहचान; केवल प्रतीक विशिष्ट नहीं होते। |
| asset_name / symbol / asset_kind | string | एसेट का प्रदर्शन नाम, टिकर और नेटिव या टोकन प्रकार। |
| contract_address / token_standard | string | null | टोकन कॉन्ट्रैक्ट या मिंट और मानक; नेटिव एसेट के लिए null। |
| asset_decimals | integer | परमाणु इकाई की सटीकता; Lightning BTC में 11 है। |
| destination_address / destination_tag | string | null | सार्वजनिक प्राप्ति पता और ज़रूरी मेमो/टैग। Lightning में पता null है; कभी निजी कुंजी नहीं। |
| status | string | तरीके की स्थिति: pending, partial, paid, overpaid, expired या invalid। Paid अपने आप में इनवॉइस निपटान नहीं है। |
| payment_count / payments_truncated / payments[] | integer / boolean / object[] | अवलोकनों की कुल संख्या और हाल के पाँच या कम। हर अवलोकन नीचे समझाया गया है। |
| links.payments | HTTPS URL | null | कॉन्फ़िगर किए API origin पर इस तरीके का प्रमाणित पृष्ठों में बँटा इतिहास। |
सटीक राशियाँ: methods[].amounts
| फ़ील्ड | प्रकार | मतलब |
|---|---|---|
| expected_amount | decimal string | स्प्रेड और ऊपर की ओर राउंड करने के बाद पूरी लॉक की गई दर-आधारित राशि। |
| received_amount / confirmed_amount | decimal strings | पता चले वैध फंड / इस तरीके की पुष्टि या अंतिमता नीति पूरी करने वाले फंड। |
| unconfirmed_amount | decimal string | max(received - confirmed, 0)। भेजने के लिए अतिरिक्त राशि नहीं। |
| minimum_payment_amount | decimal string | सहनशीलता के बाद स्वीकृत न्यूनतम सीमा। पूरी कोट राशि से कम हो सकती है। |
| remaining_amount | decimal string | max(minimum accepted - received, 0)। स्वीकृत सीमा तक पहुँचने के लिए ज़रूरी अतिरिक्त फंड, पुष्टि की प्रगति नहीं। |
| remaining_to_full_amount | decimal string | max(full quote - received, 0), सहनशीलता को छोड़कर। |
| overpaid_amount | decimal string | max(received - full quote, 0)। अपने आप रिफ़ंड अधिकृत नहीं करता। |
| Every amount's *_atomic companion | integer string | सबसे छोटी इकाई में सटीक रूप। दशमलव या पूर्णांक लाइब्रेरी इस्तेमाल करें; पैसे के लिए कभी float या JavaScript Number नहीं। |
पुष्टि नीति: methods[].acceptance
| फ़ील्ड | प्रकार | मतलब |
|---|---|---|
| finality_mode / required_confirmations | string / integer | लॉक की गई पुष्टियाँ या finalized नीति। शून्य पुष्टियाँ मर्चेंट नीति से स्पष्ट रूप से अनुमत हैं, सार्वभौमिक नेटवर्क अंतिमता नहीं। |
| observed_confirmations | integer | null | वैध अवलोकनों में न्यूनतम, केवल सबसे नए ट्रांसफ़र का नहीं। Lightning या कोई वैध अवलोकन न होने पर null। |
| underpayment_tolerance_percent | decimal string | तरीके की प्रभावी सहनशीलता। इनवॉइस में गैर-शून्य ऑन-चेन सहनशीलता हो, तब भी Lightning शून्य इस्तेमाल करता है। |
दरें: methods[].quote और market_rate_at_event
| फ़ील्ड | प्रकार | मतलब |
|---|---|---|
| quote.effective_rate / units / currency / symbol | strings | स्प्रेड सहित लॉक की गई asset_per_invoice_currency दर; मुद्रा और प्रतीक दिशा स्पष्ट करते हैं। |
| quote.exchange_rate_spread_percent / quote_expires_at | decimal string / timestamp | लॉक किया स्प्रेड और कोट की समय-सीमा। इन्हें वर्तमान दुकान सेटिंग से कभी नहीं बदला जाता। |
| quote.reference_rate / unrounded_payment_amount / rounding_adjustment | decimal string | null | स्प्रेड से पहले का संदर्भ, राउंड करने से पहले भुगतान राशि और एसेट इकाइयों में ऊपर किया समायोजन। |
| quote.pricing_provider / asset_provider / pricing_fetched_at / asset_fetched_at | string or timestamp | null | मूल मुद्रा और एसेट मूल्य के स्रोत/समय। API कुंजियाँ या प्रदाता क्रेडेंशियल नहीं। |
| quote.provenance_available / rounding | boolean / string | सहेजे स्रोत स्नैपशॉट के बिना पुराने इनवॉइस के लिए False; राउंड ऊपर की ओर होता है। |
| market_rate_at_event | object | null | इवेंट बनते समय संकेतात्मक कैश बाज़ार स्नैपशॉट। अनुपस्थित डेटा null रहता है; यह कभी इनवॉइस राशि नहीं बदलता या नेटवर्क से डेटा लेने के लिए देरी नहीं करता। |
| market_rate_at_event.rate / units / currency / symbol | strings | स्प्रेड से पहले की बाज़ार दर, quote जैसी स्पष्ट दिशा के साथ। |
| market_rate_at_event.observed_at / as_of / pricing_fetched_at / asset_fetched_at | timestamps | इवेंट स्नैपशॉट का समय / दोनों स्रोत समय में पुराना / हर स्रोत का समय। |
| market_rate_at_event.pricing_provider / asset_provider | strings | कैश मुद्रा और एसेट स्रोत, कॉन्फ़िगर की गई कस्टम-टोकन कीमतों सहित। |
| market_rate_at_event.stale / is_fixed / uses_reference_proxy / reference_currency | booleans / string | कैश पुराना है या नहीं, टोकन कीमत तय है या USD संदर्भ में स्टेबलकॉइन प्रॉक्सी है या नहीं। संदर्भ मुद्रा USD है। Stale संकेतात्मक है, कभी ताज़ा कोट नहीं। |
ट्रांसफ़र रिकॉर्ड: methods[].payments[] और GET …/payments
| फ़ील्ड | प्रकार | मतलब |
|---|---|---|
| payment_id / payment_method_id | UUID | अवलोकन पहचान / मूल इंटेंट पहचान। इतिहास के डुप्लिकेट हटाने के लिए payment_id इस्तेमाल करें। |
| transaction_id / payment_hash / event_index | string | null / integer | ऑन-चेन हैश और ट्रांसफ़र/लॉग/आउटपुट इंडेक्स या Lightning हैश। Lightning में लेनदेन या एक्सप्लोरर लिंक नहीं होता। |
| payment_rail / chain_slug / network / asset_id / asset_key / caip_asset_id / symbol / asset_decimals | strings / UUID / integer | वही एसेट और नेटवर्क पहचानकर्ता जो उसे समेटने वाले तरीके में हैं। |
| amount / amount_atomic | decimal / integer strings | इस ट्रांसफ़र का सटीक मूल्य, कभी फ़िएट रूपांतरण नहीं। |
| status / counts_towards_received | string / boolean | detected, confirming और final गिने जाते हैं; reorged, replaced और invalid नहीं। मिलान के लिए अमान्य इतिहास रखें। |
| confirmations / block_height | integer | null | अवलोकन का ब्लॉक डेटा; Lightning में पुष्टियाँ null। |
| observed_at / chain_time / finalized_at | timestamp | null | स्थानीय रूप से पहली बार दिखने का समय, उपलब्ध हो तो विश्वसनीय चेन समय, और पहुँचने पर नीति-अंतिमता का समय। |
| explorer_name / explorer_url | string | null | जहाँ समर्थित हो, सत्यापित सार्वजनिक ब्लॉक-एक्सप्लोरर संदर्भ। |
Merchant 5.13.3 सत्यापित आंतरिक गैस-फंडिंग ट्रांसफ़र को ग्राहक भुगतान कुल, payment_info, इनवॉइस भुगतान API, रिफ़ंड सीमाओं और payment.received इवेंट से बाहर रखता है। वॉलेट हिसाब के लिए उनके चेन/ट्रेज़री रिकॉर्ड उपलब्ध रहते हैं। सामान्य ट्रांसफ़र और असली अधिक भुगतान तब भी गिने जाते हैं। मौजूदा हस्ताक्षरित कॉलबैक बॉडी कभी दोबारा नहीं लिखी जाती। ऐतिहासिक निपटान ग्राहक फंड के बजाय आंतरिक फंडिंग पर निर्भर हो तो मिलान reason_code internal_gas_funding_excluded के साथ invoice.invalid जारी करता है; फिर से ऑर्डर पूरा करने के बजाय उसकी समीक्षा करें।
Merchant 4.1.0 मूल नौ फ़ील्ड को स्थानांतरित या परिवर्तित किए बिना payload_version 2 जोड़ता है। पहले से कतार में इवेंट अपनी मूल बॉडी रखते हैं और उनमें payload_version न हो सकता है। event_id, event_type और प्रोजेक्ट/दुकान ID अब हस्ताक्षरित बॉडी में हैं; ट्रांसपोर्ट के इवेंट/डिलीवरी हेडर अहस्ताक्षरित रहते हैं।
payment_info देखे गए भुगतान बताता है, चेकआउट के हर उपलब्ध विकल्प को नहीं। पता चलने से पहले active_payment_method_id null और methods खाली है। सक्रिय तरीका null होने के बाद भी reorged/invalid अवलोकन methods में रह सकते हैं। अलग एसेट या नेटवर्क की राशियाँ कभी साथ न जोड़ें।
सभी राशियाँ, परमाणु इकाई पूर्णांक, दरें और प्रतिशत स्ट्रिंग हैं। received_amount में पुष्टि का इंतज़ार करते वैध फंड शामिल हैं; confirmed_amount उस तरीके की अंतिमता नीति पूरी करता है। remaining_amount, max(minimum_payment_amount minus received_amount, 0) है; remaining_to_full_amount, max(expected_amount minus received_amount, 0) है। उदाहरण: 100 USDC अपेक्षित, 99 प्राप्त और 1% सहनशीलता का मतलब remaining_amount 0 और remaining_to_full_amount 1 है। अंतिमता तब भी ज़रूरी है।
quote लॉक की गई इनवॉइस गणना है: इनवॉइस मुद्रा की एक इकाई के प्रति एसेट इकाइयाँ। स्प्रेड ऊपर की ओर राउंड करने से पहले लागू होता है। भुगतान की सटीक तुलना के लिए expected_amount_atomic इस्तेमाल करें; केवल दिखी दर से वही ऊपर की राउंडिंग दोबारा न मिल सके। बिना सहेजी स्रोत जानकारी वाले पुराने इनवॉइस null source/reference/rounding फ़ील्ड और provenance_available false दिखाते हैं, कभी आज के डेटा को ऐतिहासिक कोट बनाकर नहीं।
market_rate_at_event स्प्रेड से पहले का संकेतात्मक कैश डेटा है, जो इवेंट बनते समय स्थिर हो जाता है। इसमें स्रोत समय, stale और reference-proxy संकेत हैं; उपयोग योग्य कैश जोड़ी न हो तो null है। कोई लाइव दर अनुरोध सूचना नहीं रोकता और यह बाज़ार अवलोकन कभी देय राशि नहीं बदलता। तय कस्टम टोकन is_fixed से चिह्नित हैं; DEX टोकन अपने प्रोजेक्ट-विशिष्ट स्रोत का इस्तेमाल करते हैं, समान प्रतीक वाले किसी टोकन का नहीं।
शीर्ष-स्तरीय paid_chain, paid_asset, paid_payment_method_id और settlement_exchange_rate (4.1.2+) निपटान के बाद प्रमाणित सफल तरीके की पहचान करते हैं, चुने हुए चेकआउट विकल्प या अलग तरीकों के जोड़ की नहीं। निपटान से पहले, अमान्य होने के बाद, बिना स्नैपशॉट के पुराने निपटान में या योग्य नीति-अंतिम फंड के बिना मैन्युअल स्वीकृति पर सारांश फ़ील्ड null होते हैं। प्रतीक प्रदर्शन लेबल हैं: सटीक नेटवर्क/एसेट/कॉन्ट्रैक्ट पहचान के लिए तरीके के ID का अनुसरण करें।
Merchant 5.0.1, paid_asset इकाइयों में सटीक दशमलव स्ट्रिंग के रूप में paid_asset_amount और paid_asset_amount_received जोड़ता है; payload_version 2 रहता है। paid_asset_amount स्प्रेड और ऊपर की राउंडिंग सहित पूरी लॉक कोट राशि है, कभी सहनशीलता सीमा या बाकी बैलेंस नहीं। paid_asset_amount_received निपटान पर सफल तरीके की कुल वैध प्राप्तियाँ हैं, जिसमें पुष्टि की प्रतीक्षा करते फंड और स्वीकार्य कमी या अधिकता शामिल है। उदाहरण: 100 USDC का कोट, 99 प्राप्त और सहनशीलता से स्वीकृत होने पर 100 और 99 मिलते हैं, 99 और 99 नहीं। दोनों निपटान स्नैपशॉट के साथ स्थिर हैं; हर इवेंट की प्राप्तियों के लिए payment_info.methods[].amounts या वर्तमान रिकॉर्ड के लिए payments API इस्तेमाल करें। योग्य स्नैपशॉट न हो और 5.0.1 से पुराने स्नैपशॉट हों तो ये null हैं; पुरानी कतारबद्ध इवेंट बॉडी नहीं बदलतीं। हिसाब-किताब के लिए सटीक दशमलव स्ट्रिंग को कभी फ़्लोटिंग पॉइंट में न बदलें।
settlement_exchange_rate निपटान के साथ कैप्चर किया स्प्रेड से पहले का कैश बाज़ार अवलोकन है, लॉक इनवॉइस कोट या निष्पादित एक्सचेंज ट्रेड नहीं। इसका ढाँचा market_rate_at_event जैसा है; EUR/USDC के साथ 1.17 asset_per_invoice_currency का मतलब 1 EUR = 1.17 USDC है। स्रोत टाइमस्टैम्प और stale/fixed/proxy संकेत इसकी गुणवत्ता बताते हैं। जोड़ी न मिलने पर दर null रहती है, लेकिन प्रमाणित तरीके में paid_* फ़ील्ड रहते हैं। यह कभी देय राशि नहीं बदलता या लाइव प्रदाता कॉल का इंतज़ार नहीं करता। उसी तरीके से बाद के भुगतान, पुनः प्रयास और दोबारा डिलीवरी सहेजे स्नैपशॉट को नहीं बदल सकते, सहेजी null दर को भी नहीं। असली दोबारा निपटान या निपटान तरीका बदलने पर नया स्नैपशॉट कैप्चर होता है; observed_at उस कैप्चर को बताता है, जबकि settled_at पहला निपटान समय रख सकता है। पुरानी इवेंट बॉडी नहीं बदलतीं।
अधिकतम आठ देखे गए तरीके और हर तरीके के हाल के पाँच भुगतान अवलोकन, संख्या और सूची कटने के संकेतों के साथ शामिल होते हैं। पेलोड बजट इन ऐरे को और छोटा कर सकता है। भुगतान अवलोकन एक ट्रांसफ़र/लॉग/UTXO आउटपुट है, ज़रूरी नहीं कि विशिष्ट लेनदेन हैश हो। पूरे वर्तमान इतिहास के लिए payment_method_id, limit और offset के साथ GET /v1/projects/YOUR_PROJECT_ID/invoices/{invoice_id}/payments इस्तेमाल करें। इनवॉइस विवरण हर कोट किए तरीके और उसके quote_details को रखता है। API लिंक में आपके कॉन्फ़िगर किए होस्ट और क्रेडेंशियल चाहिए; कॉलबैक से मिले किसी मनमाने URL पर bearer टोकन कभी न भेजें।
Lightning, transaction_id के बजाय payment_hash इस्तेमाल करता है; प्राप्ति पता, एक्सप्लोरर और देखी गई पुष्टियाँ null हैं। इसकी सटीक BTC राशि 11 दशमलव स्थान (millisatoshi) इस्तेमाल करती है और प्रभावी सहनशीलता शून्य है। कोई BOLT11 भुगतान प्रीइमेज, वॉलेट कुंजी, हस्ताक्षर सीक्रेट या प्रदाता क्रेडेंशियल शामिल नहीं है। ग्राहक/मेटाडेटा फ़ील्ड केवल मर्चेंट जवाब और हस्ताक्षरित कॉलबैक में होने चाहिए, सार्वजनिक चेकआउट में कभी नहीं; मेटाडेटा में क्रेडेंशियल न रखें।
सुरक्षित रूप से प्राप्त करें
- पार्स करने से पहले मेल खाते सीक्रेट से बिल्कुल मूल रॉ बॉडी सत्यापित करें। दुकान → IPN, कस्टम ipn_url डिलीवरी सहित IPN सीक्रेट देता है। हर दुकान → वेबहुक एंडपॉइंट का अपना सीक्रेट है। इनमें से कोई API टोकन नहीं; एक बदलने से दूसरे नहीं बदलते।
- हस्ताक्षरित टाइमस्टैम्प जाँचें (SDK डिफ़ॉल्ट: दोनों दिशाओं में पाँच मिनट) और मौजूद होने पर हस्ताक्षरित प्रोजेक्ट/दुकान ID को रिसीवर कॉन्फ़िगरेशन से मिलाएँ। HTTP 2xx लौटाने से पहले स्थायी कतार में रखें। प्रति-इवेंट प्रोसेसिंग में v2 event_id हस्ताक्षरित है; केवल हेडर ID रीप्ले सुरक्षा नहीं हैं क्योंकि वे हेडर हस्ताक्षरित नहीं हैं। ऑर्डर-स्थिति इनबॉक्स में invoice_id और sequence के डुप्लिकेट हटाएँ और मूल इनवॉइस स्थिति फ़ील्ड की तुलना करें, पूरी v2 बॉडी की नहीं: अलग इवेंट प्रकार/ID एक संशोधन साझा कर सकते हैं।
- वर्कर में अपने कॉन्फ़िगर किए API origin से वर्तमान इनवॉइस पाएँ, किसी मनमाने कॉलबैक लिंक से नहीं। सहेजे ऑर्डर, प्रोजेक्ट/दुकान, राशि और मुद्रा का मिलान करें, वर्तमान settled स्थिति ज़रूरी रखें और मैन्युअल स्वीकृति व अपवाद की अपनी नीति लागू करें। इवेंट डुप्लिकेट हटाने से अलग, ऑर्डर लॉक करके डेटाबेस ट्रांज़ैक्शन में एक बार पूरा करें।
- नए sequence के ऊपर पुराना कभी लागू न करें। अलग इवेंट एक संशोधन साझा कर सकते हैं; संशोधन-स्तर के डुप्लिकेट हटाने के साथ केवल invoice.settled फ़िल्टर न जोड़ें। दोबारा खोलने/मिलान से स्थिति बदल सकती है; अपडेट का क्रम sequence तय करता है, स्थिति की कोई तय रैंकिंग नहीं। दोबारा ऑर्डर पूरा करने के बजाय उलटाव समीक्षा के लिए दर्ज करें।
रिसीवर उदाहरण: PHP · Python · Node.js / TypeScript.
हस्ताक्षर सत्यापन और डिलीवरी नियम
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyWhollySignature(rawBody, header, signingSecret, toleranceSeconds = 300) {
const match = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header || "");
if (!match) return false;
const timestamp = Number(match[1]);
if (!Number.isSafeInteger(timestamp)) return false;
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - timestamp) > toleranceSeconds) return false;
// rawBody must be the exact request Buffer, before JSON parsing.
const expected = createHmac("sha256", signingSecret)
.update(String(timestamp))
.update(".")
.update(rawBody)
.digest();
const presented = Buffer.from(match[2], "hex");
return timingSafeEqual(expected, presented);
}| डिलीवरी नियम | विवरण |
|---|---|
| हेडर | Wholly-Signature, Wholly-Event-Id और Wholly-Delivery-Id; Content-Type application/json है। |
| हस्ताक्षर | <unix timestamp>.<exact raw body> पर HMAC-SHA256; हेडर फ़ॉर्मैट t=<timestamp>,v1=<64 lowercase hex>। |
| सफलता | कोई भी HTTP 2xx जवाब। रीडायरेक्ट का अनुसरण नहीं होता; गैर-2xx जवाब विफलता हैं। |
| टाइमआउट | कनेक्शन टाइमआउट 5 सेकंड और पूरे अनुरोध का टाइमआउट 10 सेकंड। |
| पुनः प्रयास का समयक्रम | फिर प्रयास योग्य विफलताओं के लिए अधिकतम 8 प्रयास: तुरंत, फिर पिछले प्रयास के पूरा होने के बाद 10s, 1m, 5m, 15m, 1h, 6h और 24h की देरी। IPN अपने आप फिर प्रयास करता है; हर वेबहुक एंडपॉइंट के लिए स्वचालित पुनः प्रयास बंद किया जा सकता है। |
| लक्ष्य की सुरक्षा | केवल सार्वजनिक HTTPS। डिलीवरी के लिए DNS दोबारा सत्यापित करके पिन किया जाता है; स्थानीय/निजी/आरक्षित लक्ष्य अस्वीकार होते हैं। |
| इवेंट रखने की अवधि | सूचना इवेंट पेलोड और डिलीवरी 90 दिन रखने का समय निर्धारित है; सहेजे विवरण सीमित बैच में हटाए जाते हैं। |
| डुप्लिकेट हटाना | कॉन्फ़िगर किए प्रोजेक्ट के दायरे में हस्ताक्षरित invoice_id और sequence स्थायी रूप से रखें। Wholly-Event-Id इवेंट की पहचान करता है; Wholly-Delivery-Id डिलीवरी रिकॉर्ड की (पुनः प्रयास इसे फिर इस्तेमाल करते हैं; मैन्युअल दोबारा डिलीवरी नया बनाती है)। दोनों ID हेडर अहस्ताक्षरित हैं। |
| इवेंट के नाम | संस्करण 2 बॉडी में event_id और event_type पर हस्ताक्षर करता है। पुराने कतारबद्ध इवेंट में दोनों नहीं हैं। अलग इवेंट प्रकार एक इनवॉइस sequence साझा कर सकते हैं; संशोधन से इनवॉइस स्थिति का मिलान करें या हस्ताक्षरित event_id से अलग इवेंट के डुप्लिकेट हटाएँ। |
| सीक्रेट बदलना | बदलने पर ओवरलैप या संस्करण हेडर नहीं होता और कतारबद्ध, पुनः प्रयास वाली तथा मैन्युअल डिलीवरी के हस्ताक्षर तुरंत बदलते हैं। |
| रुकी हुई डिलीवरी | अपर्याप्त प्रोसेसिंग क्रेडिट IPN/वेबहुक और उनके पुनः प्रयास रोक देते हैं। आने वाले भुगतान जारी रहते हैं; फंड जोड़ने के बाद पेलोड रखने की अवधि के भीतर कतारबद्ध सूचनाएँ फिर चलती हैं। |
AI सहायक · MCP
अपने मर्चेंट इंस्टॉलेशन से असिस्टेंट जोड़ें।
Merchant 5.0.0 में आपके कॉन्फ़िगर किए API डोमेन पर वैकल्पिक MCP सर्वर है। यह आपके इंस्टॉलेशन के भीतर चलता है, किसी साझा Wholly Crypto रिले से नहीं।
- सेटिंग → API पहुँच खोलें। अलग क्रेडेंशियल बनाएँ, केवल असिस्टेंट के ज़रूरी प्रोजेक्ट असाइन करें और केवल पढ़ने की पहुँच से शुरू करें। ऑपरेटर द्वारा होस्ट किए खाते में पहले ऑपरेटर इंस्टॉलेशन की MCP सेवा सक्षम करता है; आप केवल अपने क्रेडेंशियल और अनुमतियाँ सँभालते हैं।
- AI कनेक्शन · MCP में MCP सक्षम करें, क्रेडेंशियल चुनें और उसकी MCP पहुँच सेव करें। स्पष्ट रूप से सक्षम किए जाने तक मौजूदा क्रेडेंशियल की MCP पहुँच नहीं होती।
- MCP सर्वर URL अपने क्लाइंट की रिमोट HTTP सर्वर सेटिंग में कॉपी करें। OAuth के साथ मर्चेंट कंसोल में साइन इन करें, क्लाइंट का नाम और वापसी पता जाँचें, क्रेडेंशियल चुनें और मंज़ूरी दें। मौजूदा Basic Auth और TOTP सुरक्षा तब भी लागू होती है।
- इनवॉइस बनाने के लिए रीड/राइट क्रेडेंशियल, उसकी MCP नीति में पढ़ना + इनवॉइस बनाना, mcp:invoice:create OAuth दायरा और स्पष्ट मंज़ूरी भी चाहिए। मंज़ूरी के बाद क्रेडेंशियल में जोड़े प्रोजेक्ट OAuth कनेक्शन को कभी अपने आप नहीं मिलते।
{
"mcpServers": {
"whollycrypto": {
"url": "https://api.example.com/mcp"
}
}
}| टूल | पहुँच | उद्देश्य |
|---|---|---|
| list_projects | पढ़ें | कनेक्शन को असाइन किए सक्षम प्रोजेक्ट; limit/offset से पृष्ठ विभाजन। |
| list_stores | पढ़ें | project_id के भीतर दुकानें, ID और सक्षम स्थिति; limit/offset से पृष्ठ विभाजन। |
| list_payment_methods | पढ़ें | project_id + store_id के लिए कॉन्फ़िगर किए चेन, टोकन और Lightning तरीके। |
| get_wallet_balances | पढ़ें | ताज़गी/उपलब्धता फ़ील्ड के साथ प्राप्ति पते और कैश बैलेंस; वॉलेट सीक्रेट कभी नहीं। |
| list_invoices | पढ़ें | दुकान, स्थिति या खोज से फ़िल्टर किए प्रोजेक्ट इनवॉइस; limit/offset से पृष्ठ विभाजन। |
| get_invoice | पढ़ें | project_id + invoice_id से पूरा इनवॉइस विवरण और चेकआउट लिंक। |
| get_delivery_history | पढ़ें | दुकान की IPN/वेबहुक स्थितियाँ, प्रयास और HTTP परिणाम। वैकल्पिक invoice_id/kind फ़िल्टर; सीक्रेट या कॉलबैक बॉडी नहीं। |
| convert_amount | पढ़ें | from, to और दशमलव-स्ट्रिंग amount से कैश संदर्भ रूपांतरण; इनवॉइस कोट नहीं। |
| create_invoice | स्पष्ट लेखन अनुमति | project_id, store_id, idempotency_key और invoice (मौजूदा इनवॉइस निर्माण बॉडी)। invoice.payment_methods दुकान के सक्षम तरीके फ़िल्टर करता है; 5.4.0+ निष्क्रिय/अस्वीकार्य विकल्प अनदेखा करता है और कोई मेल न मिले तो दुकान के डिफ़ॉल्ट अपनाता है। केवल चेन चुनने पर सभी सक्रिय स्वीकार्य एसेट चुने जाते हैं। चेन के दायरे वाले asset_tickers 5.3.0 से समर्थित हैं। सामान्य इनवॉइस जवाब लौटाता है। |
प्रोटोकॉल, OAuth और सुरक्षा
HTTPS पर Streamable HTTP इस्तेमाल करें। घोषित प्रोटोकॉल संस्करण पर सहमति करें और अगले POST में MCP-Protocol-Version शामिल करें। Content-Type: application/json और Accept: application/json, text/event-stream भेजें। जवाब सीमित JSON हैं; दोबारा जुड़ने पर MCP सेशन ID नहीं चाहिए।
OAuth छोटी अवधि वाले एक्सेस टोकन (15 मिनट), एक बार इस्तेमाल वाले S256 PKCE कोड (5 मिनट) और बदलते रीफ़्रेश टोकन (कनेक्शन अवधि 30 दिन) इस्तेमाल करता है। पहले इस्तेमाल रीफ़्रेश टोकन को फिर इस्तेमाल करने से कनेक्शन रद्द होता है। समाप्ति, क्रेडेंशियल बदलने, नीति बदलाव या कैनॉनिकल API डोमेन बदलने के बाद फिर जुड़ें।
OAuth डिस्कवरी केवल MCP सक्षम होने पर सार्वजनिक है। resource पैरामीटर डिस्कवरी से लौटे कैनॉनिकल URL के बराबर होना चाहिए, /mcp सहित। डायनैमिक पंजीकरण समर्थित है; रिमोट क्लाइंट-ID मेटाडेटा दस्तावेज़ और क्लाइंट सीक्रेट नहीं।
कस्टम Authorization हेडर समर्थित करने वाले क्लाइंट के लिए MCP-सक्षम मर्चेंट API टोकन Bearer के रूप में इस्तेमाल हो सकता है। उसकी अलग REST अनुमतियाँ बनी रहती हैं; केवल MCP तक सीमित कनेक्शन के लिए OAuth को प्राथमिकता दें। क्रेडेंशियल कभी चैट, URL, टूल तर्क या स्रोत नियंत्रण में पेस्ट न करें।
MCP क्रेडेंशियल का प्रति-मिनट REST कोटा और सटीक स्रोत-IP प्रतिबंध तथा API होस्ट के IP प्रतिबंध साझा करता है। OAuth अनुमति सूची बाइपास नहीं करता। रिमोट AI क्लाइंट के लिए उनके दस्तावेज़ में दिए आउटगोइंग IP स्वीकार करें या सोच-समझकर यह प्रतिबंध बंद रखें। MCP/OAuth रूट पर वेब सुरक्षा चैलेंज या कैशिंग लागू नहीं होनी चाहिए।
HTTP त्रुटियाँ: 401 में प्रमाणीकरण चाहिए, 403 origin/IP/अनुमति अस्वीकार करता है, 404 का मतलब MCP बंद या गलत होस्ट, 405 का मतलब POST इस्तेमाल करें, 413 का मतलब 32 KiB बॉडी सीमा, 429 में Retry-After होता है। JSON-RPC त्रुटियाँ error.code इस्तेमाल करती हैं; टूल-स्तर की विफलताएँ HTTP 200 के साथ भी result.isError=true इस्तेमाल करती हैं। सफल परिणामों में content और structuredContent होते हैं।
सूचियों में डिफ़ॉल्ट 25 पंक्तियाँ, अधिकतम 100; offset की सीमा 1000000 है। टूल जवाब 2 MiB तक सीमित हैं। समाप्त अनुमतियाँ, प्राधिकरण अनुरोध और रेट बकेट अपने आप हटते हैं; सेटिंग में अधिकतम 100 सक्रिय OAuth कनेक्शन दिखते हैं।
बंद प्रोजेक्ट/दुकानों को MCP से संचालित नहीं कर सकते। कनेक्शन दुकान की सक्षम स्थिति सूची में दिखा सकता है, लेकिन भुगतान तरीके, डिलीवरी इतिहास पढ़ने या इनवॉइस बनाने के लिए दुकान सक्षम होनी चाहिए। सामान्य कंसोल प्रोजेक्ट उपयोगकर्ता MCP का प्रशासन नहीं कर सकते।
नए इनवॉइस के लिए नया idempotency_key इस्तेमाल करें; टाइमआउट के बाद उसी क्रेडेंशियल, कुंजी और बिल्कुल समान invoice ऑब्जेक्ट से फिर प्रयास करें। दशमलव राशियाँ, स्प्रेड, सहनशीलता, पुष्टियाँ और चेकआउट रूप-रंग REST इनवॉइस अनुबंध का पालन करते हैं। MCP कभी मर्चेंट भुगतान या क्रेडिट नीति बाइपास नहीं करता।
शुरुआती टूल निजी कुंजियाँ/रिकवरी फ़्रेज़ दिखा नहीं सकते, फंड भेज या स्वीप नहीं कर सकते, रिफ़ंड जारी, कॉलबैक दोबारा, भुगतान तरीके बदल, खाते/डोमेन संपादित या बिलिंग सँभाल नहीं सकते। इनवॉइस विवरण, ग्राहक फ़ील्ड और मेटाडेटा को अविश्वसनीय डेटा मानें, एजेंट निर्देश नहीं। जुड़े AI प्रदाता वही डेटा पाते हैं जिसे पढ़ने की आप अनुमति देते हैं।
| मेथड | पथ | अनुबंध |
|---|---|---|
| POST | /mcp | प्रमाणित JSON-RPC: initialize, ping, tools/list, tools/call। सूचना अनुरोध 202 लौटाते हैं; बैच अस्वीकार होते हैं। |
| GET / DELETE | /mcp | प्रमाणित 405: सीमित JSON जवाब, अलग SSE स्ट्रीम नहीं और सर्वर-पक्ष MCP सेशन नहीं। |
| GET | /.well-known/oauth-protected-resource/mcp | कैनॉनिकल संसाधन URL और प्राधिकरण-सर्वर डिस्कवरी; /.well-known/oauth-protected-resource पर भी उपलब्ध। |
| GET | /.well-known/oauth-authorization-server | OAuth एंडपॉइंट, authorization_code/refresh_token, S256 PKCE और समर्थित दायरे। |
| POST | /mcp/oauth/register | सार्वजनिक-क्लाइंट पंजीकरण: client_name और सटीक redirect_uris। केवल HTTPS या लूपबैक HTTP। क्लाइंट सीक्रेट या रिमोट मेटाडेटा प्राप्ति नहीं। |
| GET | /mcp/oauth/authorize | client_id, redirect_uri, response_type=code, resource, code_challenge, code_challenge_method=S256, वैकल्पिक scope/state; कंसोल मंज़ूरी पर रीडायरेक्ट करता है। |
| POST | /mcp/oauth/token | फ़ॉर्म-एन्कोडेड authorization_code + code + code_verifier + redirect_uri या refresh_token + refresh_token। हमेशा client_id और resource शामिल करें। |
| POST | /mcp/oauth/revoke | फ़ॉर्म-एन्कोडेड client_id और token। मेल खाते एक्सेस/रीफ़्रेश-टोकन कनेक्शन को रद्द करता है। |
सीधे टूल अनुरोध का उदाहरण
पहले MCP क्लाइंट से आरंभ करें और प्रोटोकॉल पर सहमति करें। यह उसके बाद का अनुरोध दिखाता है।
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/mcp" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'MCP-Protocol-Version: 2025-11-25' \
--header 'Accept: application/json, text/event-stream' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_invoices",
"arguments": {
"project_id": "YOUR_PROJECT_ID",
"limit": 10
}
}
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const body = `{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_invoices",
"arguments": {
"project_id": "YOUR_PROJECT_ID",
"limit": 10
}
}
}`;
const response = await fetch("https://api.example.com/mcp", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"MCP-Protocol-Version": "2025-11-25",
"Accept": "application/json, text/event-stream",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$body = <<<'JSON'
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_invoices",
"arguments": {
"project_id": "YOUR_PROJECT_ID",
"limit": 10
}
}
}
JSON;
$ch = curl_init("https://api.example.com/mcp");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "MCP-Protocol-Version: 2025-11-25", "Accept: application/json, text/event-stream", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"MCP-Protocol-Version": "2025-11-25",
"Accept": "application/json, text/event-stream",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_invoices",
"arguments": {
"project_id": "YOUR_PROJECT_ID",
"limit": 10
}
}
}""".encode("utf-8")
request = Request("https://api.example.com/mcp",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))ऑपरेटर API
अलग, सीमित दायरे की सर्वर-पक्ष कुंजियों से होस्ट किए मर्चेंट तैयार करें।
कई कारोबार होस्ट करें और api.example.com/v1/operator से उनका सेटअप स्वचालित करें। केवल ऑपरेटर मोड में 7.4.0 से उपलब्ध। सामान्य मर्चेंट API अपरिवर्तित रहता है।
- ऑपरेटर → सेटिंग → ऑपरेटर API खोलें और सक्षम करें (डिफ़ॉल्ट बंद)। केवल ज़रूरी अनुमतियों और होस्ट किए मर्चेंट के साथ अलग क्रेडेंशियल बनाएँ।
- wc_operator_ कुंजी अपने सर्वर पर रखें। API होस्टनाम इस्तेमाल करें, ऑपरेटर पैनल होस्टनाम या मर्चेंट कुंजी नहीं।
- हर ऑपरेटर POST से पहले Idempotency-Key और सटीक अनुरोध बॉडी स्थायी रूप से सेव करें। अनिश्चित परिणाम के बाद खाता फिर पढ़ें; केवल पुनः प्रयास के लिए कुंजी कभी न बदलें।
- onboarding: direct और पासवर्ड से या onboarding: invitation और बिना पासवर्ड के मर्चेंट बनाएँ। फिर प्रोजेक्ट/दुकानें बनाएँ और उसके चेकआउट इंटीग्रेशन के लिए प्रोजेक्ट-दायरे की मर्चेंट कुंजी जारी करें।
| दायरा | पहुँच |
|---|---|
| merchants.read / merchants.write | होस्ट किए मर्चेंट की सूची/विवरण और निर्माण/अपडेट। |
| users.read / users.write / users.security | उपयोगकर्ता पढ़ें/बनाएँ/अपडेट करें; पासवर्ड बदलना या सेशन रद्द करना अलग है। कभी ऑपरेटर एडमिनिस्ट्रेटर नहीं बनाता। |
| invitations.read / invitations.write | एक बार इस्तेमाल वाले आमंत्रण/रीसेट लिंक की सूची/विवरण, निर्माण, बदलाव और रद्द करना। नए उपयोगकर्ता के लिए users.write भी चाहिए; रीसेट के लिए users.security भी। |
| credits.read / credits.write / fees.write | बैलेंस/लेजर पढ़ें; स्थानीय क्रेडिट दें या सुधारें; आगे लागू होने वाले शुल्क सेट करें। गैर-शून्य शुरुआती क्रेडिट के लिए credits.write चाहिए। |
| topups.read / topups.write | होस्ट किए मर्चेंट के क्रेडिट चेकआउट अनुरोध पढ़ें या बनाएँ। कोई API कार्रवाई इन्हें चुकाया हुआ चिह्नित नहीं कर सकती। |
| projects.read / projects.write / reports.read | मर्चेंट प्रोजेक्ट, दुकानें, रूप-रंग और भुगतान सेटिंग तैयार करें; इनवॉइस, वॉलेट बैलेंस और वित्तीय रिपोर्ट पढ़ें। |
| merchant_credentials.read / merchant_credentials.write | सामान्य सीमित-दायरे की मर्चेंट कुंजियाँ सँभालें। शक्तिशाली अनुमति: जारी होने के बाद वे कुंजियाँ स्वतंत्र रूप से काम करती हैं। |
| events.read / webhooks.write / audit.read / health.read | जीवनचक्र इतिहास पढ़ें; हस्ताक्षरित जीवनचक्र कॉलबैक कॉन्फ़िगर करें; ऑडिट/क्षमताएँ/नोड स्थिति पढ़ें। |
ऑनबोर्डिंग, क्रेडिट, अनुमतियाँ और सुरक्षित पुनः प्रयास
| विषय | नियम |
|---|---|
| क्रेडेंशियल | वैकल्पिक समाप्ति और सटीक IPv4/IPv6 अनुमति सूची; डिफ़ॉल्ट 60 अनुरोध/मिनट, 1–600 तक कॉन्फ़िगर करने योग्य। हर अनुरोध जारी करने वाले एडमिनिस्ट्रेटर और वर्तमान दायरे जाँचता है। HTTP 429 में Retry-After होता है। |
| अलगाव | कुंजियाँ केवल अपने असाइन किए होस्टेड मर्चेंट तक पहुँचती हैं। मर्चेंट बनाने और पूरे इंस्टॉलेशन की रिपोर्ट देखने के लिए सभी-मर्चेंट पहुँच चाहिए। ऑपरेटर का अपना कारोबार बाहर रहता है। |
| पहला साइन-इन | सीधे बनाए खाते स्वीकार करते हैं कि होस्ट उनकी वॉलेट कुंजियों तक पहुँच सकता है। require_password_change पहले लॉगिन पर पासवर्ड बदलना ज़रूरी करता है। आमंत्रण स्वीकार करते समय फंड नियंत्रण की स्पष्ट स्वीकृति चाहिए, फिर सामान्य साइन-इन होता है। Basic Auth और मौजूदा TOTP लागू रहते हैं। |
| आमंत्रण | नए उपयोगकर्ता के लिंक 48 घंटे चलते हैं; पासवर्ड रीसेट लिंक एक घंटा। टोकन एक बार इस्तेमाल होते हैं। फिर जारी करने पर पुराना लिंक रद्द होता है। SMTP स्वीकृति इनबॉक्स में पहुँचने की गारंटी नहीं; email_delivery जाँचें। |
| सुरक्षित पुनः प्रयास | हर ऑपरेटर POST में 16–128 अक्षर की कुंजी चाहिए (अक्षर, अंक, -, _ या .)। वही कुंजी और सटीक URL/बॉडी सहेजा परिणाम लौटाते हैं। अलग बाइट पर 409 लौटता है। रीप्ले में सीक्रेट/लिंक नहीं मिलते; ज़रूरत पर नई स्पष्ट कार्रवाई से बदलें या फिर जारी करें। |
| अनिश्चित परिणाम | operator_request_in_progress का मतलब कार्रवाई चल रही है या उसकी रसीद दर्ज होने से पहले बाधित हुई। संसाधन और ऑडिट जाँचें; बिना जाँच नई कुंजी न भेजें। पूरी हुई रसीदें 30 दिन बाद संक्षिप्त की जाती हैं; पुरानी कुंजियाँ तब भी फिर नहीं चल सकतीं। |
| क्रेडिट और शुल्क | दशमलव स्ट्रिंग, अधिकतम छह दशमलव स्थान। starting_credit एक बार का स्थानीय अनुदान है। समायोजन के लिए चिह्न सहित राशि, note और request_id तथा HTTP पुनः प्रयास कुंजी चाहिए। fee_bps=100 का मतलब 1%; बदलाव भविष्य के इनवॉइस पर लागू होते हैं। अनुदान इंस्टॉलेशन का अपना प्रीपेड बैलेंस नहीं भरते। |
| रोकना | enabled=false होस्टेड खाता बंद करता है और कंसोल सेशन रद्द करता है। payments_paused=true नए इनवॉइस रोकता है। मौजूदा भुगतान निगरानी जारी रहती है। प्रोजेक्ट/दुकान निर्माण और ऑटोमेशन इंस्टॉलेशन की क्रेडिट नीति बनाए रखते हैं। |
| उपलब्ध नहीं | वॉलेट सीक्रेट, हस्ताक्षर, भेजना, रिफ़ंड, स्थायी हटाना, TOTP रीसेट, डोमेन बदलाव या सर्वर-स्तरीय कॉन्फ़िगरेशन नहीं। सामान्य इनवॉइस अनुरोध अब भी मर्चेंट कुंजी और मर्चेंट API इस्तेमाल करते हैं। |
ऑपरेटर जीवनचक्र वेबहुक
| इवेंट | डेटा |
|---|---|
| merchant.created / merchant.updated | merchant_id, enabled, payments_paused, fee_bps। |
| user.created / user.updated | merchant_id, user_id, enabled। अपडेट इवेंट ईमेल, सक्षम स्थिति और एडमिन भूमिका के बदलाव कवर करता है। |
| invitation.accepted / password_reset.completed | merchant_id, user_id, invitation_id। |
| topup.settled / credit.balance_changed | merchant_id, ledger_id, kind, amount और balance। मिलान करते समय मर्चेंट क्रेडिट मुद्रा या लेजर विवरण पढ़ें। |
ऑपरेटर जीवनचक्र इवेंट इनवॉइस IPN/दुकान वेबहुक से अलग हैं। सब्सक्रिप्शन बनाने वाले ऑपरेटर क्रेडेंशियल का होता है, हर कुंजी पर अधिकतम 10 एंडपॉइंट। केवल भविष्य के मेल खाते इवेंट कतार में आते हैं; सहेजे इतिहास के लिए GET /events इस्तेमाल करें।
बॉडी में event_id, event_type, merchant_id, occurred_at और data होते हैं। एंडपॉइंट के एक बार दिखने वाले signing_secret से सटीक रॉ बॉडी पर Wholly-Signature सत्यापित करें: HMAC-SHA256(secret, timestamp + '.' + raw_body), हेडर t=...,v1=....। टाइमस्टैम्प की छोटी सहनशीलता लागू करें।
SDK का सामान्य हस्ताक्षर सत्यापक इस्तेमाल करें, उसका इनवॉइस-सूचना पार्सर नहीं। फिर merchant_id और event_type सत्यापित करें, ट्रांज़ैक्शन में event_id सहेजें/डुप्लिकेट हटाएँ और स्थायी स्वीकृति के बाद ही 2xx लौटाएँ। Wholly-Event-Id को हस्ताक्षरित बॉडी से मेल खाना चाहिए। अहस्ताक्षरित हेडर को कारोबारी डेटा न मानें।
डिलीवरी कम-से-कम एक बार होती है, क्रम से बाहर आ सकती है और अधिकतम 8 प्रयास होते हैं। मिलान के लिए वर्तमान संसाधन पढ़ें; occurred_at निरंतर बढ़ता क्रम नहीं है। डिलीवरी से पहले दायरा और सक्षम/समाप्ति सेटिंग फिर जाँची जाती हैं। बंद सब्सक्रिप्शन पहले से कतारबद्ध काम रोकते हैं, लेकिन बंद रहते नए इवेंट कतार में नहीं डालते।
इवेंट और डिलीवरी इतिहास 30 दिन रखे जाते हैं। इंस्टॉलेशन की ऑटोमेशन नीति डिलीवरी रोक सकती है। GET /webhooks/{id}/deliveries परिणाम और अपरिवर्तनीय पेलोड दिखाता है; सार्वजनिक API समाप्त रिकॉर्ड की ज़बरदस्ती डिलीवरी नहीं करता।
{
"event_id": "55555555-5555-4555-8555-555555555555",
"event_type": "merchant.created",
"merchant_id": "11111111-1111-4111-8111-111111111111",
"occurred_at": "2026-10-01T12:00:00Z",
"data": {
"merchant_id": "11111111-1111-4111-8111-111111111111",
"enabled": true,
"payments_paused": false,
"fee_bps": 300
}
}मार्केटप्लेस API
सुरक्षित विक्रेता हिस्सों और नियंत्रित भुगतान वाला एक चेकआउट।
एक ग्राहक इनवॉइस, सटीक विक्रेता हिस्से और नियंत्रित समान-एसेट भुगतान। हर प्रोजेक्ट में अलग सक्षम करें। संस्करण 8.0.0 Bitcoin mainnet और कॉन्फ़िगर किए समर्थित EVM नेटिव कॉइन / मानक ERC-20 टोकन का समर्थन करता है, सभी प्राप्ति नेटवर्क का नहीं।
- प्रोजेक्ट में मार्केटप्लेस सक्षम करें, भाग लेने वाली दुकानें चुनें और कॉन्फ़िगरेशन के दौरान भुगतान रोके रखें।
- विक्रेता पंजीकृत करें और उनके भुगतान पते स्वतंत्र रूप से सत्यापित करें। नया गंतव्य pending होता है; मंज़ूरी के लिए destinations.approve चाहिए।
- सेटिंग → API पहुँच में अलग मार्केटप्लेस क्रेडेंशियल बनाएँ। सामान्य मर्चेंट, ऑपरेटर और MCP क्रेडेंशियल मार्केटप्लेस फंड खर्च नहीं कर सकते।
- 1–100 सकारात्मक दशमलव-स्ट्रिंग आवंटनों वाला इनवॉइस बनाएँ जिनका कुल इनवॉइस राशि के बिल्कुल बराबर हो। हर विक्रेता के पास दुकान के किसी साझा समर्थित नेटवर्क पर मंज़ूर गंतव्य होना चाहिए।
- सत्यापित आवंटन उपलब्धता का इंतज़ार करें। भुगतान तैयार करें, उसके अपरिवर्तनीय प्राप्तकर्ता और खर्च सीमाएँ पढ़ें, फिर उसके संशोधन और सटीक plan_hash को मंज़ूरी दें। भुगतान की पोलिंग करें या हस्ताक्षरित इवेंट सत्यापित करें।
| विषय | नियम |
|---|---|
| फंड का नियंत्रण | ग्राहक फंड पहले प्रोजेक्ट-नियंत्रित वॉलेट में आते हैं। विक्रेताओं को भुगतान होने तक मार्केटप्लेस/सर्वर मालिक उन कुंजियों को नियंत्रित करता है। यह ग्राहक से सीधे विक्रेता भुगतान, एस्क्रो या विक्रेता लॉगिन प्रणाली नहीं है। |
| तीन विक्रेता | तीन 100 USD हिस्सों और 4% कमीशन वाला 300 USD इनवॉइस हर विक्रेता को कोट की गई क्रिप्टो का 96 USD-समतुल्य आवंटित करता है और 12 USD-समतुल्य सकल कमीशन रखता है। योजना क्रिप्टो की परमाणु इकाइयों की गारंटी देती है, भविष्य के फ़िएट मूल्य की नहीं। |
| शुल्क | मौजूदा प्रोसेसिंग शुल्क मूल निपटाए इनवॉइस की राशि/मुद्रा पर एक बार लागू होता है। कॉन्फ़िगर किए 1% पर यह 3 USD प्रीपेड क्रेडिट है, जिससे चेन शुल्क से पहले 9 USD-समतुल्य कमीशन बचता है। विक्रेता भुगतान अतिरिक्त ग्राहक-बिक्री शुल्क नहीं बनाते। |
| आवंटन | सबसे बड़े शेष वाला आवंटन हर परमाणु इकाई सुरक्षित रखता है। कमीशन नीचे राउंड होता है; शेष विक्रेता की शुद्ध राशि है। आवंटन ओवरराइड, इनवॉइस ओवरराइड, विक्रेता ओवरराइड और दुकान/प्रोजेक्ट डिफ़ॉल्ट का स्नैपशॉट लिया जाता है। भुगतान पर नई विनिमय दर नहीं लगती। |
| सुरक्षित फंड | सामान्य भेजना, स्वीप, एक्सचेंज जमा और क्रेडिट ऑटो-टॉप-अप मार्केटप्लेस प्राप्ति पतों को बाहर रखते हैं। नेटवर्क शुल्क और टोकन गैस के लिए अलग मुक्त नेटिव कॉइन चाहिए। कैश वॉलेट मूल्य संकेतात्मक हैं; हस्ताक्षर से पहले स्वतंत्र लाइव फंड समर्थन जाँचा जाता है। |
| अंतिमता | मार्केटप्लेस भुगतान प्रमाण के लिए सकारात्मक चेन न्यूनतम और दो स्वतंत्र संगत प्रदाता ज़रूरी हैं, भले चेकआउट शून्य पुष्टियाँ या एक स्कैनर स्वीकार करे। प्रदाता कूलडाउन भुगतान सत्यापन/भुगतान को टालता है, अन्यथा वैध इनवॉइस निर्माण को नहीं। |
| अपवाद | सामान्य चेकआउट सहनशीलता से स्वीकार कम भुगतान रोके जाते हैं, अधिक आवंटित नहीं होते। विशेषाधिकार वाला रिलीज़ सटीक छोटे, पूरी तरह फंड-समर्थित विभाजन को मंज़ूरी दे सकता है। केवल अधिक भुगतान BTC या समर्थित EVM नेटिव/ERC-20 तरीकों पर कोट किया विक्रेता विभाजन कभी नहीं रोकता। अतिरिक्त राशि अलग रोकी रहती है। Bitcoin सुरक्षित चेंज इनवॉइस पते पर लौटाता है; अलग प्रोजेक्ट फंड शुल्क और डस्ट-न्यूनतम के टॉप-अप को कवर करते हैं। मिश्रित तरीके, देर/अस्पष्ट/पुनर्गठित भुगतान और फंड समर्थन की कमी पर समीक्षा चाहिए। |
| रिफ़ंड | एक स्पष्ट पुष्टि-प्राप्त तरीके की पूरी राशि का उसी एसेट में रिफ़ंड तैयार करें, फिर अलग से भुगतान के रूप में मंज़ूर करें। अवैतनिक आवंटन और कमीशन उलटते हैं। सभी विक्रेताओं को भुगतान होने पर प्राथमिक वॉलेट पते में अलग से फंड डालें; वापस छीनने की सुविधा नहीं है। आंशिक विक्रेता बैच और मिश्रित-एसेट रिफ़ंड में पहले मिलान चाहिए। 8.0.0 में आंशिक-राशि रिफ़ंड और कमीशन निकासी उपलब्ध नहीं हैं। |
| पुनः प्रयास | हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें। |
| संशोधन | बदलने योग्य रिकॉर्ड के लिए उनका वर्तमान revision चाहिए। मंज़ूरी/फिर शुरू करने के लिए expected_plan_hash और confirm:true भी चाहिए। तैयारी 15 मिनट के लिए फंड आरक्षित करती है; मंज़ूरी एक घंटा देती है। समाप्त अहस्ताक्षरित कार्य सुरक्षित रूप से रिलीज़ होता है। हस्ताक्षरित/अनिश्चित ट्रांसफ़र अपनी पहचान और आरक्षण रखते हैं। |
| स्वचालित भुगतान | डिफ़ॉल्ट बंद। हर एसेट की नीति मंज़ूर गंतव्य, सकारात्मक न्यूनतम, प्रति-भुगतान/चलती-24-घंटे की मूल राशि और नेटिव शुल्क/गैस सीमाएँ, अंतराल व पुष्टियाँ अधिकृत करती है। अधिकार बदलने/रद्द करने से न भेजा काम रुकता है; निगरानी जारी रहती है। सीमाओं में आरक्षित और अनिश्चित योजनाएँ शामिल हैं। बिलिंग से रुकी नीतियाँ निष्पक्ष ढंग से फिर तय होती हैं। अमान्य इनवॉइस समीक्षा के लिए रुकता है, दूसरे योग्य इनवॉइस समूह नहीं रोकता। |
| रोकना और रिकवरी | कम क्रेडिट और ट्रांसफ़र सुरक्षा जाँच तब भी खर्च रोकती हैं। निगरानी और लेजर मिलान जारी रहते हैं। फिर शुरू करने पर उसी सहेजी योजना की समीक्षा होती है। दो स्वतंत्र प्रदाताओं से प्रमाणित कैनॉनिकल EVM रिवर्ट को स्पष्ट मंज़ूरी के बाद बचे शुल्क बजट में बदला जा सकता है; मूल हैश और शुल्क दर्ज रहते हैं। अज्ञात परिणाम या टोकन डिलीवरी में अंतर रुके रहते हैं। पूरे डेटाबेस और कुंजियों का बैकअप लें; बहाली के बाद भुगतान की अनुमति से पहले भेजे हैश का मिलान करें। |
| पहचानकर्ता और पृष्ठ विभाजन | प्रोजेक्ट सेटिंग से प्रोजेक्ट UUID और दुकानें → मूल → API ID से दुकान UUID लें। विक्रेता/भुगतान/एसेट ID यह API लौटाता है। invoice_id सार्वजनिक इनवॉइस UUID है। पृष्ठबद्ध संसाधन data और pagination {page,per_page,total,pages} लौटाते हैं; डिफ़ॉल्ट 1/25, अधिकतम 100 पंक्तियाँ। सटीक धनराशियाँ स्ट्रिंग हैं। |
| क्रेडेंशियल का दायरा | कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं। |
मार्केटप्लेस अनुमतियाँ
marketplace.read · vendors.write · destinations.write · destinations.approve · invoices.write · policies.write · commissions.override · payouts.write · payouts.approve · webhooks.write · reconciliation.write
आवंटन स्थितियाँ
pending · held · available · reserved · paid · refunding · refunded · shortfall
भुगतान स्थितियाँ
awaiting_approval · queued · funding_gas · sending · confirming · partially_paid · paid · needs_attention · cancelled · expired
मार्केटप्लेस इवेंट
अलग मार्केटप्लेस हस्ताक्षर सीक्रेट, इनवॉइस कॉलबैक जैसे Wholly हस्ताक्षर हेडर और रॉ-बॉडी HMAC सत्यापन एल्गोरिदम के साथ। टाइमस्टैम्प/हस्ताक्षर सत्यापित करें, event_id के डुप्लिकेट हटाएँ और तुरंत 2xx लौटाएँ। डिलीवरी कम-से-कम एक बार, अधिकतम आठ प्रयासों तक; इतिहास वही इवेंट फिर भेज सकता है। एंडपॉइंट बदलने पर ग्राहक डेटा रीडायरेक्ट करने के बजाय पुरानी न भेजी डिलीवरी रद्द होती हैं। इनवॉइस निपटान विक्रेता भुगतान पूरा होना नहीं है। केवल बाहरी कॉलबैक के कहने पर कभी पैसे न भेजें।
marketplace.invoice.createdmarketplace.allocations.availablemarketplace.allocations.heldmarketplace.payout.approvedmarketplace.payout.broadcastmarketplace.payout.confirmedmarketplace.payout.partialmarketplace.payout.failedmarketplace.payout.cancelledmarketplace.refund.preparedmarketplace.refund.confirmed
{
"event_id": "11111111-1111-4111-8111-111111111111",
"event_type": "marketplace.payout.confirmed",
"payload_version": 1,
"project_id": "YOUR_PROJECT_ID",
"occurred_at": "2026-10-06T12:00:00Z",
"data": {
"payout_id": "YOUR_PAYOUT_ID",
"asset_id": "YOUR_ASSET_ID",
"amount_atomic": "28800000",
"transactions": [
{
"transaction_id": "EXAMPLE_TRANSACTION_ID",
"explorer_url": "https://mempool.space/tx/EXAMPLE_TRANSACTION_ID"
}
]
}
}कई विक्रेताओं के लिए भुगतान सेट करें · मार्केटप्लेस इनवॉइस बनाएँ
त्रुटियाँ और सीमाएँ
सत्यापन, कोटा और पुनः प्रयास को पूर्वानुमेय ढंग से सँभालें।
HTTP स्थिति जाँचें और Content-Type जवाब पार्स करने से पहले। इसके लिए 429, कम-से-कम इंतज़ार करें Retry-After अवधि तक, फिर प्रयास करने से पहले।
| सीमा | विवरण |
|---|---|
| अनुरोध दर | हर क्रेडेंशियल का कोटा: डिफ़ॉल्ट प्रति UTC मिनट 120 अनुरोध, सेटिंग → API में 1 से 6000 तक कॉन्फ़िगर करने योग्य। सभी प्रमाणित v1 रीड और राइट, समान परिणाम वाले पुनः प्रयास और प्रमाणीकरण के बाद प्राधिकरण/सत्यापन विफलताएँ भी, डोमेन, प्रोजेक्ट और प्रक्रियाओं में यही सीमा साझा करते हैं। अमान्य क्रेडेंशियल, कंसोल रूट और सार्वजनिक चेकआउट इसका उपयोग नहीं करते। |
| रेट-लिमिट हेडर | प्रमाणित v1 जवाबों में X-RateLimit-Limit, X-RateLimit-Remaining और X-RateLimit-Reset (अगले UTC मिनट की सीमा के Unix सेकंड) होते हैं। अतिरिक्त अनुरोध JSON 429 rate_limit_exceeded और पूर्णांक-सेकंड Retry-After लौटाते हैं। कम-से-कम उतना इंतज़ार करें और पुनः प्रयास में यादृच्छिक देरी जोड़ें। तय विंडो मिनट की सीमा पर अचानक अनुरोधों की अनुमति देती हैं; यह प्रति-सेकंड अनुरोधों की गारंटी नहीं है। |
| मर्चेंट बॉडी | एप्लिकेशन राउटर पर अधिकतम 32 KiB। JSON त्रुटि आवरण बनने से पहले एज बहुत बड़ा अनुरोध अस्वीकार कर सकता है। |
| इनवॉइस सूची | limit डिफ़ॉल्ट 50 है और 1–100 स्वीकार करता है; offset 0–1,000,000 स्वीकार करता है। खोज अधिकतम 100 अक्षर की है। नतीजे नए पहले आते हैं और total/has_more मेटाडेटा शामिल करते हैं। |
| दुकान के तरीके | हर दुकान में अधिकतम 64 एसेट चयन, जो सभी 30 नेटिव चेन और सीमित सत्यापित-टोकन कैटलॉग के लिए काफ़ी हैं। प्रोजेक्ट नीति, स्कैनर क्षमता और तैयार बैकअप वाला चेन वॉलेट तब भी इनवॉइस निर्माण की शर्त हैं। |
| टोकन खोज | संभावित टोकन की limit डिफ़ॉल्ट 50 है और 1–100 स्वीकार करती है। ऑन-चेन सत्यापन सफल होने तक खोज नतीजे भुगतान एसेट नहीं हैं। |
| पंजीकृत प्रोजेक्ट टोकन | हर प्रोजेक्ट में अधिकतम 20 स्थायी टोकन एसेट। पहले पंजीकृत एसेट बिना दूसरा स्लॉट लिए दोबारा इस्तेमाल हो सकते हैं। |
| इडेम्पोटेंसी | इनवॉइस निर्माण के लिए ज़रूरी। बिना स्पेस के 1–128 दृश्य ASCII अक्षर; कुंजियाँ हर दुकान में विशिष्ट हैं और रीप्ले में मूल क्रेडेंशियल व बिल्कुल मूल रॉ बॉडी चाहिए। |
| मेटाडेटा | केवल JSON ऑब्जेक्ट, अधिकतम 4,096 एन्कोडेड बाइट और पाँच स्तर की नेस्टिंग। |
| कॉलबैक | 2,048 बाइट तक सार्वजनिक HTTPS URL। सूचना अनुरोध बॉडी 256 KiB तक सीमित हैं; सहेजे इनवॉइस इवेंट पेलोड सीमित भुगतान इतिहास के साथ 64 KiB तक हैं। |
| चेकआउट संसाधन | QR SVG जवाब private और no-store हैं क्योंकि कम भुगतान से सटीक बाकी राशि बदलती है। संस्करणयुक्त PNG लोगो एक साल सार्वजनिक कैश होते हैं और अपरिवर्तनीय हैं। |
| API एज | प्रबंधित API अपस्ट्रीम अनुरोध का रीड टाइमआउट 30 सेकंड है। कॉल करने वाले को उसके कार्य बजट से छोटे स्पष्ट टाइमआउट के लिए बनाएँ। |
| गैर-JSON विफलताएँ | गलत UUID/क्वेरी निकालना, गलत मेथड और 32 KiB लंबाई सुरक्षा फ़्रेमवर्क टेक्स्ट/खाली जवाब लौटा सकते हैं। अज्ञात /v1 पथ अभी 404 कंसोल HTML लौटाते हैं; पार्स करने से पहले स्थिति और Content-Type सत्यापित करें। |
त्रुटि संदर्भ
| HTTP | त्रुटि कोड | मतलब |
|---|---|---|
| 400 | invalid_reconciliation_action | अपवाद की स्थिति, कारण, खोज या इतिहास-पृष्ठ फ़िल्टर अमान्य है। |
| 500 | reconciliation_unavailable | अपवाद कतार या प्रमाण लोड नहीं हो सका। बढ़ते अंतराल के साथ रीड फिर प्रयास करें। |
| 402 | billing_required | हर नए इनवॉइस के लिए सत्यापित जुड़ा क्रेडिट खाता और लाइव प्राधिकरण चाहिए। अपर्याप्त प्रीपेड क्रेडिट निर्माण या आने वाले भुगतान नहीं रोकते: इसके बजाय IPN, वेबहुक और स्वीप रुकते हैं, जबकि शुल्क जुड़ते रहते हैं। निलंबित खाते, समाप्त/अमान्य बिलिंग सत्यापन, पहुँच से बाहर क्रेडिट सेवा या अनधिकृत इनवॉइस फ़िएट आधार पर निर्माण बंद रहता है। शुल्क मूल इनवॉइस फ़िएट राशि पर लगता है, प्राप्त क्रिप्टो, स्प्रेड, अधिक भुगतान या नेटवर्क शुल्क पर नहीं। वह राशि और स्वतंत्र रूपांतरण चेकआउट निर्माण से पहले पंजीकृत होते हैं। सेवा बाधित होने पर मौजूदा निगरानी और इनवॉइस प्राप्ति जारी रहती है। फंड जोड़ने पर कतारबद्ध सूचनाएँ अपनी सामान्य पेलोड अवधि में फिर चलती हैं और सक्षम स्वीप नियम बहाल होते हैं। सेटिंग → शुल्क जाँचें और विफल निर्माण उसी Idempotency-Key से फिर प्रयास करें। |
| 400 | invalid_json | गलत JSON, अज्ञात फ़ील्ड या दस्तावेज़ के अनुरोध से न मिलती बॉडी। |
| 400 | idempotency_key_required | इनवॉइस निर्माण में Idempotency-Key नहीं दी गई। |
| 400 | invalid_idempotency_key | कुंजी खाली, 128 बाइट से बड़ी, गैर-ASCII है या उसमें व्हाइटस्पेस अथवा नियंत्रण बाइट है। |
| 400 | invalid_payment_request | सत्यापित फ़ील्ड या चुना सक्रिय तरीका विफल हुआ। सटीक रुकावट के लिए error.message और error.details.payment_methods (PaymentMethodIssue[]) पढ़ें। SDK 2.4.0+ सुरक्षित, कार्रवाई योग्य अपवाद सारांश और समस्या हेल्पर जोड़ता है; पुराने PHP SDK getApiMessage() देते हैं। |
| 400 | invalid_invoice_status | सूची का status दस्तावेज़ में दी छह इनवॉइस स्थितियों से बाहर है। |
| 400 | invalid_callback_url | प्रभावी IPN लक्ष्य HTTPS, सार्वजनिक-पता, DNS या SSRF सत्यापन में विफल हुआ। |
| 400 | invalid_wallet_request | वॉलेट/पता तैयारी का इनपुट अमान्य है। |
| 400 | invalid_token_asset | टोकन चेन, संभावित टोकन क्वेरी, CoinGecko पहचान, कैटलॉग मेटाडेटा या कॉन्ट्रैक्ट/मिंट इनपुट अमान्य है। |
| 401 | authentication_required | Bearer टोकन अनुपस्थित, गलत, बंद, बदला गया या अज्ञात है। |
| 403 | source_ip_denied | क्रेडेंशियल के IP प्रतिबंध में अनुरोध का सटीक सार्वजनिक स्रोत पता शामिल नहीं है। |
| 403 | source_ip_not_allowed | होस्टनाम का स्रोत IP प्रतिबंध इस क्लाइंट को बाहर रखता है। एडमिनिस्ट्रेटर सेटिंग → सिस्टम में लाइव होस्ट की अनुमति सूची सँभाल सकता है; ये क्रेडेंशियल के IP प्रतिबंधों के अतिरिक्त लागू होती हैं। |
| 503 | source_access_unavailable | होस्टनाम पहुँच सत्यापन अस्थायी रूप से उपलब्ध नहीं है। बाद में फिर प्रयास करें; जाँच विफल होने पर प्रतिबंध पहुँच बंद रखते हैं। |
| 403 / 409 / 500 | merchant_api_access_denied | प्राधिकरण विफल: अनुमति/प्रोजेक्ट दायरे पर 403, बंद प्रोजेक्ट/दुकान पर 409 और प्राधिकरण बैकएंड विफलता पर 500 हो सकता है। ऑपरेटर प्राप्ति वॉलेट ऑपरेटर पैनल के लिए आरक्षित हैं, मर्चेंट API क्रेडेंशियल या MCP के लिए नहीं, पुराने स्पष्ट प्रोजेक्ट अनुदान के साथ भी नहीं। |
| 403 | project_access_denied | निर्माण के समय ट्रांज़ैक्शन में दोबारा जाँच से पता चला कि क्रेडेंशियल को अब प्रोजेक्ट की पहुँच नहीं है। |
| 404 | invoice_not_found | अधिकृत प्रोजेक्ट में उस सार्वजनिक ID का इनवॉइस नहीं है या चेकआउट उसे दिखा नहीं सकता। |
| 404 | payment_resource_not_found | इनवॉइस तैयार करते समय ज़रूरी प्रोजेक्ट, दुकान, एसेट या वॉलेट अब मौजूद नहीं है। |
| 404 | token_candidate_not_found | प्रोजेक्ट उपलब्ध नहीं है या टोकन वर्तमान मेल खाते खोज कैटलॉग में अब नहीं है। |
| 409 | idempotency_conflict | दुकान-दायरे की कुंजी पहले से है और क्रेडेंशियल या सटीक रॉ अनुरोध बाइट अलग हैं। |
| 409 | store_unavailable | प्रोजेक्ट/दुकान बंद या अनुपलब्ध है। |
| 409 | no_ready_payment_methods | दुकान का कोई तरीका तैयार नहीं। chain_slug, asset_ticker और reason_code के लिए error.message और error.details.payment_methods पढ़ें। वॉलेट बैकअप/सक्रियण, इंस्टॉल एडॉप्टर और मूल्य निर्धारण वैध होने चाहिए। 6.0.6 से स्कैनर कूलडाउन, विफल या पुरानी स्थिति जाँच और प्रदाता कोरम न होना निर्माण नहीं रोकते। |
| 409 | payment_method_unavailable | निर्माण के समय अविभाज्य दोबारा जाँच में चुना तरीका अनुपलब्ध हो गया। |
| 409 | store_payment_method_not_selected | दुकान द्वारा अभी न चुने एसेट के लिए दुकान की पुष्टि ओवरराइड माँगी गई। |
| 409 | wallet_unavailable | निर्माण के समय अविभाज्य दोबारा जाँच में भुगतान वॉलेट अनुपलब्ध हो गया। |
| 409 | ipn_secret_required | प्रभावी IPN URL मौजूद है, लेकिन दुकान में IPN हस्ताक्षर सीक्रेट नहीं है। |
| 409 | payment_resource_not_ready | ज़रूरी भुगतान एसेट या वॉलेट बंद है, उसका बैकअप नहीं है, साझा-खाता सक्रियण प्रमाण की प्रतीक्षा है, क्षमता ख़त्म है या अन्यथा तैयार नहीं है। |
| 409 | account_activation_unverified | कॉन्फ़िगर की गई संख्या के स्वस्थ mainnet एंडपॉइंट (डिफ़ॉल्ट 2, वैकल्पिक 1) से XRP Ledger या Stellar खाता सक्रियण प्रमाणित नहीं हुआ; सटीक खाते में फंड डालें और सत्यापन फिर करें। |
| 400 | invalid_monero_wallet_rpc | HTTPS एंडपॉइंट, सटीक mainnet प्राथमिक पता, लेबल या पूरा Digest/Basic/हेडर प्रमाणीकरण इनपुट अमान्य है। |
| 404 | monero_wallet_rpc_not_found | प्रोजेक्ट-दायरे की Monero wallet-RPC बाइंडिंग मौजूद नहीं है। |
| 409 | monero_wallet_rpc_not_ready | Monero एसेट, दो-डेमन कोरम, अपरिवर्तनीय बाइंडिंग या स्पष्ट बैकअप/केवल-दृश्य प्रमाणन तैयार नहीं है। |
| 409 | monero_wallet_rpc_unavailable | इनवॉइस निर्माण के लिए वैध सर्वर-पक्ष क्रेडेंशियल के साथ सक्रिय, सत्यापित, प्रमाणित प्रोजेक्ट Monero wallet-RPC बाइंडिंग चाहिए। |
| 503 | lightning_unavailable | दुकान का एकमात्र तैयार तरीका Lightning है और उसका वॉलेट या कोट सत्यापित नहीं हो सका। उसी इडेम्पोटेंसी कुंजी से फिर प्रयास करें। दूसरा तैयार ऑन-चेन तरीका होने पर अनुपलब्ध Lightning तरीका छोड़ दिया जाता है। |
| 422 | monero_wallet_rpc_verification_failed | सटीक वॉलेट, HTTPS पिनिंग, सिंक्रनाइज़ेशन, mainnet डेमन कोरम या गेटवे मेथड-अस्वीकृति प्रमाण विफल हुआ। |
| 503 | monero_wallet_rpc_failed | बाहरी watch-only wallet-RPC इनवॉइस उपपता सुरक्षित रूप से बना और दोबारा पढ़ नहीं सका; कोई वैकल्पिक पता गढ़ा नहीं जाता। |
| 409 | token_chain_not_ready | नेटिव चेन एसेट बंद है, सत्यापन के दौरान खोज मैपिंग बदली या प्रोजेक्ट में पहले से वर्तमान अधिकतम 20 पंजीकृत टोकन एसेट हैं। |
| 503 | dex_price_unavailable | DEX प्रदाता अनुपलब्ध, व्यस्त, रेट-लिमिटेड है या जवाब पुराना अथवा डेटा गलत है। एक मिनट बाद फिर प्रयास करें; तय मूल्य निर्धारण उपलब्ध रहता है। |
| 422 | invalid_dex_price | अमान्य मूल्य-मोड संयोजन या चुना पूल सटीक कॉन्ट्रैक्ट की योग्य कीमत नहीं दे सकता। दूसरा पूल या तय USD मूल्य चुनें। |
| 422 | token_verification_failed | हर योग्य नोड चेन पहचान, कॉन्ट्रैक्ट कोड, दशमलव स्थान, बैलेंस क्वेरी या मिंट सत्यापन में विफल हुआ। |
| 422 | invalid_store_confirmation_policy | इस अंतिमता मोड में दुकान ओवरराइड अनुपलब्ध है, लौटाई गई चेन-संबंधी सीमाओं से बाहर है या असमर्थित शून्य-पुष्टि स्वीकृति माँगता है। |
| 409 | invoice_not_payable | चेकआउट इनवॉइस अंतिम स्थिति में है या भुगतान समय-सीमा बीत चुकी है। |
| 409 | invoice_payment_method_locked | वैध भुगतान पहले ही दूसरा एसेट चुन चुका है; active_payment_method_id के साथ जारी रखें। |
| 409 | payment_method_not_payable | चुना तरीका पूरा है या अब दूसरा भुगतान स्वीकार नहीं करता। |
| 422 | payment_qr_unavailable | चेकआउट भुगतान अनुरोध SVG QR चित्र में एन्कोड करने के लिए बहुत बड़ा है। |
| 503 | payment_rates_unavailable | किसी भी तैयार भुगतान तरीके के लिए ताज़ा विश्वसनीय कोट उपलब्ध नहीं है। |
| 500 | authentication_unavailable | Bearer प्रमाणीकरण अपना सहेजा क्रेडेंशियल सुरक्षित रूप से पढ़ या सत्यापित नहीं कर सका। |
| 429 | rate_limit_exceeded | इस क्रेडेंशियल की वर्तमान UTC मिनट की सीमा ख़त्म है। कम-से-कम Retry-After सेकंड इंतज़ार करें; उसी इडेम्पोटेंसी कुंजी से इनवॉइस निर्माण फिर प्रयास करें। |
| 500 | database_error / internal_error | अस्थायी सर्वर-पक्ष विफलता; उसी इडेम्पोटेंसी कुंजी से सुरक्षित फिर प्रयास करें। |
API परिचय
फ़ील्ड, उदाहरण और जवाब देखने के लिए एंडपॉइंट चुनें।
इनवॉइस
POSTइनवॉइस बनाएँ/v1/projects/{project_id}/stores/{store_id}/invoicesGETइनवॉइस की सूची पाएँ/v1/projects/{project_id}/invoicesGETइनवॉइस प्राप्त करें/v1/projects/{project_id}/invoices/{invoice_id}GETइनवॉइस के भुगतानों की सूची पाएँ/v1/projects/{project_id}/invoices/{invoice_id}/paymentsभुगतान के तरीके
GETप्रोजेक्ट के भुगतान एसेट की सूची पाएँ/v1/projects/{project_id}/payment-assetsPUTप्रोजेक्ट की एसेट नीति अपडेट करें/v1/projects/{project_id}/payment-assets/{asset_id}GETसंभावित भुगतान टोकन देखें/v1/projects/{project_id}/payment-token-candidatesPOSTटोकन सत्यापित करके पंजीकृत करें/v1/projects/{project_id}/payment-token-assetsGETकस्टम टोकन के DEX पूल खोजें/v1/projects/{project_id}/payment-token-dex-poolsPOSTकस्टम टोकन जोड़ें या कीमत बदलें/v1/projects/{project_id}/payment-token-assets/customGETदुकान के भुगतान तरीकों की सूची पाएँ/v1/projects/{project_id}/stores/{store_id}/payment-assetsPUTदुकान के भुगतान तरीके बदलें/v1/projects/{project_id}/stores/{store_id}/payment-assetsPUTदुकान की पुष्टि नीति सेट करें/v1/projects/{project_id}/stores/{store_id}/payment-assets/{asset_id}/confirmation-policyवॉलेट
GETप्रोजेक्ट के वॉलेट और बैलेंस की सूची पाएँ/v1/projects/{project_id}/walletsमिलान
GETभुगतान अपवादों की सूची पाएँ/v1/projects/{project_id}/reconciliationGETमिलान के प्रमाण पढ़ें/v1/projects/{project_id}/reconciliation/{invoice_id}मार्केटप्लेस API
GETक्षमताएँ/v1/marketplace/capabilitiesGETमार्केटप्लेस रिपोर्ट/v1/marketplace/overviewGETप्रोजेक्ट सेटिंग/v1/marketplace/settingsPOSTप्रोजेक्ट सेटिंग सेव करें/v1/marketplace/settingsGETविक्रेताओं की सूची पाएँ/v1/marketplace/vendorsPOSTविक्रेता बनाएँ/v1/marketplace/vendorsGETविक्रेता प्राप्त करें/v1/marketplace/vendors/{vendor_id}POSTविक्रेता अपडेट करें/v1/marketplace/vendors/{vendor_id}/updatePOSTविक्रेता संग्रहित करें/v1/marketplace/vendors/{vendor_id}/archiveGETविक्रेता के गंतव्य/v1/marketplace/vendors/{vendor_id}/destinationsPOSTभुगतान गंतव्य जोड़ें/v1/marketplace/vendors/{vendor_id}/destinationsPOSTगंतव्य मंज़ूर करें/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/approvePOSTगंतव्य बंद करें/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/disableGETविक्रेता बैलेंस/v1/marketplace/vendors/{vendor_id}/balancesGETमार्केटप्लेस इनवॉइस/v1/marketplace/invoicesPOSTबहु-विक्रेता इनवॉइस बनाएँ/v1/marketplace/invoicesGETइनवॉइस और आवंटन/v1/marketplace/invoices/{invoice_id}GETइनवॉइस भुगतान प्रमाण/v1/marketplace/invoices/{invoice_id}/paymentsGETइनवॉइस आवंटन/v1/marketplace/invoices/{invoice_id}/allocationsPOSTअवैतनिक इनवॉइस रद्द करें/v1/marketplace/invoices/{invoice_id}/cancelPOSTआवंटन रोकें/v1/marketplace/invoices/{invoice_id}/allocations/holdPOSTआवंटन की समीक्षा करके जारी करें/v1/marketplace/invoices/{invoice_id}/allocations/releasePOSTअवैतनिक गंतव्य दोबारा बाँधें/v1/marketplace/invoices/{invoice_id}/allocations/{allocation_id}/destinationPOSTपूरा रिफ़ंड तैयार करें/v1/marketplace/invoices/{invoice_id}/refundGETभुगतान आवंटन खोजें/v1/marketplace/allocationsGETप्रोजेक्ट लेजर बैलेंस/v1/marketplace/balancesGETअपरिवर्तनीय जर्नल/v1/marketplace/ledgerGETभुगतान इतिहास/v1/marketplace/payoutsPOSTआवंटन योजना का पूर्वावलोकन/v1/marketplace/payouts/previewPOSTभुगतान तैयार करें/v1/marketplace/payoutsGETभुगतान विवरण/v1/marketplace/payouts/{payout_id}POSTमंज़ूरी दें और भेजें/v1/marketplace/payouts/{payout_id}/approvePOSTभुगतान की समीक्षा करके फिर शुरू करें/v1/marketplace/payouts/{payout_id}/resumePOSTअहस्ताक्षरित कार्य रद्द करें/v1/marketplace/payouts/{payout_id}/cancelGETस्वचालित भुगतान नीतियाँ/v1/marketplace/policiesPOSTभुगतान नीति को अधिकृत करें/v1/marketplace/policiesGETमार्केटप्लेस वेबहुक/v1/marketplace/webhooksPOSTमार्केटप्लेस वेबहुक बनाएँ/v1/marketplace/webhooksPOSTमार्केटप्लेस वेबहुक अपडेट करें/v1/marketplace/webhooks/{webhook_id}/updatePOSTमार्केटप्लेस वेबहुक बंद करें/v1/marketplace/webhooks/{webhook_id}/disableGETमार्केटप्लेस इवेंट/v1/marketplace/eventsGETसहेजा गया इवेंट पढ़ें/v1/marketplace/events/{event_id}GETमार्केटप्लेस डिलीवरी इतिहास/v1/marketplace/webhook-deliveriesGETडिलीवरी विवरण/v1/marketplace/webhook-deliveries/{delivery_id}POSTवही इवेंट दोबारा भेजें/v1/marketplace/webhook-deliveries/{delivery_id}/resendऑपरेटर API
GETक्षमताएँ/v1/operator/capabilitiesGETस्थिति/v1/operator/healthGETमर्चेंट की सूची पाएँ/v1/operator/merchantsPOSTमर्चेंट बनाएँ/v1/operator/merchantsGETमर्चेंट प्राप्त करें/v1/operator/merchants/{merchant_id}POSTमर्चेंट अपडेट करें/v1/operator/merchants/{merchant_id}GETउपयोगकर्ताओं की सूची पाएँ/v1/operator/merchants/{merchant_id}/usersPOSTउपयोगकर्ता बनाएँ/v1/operator/merchants/{merchant_id}/usersGETउपयोगकर्ता प्राप्त करें/v1/operator/merchants/{merchant_id}/users/{user_id}POSTउपयोगकर्ता अपडेट करें/v1/operator/merchants/{merchant_id}/users/{user_id}POSTउपयोगकर्ता का पासवर्ड सेट करें/v1/operator/merchants/{merchant_id}/users/{user_id}/passwordPOSTउपयोगकर्ता के सेशन रद्द करें/v1/operator/merchants/{merchant_id}/users/{user_id}/revoke-sessionsGETआमंत्रणों की सूची पाएँ/v1/operator/merchants/{merchant_id}/invitationsPOSTआमंत्रण बनाएँ/v1/operator/merchants/{merchant_id}/invitationsGETआमंत्रण प्राप्त करें/v1/operator/invitations/{invitation_id}POSTआमंत्रण फिर भेजें/v1/operator/invitations/{invitation_id}/resendPOSTआमंत्रण रद्द करें/v1/operator/invitations/{invitation_id}/revokeGETक्रेडिट प्राप्त करें/v1/operator/merchants/{merchant_id}/creditsGETक्रेडिट लेजर की सूची पाएँ/v1/operator/merchants/{merchant_id}/credits/ledgerPOSTक्रेडिट समायोजित करें/v1/operator/merchants/{merchant_id}/credits/adjustmentsGETटॉप-अप की सूची पाएँ/v1/operator/merchants/{merchant_id}/topupsPOSTटॉप-अप बनाएँ/v1/operator/merchants/{merchant_id}/topupsGETटॉप-अप प्राप्त करें/v1/operator/merchants/{merchant_id}/topups/{topup_id}GETरिपोर्ट/v1/operator/reportsGETऑडिट सूची पाएँ/v1/operator/auditGETइवेंट की सूची पाएँ/v1/operator/eventsGETवेबहुक की सूची पाएँ/v1/operator/webhooksPOSTवेबहुक बनाएँ/v1/operator/webhooksPOSTवेबहुक अपडेट करें/v1/operator/webhooks/{webhook_id}POSTवेबहुक सीक्रेट बदलें/v1/operator/webhooks/{webhook_id}/rotateGETवेबहुक डिलीवरी की सूची पाएँ/v1/operator/webhooks/{webhook_id}/deliveriesGETप्रोजेक्ट की सूची पाएँ/v1/operator/merchants/{merchant_id}/projectsPOSTप्रोजेक्ट बनाएँ/v1/operator/merchants/{merchant_id}/projectsGETप्रोजेक्ट प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}POSTप्रोजेक्ट अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}GETदुकानों की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesPOSTदुकान बनाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesGETदुकान प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}POSTदुकान अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}GETदुकान का रूप-रंग प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearancePOSTदुकान का रूप-रंग अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceGETदुकान के भुगतान एसेट की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsPOSTदुकान के भुगतान एसेट अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsGETदुकान के वेबहुक की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksPOSTदुकान का वेबहुक बनाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksPOSTदुकान का वेबहुक अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooks/{webhook_id}GETइनवॉइस की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoicesGETइनवॉइस प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoices/{invoice_id}GETवॉलेट की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/walletsGETवॉलेट पतों की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/wallets/{wallet_id}/addressesGETमर्चेंट क्रेडेंशियल की सूची पाएँ/v1/operator/merchants/{merchant_id}/api-credentialsPOSTमर्चेंट क्रेडेंशियल बनाएँ/v1/operator/merchants/{merchant_id}/api-credentialsPOSTमर्चेंट क्रेडेंशियल अपडेट करें/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}POSTमर्चेंट क्रेडेंशियल बदलें/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/rotatePOSTमर्चेंट क्रेडेंशियल रद्द करें/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/revokePOSTआमंत्रण टोकन जाँचें/v1/onboarding/invitations/checkPOSTआमंत्रण या पासवर्ड रीसेट स्वीकार करें/v1/onboarding/invitations/acceptचेकआउट
GETचेकआउट ढाँचा/GETहोस्टेड चेकआउट पृष्ठ/invoice/{invoice_id}GETचेकआउट में सुरक्षित इनवॉइस/checkout-api/invoices/{invoice_id}GETदुकान के चेकआउट का पूर्वावलोकन/invoice/preview/{project_id}GETचेकआउट पूर्वावलोकन डेटा/checkout-api/previews/{project_id}GETदुकान का चेकआउट चित्र/checkout-api/invoices/{invoice_id}/appearance-images/{kind}/{revision}/image.pngGETदुकान का पूर्वावलोकन चित्र/checkout-api/previews/{project_id}/stores/{store_id}/appearance-images/{kind}/{revision}/image.pngGETसंस्करणयुक्त पूर्वावलोकन लोगो/checkout-api/previews/{project_id}/logo/{revision}/image.pngGETभुगतान QR चित्र/checkout-api/invoices/{invoice_id}/payment-methods/{intent_id}/qr.svgGETसंस्करणयुक्त चेकआउट लोगो/checkout-api/invoices/{invoice_id}/logo/{revision}/image.pngसेवा
GETAPI सेवा खोज/GETसेवा की स्थिति/healthzGETक्षमताएँ/v1/operator/capabilitiesकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/capabilities" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/capabilities", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/capabilities");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/capabilities",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"api_version": "v1",
"operator_version": "7.4.0",
"scopes": [
"health.read"
],
"all_merchants": false,
"merchant_ids": [
"11111111-1111-4111-8111-111111111111"
],
"onboarding": [
"direct",
"invitation"
],
"write_methods": [
"POST"
],
"idempotency_required": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- health.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETस्थिति/v1/operator/healthकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/health" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/health", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/health");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/health",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"version": "7.4.0",
"nodes": []
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- health.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETमर्चेंट की सूची पाएँ/v1/operator/merchantsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchants.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTमर्चेंट बनाएँ/v1/operator/merchantsपढ़ना + लिखना
होस्टेड मर्चेंट और पहला एडमिनिस्ट्रेटर एक अविभाज्य कार्रवाई में बनाएँ, सीधे पासवर्ड से या आमंत्रण से।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Example shop",
"email": "admin@example.test",
"onboarding": "direct",
"password": "REPLACE_WITH_A_UNIQUE_TEMPORARY_PASSWORD",
"require_password_change": true,
"currency": "EUR",
"starting_credit": "0",
"external_id": "customer-1042"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"name": "Example shop",
"email": "admin@example.test",
"onboarding": "direct",
"password": "REPLACE_WITH_A_UNIQUE_TEMPORARY_PASSWORD",
"require_password_change": true,
"currency": "EUR",
"starting_credit": "0",
"external_id": "customer-1042"
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"name": "Example shop",
"email": "admin@example.test",
"onboarding": "direct",
"password": "REPLACE_WITH_A_UNIQUE_TEMPORARY_PASSWORD",
"require_password_change": true,
"currency": "EUR",
"starting_credit": "0",
"external_id": "customer-1042"
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"name": "Example shop",
"email": "admin@example.test",
"onboarding": "direct",
"password": "REPLACE_WITH_A_UNIQUE_TEMPORARY_PASSWORD",
"require_password_change": true,
"currency": "EUR",
"starting_credit": "0",
"external_id": "customer-1042"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
onboardingdirect | invitationज़रूरीdirect के लिए password चाहिए, आमंत्रण ईमेल नहीं जाता। invitation में password नहीं देते।
passwordstring · direct only12–128 अक्षर (अधिकतम 512 UTF-8 बाइट); कभी लौटाया या ईमेल नहीं किया जाता। अस्थायी पासवर्ड के लिए require_password_change इस्तेमाल करें।
require_password_changebooleanवैकल्पिकपहले लॉगिन पर नया पासवर्ड ज़रूरी करता है। सीधे बनाए हर खाते को होस्ट किए वॉलेट के नियंत्रण की स्थिति स्वीकार करनी होगी।
currencyfiat codeवैकल्पिकप्रीपेड खाते की मुद्रा; डिफ़ॉल्ट क्षेत्रीय मुद्रा है और बाद में बदली नहीं जा सकती।
fee_bpsintegerवैकल्पिक0–10000; 100 का मतलब 1%। न देने पर ऑपरेटर डिफ़ॉल्ट इस्तेमाल होता है। fees.write चाहिए।
starting_creditdecimal stringवैकल्पिकसटीक एक बार का स्थानीय अनुदान। गैर-शून्य के लिए credits.write चाहिए। ऑपरेटर का इंस्टॉलेशन बैलेंस नहीं भरता।
send_invitation_emailbooleanवैकल्पिककेवल आमंत्रण। कॉन्फ़िगर किया SMTP चाहिए; जवाब रिले स्वीकृति और खाता निर्माण में अंतर करता है।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"merchant_id": "11111111-1111-4111-8111-111111111111",
"user_id": "22222222-2222-4222-8222-222222222222",
"merchant": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "Example shop",
"currency": "EUR",
"balance": "0"
},
"onboarding": "direct",
"access_link": null,
"email_delivery": {
"status": "not_requested"
},
"custody_acceptance_required": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchants.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- सभी मर्चेंट की पहुँच चाहिए। स्पष्ट शुल्क ओवरराइड के लिए fees.write भी; गैर-शून्य starting_credit के लिए credits.write चाहिए। आमंत्रण ऑनबोर्डिंग के लिए invitations.write भी चाहिए। स्वचालित लॉगिन नहीं, Basic Auth बाइपास नहीं, पुनः प्रयास पर पीछे से क्रेडिट नहीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETमर्चेंट प्राप्त करें/v1/operator/merchants/{merchant_id}केवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "11111111-1111-4111-8111-111111111111",
"name": "Example shop",
"currency": "EUR",
"balance": "10",
"fee_bps": 300,
"enabled": true,
"payments_paused": false,
"external_id": "customer-1042"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchants.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTमर्चेंट अपडेट करें/v1/operator/merchants/{merchant_id}पढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"payments_paused": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"payments_paused": true
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"payments_paused": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"payments_paused": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
namefieldsवैकल्पिकबंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।विवरण
बंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।
enabledfieldsवैकल्पिकबंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।विवरण
बंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।
payments_pausedfieldsवैकल्पिकबंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।विवरण
बंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।
fee_bpsfieldsवैकल्पिकबंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।विवरण
बंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।
external_idfieldsवैकल्पिकबंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।विवरण
बंद करने पर सेशन रद्द होते हैं। payments_paused नए इनवॉइस रोकता है, मौजूदा भुगतान की स्कैनिंग नहीं। शुल्क बदलाव के लिए fees.write चाहिए और वे भविष्य के इनवॉइस पर लागू होते हैं; खाते की मुद्रा नहीं बदल सकती।
जवाब 200 application/json
उदाहरण जवाब
{
"id": "11111111-1111-4111-8111-111111111111",
"name": "Example shop",
"currency": "EUR",
"balance": "10",
"fee_bps": 300,
"enabled": true,
"payments_paused": false
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchants.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETउपयोगकर्ताओं की सूची पाएँ/v1/operator/merchants/{merchant_id}/usersकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- users.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTउपयोगकर्ता बनाएँ/v1/operator/merchants/{merchant_id}/usersपढ़ना + लिखना
मर्चेंट एडमिनिस्ट्रेटर या चुने प्रोजेक्ट तक सीमित उपयोगकर्ता जोड़ें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "staff@example.test",
"display_name": "Store team",
"onboarding": "invitation",
"access_level": "projects",
"project_ids": [
"11111111-1111-4111-8111-111111111111"
],
"send_invitation_email": false
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"email": "staff@example.test",
"display_name": "Store team",
"onboarding": "invitation",
"access_level": "projects",
"project_ids": [
"11111111-1111-4111-8111-111111111111"
],
"send_invitation_email": false
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"email": "staff@example.test",
"display_name": "Store team",
"onboarding": "invitation",
"access_level": "projects",
"project_ids": [
"11111111-1111-4111-8111-111111111111"
],
"send_invitation_email": false
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"email": "staff@example.test",
"display_name": "Store team",
"onboarding": "invitation",
"access_level": "projects",
"project_ids": [
"11111111-1111-4111-8111-111111111111"
],
"send_invitation_email": false
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
access_leveladmin | projectsवैकल्पिकadmin केवल इस मर्चेंट का एडमिनिस्ट्रेटर है, कभी इंस्टॉलेशन/ऑपरेटर एडमिनिस्ट्रेटर नहीं।
project_ids[]UUID[]केवल मर्चेंट के अपने प्रोजेक्ट। प्रोजेक्ट-सीमित पहुँच के लिए चयन ज़रूरी; कभी दूसरे टेनेंट तक नहीं।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"user": {
"id": "22222222-2222-4222-8222-222222222222",
"merchant_id": "11111111-1111-4111-8111-111111111111",
"email": "admin@example.test",
"display_name": "Shop administrator",
"access_level": "admin",
"project_ids": [],
"enabled": true,
"password_setup_required": false,
"custody_acceptance_required": true,
"password_change_required": true
},
"user_id": "22222222-2222-4222-8222-222222222222",
"access_link": null,
"email_delivery": {
"status": "not_requested"
},
"merchant_id": "11111111-1111-4111-8111-111111111111"
}जवाब फ़ील्ड
userobject
user_idstringaccess_linkJSON | nullmerchant_idstringउपयोग संबंधी नोट
- users.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETउपयोगकर्ता प्राप्त करें/v1/operator/merchants/{merchant_id}/users/{user_id}केवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "22222222-2222-4222-8222-222222222222",
"merchant_id": "11111111-1111-4111-8111-111111111111",
"email": "admin@example.test",
"display_name": "Shop administrator",
"access_level": "admin",
"project_ids": [],
"enabled": true,
"password_setup_required": false,
"custody_acceptance_required": true,
"password_change_required": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- users.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTउपयोगकर्ता अपडेट करें/v1/operator/merchants/{merchant_id}/users/{user_id}पढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"display_name": "Store manager"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"display_name": "Store manager"
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"display_name": "Store manager"
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"display_name": "Store manager"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
emailfieldsवैकल्पिकदिए फ़ील्ड अपडेट करता है; अंतिम एडमिन की सुरक्षा बनी रहती है। पासवर्ड के लिए अलग users.security कार्रवाई है।
display_namefieldsवैकल्पिकदिए फ़ील्ड अपडेट करता है; अंतिम एडमिन की सुरक्षा बनी रहती है। पासवर्ड के लिए अलग users.security कार्रवाई है।
enabledfieldsवैकल्पिकदिए फ़ील्ड अपडेट करता है; अंतिम एडमिन की सुरक्षा बनी रहती है। पासवर्ड के लिए अलग users.security कार्रवाई है।
access_levelfieldsवैकल्पिकदिए फ़ील्ड अपडेट करता है; अंतिम एडमिन की सुरक्षा बनी रहती है। पासवर्ड के लिए अलग users.security कार्रवाई है।
project_idsfieldsवैकल्पिकदिए फ़ील्ड अपडेट करता है; अंतिम एडमिन की सुरक्षा बनी रहती है। पासवर्ड के लिए अलग users.security कार्रवाई है।
default_timezonefieldsवैकल्पिकदिए फ़ील्ड अपडेट करता है; अंतिम एडमिन की सुरक्षा बनी रहती है। पासवर्ड के लिए अलग users.security कार्रवाई है।
जवाब 200 application/json
उदाहरण जवाब
{
"id": "22222222-2222-4222-8222-222222222222",
"merchant_id": "11111111-1111-4111-8111-111111111111",
"email": "admin@example.test",
"display_name": "Shop administrator",
"access_level": "admin",
"project_ids": [],
"enabled": true,
"password_setup_required": false,
"custody_acceptance_required": true,
"password_change_required": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- users.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTउपयोगकर्ता का पासवर्ड सेट करें/v1/operator/merchants/{merchant_id}/users/{user_id}/passwordपढ़ना + लिखना
होस्टेड खाते का पासवर्ड सेट करें और सेशन रद्द करें। मौजूदा TOTP बना रहता है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/password" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"password": "REPLACE_WITH_A_NEW_UNIQUE_PASSWORD",
"require_password_change": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"password": "REPLACE_WITH_A_NEW_UNIQUE_PASSWORD",
"require_password_change": true
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/password", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"password": "REPLACE_WITH_A_NEW_UNIQUE_PASSWORD",
"require_password_change": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/password");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"password": "REPLACE_WITH_A_NEW_UNIQUE_PASSWORD",
"require_password_change": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/password",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"user_id": "11111111-1111-4111-8111-111111111111",
"sessions_revoked": true,
"totp_preserved": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- users.security चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTउपयोगकर्ता के सेशन रद्द करें/v1/operator/merchants/{merchant_id}/users/{user_id}/revoke-sessionsपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/revoke-sessions" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/revoke-sessions", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/revoke-sessions");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/users/YOUR_USER_ID/revoke-sessions",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"user_id": "11111111-1111-4111-8111-111111111111",
"sessions_revoked": true,
"totp_preserved": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- users.security चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETआमंत्रणों की सूची पाएँ/v1/operator/merchants/{merchant_id}/invitationsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- invitations.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTआमंत्रण बनाएँ/v1/operator/merchants/{merchant_id}/invitationsपढ़ना + लिखना
एक बार इस्तेमाल वाला आमंत्रण या पासवर्ड-रीसेट लिंक बनाएँ या बदलें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id": "11111111-1111-4111-8111-111111111111",
"send_email": false
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"user_id": "11111111-1111-4111-8111-111111111111",
"send_email": false
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"user_id": "11111111-1111-4111-8111-111111111111",
"send_email": false
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"user_id": "11111111-1111-4111-8111-111111111111",
"send_email": false
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/invitations",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
user_idUUID, booleanमौजूदा खाते के लिए एक बार इस्तेमाल वाला लिंक जारी/बदलें। सक्रिय उपयोगकर्ताओं को एक घंटे का रीसेट लिंक मिलता है और users.security चाहिए।
send_emailUUID, booleanमौजूदा खाते के लिए एक बार इस्तेमाल वाला लिंक जारी/बदलें। सक्रिय उपयोगकर्ताओं को एक घंटे का रीसेट लिंक मिलता है और users.security चाहिए।
new user fieldsalternative to user_idआमंत्रित उपयोगकर्ता बनाने के लिए email, display_name, access_level और project_ids इस्तेमाल करें; users.write चाहिए।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"user_id": "22222222-2222-4222-8222-222222222222",
"email": "admin@example.test",
"kind": "invitation",
"expires_at": "2026-10-03T12:00:00Z",
"url": "https://merchant.example.com/account-access.html#token=YOUR_PRIVATE_INVITATION_TOKEN"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- invitations.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETआमंत्रण प्राप्त करें/v1/operator/invitations/{invitation_id}केवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
invitation_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"user_id": "22222222-2222-4222-8222-222222222222",
"merchant_id": "11111111-1111-4111-8111-111111111111",
"kind": "invitation",
"status": "pending",
"created_at": "2026-10-01T12:00:00Z",
"expires_at": "2026-10-03T12:00:00Z"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- invitations.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTआमंत्रण फिर भेजें/v1/operator/invitations/{invitation_id}/resendपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
invitation_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/resend" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"send_email": false
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"send_email": false
}`;
const response = await fetch("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/resend", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"send_email": false
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/resend");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"send_email": false
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/resend",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
send_emailbooleanवैकल्पिकपिछला टोकन बदलता है, कभी क्रेडिट नहीं जोड़ता। नया बना लिंक एक बार लौटाता है। पहले सक्रिय खाते के लिए users.security चाहिए।
जवाब 200 application/json
उदाहरण जवाब
{
"user_id": "22222222-2222-4222-8222-222222222222",
"email": "admin@example.test",
"kind": "invitation",
"expires_at": "2026-10-03T12:00:00Z",
"url": "https://merchant.example.com/account-access.html#token=YOUR_PRIVATE_INVITATION_TOKEN"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- invitations.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTआमंत्रण रद्द करें/v1/operator/invitations/{invitation_id}/revokeपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
invitation_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/revoke" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{}`;
const response = await fetch("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/revoke", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/revoke");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/invitations/YOUR_INVITATION_ID/revoke",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"revoked": true,
"invitation_id": "44444444-4444-4444-8444-444444444444"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- invitations.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETक्रेडिट प्राप्त करें/v1/operator/merchants/{merchant_id}/creditsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "11111111-1111-4111-8111-111111111111",
"name": "Example shop",
"currency": "EUR",
"balance": "10",
"fee_bps": 300,
"enabled": true,
"payments_paused": false,
"external_id": "customer-1042"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- credits.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETक्रेडिट लेजर की सूची पाएँ/v1/operator/merchants/{merchant_id}/credits/ledgerकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
qवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/ledger" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/ledger", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/ledger");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/ledger",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- credits.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTक्रेडिट समायोजित करें/v1/operator/merchants/{merchant_id}/credits/adjustmentsपढ़ना + लिखना
इस मर्चेंट के प्रीपेड लेजर में कारण सहित अनुदान या सुधार जोड़ें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/adjustments" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "10.00",
"note": "Promotional credit",
"request_id": "11111111-1111-4111-8111-111111111111"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"amount": "10.00",
"note": "Promotional credit",
"request_id": "11111111-1111-4111-8111-111111111111"
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/adjustments", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"amount": "10.00",
"note": "Promotional credit",
"request_id": "11111111-1111-4111-8111-111111111111"
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/adjustments");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "10.00",
"note": "Promotional credit",
"request_id": "11111111-1111-4111-8111-111111111111"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/credits/adjustments",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"balance": "25"
}जवाब फ़ील्ड
balancestringउपयोग संबंधी नोट
- credits.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETटॉप-अप की सूची पाएँ/v1/operator/merchants/{merchant_id}/topupsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- topups.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTटॉप-अप बनाएँ/v1/operator/merchants/{merchant_id}/topupsपढ़ना + लिखना
प्रीपेड क्रेडिट के लिए चेकआउट बनाएँ; कभी मैन्युअल रूप से चुकाया हुआ न चिह्नित करें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "25.00",
"request_id": "11111111-1111-4111-8111-111111111111"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"amount": "25.00",
"request_id": "11111111-1111-4111-8111-111111111111"
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"amount": "25.00",
"request_id": "11111111-1111-4111-8111-111111111111"
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "25.00",
"request_id": "11111111-1111-4111-8111-111111111111"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"invoice_id": "33333333-3333-4333-8333-333333333333",
"checkout_url": "https://pay.example.com/invoice/33333333-3333-4333-8333-333333333333"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- topups.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETटॉप-अप प्राप्त करें/v1/operator/merchants/{merchant_id}/topups/{topup_id}केवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups/YOUR_TOPUP_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups/YOUR_TOPUP_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups/YOUR_TOPUP_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/topups/YOUR_TOPUP_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"merchant_id": "11111111-1111-4111-8111-111111111111",
"invoice_id": "33333333-3333-4333-8333-333333333333",
"amount": "25",
"currency": "EUR",
"status": "pending",
"invoice_status": "new",
"checkout_url": "https://pay.example.com/invoice/33333333-3333-4333-8333-333333333333"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- topups.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETरिपोर्ट/v1/operator/reportsकेवल पढ़ना
ऑपरेटर वित्तीय सारांश पढ़ें। सभी होस्टेड मर्चेंट तक पहुँच चाहिए।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
क्वेरी पैरामीटर
periodवैकल्पिकवित्त फ़िल्टर। period डिफ़ॉल्ट last30 है; YYYY-MM-DD start/end के साथ custom इस्तेमाल करें। केवल सभी-मर्चेंट क्रेडेंशियल।
startवैकल्पिकवित्त फ़िल्टर। period डिफ़ॉल्ट last30 है; YYYY-MM-DD start/end के साथ custom इस्तेमाल करें। केवल सभी-मर्चेंट क्रेडेंशियल।
endवैकल्पिकवित्त फ़िल्टर। period डिफ़ॉल्ट last30 है; YYYY-MM-DD start/end के साथ custom इस्तेमाल करें। केवल सभी-मर्चेंट क्रेडेंशियल।
currencyवैकल्पिकवित्त फ़िल्टर। period डिफ़ॉल्ट last30 है; YYYY-MM-DD start/end के साथ custom इस्तेमाल करें। केवल सभी-मर्चेंट क्रेडेंशियल।
merchant_idवैकल्पिकवित्त फ़िल्टर। period डिफ़ॉल्ट last30 है; YYYY-MM-DD start/end के साथ custom इस्तेमाल करें। केवल सभी-मर्चेंट क्रेडेंशियल।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/reports" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/reports", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/reports");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/reports",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"summary": {
"fees": "10",
"costs": "3",
"margin": "7",
"credits": "25",
"pending": 0,
"missing_rates": 0
},
"merchants": [],
"filters": {
"period": "last30",
"currency": "EUR",
"timezone": "UTC"
},
"basis": "first_settlement_latest_net_fees"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- reports.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- कुल निकालने से पहले अपने कारोबार की पंक्तियाँ, खर्च और संख्याएँ बाहर की जाती हैं। अपने कारोबार का merchant_id फ़िल्टर 404 लौटाता है। रिपोर्टिंग इंस्टॉलेशन का समय-क्षेत्र इस्तेमाल करती है।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETऑडिट सूची पाएँ/v1/operator/auditकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
क्वेरी पैरामीटर
merchant_idवैकल्पिकअनुमति वाले मर्चेंट, सटीक इवेंट प्रकार (events) या कार्रवाई टेक्स्ट (audit) से फ़िल्टर करें। इवेंट रखने की अवधि: 30 दिन।
searchवैकल्पिकअनुमति वाले मर्चेंट, सटीक इवेंट प्रकार (events) या कार्रवाई टेक्स्ट (audit) से फ़िल्टर करें। इवेंट रखने की अवधि: 30 दिन।
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/audit" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/audit", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/audit");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/audit",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- audit.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETइवेंट की सूची पाएँ/v1/operator/eventsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
क्वेरी पैरामीटर
merchant_idवैकल्पिकअनुमति वाले मर्चेंट, सटीक इवेंट प्रकार (events) या कार्रवाई टेक्स्ट (audit) से फ़िल्टर करें। इवेंट रखने की अवधि: 30 दिन।
event_typeवैकल्पिकअनुमति वाले मर्चेंट, सटीक इवेंट प्रकार (events) या कार्रवाई टेक्स्ट (audit) से फ़िल्टर करें। इवेंट रखने की अवधि: 30 दिन।
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/events" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/events", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/events");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/events",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- events.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETवेबहुक की सूची पाएँ/v1/operator/webhooksकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/webhooks" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/webhooks", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/webhooks");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/webhooks",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- events.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTवेबहुक बनाएँ/v1/operator/webhooksपढ़ना + लिखना
भविष्य के ऑपरेटर जीवनचक्र इवेंट की सदस्यता लें। दुकान भुगतान वेबहुक नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/webhooks" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https://shop.example.test/operator-events",
"events": [
"merchant.created",
"topup.settled"
],
"merchant_ids": [],
"enabled": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"url": "https://shop.example.test/operator-events",
"events": [
"merchant.created",
"topup.settled"
],
"merchant_ids": [],
"enabled": true
}`;
const response = await fetch("https://api.example.com/v1/operator/webhooks", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"url": "https://shop.example.test/operator-events",
"events": [
"merchant.created",
"topup.settled"
],
"merchant_ids": [],
"enabled": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/webhooks");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"url": "https://shop.example.test/operator-events",
"events": [
"merchant.created",
"topup.settled"
],
"merchant_ids": [],
"enabled": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/webhooks",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
urlpublic HTTPS URLज़रूरीक्रेडेंशियल, निजी IP या रीडायरेक्ट नहीं। डिलीवरी पर DNS/IP फिर जाँचे जाते हैं।
merchant_ids[]UUID[]वैकल्पिकखाली का मतलब इस क्रेडेंशियल से अनुमति वाले सभी मर्चेंट। लाइव दायरा प्रतिबंध फिर जाँचे जाते हैं।
enabledbooleanवैकल्पिकरुके एंडपॉइंट कतारबद्ध डिलीवरी रखते हैं; फिर सक्षम करने पर वैध सहेजा कार्य जारी होता है।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"id": "11111111-1111-4111-8111-111111111111",
"signing_secret": "wco_whsec_EXAMPLE_ONLY_SAVE_ONCE"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- webhooks.write + events.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTवेबहुक अपडेट करें/v1/operator/webhooks/{webhook_id}पढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
webhook_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https://shop.example.test/operator-events",
"events": [
"topup.settled"
],
"merchant_ids": [],
"enabled": false
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"url": "https://shop.example.test/operator-events",
"events": [
"topup.settled"
],
"merchant_ids": [],
"enabled": false
}`;
const response = await fetch("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"url": "https://shop.example.test/operator-events",
"events": [
"topup.settled"
],
"merchant_ids": [],
"enabled": false
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"url": "https://shop.example.test/operator-events",
"events": [
"topup.settled"
],
"merchant_ids": [],
"enabled": false
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
urlpublic HTTPS URLज़रूरीक्रेडेंशियल, निजी IP या रीडायरेक्ट नहीं। डिलीवरी पर DNS/IP फिर जाँचे जाते हैं।
merchant_ids[]UUID[]वैकल्पिकखाली का मतलब इस क्रेडेंशियल से अनुमति वाले सभी मर्चेंट। लाइव दायरा प्रतिबंध फिर जाँचे जाते हैं।
enabledbooleanवैकल्पिकरुके एंडपॉइंट कतारबद्ध डिलीवरी रखते हैं; फिर सक्षम करने पर वैध सहेजा कार्य जारी होता है।
जवाब 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"signing_secret": null
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- webhooks.write + events.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTवेबहुक सीक्रेट बदलें/v1/operator/webhooks/{webhook_id}/rotateपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
webhook_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/rotate" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{}`;
const response = await fetch("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/rotate", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/rotate");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/rotate",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "11111111-1111-4111-8111-111111111111",
"signing_secret": "wco_whsec_EXAMPLE_ONLY_SAVE_ONCE"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- webhooks.write + events.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETवेबहुक डिलीवरी की सूची पाएँ/v1/operator/webhooks/{webhook_id}/deliveriesकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
webhook_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/deliveries" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/deliveries", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/deliveries");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/webhooks/YOUR_WEBHOOK_ID/deliveries",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- events.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETप्रोजेक्ट की सूची पाएँ/v1/operator/merchants/{merchant_id}/projectsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTप्रोजेक्ट बनाएँ/v1/operator/merchants/{merchant_id}/projectsपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Online shop",
"slug": "online-shop",
"enabled": false
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"name": "Online shop",
"slug": "online-shop",
"enabled": false
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"name": "Online shop",
"slug": "online-shop",
"enabled": false
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"name": "Online shop",
"slug": "online-shop",
"enabled": false
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
namestringsज़रूरीनाम और विशिष्ट स्थिर प्रोजेक्ट पहचानकर्ता। मौजूदा प्रोजेक्ट बूटस्ट्रैप से स्थानीय वॉलेट बनाता है, कभी फंड ट्रांसफ़र नहीं करता।
slugstringsज़रूरीनाम और विशिष्ट स्थिर प्रोजेक्ट पहचानकर्ता। मौजूदा प्रोजेक्ट बूटस्ट्रैप से स्थानीय वॉलेट बनाता है, कभी फंड ट्रांसफ़र नहीं करता।
reporting_timezoneवैकल्पिकenabled डिफ़ॉल्ट true; रोका हुआ बनाकर पहले दुकान कॉन्फ़िगर करना सुझाया जाता है।
checkout_titleवैकल्पिकenabled डिफ़ॉल्ट true; रोका हुआ बनाकर पहले दुकान कॉन्फ़िगर करना सुझाया जाता है।
checkout_descriptionवैकल्पिकenabled डिफ़ॉल्ट true; रोका हुआ बनाकर पहले दुकान कॉन्फ़िगर करना सुझाया जाता है।
checkout_themeवैकल्पिकenabled डिफ़ॉल्ट true; रोका हुआ बनाकर पहले दुकान कॉन्फ़िगर करना सुझाया जाता है।
checkout_accent_colorवैकल्पिकenabled डिफ़ॉल्ट true; रोका हुआ बनाकर पहले दुकान कॉन्फ़िगर करना सुझाया जाता है।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"id": "33333333-3333-4333-8333-333333333333",
"slug": "example-shop",
"name": "Example shop",
"enabled": false,
"reporting_currency": "EUR",
"reporting_timezone": "Europe/Berlin",
"stores": []
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETप्रोजेक्ट प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}केवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "33333333-3333-4333-8333-333333333333",
"slug": "example-shop",
"name": "Example shop",
"enabled": false,
"reporting_currency": "EUR",
"reporting_timezone": "Europe/Berlin",
"stores": []
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTप्रोजेक्ट अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}पढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"enabled": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"enabled": true
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"enabled": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"enabled": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"id": "33333333-3333-4333-8333-333333333333",
"slug": "example-shop",
"name": "Example shop",
"enabled": false,
"reporting_currency": "EUR",
"reporting_timezone": "Europe/Berlin",
"stores": []
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETदुकानों की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTदुकान बनाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Web checkout",
"slug": "web-checkout",
"default_currency": "EUR",
"enabled": false
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"name": "Web checkout",
"slug": "web-checkout",
"default_currency": "EUR",
"enabled": false
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"name": "Web checkout",
"slug": "web-checkout",
"default_currency": "EUR",
"enabled": false
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"name": "Web checkout",
"slug": "web-checkout",
"default_currency": "EUR",
"enabled": false
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
default_currencyवैकल्पिकप्रतिशत के लिए दशमलव स्ट्रिंग इस्तेमाल करें। नई दुकानें प्रोजेक्ट की डिफ़ॉल्ट दुकान का रूप-रंग अपनाती हैं।
invoice_expiry_minutesवैकल्पिकप्रतिशत के लिए दशमलव स्ट्रिंग इस्तेमाल करें। नई दुकानें प्रोजेक्ट की डिफ़ॉल्ट दुकान का रूप-रंग अपनाती हैं।
exchange_rate_spread_percentवैकल्पिकप्रतिशत के लिए दशमलव स्ट्रिंग इस्तेमाल करें। नई दुकानें प्रोजेक्ट की डिफ़ॉल्ट दुकान का रूप-रंग अपनाती हैं।
underpayment_tolerance_percentवैकल्पिकप्रतिशत के लिए दशमलव स्ट्रिंग इस्तेमाल करें। नई दुकानें प्रोजेक्ट की डिफ़ॉल्ट दुकान का रूप-रंग अपनाती हैं।
enabledवैकल्पिकpayment-assets से स्वीकार्य एसेट कॉन्फ़िगर करें; शून्य-राशि इनवॉइस डिफ़ॉल्ट बंद हैं।
is_defaultवैकल्पिकpayment-assets से स्वीकार्य एसेट कॉन्फ़िगर करें; शून्य-राशि इनवॉइस डिफ़ॉल्ट बंद हैं।
allow_zero_amount_invoicesवैकल्पिकpayment-assets से स्वीकार्य एसेट कॉन्फ़िगर करें; शून्य-राशि इनवॉइस डिफ़ॉल्ट बंद हैं।
allow_underpaymentsवैकल्पिकpayment-assets से स्वीकार्य एसेट कॉन्फ़िगर करें; शून्य-राशि इनवॉइस डिफ़ॉल्ट बंद हैं।
allow_overpaymentsवैकल्पिकpayment-assets से स्वीकार्य एसेट कॉन्फ़िगर करें; शून्य-राशि इनवॉइस डिफ़ॉल्ट बंद हैं।
allowed_chain_slugsवैकल्पिकpayment-assets से स्वीकार्य एसेट कॉन्फ़िगर करें; शून्य-राशि इनवॉइस डिफ़ॉल्ट बंद हैं।
ipn_enabledवैकल्पिकIPN और वापसी URL मौजूदा URL सत्यापन का पालन करते हैं। मनमाना HTML/JavaScript नहीं।
default_ipn_urlवैकल्पिकIPN और वापसी URL मौजूदा URL सत्यापन का पालन करते हैं। मनमाना HTML/JavaScript नहीं।
default_redirect_urlवैकल्पिकIPN और वापसी URL मौजूदा URL सत्यापन का पालन करते हैं। मनमाना HTML/JavaScript नहीं।
default_cancel_urlवैकल्पिकIPN और वापसी URL मौजूदा URL सत्यापन का पालन करते हैं। मनमाना HTML/JavaScript नहीं।
redirect_automaticallyवैकल्पिकIPN और वापसी URL मौजूदा URL सत्यापन का पालन करते हैं। मनमाना HTML/JavaScript नहीं।
checkout_languageवैकल्पिकसमर्थित भाषा और सक्रिय भूमिका डोमेन इस्तेमाल करें; एम्बेडिंग origin स्पष्ट रूप से कॉन्फ़िगर करें।
embed_enabledवैकल्पिकसमर्थित भाषा और सक्रिय भूमिका डोमेन इस्तेमाल करें; एम्बेडिंग origin स्पष्ट रूप से कॉन्फ़िगर करें।
allowed_embed_originsवैकल्पिकसमर्थित भाषा और सक्रिय भूमिका डोमेन इस्तेमाल करें; एम्बेडिंग origin स्पष्ट रूप से कॉन्फ़िगर करें।
domainsवैकल्पिकसमर्थित भाषा और सक्रिय भूमिका डोमेन इस्तेमाल करें; एम्बेडिंग origin स्पष्ट रूप से कॉन्फ़िगर करें।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"project_id": "33333333-3333-4333-8333-333333333333",
"slug": "online",
"name": "Online shop",
"enabled": false,
"default_currency": "EUR",
"invoice_expiry_minutes": 60
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETदुकान प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}केवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"project_id": "33333333-3333-4333-8333-333333333333",
"slug": "online",
"name": "Online shop",
"enabled": false,
"default_currency": "EUR",
"invoice_expiry_minutes": 60
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTदुकान अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}पढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"enabled": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"enabled": true
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"enabled": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"enabled": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"project_id": "33333333-3333-4333-8333-333333333333",
"slug": "online",
"name": "Online shop",
"enabled": false,
"default_currency": "EUR",
"invoice_expiry_minutes": 60
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETदुकान का रूप-रंग प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"revision": 1,
"settings": {
"inherit_default_store": true
},
"effective": {
"title": "Pay securely"
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTदुकान का रूप-रंग अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceपढ़ना + लिखना
सत्यापित, संशोधन-सुरक्षित दुकान डिज़ाइन सेव करें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"revision": 1,
"settings": {
"inherit_default_store": false,
"title": "Pay securely",
"theme": "light"
}
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"revision": 1,
"settings": {
"inherit_default_store": false,
"title": "Pay securely",
"theme": "light"
}
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"revision": 1,
"settings": {
"inherit_default_store": false,
"title": "Pay securely",
"theme": "light"
}
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"revision": 1,
"settings": {
"inherit_default_store": false,
"title": "Pay securely",
"theme": "light"
}
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/checkout-appearance",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
revisionintegerज़रूरीपहले GET से वर्तमान संशोधन पढ़ें। पुराना संशोधन दूसरे संपादक का काम बदले बिना विफल होता है।
settingsobjectज़रूरी
सत्यापित चेकआउट रूप-रंग, जिसमें inherit_default_store, ब्रांडिंग, intro/outro, फ़ॉन्ट आकार और दृश्यता हैं। मनमाना HTML/JavaScript नहीं। इमेज बाइट अपलोड केवल कंसोल में।विवरण
सत्यापित चेकआउट रूप-रंग, जिसमें inherit_default_store, ब्रांडिंग, intro/outro, फ़ॉन्ट आकार और दृश्यता हैं। मनमाना HTML/JavaScript नहीं। इमेज बाइट अपलोड केवल कंसोल में।
जवाब 200 application/json
उदाहरण जवाब
{
"settings": {
"inherit_default_store": false,
"title": "Pay securely",
"theme": "light"
},
"revision": 2
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETदुकान के भुगतान एसेट की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": []
}जवाब फ़ील्ड
data[]arrayउपयोग संबंधी नोट
- projects.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTदुकान के भुगतान एसेट अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"assets": [
{
"asset_id": "11111111-1111-4111-8111-111111111111",
"display_order": 0
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"assets": [
{
"asset_id": "11111111-1111-4111-8111-111111111111",
"display_order": 0
}
]
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"assets": [
{
"asset_id": "11111111-1111-4111-8111-111111111111",
"display_order": 0
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"assets": [
{
"asset_id": "11111111-1111-4111-8111-111111111111",
"display_order": 0
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
assets[]object[]ज़रूरी
ऑन-चेन तरीकों का पूरा प्रतिस्थापन: asset_id UUID और display_order। [] स्वीकृत ऑन-चेन एसेट साफ़ करता है। केवल सत्यापित प्रोजेक्ट एसेट; Lightning कॉन्फ़िगर नहीं करता।विवरण
ऑन-चेन तरीकों का पूरा प्रतिस्थापन: asset_id UUID और display_order। [] स्वीकृत ऑन-चेन एसेट साफ़ करता है। केवल सत्यापित प्रोजेक्ट एसेट; Lightning कॉन्फ़िगर नहीं करता।
जवाब 200 application/json
उदाहरण जवाब
{
"data": []
}जवाब फ़ील्ड
data[]arrayउपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETदुकान के वेबहुक की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTदुकान का वेबहुक बनाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": true,
"automatic_redelivery": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": true,
"automatic_redelivery": true
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": true,
"automatic_redelivery": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": true,
"automatic_redelivery": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
event_types[]strings / arrayज़रूरीसार्वजनिक HTTPS रिसीवर और IPN व वेबहुक दस्तावेज़ के इनवॉइस इवेंट नाम।
enabledbooleansवैकल्पिकनिर्माण हस्ताक्षर सीक्रेट एक बार लौटाता है। ये दुकान भुगतान कॉलबैक हैं, ऑपरेटर जीवनचक्र इवेंट नहीं।
automatic_redeliverybooleansवैकल्पिकनिर्माण हस्ताक्षर सीक्रेट एक बार लौटाता है। ये दुकान भुगतान कॉलबैक हैं, ऑपरेटर जीवनचक्र इवेंट नहीं।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"signing_secret": "EXAMPLE_ONLY_SAVE_ONCE",
"endpoint": {
"id": "44444444-4444-4444-8444-444444444444",
"name": "Orders",
"enabled": true
},
"secret_visible_once": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTदुकान का वेबहुक अपडेट करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooks/{webhook_id}पढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
store_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
webhook_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks/YOUR_WEBHOOK_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": false,
"automatic_redelivery": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": false,
"automatic_redelivery": true
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks/YOUR_WEBHOOK_ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": false,
"automatic_redelivery": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks/YOUR_WEBHOOK_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"name": "Orders",
"url": "https://shop.example.test/payments",
"event_types": [
"invoice.settled"
],
"enabled": false,
"automatic_redelivery": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/webhooks/YOUR_WEBHOOK_ID",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
event_types[]strings / arrayज़रूरीसार्वजनिक HTTPS रिसीवर और IPN व वेबहुक दस्तावेज़ के इनवॉइस इवेंट नाम।
enabledbooleansवैकल्पिकनिर्माण हस्ताक्षर सीक्रेट एक बार लौटाता है। ये दुकान भुगतान कॉलबैक हैं, ऑपरेटर जीवनचक्र इवेंट नहीं।
automatic_redeliverybooleansवैकल्पिकनिर्माण हस्ताक्षर सीक्रेट एक बार लौटाता है। ये दुकान भुगतान कॉलबैक हैं, ऑपरेटर जीवनचक्र इवेंट नहीं।
जवाब 200 application/json
उदाहरण जवाब
{
"id": "44444444-4444-4444-8444-444444444444",
"name": "Orders",
"enabled": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- projects.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETइनवॉइस की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoicesकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
क्वेरी पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"limit": 25,
"offset": 0,
"total": 0,
"has_more": false
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- reports.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETइनवॉइस प्राप्त करें/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoices/{invoice_id}केवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
invoice_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices/YOUR_INVOICE_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices/YOUR_INVOICE_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices/YOUR_INVOICE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/invoices/YOUR_INVOICE_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"invoice_id": "44444444-4444-4444-8444-444444444444",
"project_id": "33333333-3333-4333-8333-333333333333",
"amount": "25",
"currency": "EUR",
"status": "new",
"metadata": {},
"payment_intents": []
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- reports.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
- invoice_id निर्माण और कॉलबैक में लौटाया सार्वजनिक इनवॉइस ID है, आंतरिक id नहीं।
त्रुटियाँ
GETवॉलेट की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/walletsकेवल पढ़ना
कैश सार्वजनिक वॉलेट बैलेंस पढ़ें, कभी निजी कुंजियाँ या रिकवरी फ़्रेज़ नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- reports.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- बैलेंस ताज़गी फ़ील्ड वाले कैश अवलोकन हैं, खर्च योग्य बैलेंस की गारंटी नहीं। इस API से भेजना और कुंजी निर्यात उपलब्ध नहीं हैं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETवॉलेट पतों की सूची पाएँ/v1/operator/merchants/{merchant_id}/projects/{project_id}/wallets/{wallet_id}/addressesकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
project_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
wallet_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
limitवैकल्पिकLimit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।विवरण
Limit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।
beforeवैकल्पिकLimit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।विवरण
Limit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।
searchवैकल्पिकLimit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।विवरण
Limit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।
has_balanceवैकल्पिकLimit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।विवरण
Limit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।
hide_small_balancesवैकल्पिकLimit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।विवरण
Limit 1–50, डिफ़ॉल्ट 25। अगले पृष्ठ के लिए next_cursor को before में दें। पहले पृष्ठ के लिए before न दें। has_balance=false और hide_small_balances=false खाली/छोटे बैलेंस शामिल करते हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets/YOUR_WALLET_ID/addresses" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets/YOUR_WALLET_ID/addresses", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets/YOUR_WALLET_ID/addresses");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/projects/YOUR_PROJECT_ID/wallets/YOUR_WALLET_ID/addresses",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"wallet": {
"id": "22222222-2222-4222-8222-222222222222",
"chain_slug": "ethereum"
},
"items": [],
"total": 0,
"total_pages": 1,
"next_cursor": null,
"reporting_currency": "EUR",
"has_balance": true,
"hide_small_balances": true,
"small_balance_threshold": {
"amount": "0.20",
"currency": "EUR"
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- reports.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETमर्चेंट क्रेडेंशियल की सूची पाएँ/v1/operator/merchants/{merchant_id}/api-credentialsकेवल पढ़ना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
क्वेरी पैरामीटर
pageवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
searchवैकल्पिकपृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।विवरण
पृष्ठ 1 से शुरू, हर पृष्ठ पर 25 आइटम। मर्चेंट, उपयोगकर्ता, प्रोजेक्ट, दुकानें, वॉलेट, क्रेडेंशियल और वेबहुक पर खोज समर्थित है; नेटिव इवेंट सूचियाँ अपने विशेष फ़िल्टर इस्तेमाल करती हैं।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchant_credentials.read चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTमर्चेंट क्रेडेंशियल बनाएँ/v1/operator/merchants/{merchant_id}/api-credentialsपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
merchant_idUUIDज़रूरीकैनॉनिकल छोटे अक्षरों वाला संसाधन UUID; क्रेडेंशियल के मर्चेंट दायरे का होना चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Store integration",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"11111111-1111-4111-8111-111111111111"
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"name": "Store integration",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"11111111-1111-4111-8111-111111111111"
]
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"name": "Store integration",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"11111111-1111-4111-8111-111111111111"
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"name": "Store integration",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"11111111-1111-4111-8111-111111111111"
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
project_ids[]UUID[]केवल चुने मर्चेंट के प्रोजेक्ट; खाली सूची मौजूदा सभी-मर्चेंट-प्रोजेक्ट नीति अपनाती है।
enabledवैकल्पिकमौजूदा मर्चेंट कुंजी नियंत्रण। सीक्रेट केवल एक बार लौटता है; merchant_credentials.write चाहिए।
ip_restriction_enabledवैकल्पिकमौजूदा मर्चेंट कुंजी नियंत्रण। सीक्रेट केवल एक बार लौटता है; merchant_credentials.write चाहिए।
allowed_ips[]वैकल्पिकमौजूदा मर्चेंट कुंजी नियंत्रण। सीक्रेट केवल एक बार लौटता है; merchant_credentials.write चाहिए।
requests_per_minuteवैकल्पिकमौजूदा मर्चेंट कुंजी नियंत्रण। सीक्रेट केवल एक बार लौटता है; merchant_credentials.write चाहिए।
जवाब 201 or 200 application/json
उदाहरण जवाब
{
"credential": {
"id": "22222222-2222-4222-8222-222222222222",
"name": "Checkout",
"access_level": "read_only",
"project_ids": [
"33333333-3333-4333-8333-333333333333"
],
"enabled": true
},
"token": "wc_live_EXAMPLE_ONLY_SAVE_ONCE"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchant_credentials.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTमर्चेंट क्रेडेंशियल अपडेट करें/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}पढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Checkout",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"33333333-3333-4333-8333-333333333333"
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"name": "Checkout",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"33333333-3333-4333-8333-333333333333"
]
}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"name": "Checkout",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"33333333-3333-4333-8333-333333333333"
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"name": "Checkout",
"access_level": "read_only",
"enabled": true,
"ip_restriction_enabled": false,
"allowed_ips": [],
"project_ids": [
"33333333-3333-4333-8333-333333333333"
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
namefieldsज़रूरीबदलावों के साथ पूरा वर्तमान क्रेडेंशियल कॉन्फ़िगरेशन भेजें। project_ids डिफ़ॉल्ट []; requests_per_minute डिफ़ॉल्ट मर्चेंट API कोटा है।
access_levelfieldsज़रूरीबदलावों के साथ पूरा वर्तमान क्रेडेंशियल कॉन्फ़िगरेशन भेजें। project_ids डिफ़ॉल्ट []; requests_per_minute डिफ़ॉल्ट मर्चेंट API कोटा है।
enabledfieldsज़रूरीबदलावों के साथ पूरा वर्तमान क्रेडेंशियल कॉन्फ़िगरेशन भेजें। project_ids डिफ़ॉल्ट []; requests_per_minute डिफ़ॉल्ट मर्चेंट API कोटा है।
ip_restriction_enabledfieldsज़रूरीबदलावों के साथ पूरा वर्तमान क्रेडेंशियल कॉन्फ़िगरेशन भेजें। project_ids डिफ़ॉल्ट []; requests_per_minute डिफ़ॉल्ट मर्चेंट API कोटा है।
allowed_ips[]fieldsज़रूरीबदलावों के साथ पूरा वर्तमान क्रेडेंशियल कॉन्फ़िगरेशन भेजें। project_ids डिफ़ॉल्ट []; requests_per_minute डिफ़ॉल्ट मर्चेंट API कोटा है।
project_ids[]arrayजवाब 200 application/json
उदाहरण जवाब
{
"id": "22222222-2222-4222-8222-222222222222",
"name": "Checkout",
"access_level": "read_only",
"project_ids": [
"33333333-3333-4333-8333-333333333333"
],
"enabled": true
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchant_credentials.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTमर्चेंट क्रेडेंशियल बदलें/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/rotateपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/rotate" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/rotate", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/rotate");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/rotate",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"credential": {
"id": "22222222-2222-4222-8222-222222222222",
"name": "Checkout",
"access_level": "read_only",
"project_ids": [
"33333333-3333-4333-8333-333333333333"
],
"enabled": true
},
"token": "wc_live_EXAMPLE_ONLY_SAVE_ONCE"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- merchant_credentials.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTमर्चेंट क्रेडेंशियल रद्द करें/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/revokeपढ़ना + लिखना
अलग ऑपरेटर क्रेडेंशियल से नामित होस्टेड मर्चेंट संसाधन सँभालें या जाँचें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इस कार्रवाई के लिए सहेजे गए |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/revoke" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: operator-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{}`;
const response = await fetch("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/revoke", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{}
JSON;
$ch = curl_init("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/revoke");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: operator-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "operator-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{}""".encode("utf-8")
request = Request("https://api.example.com/v1/operator/merchants/YOUR_MERCHANT_ID/api-credentials/YOUR_CREDENTIAL_ID/revoke",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"revoked": true
}जवाब फ़ील्ड
revokedbooleanउपयोग संबंधी नोट
- merchant_credentials.write चाहिए; केवल अनुमति वाले होस्टेड मर्चेंट। ऑपरेटर कुंजियाँ मालिक के अपने कारोबार के वर्कस्पेस तक नहीं पहुँचतीं।
- भेजने से पहले विशिष्ट Idempotency-Key और सटीक बॉडी सहेजें। पुनः प्रयास कभी पूरी हो चुकी कार्रवाई नहीं दोहराते। रीप्ले में सीक्रेट फ़ील्ड छूटते हैं; सीक्रेट वाला जवाब खो जाए तो बने संसाधन की जाँच करें और स्पष्ट रूप से बदलें/फिर जारी करें। 409 operator_request_in_progress अज्ञात परिणाम वाला बाधित अनुरोध हो सकता है: संसाधन/ऑडिट जाँचें; बिना जाँच नई कुंजी से फिर प्रयास न करें।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTआमंत्रण टोकन जाँचें/v1/onboarding/invitations/checkसार्वजनिक
केवल टोकन से ऑनबोर्डिंग। ऑपरेटर कुंजी स्वीकार नहीं करता और अपने आप साइन इन नहीं करता। कंसोल लॉगिन के लिए साइट का Basic Auth और मौजूदा TOTP तब भी चाहिए।
प्रमाणीकरण और हेडर
सार्वजनिक
अनुरोध
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/onboarding/invitations/check" \
--header 'Content-Type: application/json' \
--data-raw '{
"token": "YOUR_PRIVATE_INVITATION_TOKEN"
}'// Node.js 18+ · run on your server, never in browser code.
const body = `{
"token": "YOUR_PRIVATE_INVITATION_TOKEN"
}`;
const response = await fetch("https://api.example.com/v1/onboarding/invitations/check", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$body = <<<'JSON'
{
"token": "YOUR_PRIVATE_INVITATION_TOKEN"
}
JSON;
$ch = curl_init("https://api.example.com/v1/onboarding/invitations/check");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Content-Type": "application/json"
}
body = """{
"token": "YOUR_PRIVATE_INVITATION_TOKEN"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/onboarding/invitations/check",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"kind": "invitation",
"email": "admin@example.test",
"merchant_name": "Example shop"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- 48 घंटे का आमंत्रण; एक घंटे का पासवर्ड रीसेट लिंक। एक बार उपयोग वाले हैश किए टोकन। फिर जारी करने पर पुराना लिंक रद्द होता है। स्वीकृति TOTP बनाए रखती है और पुराने सेशन रद्द करती है।
- स्वचालित पुनः प्रयास नहीं। स्वीकृति टाइमआउट हो तो लिंक की स्थिति जाँचें और साइन इन आज़माएँ; विफल होना न मान लें। देखे गए स्रोत IP के आधार पर रेट लिमिट लागू है। प्राप्तकर्ता को फंड नियंत्रण की स्थिति स्वयं स्वीकार करनी होगी।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
POSTआमंत्रण या पासवर्ड रीसेट स्वीकार करें/v1/onboarding/invitations/acceptसार्वजनिक
केवल टोकन से ऑनबोर्डिंग। ऑपरेटर कुंजी स्वीकार नहीं करता और अपने आप साइन इन नहीं करता। कंसोल लॉगिन के लिए साइट का Basic Auth और मौजूदा TOTP तब भी चाहिए।
प्रमाणीकरण और हेडर
सार्वजनिक
अनुरोध
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/onboarding/invitations/accept" \
--header 'Content-Type: application/json' \
--data-raw '{
"token": "YOUR_PRIVATE_INVITATION_TOKEN",
"password": "REPLACE_WITH_YOUR_OWN_UNIQUE_PASSWORD",
"custody_acknowledged": true
}'// Node.js 18+ · run on your server, never in browser code.
const body = `{
"token": "YOUR_PRIVATE_INVITATION_TOKEN",
"password": "REPLACE_WITH_YOUR_OWN_UNIQUE_PASSWORD",
"custody_acknowledged": true
}`;
const response = await fetch("https://api.example.com/v1/onboarding/invitations/accept", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$body = <<<'JSON'
{
"token": "YOUR_PRIVATE_INVITATION_TOKEN",
"password": "REPLACE_WITH_YOUR_OWN_UNIQUE_PASSWORD",
"custody_acknowledged": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/onboarding/invitations/accept");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Content-Type": "application/json"
}
body = """{
"token": "YOUR_PRIVATE_INVITATION_TOKEN",
"password": "REPLACE_WITH_YOUR_OWN_UNIQUE_PASSWORD",
"custody_acknowledged": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/onboarding/invitations/accept",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"password_set": true
}जवाब फ़ील्ड
password_setbooleanउपयोग संबंधी नोट
- 48 घंटे का आमंत्रण; एक घंटे का पासवर्ड रीसेट लिंक। एक बार उपयोग वाले हैश किए टोकन। फिर जारी करने पर पुराना लिंक रद्द होता है। स्वीकृति TOTP बनाए रखती है और पुराने सेशन रद्द करती है।
- स्वचालित पुनः प्रयास नहीं। स्वीकृति टाइमआउट हो तो लिंक की स्थिति जाँचें और साइन इन आज़माएँ; विफल होना न मान लें। देखे गए स्रोत IP के आधार पर रेट लिमिट लागू है। प्राप्तकर्ता को फंड नियंत्रण की स्थिति स्वयं स्वीकार करनी होगी।
- जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं। अतिरिक्त जवाब फ़ील्ड को विस्तार मानें।
त्रुटियाँ
GETक्षमताएँ/v1/marketplace/capabilitiesकेवल पढ़ना
भाग लेने वाली दुकानें, कॉन्फ़िगर किए एसेट, समर्थित भुगतान प्रणालियाँ, नेटिव शुल्क एसेट और तैयारी के कारण। स्कैनर की अस्थायी उपलब्धता अनुमत एसेट समूह नहीं बढ़ाती।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/capabilities?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/capabilities?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/capabilities?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/capabilities?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETमार्केटप्लेस रिपोर्ट/v1/marketplace/overviewकेवल पढ़ना
store_id, asset_id, from और to से फ़िल्टर करें (समावेशी YYYY-MM-DD, UTC; डिफ़ॉल्ट पिछले 30 दिन; दस साल तक)। अंतिम तारीख तक के सटीक खाता बैलेंस और अवधि के बदलाव। अनुमानित फ़िएट कमाई नहीं। दुकान फ़िल्टर बिना इनवॉइस वाले प्रोजेक्ट-व्यापी शुल्क बाहर करता है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/overview?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/overview?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/overview?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/overview?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETप्रोजेक्ट सेटिंग/v1/marketplace/settingsकेवल पढ़ना
enabled, payouts_paused, commission_percent, revision और भाग लेने वाली दुकानें लौटाता है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/settings?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/settings?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/settings?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/settings?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTप्रोजेक्ट सेटिंग सेव करें/v1/marketplace/settingsपढ़ना + लिखना
भाग लेने वाली दुकानों का चयन बदलें। revision 0 सेटिंग आरंभ करता है; बाद के बदलावों में लौटाया revision चाहिए। कमीशन दशमलव प्रतिशत है, 0–100 और अधिकतम दो दशमलव स्थान।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | policies.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/settings" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 0,
"enabled": true,
"payouts_paused": true,
"commission_percent": "4",
"stores": [
{
"store_id": "YOUR_STORE_ID",
"enabled": true,
"commission_percent": null
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 0,
"enabled": true,
"payouts_paused": true,
"commission_percent": "4",
"stores": [
{
"store_id": "YOUR_STORE_ID",
"enabled": true,
"commission_percent": null
}
]
}`;
const response = await fetch("https://api.example.com/v1/marketplace/settings", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 0,
"enabled": true,
"payouts_paused": true,
"commission_percent": "4",
"stores": [
{
"store_id": "YOUR_STORE_ID",
"enabled": true,
"commission_percent": null
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/settings");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 0,
"enabled": true,
"payouts_paused": true,
"commission_percent": "4",
"stores": [
{
"store_id": "YOUR_STORE_ID",
"enabled": true,
"commission_percent": null
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/settings",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- policies.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETविक्रेताओं की सूची पाएँ/v1/marketplace/vendorsकेवल पढ़ना
पृष्ठबद्ध विक्रेता। q से नाम, बाहरी ID या ईमेल खोजें; status active, suspended या archived।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/vendors?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/vendors?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/vendors?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/vendors?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTविक्रेता बनाएँ/v1/marketplace/vendorsपढ़ना + लिखना
नाम ज़रूरी (160 अक्षर); external_id वैकल्पिक और प्रोजेक्ट में विशिष्ट (128); ईमेल वैकल्पिक (254); विवरण 2000 तक। commission_percent null हो तो दुकान से अपनाता है। गैर-null ओवरराइड के लिए commissions.override भी चाहिए। विक्रेता होस्टेड मर्चेंट खाते नहीं हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | vendors.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/vendors" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null
}`;
const response = await fetch("https://api.example.com/v1/marketplace/vendors", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/vendors");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/vendors",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- vendors.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETविक्रेता प्राप्त करें/v1/marketplace/vendors/{vendor_id}केवल पढ़ना
एक विक्रेता, संशोधन और कमीशन ओवरराइड लौटाएँ।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTविक्रेता अपडेट करें/v1/marketplace/vendors/{vendor_id}/updateपढ़ना + लिखना
विक्रेता विवरण अपडेट करें; status active या suspended। commission_percent बदलने या हटाने के लिए commissions.override भी चाहिए; अपरिवर्तित मानों के लिए केवल vendors.write। संग्रहित विक्रेता बहाल करने के लिए reconciliation.write भी चाहिए। कंसोल के वित्तीय बदलावों में खाते का पुनः प्रमाणीकरण चाहिए। मौजूदा आवंटन अपना मूल कमीशन और गंतव्य रखते हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | vendors.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/update" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null,
"revision": 1
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null,
"revision": 1
}`;
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/update", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null,
"revision": 1
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/update");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"name": "Example vendor",
"external_id": "vendor-1042",
"email": "vendor@example.com",
"description": "",
"status": "active",
"commission_percent": null,
"revision": 1
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/update",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- vendors.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTविक्रेता संग्रहित करें/v1/marketplace/vendors/{vendor_id}/archiveपढ़ना + लिखना
अवैतनिक और खुले इनवॉइस दायित्व सुलझने के बाद ही संग्रहित करें; वरना 409 vendor_has_obligations लौटता है। इतिहास बना रहता है। अस्थायी रूप से suspended स्थिति इस्तेमाल करें या अपडेट रूट और reconciliation.write से पुराना संग्रहित विक्रेता बहाल करें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | vendors.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/archive" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}`;
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/archive", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/archive");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/archive",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- vendors.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETविक्रेता के गंतव्य/v1/marketplace/vendors/{vendor_id}/destinationsकेवल पढ़ना
संस्करणयुक्त गंतव्य और pending/approved/disabled स्थितियाँ। मंज़ूरी स्वामित्व साबित नहीं करती।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTभुगतान गंतव्य जोड़ें/v1/marketplace/vendors/{vendor_id}/destinationsपढ़ना + लिखना
मंज़ूरी की प्रतीक्षा में वैध mainnet BTC या समर्थित EVM पता पंजीकृत करें। प्रोजेक्ट के अपने पते, गलत नेटवर्क और शून्य EVM पते अस्वीकार होते हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | destinations.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"chain_slug": "bitcoin",
"network": "mainnet",
"address": "VERIFIED_VENDOR_BTC_ADDRESS",
"label": "Vendor BTC"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"chain_slug": "bitcoin",
"network": "mainnet",
"address": "VERIFIED_VENDOR_BTC_ADDRESS",
"label": "Vendor BTC"
}`;
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"chain_slug": "bitcoin",
"network": "mainnet",
"address": "VERIFIED_VENDOR_BTC_ADDRESS",
"label": "Vendor BTC"
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"chain_slug": "bitcoin",
"network": "mainnet",
"address": "VERIFIED_VENDOR_BTC_ADDRESS",
"label": "Vendor BTC"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- destinations.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTगंतव्य मंज़ूर करें/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/approveपढ़ना + लिखना
पहले स्वामित्व स्वतंत्र रूप से सत्यापित करें। इस विक्रेता/नेटवर्क का मौजूदा मंज़ूर गंतव्य पहले बंद करें; पुराने स्नैपशॉट रीडायरेक्ट नहीं होते।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | destinations.approve |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/approve" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}`;
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/approve", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/approve");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/approve",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- destinations.approve चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTगंतव्य बंद करें/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/disableपढ़ना + लिखना
इस संस्करण का नया/न भेजा कार्य रोकें। हस्ताक्षरित लेनदेन रद्द नहीं किया जा सकता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | destinations.approve |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/disable" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}`;
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/disable", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/disable");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/destinations/YOUR_DESTINATION_ID/disable",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- destinations.approve चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETविक्रेता बैलेंस/v1/marketplace/vendors/{vendor_id}/balancesकेवल पढ़ना
अपरिवर्तनीय एसेट पहचान और खाता प्रकार के अनुसार समूहित सटीक सहेजी लेजर राशियाँ; लाइव खर्च योग्य वॉलेट बैलेंस नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/balances?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/balances?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/balances?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/vendors/YOUR_VENDOR_ID/balances?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETमार्केटप्लेस इनवॉइस/v1/marketplace/invoicesकेवल पढ़ना
पृष्ठबद्ध इनवॉइस; q ऑर्डर, ईमेल, विवरण, मेटाडेटा और इनवॉइस UUID खोजता है। store_id, vendor_id और मार्केटप्लेस स्थिति से फ़िल्टर करें। सामान्य इनवॉइस बाहर हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/invoices?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/invoices?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/invoices?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/invoices?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTबहु-विक्रेता इनवॉइस बनाएँ/v1/marketplace/invoicesपढ़ना + लिखना
सामान्य InvoiceCreateInput फ़ील्ड के साथ store_id और allocations दोबारा इस्तेमाल करें। हर विक्रेता एक बार, 1–100 सकारात्मक हिस्से, कुल बिल्कुल amount के बराबर। वैकल्पिक इनवॉइस/प्रति-आवंटन commission_percent के लिए commissions.override और सेशन अनुरोधों में कंसोल पुनः प्रमाणीकरण चाहिए। data.invoice_id और links.checkout लौटाता है। संगत साझा तरीका न हो तो विस्तृत त्रुटि; असंगत एसेट पर फ़ॉलबैक नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | invoices.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"store_id": "YOUR_STORE_ID",
"amount": "300.00",
"currency": "USD",
"order_id": "cart-1042",
"allocations": [
{
"vendor_id": "VENDOR_A_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_B_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_C_UUID",
"gross_amount": "100.00"
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"store_id": "YOUR_STORE_ID",
"amount": "300.00",
"currency": "USD",
"order_id": "cart-1042",
"allocations": [
{
"vendor_id": "VENDOR_A_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_B_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_C_UUID",
"gross_amount": "100.00"
}
]
}`;
const response = await fetch("https://api.example.com/v1/marketplace/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"store_id": "YOUR_STORE_ID",
"amount": "300.00",
"currency": "USD",
"order_id": "cart-1042",
"allocations": [
{
"vendor_id": "VENDOR_A_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_B_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_C_UUID",
"gross_amount": "100.00"
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"store_id": "YOUR_STORE_ID",
"amount": "300.00",
"currency": "USD",
"order_id": "cart-1042",
"allocations": [
{
"vendor_id": "VENDOR_A_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_B_UUID",
"gross_amount": "100.00"
},
{
"vendor_id": "VENDOR_C_UUID",
"gross_amount": "100.00"
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
amountstringज़रूरीबिना चिह्न की साधारण दशमलव स्ट्रिंग; चिह्न या घातांक नहीं, अधिकतम 48 पूर्णांक अंक और 30 दशमलव स्थान। डिफ़ॉल्ट रूप से सकारात्मक होनी चाहिए। दुकान, दुकानें → इनवॉइस में शून्य-राशि इनवॉइस स्वीकार कर सकती है; शून्य कुल बिना फंड प्राप्ति, पता आवंटन या प्रोसेसिंग शुल्क के निपटते हैं।विवरण
बिना चिह्न की साधारण दशमलव स्ट्रिंग; चिह्न या घातांक नहीं, अधिकतम 48 पूर्णांक अंक और 30 दशमलव स्थान। डिफ़ॉल्ट रूप से सकारात्मक होनी चाहिए। दुकान, दुकानें → इनवॉइस में शून्य-राशि इनवॉइस स्वीकार कर सकती है; शून्य कुल बिना फंड प्राप्ति, पता आवंटन या प्रोसेसिंग शुल्क के निपटते हैं।
currencystring | nullवैकल्पिकसमर्थित तीन-अक्षर फ़िएट मुद्रा, बड़े अक्षरों में सामान्यीकृत। न देने या null पर दुकान की इनवॉइस मुद्रा अपनती है। निर्माण के लिए स्वतंत्र रूप से उपलब्ध बिलिंग रूपांतरण दर भी चाहिए।विवरण
समर्थित तीन-अक्षर फ़िएट मुद्रा, बड़े अक्षरों में सामान्यीकृत। न देने या null पर दुकान की इनवॉइस मुद्रा अपनती है। निर्माण के लिए स्वतंत्र रूप से उपलब्ध बिलिंग रूपांतरण दर भी चाहिए।
payment_methods[]object[] | nullवैकल्पिक
इस इनवॉइस के लिए दुकान-सक्षम तरीके चुनें। Merchant 5.4.0+: अज्ञात/निष्क्रिय/अस्वीकार्य विकल्प अनदेखे करें; कोई मेल न हो तो दुकान डिफ़ॉल्ट इस्तेमाल करें। अनुपस्थित/null पर भी दुकान डिफ़ॉल्ट; [] अमान्य। कभी तरीका सक्षम नहीं करता या दुकान सेटिंग नहीं बदलता। चयन स्कीमा नीचे देखें।विवरण
इस इनवॉइस के लिए दुकान-सक्षम तरीके चुनें। Merchant 5.4.0+: अज्ञात/निष्क्रिय/अस्वीकार्य विकल्प अनदेखे करें; कोई मेल न हो तो दुकान डिफ़ॉल्ट इस्तेमाल करें। अनुपस्थित/null पर भी दुकान डिफ़ॉल्ट; [] अमान्य। कभी तरीका सक्षम नहीं करता या दुकान सेटिंग नहीं बदलता। चयन स्कीमा नीचे देखें।
chain_slugstringज़रूरीप्रोजेक्ट → दुकानें → भुगतान तरीके से chain_slug कॉपी करें या GET /v1/projects/{project_id}/stores/{store_id}/payment-assets से पढ़ें, जैसे ethereum, base या bitcoin। चेन/प्रणाली की जोड़ी केवल एक बार आ सकती है।विवरण
प्रोजेक्ट → दुकानें → भुगतान तरीके से chain_slug कॉपी करें या GET /v1/projects/{project_id}/stores/{store_id}/payment-assets से पढ़ें, जैसे ethereum, base या bitcoin। चेन/प्रणाली की जोड़ी केवल एक बार आ सकती है।
asset_ids[]UUID[] | nullवैकल्पिकऑन-चेन asset.id UUID, कॉन्ट्रैक्ट पते या इनवॉइस भुगतान-तरीका ID नहीं। यह या asset_tickers इस्तेमाल करें। इस चेन के सभी सक्रिय स्वीकार्य एसेट के लिए दोनों चयनकर्ता छोड़ें। [] और डुप्लिकेट/nil ID अमान्य हैं। 5.4.0+ में इस दुकान की इस चेन पर निष्क्रिय/अस्वीकार्य ID अनदेखे होते हैं; पूरी तरह बेमेल चयन दुकान डिफ़ॉल्ट इस्तेमाल करता है।विवरण
ऑन-चेन asset.id UUID, कॉन्ट्रैक्ट पते या इनवॉइस भुगतान-तरीका ID नहीं। यह या asset_tickers इस्तेमाल करें। इस चेन के सभी सक्रिय स्वीकार्य एसेट के लिए दोनों चयनकर्ता छोड़ें। [] और डुप्लिकेट/nil ID अमान्य हैं। 5.4.0+ में इस दुकान की इस चेन पर निष्क्रिय/अस्वीकार्य ID अनदेखे होते हैं; पूरी तरह बेमेल चयन दुकान डिफ़ॉल्ट इस्तेमाल करता है।
asset_tickers[]string[] | nullवैकल्पिकMerchant 5.3.0+। BTC, USDC या PEPE जैसे प्रतीक, chain_slug और इस दुकान के दायरे में। 1–64 विशिष्ट टिकर; किनारे की खाली जगह हटती है/अक्षर आकार से फ़र्क नहीं, 1–40 ASCII अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न। यह या asset_ids इस्तेमाल करें। 5.4.0+ में अज्ञात/निष्क्रिय/अस्वीकार्य टिकर अनदेखे होते हैं। अस्पष्ट स्वीकृत प्रतीक तब भी विफल होते हैं: asset_ids इस्तेमाल करें। सक्रिय चुने तरीकों के लिए वैध वॉलेट और मूल्य चाहिए; 6.0.6 से अस्थायी ऑन-चेन स्कैनर रुकावट निर्माण नहीं रोकती। Lightning वैकल्पिक रूप से केवल BTC स्वीकार करता है।विवरण
Merchant 5.3.0+। BTC, USDC या PEPE जैसे प्रतीक, chain_slug और इस दुकान के दायरे में। 1–64 विशिष्ट टिकर; किनारे की खाली जगह हटती है/अक्षर आकार से फ़र्क नहीं, 1–40 ASCII अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न। यह या asset_ids इस्तेमाल करें। 5.4.0+ में अज्ञात/निष्क्रिय/अस्वीकार्य टिकर अनदेखे होते हैं। अस्पष्ट स्वीकृत प्रतीक तब भी विफल होते हैं: asset_ids इस्तेमाल करें। सक्रिय चुने तरीकों के लिए वैध वॉलेट और मूल्य चाहिए; 6.0.6 से अस्थायी ऑन-चेन स्कैनर रुकावट निर्माण नहीं रोकती। Lightning वैकल्पिक रूप से केवल BTC स्वीकार करता है।
payment_railonchain | lightningवैकल्पिकडिफ़ॉल्ट onchain। Bitcoin Lightning चुनने के लिए बिना asset_ids के {chain_slug: bitcoin, payment_rail: lightning} इस्तेमाल करें; asset_tickers वैकल्पिक रूप से [BTC] हो सकता है। ऑन-चेन Bitcoin में Lightning शामिल नहीं है। दुकान का Lightning कनेक्शन पहले से सक्षम और तैयार होना चाहिए।विवरण
डिफ़ॉल्ट onchain। Bitcoin Lightning चुनने के लिए बिना asset_ids के {chain_slug: bitcoin, payment_rail: lightning} इस्तेमाल करें; asset_tickers वैकल्पिक रूप से [BTC] हो सकता है। ऑन-चेन Bitcoin में Lightning शामिल नहीं है। दुकान का Lightning कनेक्शन पहले से सक्षम और तैयार होना चाहिए।
order_idstring | nullवैकल्पिकमर्चेंट ऑर्डर संदर्भ, किनारे की खाली जगह हटाने के बाद 1–128 अक्षर; नियंत्रण अक्षर अस्वीकार होते हैं।
emailstring | nullवैकल्पिककेवल मर्चेंट का ग्राहक ईमेल, अधिकतम 254 अक्षर के व्यावहारिक ASCII पते में सामान्यीकृत। न देने या null पर ईमेल नहीं रखा जाता।
descriptionstring | nullवैकल्पिकग्राहक को दिखने वाला विवरण, 1–500 अक्षर; नई पंक्तियाँ और टैब स्वीकार हैं।
expires_in_secondsinteger | nullवैकल्पिकइनवॉइस कोट अवधि 300 से 86,400 सेकंड; न देने या null पर दुकान नीति अपनती है।
exchange_rate_spread_percentdecimal string | nullवैकल्पिककोट मार्कअप 0 से 100, अधिकतम दो दशमलव स्थान। न देने या null पर दुकान डिफ़ॉल्ट; "0" इस इनवॉइस के लिए बंद करता है। ऊपर राउंड करने से पहले लागू होता है, फिर लॉक। इनवॉइस फ़िएट राशि या प्रोसेसिंग शुल्क आधार नहीं बदलता।विवरण
कोट मार्कअप 0 से 100, अधिकतम दो दशमलव स्थान। न देने या null पर दुकान डिफ़ॉल्ट; "0" इस इनवॉइस के लिए बंद करता है। ऊपर राउंड करने से पहले लागू होता है, फिर लॉक। इनवॉइस फ़िएट राशि या प्रोसेसिंग शुल्क आधार नहीं बदलता।
underpayment_tolerance_percentdecimal string | nullवैकल्पिकस्वीकृत कमी 0 से 99.99, अधिकतम दो दशमलव स्थान। न देने या null पर दुकान डिफ़ॉल्ट अपनता है।
ipn_urlstring | nullवैकल्पिकसार्वजनिक HTTPS कॉलबैक, अधिकतम 2,048 बाइट, क्रेडेंशियल या फ़्रैगमेंट के बिना। दुकान डिफ़ॉल्ट को बदलता है; null/अनुपस्थित पर वही अपनता है।
redirect_urlstring | nullवैकल्पिकनिपटान के बाद इस्तेमाल होने वाला HTTPS सफलता URL, अधिकतम 2,048 बाइट और बिना अंतर्निहित क्रेडेंशियल। न देने या null पर दुकान डिफ़ॉल्ट अपनता है और उसे साफ़ नहीं कर सकता।
cancel_urlstring | nullवैकल्पिकसफल भुगतान के बिना चेकआउट समाप्त होने पर HTTPS वापसी URL। न देने या null पर दुकान डिफ़ॉल्ट अपनता है और उसे साफ़ नहीं कर सकता।
redirect_automaticallyboolean | nullवैकल्पिकन देने या null पर दुकान नीति अपनती है। true के लिए प्रभावी redirect_url चाहिए।
languagestring | nullवैकल्पिकग्राहक भाषा: en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja। pt का मतलब ब्राज़ीली पुर्तगाली और zh का मतलब सरलीकृत चीनी। de-DE जैसे समर्थित क्षेत्रीय टैग सूचीबद्ध भाषा में सामान्यीकृत होते हैं। न देने या null पर दुकान भाषा अपनती है। कंसोल भाषा अलग है।विवरण
ग्राहक भाषा: en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja। pt का मतलब ब्राज़ीली पुर्तगाली और zh का मतलब सरलीकृत चीनी। de-DE जैसे समर्थित क्षेत्रीय टैग सूचीबद्ध भाषा में सामान्यीकृत होते हैं। न देने या null पर दुकान भाषा अपनती है। कंसोल भाषा अलग है।
checkout_appearanceobject | nullवैकल्पिक
इस इनवॉइस की आंशिक प्रदर्शन सेटिंग। अनुपस्थित/null पर दुकान का वर्तमान डिज़ाइन। {} सहित ऑब्जेक्ट देने पर निर्माण के समय तय डिज़ाइन और चित्र स्थिर हो जाते हैं। नीचे ओवरराइड स्कीमा देखें; वित्तीय सेटिंग, HTML, CSS, JavaScript या रिमोट इमेज URL नहीं।विवरण
इस इनवॉइस की आंशिक प्रदर्शन सेटिंग। अनुपस्थित/null पर दुकान का वर्तमान डिज़ाइन। {} सहित ऑब्जेक्ट देने पर निर्माण के समय तय डिज़ाइन और चित्र स्थिर हो जाते हैं। नीचे ओवरराइड स्कीमा देखें; वित्तीय सेटिंग, HTML, CSS, JavaScript या रिमोट इमेज URL नहीं।
inherit_default_storebooleanवैकल्पिकtrue प्रोजेक्ट की डिफ़ॉल्ट दुकान का डिज़ाइन आधार चुनता है; वरना लक्ष्य दुकान का प्रभावी डिज़ाइन इस्तेमाल होता है। फिर ओवरराइड लागू होकर अलग सहेजे जाते हैं; तय इनवॉइस फ़्लैग false होता है।विवरण
true प्रोजेक्ट की डिफ़ॉल्ट दुकान का डिज़ाइन आधार चुनता है; वरना लक्ष्य दुकान का प्रभावी डिज़ाइन इस्तेमाल होता है। फिर ओवरराइड लागू होकर अलग सहेजे जाते हैं; तय इनवॉइस फ़्लैग false होता है।
introstringवैकल्पिकसादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।विवरण
सादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।
outrostringवैकल्पिकसादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।विवरण
सादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।
accent_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
background_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
card_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
button_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
imagesobjectवैकल्पिक
कुंजियाँ logo_light, logo_dark, favicon। अनुपस्थित कुंजी आधार चित्र रखती है; null हटाता है। {store_id: UUID, kind?: logo_light|logo_dark|favicon} ऑब्जेक्ट उसी प्रोजेक्ट की उस दुकान का प्रभावी अपलोड चित्र दोबारा इस्तेमाल करता है। kind डिफ़ॉल्ट लक्ष्य कुंजी है। पहले दुकान → चेकआउट में अपलोड करें; मूल → API ID से दुकान API ID कॉपी करें। अनुपस्थित चित्र या दूसरे प्रोजेक्ट ID पर 400 मिलता है। बाहरी URL या इमेज डेटा स्वीकार नहीं।विवरण
कुंजियाँ logo_light, logo_dark, favicon। अनुपस्थित कुंजी आधार चित्र रखती है; null हटाता है। {store_id: UUID, kind?: logo_light|logo_dark|favicon} ऑब्जेक्ट उसी प्रोजेक्ट की उस दुकान का प्रभावी अपलोड चित्र दोबारा इस्तेमाल करता है। kind डिफ़ॉल्ट लक्ष्य कुंजी है। पहले दुकान → चेकआउट में अपलोड करें; मूल → API ID से दुकान API ID कॉपी करें। अनुपस्थित चित्र या दूसरे प्रोजेक्ट ID पर 400 मिलता है। बाहरी URL या इमेज डेटा स्वीकार नहीं।
show_order_idbooleanवैकल्पिकशीर्षक के नीचे ऑर्डर ID विवरण और सादे टेक्स्ट का विवरण दिखाएँ। details_expanded ऑर्डर ID विवरण शुरू से खोलता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
show_descriptionbooleanवैकल्पिकशीर्षक के नीचे ऑर्डर ID विवरण और सादे टेक्स्ट का विवरण दिखाएँ। details_expanded ऑर्डर ID विवरण शुरू से खोलता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
details_expandedbooleanवैकल्पिकशीर्षक के नीचे ऑर्डर ID विवरण और सादे टेक्स्ट का विवरण दिखाएँ। details_expanded ऑर्डर ID विवरण शुरू से खोलता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
show_project_namebooleanवैकल्पिकMerchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।विवरण
Merchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
show_store_namebooleanवैकल्पिकMerchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।विवरण
Merchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
featured_chains[]string[]वैकल्पिकक्रमबद्ध चेन स्लग, अधिकतम 60 विशिष्ट मान (छोटे अक्षर, अंक, हाइफ़न; 64 अक्षर तक)। [] साफ़ करता है। केवल उपलब्ध इनवॉइस तरीकों का क्रम बदलता है।विवरण
क्रमबद्ध चेन स्लग, अधिकतम 60 विशिष्ट मान (छोटे अक्षर, अंक, हाइफ़न; 64 अक्षर तक)। [] साफ़ करता है। केवल उपलब्ध इनवॉइस तरीकों का क्रम बदलता है।
featured_asset_ids[]UUID[]वैकल्पिकअधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।विवरण
अधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।
default_asset_idUUID|nullवैकल्पिकअधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।विवरण
अधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।
messagesobjectवैकल्पिक
en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja कुंजियों वाले भाषा ऑब्जेक्ट, जिनमें waiting, confirming, paid, underpaid, expired सादी स्ट्रिंग (हर एक 500 अक्षर) हैं। केवल दी गई भाषाएँ/स्थितियाँ बदलती हैं; {} सभी संदेश साफ़ करता है, {en:{}} अंग्रेज़ी साफ़ करता है और खाली स्थिति स्ट्रिंग वह स्थिति साफ़ करती है। अंग्रेज़ी फ़ॉलबैक है। वास्तविक स्थिति नहीं बदलता।विवरण
en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja कुंजियों वाले भाषा ऑब्जेक्ट, जिनमें waiting, confirming, paid, underpaid, expired सादी स्ट्रिंग (हर एक 500 अक्षर) हैं। केवल दी गई भाषाएँ/स्थितियाँ बदलती हैं; {} सभी संदेश साफ़ करता है, {en:{}} अंग्रेज़ी साफ़ करता है और खाली स्थिति स्ट्रिंग वह स्थिति साफ़ करती है। अंग्रेज़ी फ़ॉलबैक है। वास्तविक स्थिति नहीं बदलता।
enobjectवैकल्पिक
deobjectवैकल्पिक
esobjectवैकल्पिक
pt-BRobjectवैकल्पिक
itobjectवैकल्पिक
ruobjectवैकल्पिक
zh-CNobjectवैकल्पिक
frobjectवैकल्पिक
koobjectवैकल्पिक
support_urlstringवैकल्पिकबिना क्रेडेंशियल के 2,048 अक्षर तक HTTPS URL। खाली साफ़ करता है। लिंक नई विंडो में खुलते हैं।
terms_urlstringवैकल्पिकबिना क्रेडेंशियल के 2,048 अक्षर तक HTTPS URL। खाली साफ़ करता है। लिंक नई विंडो में खुलते हैं।
privacy_urlstringवैकल्पिकबिना क्रेडेंशियल के 2,048 अक्षर तक HTTPS URL। खाली साफ़ करता है। लिंक नई विंडो में खुलते हैं।
return_button_textstringवैकल्पिक60 अक्षर तक लेबल। इनवॉइस व्यवहार के लिए शीर्ष-स्तरीय redirect_url/cancel_url/redirect_automatically/language इस्तेमाल करें।
show_return_buttonbooleanवैकल्पिकअंतिम स्थितियों सहित चेकआउट में मैन्युअल मर्चेंट पर लौटें/रद्द बटन दिखाएँ। दुकान रूप-रंग अपनाने के लिए न दें (डिफ़ॉल्ट true); false छिपाता है। इनवॉइस रद्द नहीं करता, JSON में URL नहीं छिपाता और स्वचालित सफलता रीडायरेक्ट बंद नहीं करता। ज़रूरत हो तो शीर्ष-स्तरीय redirect_automatically अलग से false करें। मर्चेंट 8.1.4 या नया चाहिए।विवरण
अंतिम स्थितियों सहित चेकआउट में मैन्युअल मर्चेंट पर लौटें/रद्द बटन दिखाएँ। दुकान रूप-रंग अपनाने के लिए न दें (डिफ़ॉल्ट true); false छिपाता है। इनवॉइस रद्द नहीं करता, JSON में URL नहीं छिपाता और स्वचालित सफलता रीडायरेक्ट बंद नहीं करता। ज़रूरत हो तो शीर्ष-स्तरीय redirect_automatically अलग से false करें। मर्चेंट 8.1.4 या नया चाहिए।
metadataobject | nullवैकल्पिक
केवल मर्चेंट का JSON ऑब्जेक्ट; अनुपस्थित या null से {}, अधिकतम 4,096 एन्कोडेड बाइट और पाँच नेस्टेड स्तर। firstname, lastname, street, street2, zip, city, country, countryiso2, company और vatid सत्यापित, सामान्यीकृत होकर ग्राहक सारांश फ़ील्ड में आते हैं।विवरण
केवल मर्चेंट का JSON ऑब्जेक्ट; अनुपस्थित या null से {}, अधिकतम 4,096 एन्कोडेड बाइट और पाँच नेस्टेड स्तर। firstname, lastname, street, street2, zip, city, country, countryiso2, company और vatid सत्यापित, सामान्यीकृत होकर ग्राहक सारांश फ़ील्ड में आते हैं।
allocations[]object[]
[{"vendor_id":"VENDOR_A_UUID","gross_amount":"100.00"},{"vendor_id":"VENDOR_B_UUID","gross_amount":"100.00"},{"vendor_id":"VENDOR_C_UUID","gross_amount":"100.00"}]विवरण
[{"vendor_id":"VENDOR_A_UUID","gross_amount":"100.00"},{"vendor_id":"VENDOR_B_UUID","gross_amount":"100.00"},{"vendor_id":"VENDOR_C_UUID","gross_amount":"100.00"}]
जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"invoice_id": "YOUR_INVOICE_ID",
"status": "new",
"marketplace": {
"state": "pending",
"allocations": []
}
},
"links": {
"checkout": "https://pay.example.com/invoice/YOUR_INVOICE_ID"
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- invoices.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETइनवॉइस और आवंटन/v1/marketplace/invoices/{invoice_id}केवल पढ़ना
सामान्य इनवॉइस विवरण के साथ marketplace स्थिति, revision, hold_reason, स्थिर आवंटन, नीति स्नैपशॉट, हाल के 200 भुगतान और हाल के 100 संबंधित भुगतान-निर्गम, सूची कटने के संकेत सहित। सार्वजनिक चेकआउट विक्रेता डेटा नहीं दिखाता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETइनवॉइस भुगतान प्रमाण/v1/marketplace/invoices/{invoice_id}/paymentsकेवल पढ़ना
page/per_page के साथ सामान्य भुगतान प्रमाण। अवलोकन विक्रेता भुगतान नहीं हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/payments?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/payments?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/payments?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/payments?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETइनवॉइस आवंटन/v1/marketplace/invoices/{invoice_id}/allocationsकेवल पढ़ना
योग्य निपटान के बाद अपरिवर्तनीय हिस्सा/कमीशन/गंतव्य स्नैपशॉट और सटीक सकल, कमीशन व शुद्ध परमाणु इकाई मान।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTअवैतनिक इनवॉइस रद्द करें/v1/marketplace/invoices/{invoice_id}/cancelपढ़ना + लिखना
केवल अवैतनिक new या expired इनवॉइस। देर से प्राप्तियाँ समीक्षा के लिए रुकती हैं। Revision मार्केटप्लेस इनवॉइस का संशोधन है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | invoices.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/cancel" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}`;
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/cancel", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/cancel");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/cancel",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- invoices.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTआवंटन रोकें/v1/marketplace/invoices/{invoice_id}/allocations/holdपढ़ना + लिखना
दायित्व मिटाए बिना अहस्ताक्षरित आवंटन रोकें। हस्ताक्षरित या अनिश्चित भुगतान ट्रैक होते रहते हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | reconciliation.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/hold" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verify customer request"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verify customer request"
}`;
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/hold", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verify customer request"
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/hold");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verify customer request"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/hold",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- reconciliation.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTआवंटन की समीक्षा करके जारी करें/v1/marketplace/invoices/{invoice_id}/allocations/releaseपढ़ना + लिखना
फंड समर्थन/अंतिमता फिर जाँचें। वैकल्पिक approved_amount_atomic आवंटन स्थिर होने से पहले छोटे, पूरी तरह समर्थित विभाजन को स्पष्ट रूप से स्वीकार करता है; प्राप्त फंड कभी गढ़ता नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | reconciliation.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/release" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verified payment evidence"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verified payment evidence"
}`;
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/release", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verified payment evidence"
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/release");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"reason": "Verified payment evidence"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/release",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- reconciliation.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTअवैतनिक गंतव्य दोबारा बाँधें/v1/marketplace/invoices/{invoice_id}/allocations/{allocation_id}/destinationपढ़ना + लिखना
आवंटन revision ज़रूरी। केवल अनारक्षित/अहस्ताक्षरित कार्य और मूल नेटवर्क पर उसी विक्रेता का अलग मंज़ूर संस्करण। ऑडिट होता है; हस्ताक्षरित कार्य बदल नहीं सकता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | reconciliation.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/YOUR_ALLOCATION_ID/destination" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"destination_id": "YOUR_DESTINATION_ID",
"reason": "Vendor verified replacement address"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"destination_id": "YOUR_DESTINATION_ID",
"reason": "Vendor verified replacement address"
}`;
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/YOUR_ALLOCATION_ID/destination", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"destination_id": "YOUR_DESTINATION_ID",
"reason": "Vendor verified replacement address"
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/YOUR_ALLOCATION_ID/destination");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"destination_id": "YOUR_DESTINATION_ID",
"reason": "Vendor verified replacement address"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/allocations/YOUR_ALLOCATION_ID/destination",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- reconciliation.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTपूरा रिफ़ंड तैयार करें/v1/marketplace/invoices/{invoice_id}/refundपढ़ना + लिखना
अलग मंज़ूर होने वाला उसी एसेट में पूरी प्राप्त राशि का रिफ़ंड तैयार करें। विक्रेता भुगतान से पहले अवैतनिक फंड आरक्षित करें और पुष्टि पर कमीशन उलटें। सभी विक्रेता भुगतान के बाद अलग मुक्त प्राथमिक-पते के फंड इस्तेमाल करें। भेजने वाले पते से ग्राहक का रिफ़ंड पता कभी अनुमान न लगाएँ।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | reconciliation.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/refund" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"payment_method_id": "YOUR_PAYMENT_METHOD_ID",
"destination_address": "VERIFIED_CUSTOMER_REFUND_ADDRESS",
"reason": "Customer cancellation",
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"payment_method_id": "YOUR_PAYMENT_METHOD_ID",
"destination_address": "VERIFIED_CUSTOMER_REFUND_ADDRESS",
"reason": "Customer cancellation",
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}`;
const response = await fetch("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/refund", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"payment_method_id": "YOUR_PAYMENT_METHOD_ID",
"destination_address": "VERIFIED_CUSTOMER_REFUND_ADDRESS",
"reason": "Customer cancellation",
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/refund");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"payment_method_id": "YOUR_PAYMENT_METHOD_ID",
"destination_address": "VERIFIED_CUSTOMER_REFUND_ADDRESS",
"reason": "Customer cancellation",
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/invoices/YOUR_INVOICE_ID/refund",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- reconciliation.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETभुगतान आवंटन खोजें/v1/marketplace/allocationsकेवल पढ़ना
पृष्ठबद्ध विकल्प; status (available आदि), asset_id, vendor_id, store_id और q (विक्रेता/ऑर्डर/इनवॉइस) से फ़िल्टर करें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/allocations?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/allocations?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/allocations?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/allocations?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETप्रोजेक्ट लेजर बैलेंस/v1/marketplace/balancesकेवल पढ़ना
सटीक समूहित एसेट/खाता कुल, जिसमें रोका, उपलब्ध, आरक्षित, चुकाया, कमीशन, रिफ़ंड और नेटवर्क शुल्क शामिल हैं। बाहरी संतुलन खाता बाहर है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/balances?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/balances?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/balances?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/balances?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETअपरिवर्तनीय जर्नल/v1/marketplace/ledgerकेवल पढ़ना
पृष्ठबद्ध केवल-जोड़ने वाली गतिविधियाँ; q संदर्भ/खाता, asset_id और vendor_id फ़िल्टर। राशियाँ परमाणु इकाई स्ट्रिंग हैं; कोई प्रविष्टि संपादित या मैन्युअल रूप से चुकाई हुई नहीं कर सकते।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/ledger?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/ledger?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/ledger?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/ledger?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETभुगतान इतिहास/v1/marketplace/payoutsकेवल पढ़ना
पृष्ठबद्ध मूल रिकॉर्ड; state, asset_id, vendor_id या q ID/प्रतीक से फ़िल्टर करें। Paid का मतलब स्वतंत्र पुष्टि है, केवल प्रसारण नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/payouts?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/payouts?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/payouts?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/payouts?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTआवंटन योजना का पूर्वावलोकन/v1/marketplace/payouts/previewपढ़ना + लिखना
केवल-पढ़ने की लेखा योजना, आरक्षण या खर्च अधिकार नहीं। अधिकतम शुल्क उपयोगकर्ता की सीमा है, वास्तविक शुल्क का अनुमान नहीं। तैयारी में बाद में लाइव जाँच होती है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | payouts.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/payouts/preview" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}`;
const response = await fetch("https://api.example.com/v1/marketplace/payouts/preview", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/payouts/preview");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/payouts/preview",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- payouts.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTभुगतान तैयार करें/v1/marketplace/payoutsपढ़ना + लिखना
एक एसेट/वॉलेट में 1–100 उपलब्ध आवंटन ID आरक्षित करें। BTC में हर चुने इनवॉइस के सभी अवैतनिक हिस्से एक मल्टी-आउटपुट बैच में होने चाहिए। बजट नेटिव शुल्क एसेट की परमाणु इकाई स्ट्रिंग हैं। awaiting_approval योजना बनाता है, प्रसारण नहीं करता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | payouts.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/payouts" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}`;
const response = await fetch("https://api.example.com/v1/marketplace/payouts", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/payouts");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"allocation_ids": [
"YOUR_ALLOCATION_ID"
],
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"fee_tier": "medium"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/payouts",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"id": "YOUR_PAYOUT_ID",
"state": "awaiting_approval",
"revision": 1,
"plan_hash": "RETAINED_PLAN_HASH",
"plan": {
"amount_atomic": "28800000",
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"items": []
},
"transactions": []
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- payouts.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETभुगतान विवरण/v1/marketplace/payouts/{payout_id}केवल पढ़ना
अपरिवर्तनीय योजना/हैश, संशोधन, समाप्ति, प्राप्तकर्ता आइटम, सहेजे उप-प्रयास, प्रगति, सटीक शुल्क और एक्सप्लोरर लिंक। निजी कुंजियाँ या हस्ताक्षरित बाइट कभी नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"id": "YOUR_PAYOUT_ID",
"state": "awaiting_approval",
"revision": 1,
"plan_hash": "RETAINED_PLAN_HASH",
"plan": {
"amount_atomic": "28800000",
"maximum_network_fee_atomic": "10000",
"maximum_gas_funding_atomic": "0",
"items": []
},
"transactions": []
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTमंज़ूरी दें और भेजें/v1/marketplace/payouts/{payout_id}/approveपढ़ना + लिखना
समाप्ति से पहले सटीक सहेजी योजना को स्पष्ट रूप से अधिकृत करें। सीमित गैस फंडिंग और विक्रेता लेनदेन पृष्ठभूमि की कतार में डालें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | payouts.approve |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/approve" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}`;
const response = await fetch("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/approve", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/approve");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/approve",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- payouts.approve चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTभुगतान की समीक्षा करके फिर शुरू करें/v1/marketplace/payouts/{payout_id}/resumeपढ़ना + लिखना
केवल needs_attention। सहेजी योजना/हैश फिर इस्तेमाल करें; पुष्टि पाए प्राप्तकर्ताओं को कभी फिर नहीं भेजा जाता। विफल उप-लेनदेन बदलने से पहले दो स्वतंत्र प्रदाताओं को पर्याप्त पुष्टि वाला कैनॉनिकल EVM रिवर्ट साबित करना होगा। पिछले शुल्क मंज़ूर बजट में अब भी गिने जाते हैं और सभी हैश इतिहास में रहते हैं। अज्ञात/आंशिक टोकन डिलीवरी payout_recovery_unverified लौटाती है; आरक्षण रुके रहते हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | payouts.approve |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/resume" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}`;
const response = await fetch("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/resume", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/resume");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"expected_plan_hash": "COPY_EXACT_PLAN_HASH_FROM_PREPARE",
"confirm": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/resume",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- payouts.approve चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTअहस्ताक्षरित कार्य रद्द करें/v1/marketplace/payouts/{payout_id}/cancelपढ़ना + लिखना
केवल सुरक्षित रूप से अहस्ताक्षरित/न भेजे आरक्षण रिलीज़ करें। पुष्टि पाए प्राप्तकर्ता और ऑडिट बने रहते हैं। हस्ताक्षरित/अनिश्चित कार्य रद्द नहीं हो सकता। स्पष्ट रिकवरी किया प्रमाणित रिवर्ट बाकी अहस्ताक्षरित कार्य रद्द करने से अब नहीं रोकता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | payouts.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/cancel" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}`;
const response = await fetch("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/cancel", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/cancel");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/payouts/YOUR_PAYOUT_ID/cancel",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- payouts.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETस्वचालित भुगतान नीतियाँ/v1/marketplace/policiesकेवल पढ़ना
हर एसेट की नीति, revision, next_attempt_at, last_checked_at और तैयारी या प्राधिकरण को ध्यान चाहिए तो सुरक्षित last_error पढ़ें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/policies?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/policies?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/policies?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/policies?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": []
}जवाब फ़ील्ड
data[]arrayउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTभुगतान नीति को अधिकृत करें/v1/marketplace/policiesपढ़ना + लिखना
सटीक परमाणु इकाई स्ट्रिंग; minimum <= transfer <= दैनिक मूल राशि, शुल्क/गैस सीमाएँ <= उनके दैनिक बजट। interval_seconds 60–604800; minimum_confirmations 1–100000, चेन न्यूनतम के अधीन। Revision 0 बनाता है। सक्षम नीतियाँ आगे क्लिक के बिना भेज सकती हैं; समीक्षा तक false रखें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | policies.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/policies" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"asset_id": "YOUR_ASSET_ID",
"revision": 0,
"enabled": false,
"minimum_atomic": "100000",
"transfer_limit_atomic": "10000000",
"daily_limit_atomic": "30000000",
"fee_limit_atomic": "10000",
"daily_fee_limit_atomic": "30000",
"gas_limit_atomic": "0",
"daily_gas_limit_atomic": "0",
"interval_seconds": 3600,
"minimum_confirmations": 2
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"asset_id": "YOUR_ASSET_ID",
"revision": 0,
"enabled": false,
"minimum_atomic": "100000",
"transfer_limit_atomic": "10000000",
"daily_limit_atomic": "30000000",
"fee_limit_atomic": "10000",
"daily_fee_limit_atomic": "30000",
"gas_limit_atomic": "0",
"daily_gas_limit_atomic": "0",
"interval_seconds": 3600,
"minimum_confirmations": 2
}`;
const response = await fetch("https://api.example.com/v1/marketplace/policies", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"asset_id": "YOUR_ASSET_ID",
"revision": 0,
"enabled": false,
"minimum_atomic": "100000",
"transfer_limit_atomic": "10000000",
"daily_limit_atomic": "30000000",
"fee_limit_atomic": "10000",
"daily_fee_limit_atomic": "30000",
"gas_limit_atomic": "0",
"daily_gas_limit_atomic": "0",
"interval_seconds": 3600,
"minimum_confirmations": 2
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/policies");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"asset_id": "YOUR_ASSET_ID",
"revision": 0,
"enabled": false,
"minimum_atomic": "100000",
"transfer_limit_atomic": "10000000",
"daily_limit_atomic": "30000000",
"fee_limit_atomic": "10000",
"daily_fee_limit_atomic": "30000",
"gas_limit_atomic": "0",
"daily_gas_limit_atomic": "0",
"interval_seconds": 3600,
"minimum_confirmations": 2
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/policies",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- policies.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETमार्केटप्लेस वेबहुक/v1/marketplace/webhooksकेवल पढ़ना
अधिकतम 20 एंडपॉइंट और समर्थित event_types। एन्क्रिप्टेड या सादे टेक्स्ट के हस्ताक्षर सीक्रेट कभी नहीं लौटाता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/webhooks?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/webhooks?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/webhooks?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/webhooks?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"endpoints": [],
"event_types": [
"marketplace.invoice.created",
"marketplace.allocations.available",
"marketplace.allocations.held",
"marketplace.payout.approved",
"marketplace.payout.broadcast",
"marketplace.payout.confirmed",
"marketplace.payout.partial",
"marketplace.payout.failed",
"marketplace.payout.cancelled",
"marketplace.refund.prepared",
"marketplace.refund.confirmed"
]
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTमार्केटप्लेस वेबहुक बनाएँ/v1/marketplace/webhooksपढ़ना + लिखना
केवल सार्वजनिक HTTPS, क्रेडेंशियल, निजी गंतव्य या रीडायरेक्ट नहीं। सहेजे इडेम्पोटेंट निर्माण जवाब में signing_secret एक बार लौटाता है; सुरक्षित रखें। दुकान के IPN सीक्रेट से अलग।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | webhooks.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/webhooks" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed",
"marketplace.payout.failed"
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed",
"marketplace.payout.failed"
]
}`;
const response = await fetch("https://api.example.com/v1/marketplace/webhooks", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed",
"marketplace.payout.failed"
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/webhooks");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed",
"marketplace.payout.failed"
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/webhooks",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- webhooks.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTमार्केटप्लेस वेबहुक अपडेट करें/v1/marketplace/webhooks/{webhook_id}/updateपढ़ना + लिखना
बदलाव पुरानी न भेजी डिलीवरी रद्द करते हैं। सीक्रेट वही रहता है; पुराने अपरिवर्तनीय पेलोड नए URL पर कभी रीडायरेक्ट नहीं होते।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | webhooks.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/update" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed"
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed"
]
}`;
const response = await fetch("https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/update", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed"
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/update");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1,
"url": "https://shop.example.com/marketplace-events",
"enabled": true,
"events": [
"marketplace.payout.confirmed"
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/update",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- webhooks.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTमार्केटप्लेस वेबहुक बंद करें/v1/marketplace/webhooks/{webhook_id}/disableपढ़ना + लिखना
नई डिलीवरी रोकें; सहेजा इवेंट इतिहास बना रहता है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | webhooks.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/disable" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}`;
const response = await fetch("https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/disable", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/disable");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"revision": 1
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/webhooks/YOUR_WEBHOOK_ID/disable",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- webhooks.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETमार्केटप्लेस इवेंट/v1/marketplace/eventsकेवल पढ़ना
पृष्ठबद्ध अपरिवर्तनीय इवेंट संदर्भ। q प्रकार/संदर्भ खोजता है; status, event_type फ़िल्टर करता है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/events?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/events?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/events?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/events?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETसहेजा गया इवेंट पढ़ें/v1/marketplace/events/{event_id}केवल पढ़ना
अपरिवर्तनीय मूल इवेंट पेलोड लौटाता है, वर्तमान बैलेंस से दोबारा बनाया रूप नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/events/YOUR_EVENT_ID?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/events/YOUR_EVENT_ID?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/events/YOUR_EVENT_ID?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/events/YOUR_EVENT_ID?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"event_id": "11111111-1111-4111-8111-111111111111",
"event_type": "marketplace.payout.confirmed",
"payload_version": 1,
"project_id": "YOUR_PROJECT_ID",
"occurred_at": "2026-10-06T12:00:00Z",
"data": {
"payout_id": "YOUR_PAYOUT_ID",
"asset_id": "YOUR_ASSET_ID",
"amount_atomic": "28800000",
"transactions": [
{
"transaction_id": "EXAMPLE_TRANSACTION_ID",
"explorer_url": "https://mempool.space/tx/EXAMPLE_TRANSACTION_ID"
}
]
}
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETमार्केटप्लेस डिलीवरी इतिहास/v1/marketplace/webhook-deliveriesकेवल पढ़ना
पृष्ठबद्ध डिलीवरी, इवेंट प्रकार, प्रयास और अंतिम परिणाम। status pending/sending/succeeded/failed/cancelled से फ़िल्टर करें; q इवेंट प्रकार।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/webhook-deliveries?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/webhook-deliveries?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/webhook-deliveries?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/webhook-deliveries?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETडिलीवरी विवरण/v1/marketplace/webhook-deliveries/{delivery_id}केवल पढ़ना
मूल URL, सहेजा पेलोड, HTTP परिणाम और सुरक्षित त्रुटि; हस्ताक्षर सीक्रेट नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | marketplace.read |
क्वेरी पैरामीटर
pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
per_pageवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
qवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
statusवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
store_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
vendor_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
asset_idवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
fromवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
toवैकल्पिककेवल इस संसाधन के दस्तावेज़ वाले फ़िल्टर इस्तेमाल करें। पृष्ठबद्ध सूची डिफ़ॉल्ट 25 और अधिकतम 100 पंक्तियाँ देती है।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID?project_id=YOUR_PROJECT_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID?project_id=YOUR_PROJECT_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID?project_id=YOUR_PROJECT_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID?project_id=YOUR_PROJECT_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- marketplace.read चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
POSTवही इवेंट दोबारा भेजें/v1/marketplace/webhook-deliveries/{delivery_id}/resendपढ़ना + लिखना
केवल समाप्त डिलीवरी और अपरिवर्तित सक्रिय एंडपॉइंट; अधिकतम 20 मैन्युअल पुनः प्रयास। event_id फिर इस्तेमाल करता है। विफल सूचना कभी दूसरा भुगतान अधिकृत नहीं करती।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | ज़रूरी | 16–128 अक्षर, अंक, -, _ या .; इसी सटीक अनुरोध के साथ सहेजें |
| पैरामीटर | प्रकार / स्थान | नियम |
|---|---|---|
| permission | credential scope | webhooks.write |
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new operation.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID/resend" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: marketplace-request-1042' \
--header 'Content-Type: application/json' \
--data-raw '{
"project_id": "YOUR_PROJECT_ID",
"confirm": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new operation.
const body = `{
"project_id": "YOUR_PROJECT_ID",
"confirm": true
}`;
const response = await fetch("https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID/resend", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new operation.
$body = <<<'JSON'
{
"project_id": "YOUR_PROJECT_ID",
"confirm": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID/resend");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: marketplace-request-1042", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new operation.
headers = {
"Idempotency-Key": "marketplace-request-1042",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"project_id": "YOUR_PROJECT_ID",
"confirm": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/marketplace/webhook-deliveries/YOUR_DELIVERY_ID/resend",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": {}
}जवाब फ़ील्ड
dataobjectउपयोग संबंधी नोट
- webhooks.write चाहिए। जवाब उदाहरण चुनिंदा फ़ील्ड दिखाते हैं; पूरे सहेजे प्रमाण के लिए संसाधन GET करें।
- हर POST में सहेजी गई 16–128 अक्षर की Idempotency-Key चाहिए (अक्षर, अंक, -, _ या .)। टाइमआउट के बाद वही कुंजी और JSON निर्देश फिर इस्तेमाल करें। अलग निर्देश 409 लौटाते हैं। पूरे जवाब 30 दिन रहते हैं; पुरानी कुंजियाँ दोबारा उपयोग रोकने वाले स्थायी रिकॉर्ड बन जाती हैं। केवल अनिश्चित परिणाम बाइपास करने के लिए कुंजी कभी न बदलें।
- कुंजियों में प्रोजेक्ट सूची, वैकल्पिक इनवॉइस-दुकान प्रतिबंध, समाप्ति, IP अनुमति सूची और 1–600/मिनट कोटा (डिफ़ॉल्ट 60) हैं। HTTP 429 में Retry-After होता है। दुकान-सीमित कुंजियाँ विक्रेता, प्रोजेक्ट बैलेंस, लेजर, भुगतान या सेटिंग नहीं देख सकतीं। खर्च क्रेडेंशियल केवल विश्वसनीय सर्वर पर रखें, ब्राउज़र या वितरित मोबाइल ऐप में कभी नहीं।
त्रुटियाँ
GETभुगतान अपवादों की सूची पाएँ/v1/projects/{project_id}/reconciliationकेवल पढ़ना
कम, अधिक, देर, पुनर्गठित या अस्पष्ट भुगतान, विफल डिलीवरी और बंद/समाप्त तरीकों के लिए एक पृष्ठबद्ध समीक्षा कतार। ऑपरेटर द्वारा स्वीकार किए मामले नया प्रमाण आने पर फिर खुलते हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
पथ पैरामीटर
क्वेरी पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation?status=open&page=1" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation?status=open&page=1", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation?status=open&page=1");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation?status=open&page=1",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{"data":[],"pagination":{"page":1,"per_page":25,"total":0,"has_more":false},"counts":{"open":0,"resolved":0}}जवाब फ़ील्ड
data[]object[]हमेशा
हाल में अपडेट मामले पहले। मर्चेंट विवरण URL में invoice_id इस्तेमाल करें, आंतरिक id नहीं।
idUUIDहमेशाआंतरिक रिकॉर्ड ID / ग्राहक को दिखने वाला इनवॉइस UUID। invoice_id कॉलबैक पेलोड से मेल खाता है।
invoice_idUUIDहमेशाआंतरिक रिकॉर्ड ID / ग्राहक को दिखने वाला इनवॉइस UUID। invoice_id कॉलबैक पेलोड से मेल खाता है।
paginationobjectहमेशा
page (1–40001), per_page (25), कुल मेल खाती पंक्तियाँ, has_more।
उपयोग संबंधी नोट
- केवल-पढ़ने का, प्रोजेक्ट-दायरे में और क्रेडेंशियल कोटे के अंतर्गत। वित्तीय निर्णय और रिफ़ंड केवल कंसोल में रहते हैं।
- पंक्तियों में id (आंतरिक UUID), invoice_id (सार्वजनिक UUID, कॉलबैक जैसा), दुकान जानकारी, मूल फ़िएट राशि/मुद्रा, invoice_status, मामले की स्थिति, कारण, revision और updated_at होते हैं। मर्चेंट विवरण एंडपॉइंट में invoice_id इस्तेमाल करें।
- स्वचालित पता लगाना मूल इनवॉइस निगरानी अवधि का पालन करता है; Rescan चेकआउट सक्षम किए बिना निगरानी एक घंटा बढ़ाता है। निपटान के बाद/रद्द तरीकों की निगरानी उस अवधि में जारी रहती है।
त्रुटियाँ
GETमिलान के प्रमाण पढ़ें/v1/projects/{project_id}/reconciliation/{invoice_id}केवल पढ़ना
इनवॉइस, मामला, तरीके के सटीक कुल और उपलब्ध रिफ़ंड राशि, देखे लेनदेन, डिलीवरी इतिहास, मर्चेंट निर्णय और जुड़े रिफ़ंड ट्रांसफ़र लौटाता है। हस्ताक्षर कुंजियाँ या कॉलबैक सीक्रेट कभी नहीं दिखाता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
पथ पैरामीटर
क्वेरी पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation/YOUR_PUBLIC_INVOICE_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation/YOUR_PUBLIC_INVOICE_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation/YOUR_PUBLIC_INVOICE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/reconciliation/YOUR_PUBLIC_INVOICE_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{"invoice":{"invoice_id":"YOUR_PUBLIC_INVOICE_ID","status":"processing"},"case":{"status":"open","reasons":["underpaid"],"revision":1},"methods":[],"history":[],"history_pagination":{"page":1,"per_page":25,"total":0},"refunds":[],"observations":[],"deliveries":[]}जवाब फ़ील्ड
invoiceobjectहमेशा
पूरा मर्चेंट इनवॉइस: सारांश फ़ील्ड, निजी मेटाडेटा और payment_intents। data के भीतर नहीं।
customer_addressstring | nullहमेशानिजी company, street, street2, zip, city, country, countryiso2 और vatid मेटाडेटा से निकला एक-पंक्ति मर्चेंट पता।
exchange_rate_spread_percentdecimal stringहमेशालॉक किया कोट स्प्रेड: निर्माण ओवरराइड या न देने पर दुकान डिफ़ॉल्ट। ऊपर राउंड करने से पहले लागू; इस इनवॉइस पर कभी नहीं बदलता।
underpayment_tolerance_percentdecimal stringहमेशाइनवॉइस बनते समय स्नैपशॉट किया अपरिवर्तनीय स्वीकृत कमी प्रतिशत।
amount_statusamount statusहमेशाnone, partial, paid या overpaid। स्पष्ट अनुमति वाला शून्य-राशि इनवॉइस none और बिना भुगतान तरीकों के निपटता है।
winning_payment_intent_idUUID | nullहमेशाचुने जाने पर वह भुगतान तरीका जिसने इनवॉइस का परिणाम तय किया।
monitoring_expires_atRFC 3339 timestampहमेशासभी भुगतान तरीकों में कॉन्फ़िगर किया सबसे बाद का देर-निगरानी कटऑफ़।
ipn_urlstring | nullहमेशाहर इनवॉइस का प्रभावी IPN लक्ष्य। केवल मर्चेंट जवाब; सार्वजनिक चेकआउट में नहीं।
metadataobjectहमेशामर्चेंट मेटाडेटा। सार्वजनिक चेकआउट कभी नहीं लौटाता। कंसोल भुगतान टूल payment_tool स्रोत जानकारी (id, kind, title, pricing, requested_amount, request_id) जोड़ते हैं; यह भुगतान साबित नहीं करती। कॉलबैक प्रमाणित करें और हर invoice_id पर invoice.settled एक बार पूरा करें।विवरण
मर्चेंट मेटाडेटा। सार्वजनिक चेकआउट कभी नहीं लौटाता। कंसोल भुगतान टूल payment_tool स्रोत जानकारी (id, kind, title, pricing, requested_amount, request_id) जोड़ते हैं; यह भुगतान साबित नहीं करती। कॉलबैक प्रमाणित करें और हर invoice_id पर invoice.settled एक बार पूरा करें।
payment_intents[]object[]हमेशा
कोट किए भुगतान तरीके और निगरानी स्थिति।
payment_railonchain | lightningहमेशाइनवॉइस ट्रांसपोर्ट। Bitcoin ऑन-चेन और Lightning समान asset_id साझा कर सकते हैं; केवल प्रतीक नहीं, इंटेंट id के साथ यह फ़ील्ड इस्तेमाल करें। यह एसेट कैटलॉग के स्कैनर payment_rail से अलग है।विवरण
इनवॉइस ट्रांसपोर्ट। Bitcoin ऑन-चेन और Lightning समान asset_id साझा कर सकते हैं; केवल प्रतीक नहीं, इंटेंट id के साथ यह फ़ील्ड इस्तेमाल करें। यह एसेट कैटलॉग के स्कैनर payment_rail से अलग है।
bolt11string | nullहमेशाLightning भुगतान अनुरोध, वरना null। यह अनुरोध Lightning वॉलेट से चुकाएँ; इसके payment hash पर कभी ऑन-चेन फंड न भेजें।
asset_decimalsintegerहमेशापरमाणु इकाई सटीकता। Lightning BTC में 11 (millisatoshi), ऑन-चेन Bitcoin के 8 नहीं। कोट पूरे satoshi में हैं; प्राप्तियाँ millisatoshi सटीकता रखती हैं।
quote_ratedecimal stringहमेशालॉक स्प्रेड सहित इनवॉइस मुद्रा की एक इकाई के प्रति एसेट इकाइयाँ। जैसे प्रति USD 1.02 USDC। उलटी दर नहीं।
quote_detailsobject | nullहमेशालॉक कोट का स्रोत विवरण: स्प्रेड से पहले reference_rate, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at और asset_fetched_at। पुराने इनवॉइस में null; ऐतिहासिक मान गढ़े नहीं जाते।विवरण
लॉक कोट का स्रोत विवरण: स्प्रेड से पहले reference_rate, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at और asset_fetched_at। पुराने इनवॉइस में null; ऐतिहासिक मान गढ़े नहीं जाते।
expected_amountdecimal stringहमेशास्प्रेड और ऊपर की राउंडिंग के बाद चुकाने की सटीक लॉक एसेट राशि। 4.1.1 से पहचाने सत्यापित फ़िएट स्टेबलकॉइन (जैसे USDC, USDT, DAI, USDS, EURC) अधिकतम दो दशमलव तक ऊपर राउंड होते हैं; 1.321 से 1.33 होता है, कभी 1.32 नहीं। शून्य सहनशीलता पर भी यही अपेक्षित राशि है। अन्य एसेट अनुकूलित सटीकता रखते हैं। मौजूदा इनवॉइस की कीमत कभी दोबारा नहीं तय होती।विवरण
स्प्रेड और ऊपर की राउंडिंग के बाद चुकाने की सटीक लॉक एसेट राशि। 4.1.1 से पहचाने सत्यापित फ़िएट स्टेबलकॉइन (जैसे USDC, USDT, DAI, USDS, EURC) अधिकतम दो दशमलव तक ऊपर राउंड होते हैं; 1.321 से 1.33 होता है, कभी 1.32 नहीं। शून्य सहनशीलता पर भी यही अपेक्षित राशि है। अन्य एसेट अनुकूलित सटीकता रखते हैं। मौजूदा इनवॉइस की कीमत कभी दोबारा नहीं तय होती।
minimum_payment_amountdecimal stringहमेशाइनवॉइस सहनशीलता लागू करने के बाद paid मानी जाने वाली न्यूनतम राशि।
destination_addressstringहमेशाऑन-चेन प्राप्ति पता या Lightning का 64-अक्षर payment hash। Lightning भुगतान के लिए bolt11 इस्तेमाल करें; उसका हैश Bitcoin पता नहीं है।
destination_tagstring | nullहमेशाजहाँ प्रणाली इस्तेमाल करती हो, ज़रूरी सार्वजनिक भुगतान संदर्भ: XRP destination tag, Stellar memo ID या TON इनवॉइस टिप्पणी। विशिष्ट-पते वाली प्रणालियों में null।
caseobject | nullहमेशा
स्थिति, कारण, संशोधन और टाइमस्टैम्प वाला वर्तमान मामला; अपवाद न हो तो null। आंतरिक प्रमाण बाहर हैं।
methods[]object[]हमेशाid, wallet_id, asset_id, symbol, chain, decimals, expected_atomic, received_atomic, confirmed_atomic, refundable_atomic, address, tag, monitor_error, last_checked_at, monitoring_expires_at और spending_supported। परमाणु इकाई राशियाँ स्ट्रिंग हैं।विवरण
id, wallet_id, asset_id, symbol, chain, decimals, expected_atomic, received_atomic, confirmed_atomic, refundable_atomic, address, tag, monitor_error, last_checked_at, monitoring_expires_at और spending_supported। परमाणु इकाई राशियाँ स्ट्रिंग हैं।
history_paginationobjectहमेशा
page, per_page (25), total। केवल निर्णय इतिहास page से पृष्ठबद्ध है।
refunds[]object[]हमेशाहाल के 100 रिफ़ंड: id, payment_intent_id, amount_atomic, destination, status, request, treasury_intent_id, transfer_status, created_at और transactions (id/status)। रिफ़ंड भेजना केवल कंसोल में।विवरण
हाल के 100 रिफ़ंड: id, payment_intent_id, amount_atomic, destination, status, request, treasury_intent_id, transfer_status, created_at और transactions (id/status)। रिफ़ंड भेजना केवल कंसोल में।
observations[]object[]हमेशाहाल के 100: payment_intent_id, transaction_id, event_index, amount, status, confirmations, observed_at, symbol, chain और disabled_at_detection। समर्थित होने पर explorer_name/explorer_url शामिल हैं।विवरण
हाल के 100: payment_intent_id, transaction_id, event_index, amount, status, confirmations, observed_at, symbol, chain और disabled_at_detection। समर्थित होने पर explorer_name/explorer_url शामिल हैं।
deliveries[]object[]हमेशाहाल के 50: id, kind, status, attempts, response_status, error, next_attempt_at, event_type और created_at। कॉलबैक सीक्रेट नहीं।
उपयोग संबंधी नोट
- इनवॉइस में अपवाद न बना हो तो case null है। हाल के 100 अवलोकन और 50 डिलीवरी लौटते हैं; निर्णय इतिहास पृष्ठबद्ध है।
- refundable_atomic के लिए कम-से-कम एक नेटवर्क पुष्टि चाहिए, यह मौजूदा रिफ़ंड आरक्षण बाहर रखता है और खर्च योग्य वॉलेट फंड का वादा नहीं है। लाइव कोट वॉलेट तैयारी, स्रोत बैलेंस और शुल्क भी सत्यापित करता है।
- प्रसारित रिफ़ंड का मतलब चेन एंडपॉइंट को भेजा गया, ग्राहक को प्राप्ति की स्वतंत्र पुष्टि नहीं। शुल्क अतिरिक्त हैं और रिफ़ंड जारी करने पर फ़िएट प्रोसेसिंग शुल्क अपने आप वापस क्रेडिट नहीं होते।
- कंसोल प्रोजेक्ट मेनू → ध्यान देने की ज़रूरत में रद्द करना, स्वीकारना, अस्वीकारना, फिर खोलना, समीक्षा, नोट, Rescan, डिलीवरी पुनः प्रयास और समर्थित-चेन रिफ़ंड मिलते हैं। निर्णय CSRF-सुरक्षित सेशन, विशिष्ट request_id, वर्तमान मामला संशोधन, ज़रूरी नोट और स्पष्ट पुष्टि इस्तेमाल करते हैं; bearer टोकन ये बदलाव नहीं कर सकते।
त्रुटियाँ
GETAPI सेवा खोज/सार्वजनिक
v1 सार्वजनिक API भूमिका की पुष्टि करने वाला प्रबंधित API-होस्ट एज जवाब। यह जवाब प्रबंधित प्रॉक्सी बनाता है, मर्चेंट Axum राउटर नहीं।
प्रमाणीकरण और हेडर
सार्वजनिक
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/"// Node.js 18+ · run on your server, never in browser code.
const response = await fetch("https://api.example.com/", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://api.example.com/");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://api.example.com/",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"service": "Wholly Crypto API",
"status": "ready",
"version": "v1"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- Bearer टोकन की ज़रूरत नहीं।
- केवल प्रबंधित API होस्टनाम इस सटीक रूट जवाब की गारंटी देता है।
त्रुटियाँ
GETसेवा की स्थिति/healthzसार्वजनिक
एप्लिकेशन की पहुँच और दो-सेकंड डेटाबेस पिंग जाँचता है। निगरानी के लिए इस्तेमाल करें, इनवॉइस स्थिति के विकल्प के रूप में नहीं।
प्रमाणीकरण और हेडर
सार्वजनिक
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/healthz"// Node.js 18+ · run on your server, never in browser code.
const response = await fetch("https://api.example.com/healthz", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://api.example.com/healthz");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://api.example.com/healthz",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 healthy; 503 database unavailable
उदाहरण जवाब
{
"status": "ok",
"database": "ok",
"version": "0.1.0"
}जवाब फ़ील्ड
उपयोग संबंधी नोट
- Bearer टोकन की ज़रूरत नहीं।
- version मान चल रहे पैकेज का संस्करण है, API पथ का संस्करण नहीं।
त्रुटियाँ
GETप्रोजेक्ट के भुगतान एसेट की सूची पाएँ/v1/projects/{project_id}/payment-assetsकेवल पढ़ना
प्रोजेक्ट नीति, चेन-वॉलेट तैयारी और इंस्टॉल स्कैनर/बैलेंस क्षमताओं के साथ नेटिव एसेट व सत्यापित टोकन सूचीबद्ध करता है। scanner_ready एडॉप्टर-बिल्ड शर्त है, लाइव एंडपॉइंट कोरम परिणाम नहीं। 6.0.6 से स्कैनर बंद रहने पर भी निर्माण कॉन्फ़िगर किए तरीके रखता है। प्राप्ति सत्यापन के लिए कॉन्फ़िगर किया स्वस्थ सटीक-भूमिका प्रदाता थ्रेशोल्ड (डिफ़ॉल्ट 2, वैकल्पिक 1) तब भी चाहिए।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Accept: application/json'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
"Accept": "application/json"
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Accept: application/json"],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Accept": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{
"asset": {
"id": "10000000-0000-4000-8000-000000000003",
"asset_key": "eip155:1/slip44:60",
"chain_slug": "ethereum",
"network": "mainnet",
"caip_network_id": "eip155:1",
"caip_asset_id": "eip155:1/slip44:60",
"asset_kind": "native",
"payment_rail": "evm-native",
"symbol": "ETH",
"name": "Ethereum",
"decimals": 18,
"contract_address": null,
"coingecko_id": "ethereum",
"icon_path": "/assets/coingecko/ethereum.png",
"token_standard": null,
"metadata_verified_at": null,
"payment_supported": true,
"scanner_ready": true,
"balance_ready": true,
"default_finality_mode": "confirmations",
"default_required_confirmations": 12,
"default_monitoring_minutes": 60
},
"policy": {
"enabled": true,
"finality_mode": "confirmations",
"required_confirmations": 12,
"monitoring_minutes": 60,
"late_monitoring_days": 30
},
"wallet": null,
"wallet_readiness": "wallet_missing",
"receive_readiness": { "ready": false, "invoice_creatable": false, "checked_at": "2026-09-16T09:00:00Z", "issues": [{ "chain_slug": "ethereum", "asset_id": "10000000-0000-4000-8000-000000000003", "asset_ticker": "ETH", "reason_code": "wallet_missing", "message": "ethereum / ETH: Create a project wallet for this chain.", "action": "wallets" }] }
}
]
}जवाब फ़ील्ड
data[]object[]
assetobjectहमेशा
स्थायी नेटिव या सत्यापित टोकन एसेट।
payment_railstringहमेशारनटाइम प्रणाली: utxo, evm-native, solana-native, account-native, privacy-native या token-transfer।
contract_addressstring | nullहमेशाटोकन के लिए कैनॉनिकल ERC-20 कॉन्ट्रैक्ट या SPL मिंट; नेटिव एसेट के लिए null।
coingecko_idstring | nullहमेशाखोज/मूल्य पहचान। कस्टम कॉन्ट्रैक्ट में null; उनके टिकर से कभी बाज़ार कीमत का अनुमान न लगाएँ। केवल CoinGecko मेटाडेटा टोकन को चयन योग्य नहीं बनाता।
custom_tokenbooleanहमेशाप्रोजेक्ट-दायरे के तय USD या चुने DEX पूल मूल्य के साथ कस्टम ऑन-चेन-सत्यापित कॉन्ट्रैक्ट।
payment_supportedbooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
scanner_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
balance_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
default_finality_modeconfirmations | finalizedहमेशानई प्रोजेक्ट नीति को विरासत में मिलने वाला डिफ़ॉल्ट अंतिमता मॉडल।
policyobject | nullहमेशा
प्रोजेक्ट सक्रियण/अंतिमता नीति या कॉन्फ़िगर न हो तो null। इसमें custom_price_mode (fixed/dex), custom_price_usd (तय दशमलव स्ट्रिंग या null), custom_dex_pair (चुना पूल या null) और custom_dex (dex_id, quote_symbol, वर्तमान price_usd या null, liquidity_usd, fetched_at, last_error) हैं। इस प्रोजेक्ट की दुकानें कस्टम मूल्य साझा करती हैं।विवरण
प्रोजेक्ट सक्रियण/अंतिमता नीति या कॉन्फ़िगर न हो तो null। इसमें custom_price_mode (fixed/dex), custom_price_usd (तय दशमलव स्ट्रिंग या null), custom_dex_pair (चुना पूल या null) और custom_dex (dex_id, quote_symbol, वर्तमान price_usd या null, liquidity_usd, fetched_at, last_error) हैं। इस प्रोजेक्ट की दुकानें कस्टम मूल्य साझा करती हैं।
enabledbooleanज़रूरीप्रोजेक्ट के लिए एसेट सक्षम या बंद करता है। किसी टोकन से पहले नेटिव चेन सक्षम होनी चाहिए।
finality_modeconfirmations | finalizedज़रूरीएसेट प्रणाली समर्थित अंतिमता नीति। finalized के लिए required_confirmations=1 चाहिए।
required_confirmationsintegerज़रूरीBitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।विवरण
Bitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।
walletobject | nullहमेशा
चेन का नॉन-कस्टोडियल प्रोजेक्ट वॉलेट। टोकन अपनी चेन-नेटिव वॉलेट साझा करते हैं।
activation_requiredbooleanहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
activation_verified_attimestamp|nullहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
receive_readinessobject | null5.5.0+
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।विवरण
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
monero_wallet_rpcMoneroWalletRpcBinding | nullहमेशाMonero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।विवरण
Monero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।
balances[]object[]हमेशा
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।विवरण
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।
active_store_countintegerहमेशाअभी यह एसेट चुनने वाली सक्षम दुकानों की संख्या। यह स्वीकृति का दृश्य है; केवल-पढ़ने की बैलेंस ट्रैकिंग स्वतंत्र रहती है।
active_store_ids[]UUID[]हमेशाइस प्रोजेक्ट की सक्षम दुकानें जो अभी एसेट स्वीकार करती हैं। इससे बिना दूसरे API अनुरोध सटीक स्थानीय दुकान फ़िल्टर मिलता है।
tracking_activebooleanहमेशापढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।विवरण
पढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।
balancedecimal string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
balance_atomicinteger string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
statuspending | refreshing | fresh | stale | errorहमेशाकैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।विवरण
कैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।
balance_statuspending | refreshing | fresh | stale | error | unknownहमेशासमग्र कैश ताज़गी; unknown सुरक्षित फ़ॉलबैक है और कोई भी स्थिति इनवॉइस निपटान साबित नहीं करती।
recent_payments[]object[]हमेशा
इसी सटीक वॉलेट से जुड़े अधिकतम तीन हाल के वैध detected, confirming या final अवलोकन।
statusdetected | confirming | finalहमेशावर्तमान वैध अवलोकन स्थिति। Reorged, replaced और invalid अवलोकन बाहर हैं।
wallet_readinessreadiness enumहमेशाunsupported, project_disabled, project_asset_disabled, store_disabled, store_asset_disabled, wallet_missing, wallet_pending, wallet_disabled, wallet_error, backup_required, account_activation_required, external_wallet_rpc_required या ready।विवरण
unsupported, project_disabled, project_asset_disabled, store_disabled, store_asset_disabled, wallet_missing, wallet_pending, wallet_disabled, wallet_error, backup_required, account_activation_required, external_wallet_rpc_required या ready।
receive_readinessobject | null5.5.0+
साझा प्रोजेक्ट प्राप्ति-सेटअप आकलन। वॉलेट और स्वतंत्र स्कैनर-प्रदाता जाँच शामिल हैं, बैलेंस ताज़गी और भेजने की गैस से अलग। प्रोजेक्ट नीति न हो तो null। इनवॉइस बनाते समय मुद्रा/दरें जँचती हैं।विवरण
साझा प्रोजेक्ट प्राप्ति-सेटअप आकलन। वॉलेट और स्वतंत्र स्कैनर-प्रदाता जाँच शामिल हैं, बैलेंस ताज़गी और भेजने की गैस से अलग। प्रोजेक्ट नीति न हो तो null। इनवॉइस बनाते समय मुद्रा/दरें जँचती हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
उपयोग संबंधी नोट
- टोकन वैश्विक सूची में हो सकता है, फिर भी scanner_ready या payment_supported false होने पर चयन योग्य नहीं।
- ऑपरेटर क्षमता मैट्रिक्स को स्कैनर की सटीक एंडपॉइंट भूमिका भी चाहिए; असंगत API देने वाला स्वस्थ एंडपॉइंट नहीं गिना जाता।
- टोकन अपनी नेटिव चेन का प्रोजेक्ट वॉलेट साझा करते हैं; दूसरी सीड फ़्रेज़ नहीं बनाते।
- शामिल वॉलेट सारांश केवल तैयारी के हैं और बैलेंस खाली रखते हैं; विस्तृत बैलेंस के लिए GET /v1/projects/{project_id}/wallets इस्तेमाल करें।
त्रुटियाँ
PUTप्रोजेक्ट की एसेट नीति अपडेट करें/v1/projects/{project_id}/payment-assets/{asset_id}पढ़ना + लिखना
एक स्थायी एसेट की प्रोजेक्ट नीति बनाता या बदलता है और रीफ़्रेश की गई प्रोजेक्ट एसेट सूची लौटाता है। नेटिव चेन बंद करने पर उसका नेटिव एसेट और टोकन नए इनवॉइस के लिए अनुपलब्ध होते हैं, लेकिन टोकन नीतियाँ, वॉलेट और दुकान चयन सुरक्षित रहते हैं ताकि बाद में फिर चालू कर सकें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | ज़रूरी | application/json |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request PUT \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets/YOUR_ASSET_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw '{
"enabled": true,
"finality_mode": "confirmations",
"required_confirmations": 2,
"monitoring_minutes": 60,
"late_monitoring_days": 30
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const body = `{
"enabled": true,
"finality_mode": "confirmations",
"required_confirmations": 2,
"monitoring_minutes": 60,
"late_monitoring_days": 30
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets/YOUR_ASSET_ID", {
method: "PUT",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$body = <<<'JSON'
{
"enabled": true,
"finality_mode": "confirmations",
"required_confirmations": 2,
"monitoring_minutes": 60,
"late_monitoring_days": 30
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets/YOUR_ASSET_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"enabled": true,
"finality_mode": "confirmations",
"required_confirmations": 2,
"monitoring_minutes": 60,
"late_monitoring_days": 30
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-assets/YOUR_ASSET_ID",
method="PUT", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
enabledbooleanज़रूरीप्रोजेक्ट के लिए एसेट सक्षम या बंद करता है। किसी टोकन से पहले नेटिव चेन सक्षम होनी चाहिए।
finality_modeconfirmations | finalizedज़रूरीएसेट प्रणाली समर्थित अंतिमता नीति। finalized के लिए required_confirmations=1 चाहिए।
required_confirmationsintegerज़रूरीBitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।विवरण
Bitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।
जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{ "asset": { "id": "ASSET_UUID", "symbol": "USDC", "asset_kind": "token", "scanner_ready": true }, "policy": { "enabled": true, "finality_mode": "confirmations", "required_confirmations": 2, "monitoring_minutes": 60, "late_monitoring_days": 30 }, "wallet_readiness": "ready" }
]
}जवाब फ़ील्ड
data[]object[]
assetobjectहमेशा
स्थायी नेटिव या सत्यापित टोकन एसेट।
payment_railstringहमेशारनटाइम प्रणाली: utxo, evm-native, solana-native, account-native, privacy-native या token-transfer।
contract_addressstring | nullहमेशाटोकन के लिए कैनॉनिकल ERC-20 कॉन्ट्रैक्ट या SPL मिंट; नेटिव एसेट के लिए null।
coingecko_idstring | nullहमेशाखोज/मूल्य पहचान। कस्टम कॉन्ट्रैक्ट में null; उनके टिकर से कभी बाज़ार कीमत का अनुमान न लगाएँ। केवल CoinGecko मेटाडेटा टोकन को चयन योग्य नहीं बनाता।
custom_tokenbooleanहमेशाप्रोजेक्ट-दायरे के तय USD या चुने DEX पूल मूल्य के साथ कस्टम ऑन-चेन-सत्यापित कॉन्ट्रैक्ट।
payment_supportedbooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
scanner_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
balance_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
default_finality_modeconfirmations | finalizedहमेशानई प्रोजेक्ट नीति को विरासत में मिलने वाला डिफ़ॉल्ट अंतिमता मॉडल।
policyobject | nullहमेशा
प्रोजेक्ट सक्रियण/अंतिमता नीति या कॉन्फ़िगर न हो तो null। इसमें custom_price_mode (fixed/dex), custom_price_usd (तय दशमलव स्ट्रिंग या null), custom_dex_pair (चुना पूल या null) और custom_dex (dex_id, quote_symbol, वर्तमान price_usd या null, liquidity_usd, fetched_at, last_error) हैं। इस प्रोजेक्ट की दुकानें कस्टम मूल्य साझा करती हैं।विवरण
प्रोजेक्ट सक्रियण/अंतिमता नीति या कॉन्फ़िगर न हो तो null। इसमें custom_price_mode (fixed/dex), custom_price_usd (तय दशमलव स्ट्रिंग या null), custom_dex_pair (चुना पूल या null) और custom_dex (dex_id, quote_symbol, वर्तमान price_usd या null, liquidity_usd, fetched_at, last_error) हैं। इस प्रोजेक्ट की दुकानें कस्टम मूल्य साझा करती हैं।
enabledbooleanज़रूरीप्रोजेक्ट के लिए एसेट सक्षम या बंद करता है। किसी टोकन से पहले नेटिव चेन सक्षम होनी चाहिए।
finality_modeconfirmations | finalizedज़रूरीएसेट प्रणाली समर्थित अंतिमता नीति। finalized के लिए required_confirmations=1 चाहिए।
required_confirmationsintegerज़रूरीBitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।विवरण
Bitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।
walletobject | nullहमेशा
चेन का नॉन-कस्टोडियल प्रोजेक्ट वॉलेट। टोकन अपनी चेन-नेटिव वॉलेट साझा करते हैं।
activation_requiredbooleanहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
activation_verified_attimestamp|nullहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
receive_readinessobject | null5.5.0+
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।विवरण
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
monero_wallet_rpcMoneroWalletRpcBinding | nullहमेशाMonero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।विवरण
Monero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।
balances[]object[]हमेशा
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।विवरण
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।
active_store_countintegerहमेशाअभी यह एसेट चुनने वाली सक्षम दुकानों की संख्या। यह स्वीकृति का दृश्य है; केवल-पढ़ने की बैलेंस ट्रैकिंग स्वतंत्र रहती है।
active_store_ids[]UUID[]हमेशाइस प्रोजेक्ट की सक्षम दुकानें जो अभी एसेट स्वीकार करती हैं। इससे बिना दूसरे API अनुरोध सटीक स्थानीय दुकान फ़िल्टर मिलता है।
tracking_activebooleanहमेशापढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।विवरण
पढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।
balancedecimal string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
balance_atomicinteger string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
statuspending | refreshing | fresh | stale | errorहमेशाकैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।विवरण
कैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।
balance_statuspending | refreshing | fresh | stale | error | unknownहमेशासमग्र कैश ताज़गी; unknown सुरक्षित फ़ॉलबैक है और कोई भी स्थिति इनवॉइस निपटान साबित नहीं करती।
recent_payments[]object[]हमेशा
इसी सटीक वॉलेट से जुड़े अधिकतम तीन हाल के वैध detected, confirming या final अवलोकन।
statusdetected | confirming | finalहमेशावर्तमान वैध अवलोकन स्थिति। Reorged, replaced और invalid अवलोकन बाहर हैं।
wallet_readinessreadiness enumहमेशाunsupported, project_disabled, project_asset_disabled, store_disabled, store_asset_disabled, wallet_missing, wallet_pending, wallet_disabled, wallet_error, backup_required, account_activation_required, external_wallet_rpc_required या ready।विवरण
unsupported, project_disabled, project_asset_disabled, store_disabled, store_asset_disabled, wallet_missing, wallet_pending, wallet_disabled, wallet_error, backup_required, account_activation_required, external_wallet_rpc_required या ready।
receive_readinessobject | null5.5.0+
साझा प्रोजेक्ट प्राप्ति-सेटअप आकलन। वॉलेट और स्वतंत्र स्कैनर-प्रदाता जाँच शामिल हैं, बैलेंस ताज़गी और भेजने की गैस से अलग। प्रोजेक्ट नीति न हो तो null। इनवॉइस बनाते समय मुद्रा/दरें जँचती हैं।विवरण
साझा प्रोजेक्ट प्राप्ति-सेटअप आकलन। वॉलेट और स्वतंत्र स्कैनर-प्रदाता जाँच शामिल हैं, बैलेंस ताज़गी और भेजने की गैस से अलग। प्रोजेक्ट नीति न हो तो null। इनवॉइस बनाते समय मुद्रा/दरें जँचती हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
उपयोग संबंधी नोट
- बॉडी पूरी नीति का प्रतिस्थापन है और अज्ञात फ़ील्ड अस्वीकार करती है।
- प्रोजेक्ट में सक्षम करना अपने आप किसी दुकान के लिए एसेट नहीं चुनता।
त्रुटियाँ
GETसंभावित भुगतान टोकन देखें/v1/projects/{project_id}/payment-token-candidatesकेवल पढ़ना
केवल उन चेन पर स्थानीय कैश CoinGecko कॉन्ट्रैक्ट मैपिंग खोजता है जिनमें टोकन इनवॉइस स्कैनर और बैलेंस एडॉप्टर लागू हैं। परिणाम खोज के संभावित विकल्प हैं, विश्वसनीय भुगतान एसेट नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
क्वेरी पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-candidates?chain_slug=ethereum&q=USDC&limit=50" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-candidates?chain_slug=ethereum&q=USDC&limit=50", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-candidates?chain_slug=ethereum&q=USDC&limit=50");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-candidates?chain_slug=ethereum&q=USDC&limit=50",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{
"coingecko_id": "usd-coin",
"chain_slug": "ethereum",
"symbol": "USDC",
"name": "USDC",
"contract_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"market_cap_rank": 7,
"icon_path": "/assets/coingecko/usd-coin.png",
"current_price_usd": "1.0001",
"token_standard": "erc20",
"scanner_ready": true,
"registered_asset_id": null,
"project_enabled": false
}
]
}जवाब फ़ील्ड
data[]object[]
उपयोग संबंधी नोट
- समर्थित टोकन एडॉप्टर: Ethereum, Base, BNB Chain, HyperEVM, Avalanche, Polygon, Arbitrum और Optimism पर ERC-20; Solana पर SPL।
- असमर्थित कैटलॉग चेन चयन योग्य दिखने के बजाय अस्वीकार होती हैं।
- CoinGecko रैंक, आइकन और कीमत संकेतात्मक खोज डेटा हैं।
त्रुटियाँ
POSTटोकन सत्यापित करके पंजीकृत करें/v1/projects/{project_id}/payment-token-assetsपढ़ना + लिखना
कॉन्फ़िगर किए नोड द्वारा चेन पहचान, कॉन्ट्रैक्ट/मिंट पहचान, दशमलव स्थान और उपयोग योग्य बैलेंस क्वेरी सत्यापित होने के बाद ही एक वर्तमान विकल्प को स्थायी भुगतान रजिस्ट्री में लाता है। पंजीकरण कभी केवल CoinGecko मेटाडेटा पर भरोसा नहीं करता और हर प्रोजेक्ट में 20 पंजीकृत टोकन एसेट की सीमा है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | ज़रूरी | application/json |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw '{
"chain_slug": "ethereum",
"coingecko_id": "usd-coin",
"enabled": true
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const body = `{
"chain_slug": "ethereum",
"coingecko_id": "usd-coin",
"enabled": true
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$body = <<<'JSON'
{
"chain_slug": "ethereum",
"coingecko_id": "usd-coin",
"enabled": true
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"chain_slug": "ethereum",
"coingecko_id": "usd-coin",
"enabled": true
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
chain_slugstringज़रूरीethereum, base, bnb-chain, hyperliquid, avalanche, polygon, arbitrum, optimism या solana।
coingecko_idstringज़रूरीटोकन खोज से लौटी सटीक विकल्प पहचान। शुरुआत के अंडरस्कोर या हाइफ़न रखें, जैसे _ या -6। टोकन नाम या टिकर से यह ID न बनाएँ।विवरण
टोकन खोज से लौटी सटीक विकल्प पहचान। शुरुआत के अंडरस्कोर या हाइफ़न रखें, जैसे _ या -6। टोकन नाम या टिकर से यह ID न बनाएँ।
जवाब 201 application/json
उदाहरण जवाब
{
"data": {
"asset_id": "44444444-4444-4444-8444-444444444444",
"chain_slug": "ethereum",
"coingecko_id": "usd-coin",
"contract_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"token_standard": "erc20",
"symbol": "USDC",
"name": "USDC",
"decimals": 6,
"enabled": true,
"metadata_verified_at": "2026-08-31T18:00:00Z"
}
}जवाब फ़ील्ड
dataobject
उपयोग संबंधी नोट
- टोकन पंजीकृत करने से पहले चेन का नेटिव प्रोजेक्ट एसेट सक्षम करें।
- प्रोजेक्ट अधिकतम 20 टोकन एसेट पंजीकृत कर सकता है; सीमा से आगे नया विकल्प token_chain_not_ready (409) लौटाता है। पहले पंजीकृत एसेट फिर इस्तेमाल करने पर दूसरा स्लॉट नहीं लगता।
- नोड सत्यापन में कैटलॉग पढ़ने से अधिक समय लग सकता है; स्पष्ट क्लाइंट टाइमआउट रखें।
- पंजीकरण के बाद हर वह दुकान एसेट चुने जिसे उसे उपलब्ध कराना है।
त्रुटियाँ
GETकस्टम टोकन के DEX पूल खोजें/v1/projects/{project_id}/payment-token-dex-poolsकेवल पढ़ना
DEX Screener से सटीक चेन और बेस-टोकन कॉन्ट्रैक्ट के अधिकतम 12 योग्य पूल खोजें, तरलता के क्रम में। यह टोकन पंजीकृत या सक्षम नहीं करता।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
पथ पैरामीटर
क्वेरी पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-dex-pools?chain_slug=ethereum&contract_address=YOUR_TOKEN_CONTRACT" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-dex-pools?chain_slug=ethereum&contract_address=YOUR_TOKEN_CONTRACT", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-dex-pools?chain_slug=ethereum&contract_address=YOUR_TOKEN_CONTRACT");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-dex-pools?chain_slug=ethereum&contract_address=YOUR_TOKEN_CONTRACT",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{"data":[{"pair_address":"0x2222222222222222222222222222222222222222","dex_id":"uniswap","quote_symbol":"WETH","price_usd":"0.25","liquidity_usd":"250000.00","fetched_at":"2026-09-09T12:00:00Z","url":"https://dexscreener.com/ethereum/0x2222222222222222222222222222222222222222"}]}जवाब फ़ील्ड
data[]object[]
pair_addressstringहमेशासटीक पूल पहचानकर्ता, एक्सचेंज ID (जैसे uniswap/pancakeswap) और केवल प्रदर्शन वाला जोड़ी टिकर।
dex_idstringहमेशासटीक पूल पहचानकर्ता, एक्सचेंज ID (जैसे uniswap/pancakeswap) और केवल प्रदर्शन वाला जोड़ी टिकर।
quote_symbolstringहमेशासटीक पूल पहचानकर्ता, एक्सचेंज ID (जैसे uniswap/pancakeswap) और केवल प्रदर्शन वाला जोड़ी टिकर।
price_usddecimal stringहमेशामाँगे गए बेस टोकन की USD कीमत और कुल पूल तरलता। कम-से-कम $10,000 तरलता और पिछले घंटे में ट्रेड ज़रूरी।
liquidity_usddecimal stringहमेशामाँगे गए बेस टोकन की USD कीमत और कुल पूल तरलता। कम-से-कम $10,000 तरलता और पिछले घंटे में ट्रेड ज़रूरी।
fetched_atRFC 3339 timestampहमेशासर्वर ने प्रदाता अवलोकन कब पाया, ऑन-चेन ट्रेड का टाइमस्टैम्प नहीं।
उपयोग संबंधी नोट
- खाली data ऐरे का मतलब कोई योग्य पूल नहीं मिला। केवल वे पूल लौटते हैं जिनका बेस टोकन ठीक माँगा कॉन्ट्रैक्ट है; कोट-पक्ष USD कीमत कभी मान नहीं ली जाती।
- DEX सूची सुरक्षा ऑडिट नहीं है। न्यूनतम तरलता और हाल की गतिविधि अनुपयोगी कोट घटाती हैं, लेकिन बाज़ार हेरफेर नहीं रोकतीं।
- जहाँ मौजूदा चेन स्कैनर टोकन समर्थित करता है, वहाँ Uniswap, PancakeSwap और दूसरे इंडेक्स्ड DEX समर्थित हैं। API पहुँच प्रोजेक्ट-दायरे में और रेट-सीमित रहती है। प्रदाता कॉल भी क्रमबद्ध और नियंत्रित दर पर होती हैं।
त्रुटियाँ
POSTकस्टम टोकन जोड़ें या कीमत बदलें/v1/projects/{project_id}/payment-token-assets/customपढ़ना + लिखना
कॉन्फ़िगर चेन नोड से कस्टम कॉन्ट्रैक्ट सत्यापित करता है और CoinGecko सूची की ज़रूरत बिना पंजीकृत करता है। तय USD कीमत या चुना स्वचालित DEX पूल इस प्रोजेक्ट का है, टिकर या दूसरे प्रोजेक्ट का नहीं। वही पहचान दोहराने पर उसकी प्रोजेक्ट कीमत अपडेट होती है, मौजूदा सक्षम/बंद नीति नहीं बदलती।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | ज़रूरी | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets/custom" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw '{
"chain_slug": "ethereum",
"contract_address": "YOUR_VERIFIED_TOKEN_CONTRACT",
"name": "Example token",
"symbol": "EXAMPLE",
"price_usd": "0.25"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const body = `{
"chain_slug": "ethereum",
"contract_address": "YOUR_VERIFIED_TOKEN_CONTRACT",
"name": "Example token",
"symbol": "EXAMPLE",
"price_usd": "0.25"
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets/custom", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$body = <<<'JSON'
{
"chain_slug": "ethereum",
"contract_address": "YOUR_VERIFIED_TOKEN_CONTRACT",
"name": "Example token",
"symbol": "EXAMPLE",
"price_usd": "0.25"
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets/custom");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"chain_slug": "ethereum",
"contract_address": "YOUR_VERIFIED_TOKEN_CONTRACT",
"name": "Example token",
"symbol": "EXAMPLE",
"price_usd": "0.25"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/payment-token-assets/custom",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
chain_slugstringज़रूरीethereum, base, bnb-chain, hyperliquid, avalanche, polygon, arbitrum, optimism या solana। इस कॉन्ट्रैक्ट के लिए तय।
contract_addressstringज़रूरीERC-20 कॉन्ट्रैक्ट (0x और 40 हेक्साडेसिमल अक्षर) या क्लासिक SPL मिंट। नोड नेटवर्क पहचान और सटीक दशमलव स्थान सत्यापित करते हैं; कॉलर के दिए दशमलव स्थान और RPC URL अस्वीकार हैं।विवरण
ERC-20 कॉन्ट्रैक्ट (0x और 40 हेक्साडेसिमल अक्षर) या क्लासिक SPL मिंट। नोड नेटवर्क पहचान और सटीक दशमलव स्थान सत्यापित करते हैं; कॉलर के दिए दशमलव स्थान और RPC URL अस्वीकार हैं।
namestringज़रूरीप्रदर्शन नाम (1–80 अक्षर) और टिकर (1–16 अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न, पहला अक्षर या अंक)। यह एंडपॉइंट मौजूदा पहचान का नाम नहीं बदल सकता।विवरण
प्रदर्शन नाम (1–80 अक्षर) और टिकर (1–16 अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न, पहला अक्षर या अंक)। यह एंडपॉइंट मौजूदा पहचान का नाम नहीं बदल सकता।
symbolstringज़रूरीप्रदर्शन नाम (1–80 अक्षर) और टिकर (1–16 अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न, पहला अक्षर या अंक)। यह एंडपॉइंट मौजूदा पहचान का नाम नहीं बदल सकता।विवरण
प्रदर्शन नाम (1–80 अक्षर) और टिकर (1–16 अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न, पहला अक्षर या अंक)। यह एंडपॉइंट मौजूदा पहचान का नाम नहीं बदल सकता।
price_modefixed | dexवैकल्पिकपुरानी संगतता के लिए डिफ़ॉल्ट fixed। DEX सटीक चेन और कॉन्ट्रैक्ट के लिए खोजा विशेष पूल इस्तेमाल करता है।
price_usddecimal stringfixed मोडएक टोकन का तय USD मूल्य, सकारात्मक, अधिकतम 30 दशमलव स्थान, अधिकतम 1000000000000000000000000। घातांक या float नहीं। dex मोड में न दें।
dex_pair_addressstringdex मोडpayment-token-dex-pools से पूल पता। dex मोड में ज़रूरी; fixed में न दें। हर सेव पर सर्वर पूल पहचान, कीमत, तरलता और गतिविधि फिर जाँचता है।विवरण
payment-token-dex-pools से पूल पता। dex मोड में ज़रूरी; fixed में न दें। हर सेव पर सर्वर पूल पहचान, कीमत, तरलता और गतिविधि फिर जाँचता है।
जवाब 200 application/json
उदाहरण जवाब
{"data":{"asset_id":"44444444-4444-4444-8444-444444444444"}}जवाब फ़ील्ड
उपयोग संबंधी नोट
- पंजीकरण के बाद दुकान के payment-assets एंडपॉइंट में asset_id चुनें; केवल पंजीकरण दुकान का तरीका कभी सक्षम नहीं करता।
- कस्टम और कैटलॉग टोकन प्रोजेक्ट की 20-टोकन सीमा साझा करते हैं। अलग चेन पर वही कॉन्ट्रैक्ट अलग भुगतान एसेट है।
- मौजूदा कैटलॉग कॉन्ट्रैक्ट 409 लौटाते हैं: स्वचालित बाज़ार दरें बनाए रखने के लिए कैटलॉग पंजीकरण करें। कस्टम टिकर कभी समान नाम वाले टोकन की कीमत नहीं लेता।
- तय कीमतें ऑपरेटर के अनुमान हैं। स्वचालित DEX कीमतें DEX Screener से चुने पूल के स्पॉट अवलोकन हैं, हेरफेर-प्रतिरोधी ओरेकल नहीं। ताज़ा फ़िएट दरों के साथ दुकान स्प्रेड और ऊपर की राउंडिंग तब भी लागू होते हैं। पहले जारी कोट नहीं बदलते।
- DEX मोड के लिए पहले पूल खोजें, फिर price_usd छोड़कर price_mode: dex और dex_pair_address भेजें। साझा पृष्ठभूमि कार्य चुने पूल हर मिनट रीफ़्रेश करता है। विफल जाँच या पाँच मिनट से पुरानी कीमत इस टोकन को नए कोट से हटाती है; चुपचाप तय कीमत या टिकर फ़ॉलबैक नहीं होता।
- केवल मानक ERC-20 और क्लासिक SPL टोकन स्वीकार हैं। Token-2022/एक्सटेंशन और केवल-नेटिव चेन अस्वीकार हैं। तकनीकी सत्यापन जारीकर्ता/कॉन्ट्रैक्ट का सुरक्षा ऑडिट नहीं है; ट्रांसफ़र पर शुल्क, रीबेसिंग या ब्लैकलिस्टिंग वाले टोकन असंगत व्यवहार कर सकते हैं।
- कम-से-कम 60 सेकंड क्लाइंट टाइमआउट रखें। सत्यापन सीमित है और वैकल्पिक नोड आज़मा सकता है। अमान्य इनपुट 400; विफल चेन/कॉन्ट्रैक्ट जाँच 422; पहचान टकराव या सीमाएँ 409 लौटाते हैं।
त्रुटियाँ
GETदुकान के भुगतान तरीकों की सूची पाएँ/v1/projects/{project_id}/stores/{store_id}/payment-assetsकेवल पढ़ना
data में ऑन-चेन एसेट और lightning में अलग Lightning तैयारी सूचीबद्ध करता है। ऑन-चेन तरीकों को तैयार चेन वॉलेट चाहिए। Lightning दुकान में चुना सत्यापित बाहरी प्राप्ति कनेक्शन इस्तेमाल करता है, ऑन-चेन Bitcoin वॉलेट से स्वतंत्र।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{ "asset": { "id": "ASSET_UUID", "chain_slug": "ethereum", "symbol": "USDC", "asset_kind": "token", "token_standard": "erc20", "scanner_ready": true }, "project_policy": { "enabled": true, "required_confirmations": 12 }, "selected": true, "display_order": 0, "confirmation_policy": { "finality_mode": "confirmations", "project_required_confirmations": 12, "override_required_confirmations": 3, "effective_required_confirmations": 3, "editable": true, "minimum_required_confirmations": 0, "maximum_required_confirmations": 48 }, "wallet": { "id": "WALLET_UUID", "status": "active" }, "wallet_readiness": "ready" }
],
"lightning": { "payment_rail": "lightning", "symbol": "BTC", "asset_decimals": 11, "enabled": true, "ready": true }
}जवाब फ़ील्ड
data[]object[]
assetobjectहमेशा
प्रोजेक्ट में दिखने वाला नेटिव या सत्यापित टोकन एसेट।
payment_railstringहमेशारनटाइम प्रणाली: utxo, evm-native, solana-native, account-native, privacy-native या token-transfer।
contract_addressstring | nullहमेशाटोकन के लिए कैनॉनिकल ERC-20 कॉन्ट्रैक्ट या SPL मिंट; नेटिव एसेट के लिए null।
coingecko_idstring | nullहमेशाखोज/मूल्य पहचान। कस्टम कॉन्ट्रैक्ट में null; उनके टिकर से कभी बाज़ार कीमत का अनुमान न लगाएँ। केवल CoinGecko मेटाडेटा टोकन को चयन योग्य नहीं बनाता।
custom_tokenbooleanहमेशाप्रोजेक्ट-दायरे के तय USD या चुने DEX पूल मूल्य के साथ कस्टम ऑन-चेन-सत्यापित कॉन्ट्रैक्ट।
payment_supportedbooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
scanner_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
balance_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
default_finality_modeconfirmations | finalizedहमेशानई प्रोजेक्ट नीति को विरासत में मिलने वाला डिफ़ॉल्ट अंतिमता मॉडल।
project_policyobject | nullहमेशा
मूल प्रोजेक्ट नीति।
enabledbooleanज़रूरीप्रोजेक्ट के लिए एसेट सक्षम या बंद करता है। किसी टोकन से पहले नेटिव चेन सक्षम होनी चाहिए।
finality_modeconfirmations | finalizedज़रूरीएसेट प्रणाली समर्थित अंतिमता नीति। finalized के लिए required_confirmations=1 चाहिए।
required_confirmationsintegerज़रूरीBitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।विवरण
Bitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।
selectedbooleanहमेशाक्या यह तरीका दुकान के सहेजे इच्छित कॉन्फ़िगरेशन का हिस्सा है। प्रोजेक्ट नीति, वॉलेट, इंस्टॉल एडॉप्टर और मूल्य वैध होने पर उपलब्ध होता है। अस्थायी स्कैनर बाधाएँ इसे नए इनवॉइस से नहीं हटातीं।विवरण
क्या यह तरीका दुकान के सहेजे इच्छित कॉन्फ़िगरेशन का हिस्सा है। प्रोजेक्ट नीति, वॉलेट, इंस्टॉल एडॉप्टर और मूल्य वैध होने पर उपलब्ध होता है। अस्थायी स्कैनर बाधाएँ इसे नए इनवॉइस से नहीं हटातीं।
confirmation_policyobject | nullहमेशा
प्रोजेक्ट-कॉन्फ़िगर एसेट की प्रभावी दुकान नीति। प्रोजेक्ट नीति न हो तो null।
finality_modeconfirmations | finalizedहमेशानिपटान कॉन्फ़िगर करने योग्य ब्लॉक संख्या इस्तेमाल करता है या नेटवर्क अंतिमता।
project_required_confirmationsintegerहमेशादुकान ओवरराइड न होने पर भविष्य के इनवॉइस में इस्तेमाल वर्तमान प्रोजेक्ट डिफ़ॉल्ट।
override_required_confirmationsinteger | nullहमेशादुकान-विशिष्ट संख्या या प्रोजेक्ट डिफ़ॉल्ट अपनाने के लिए null।
effective_required_confirmationsintegerहमेशाइस दुकान और एसेट के नए इनवॉइस जिस संख्या का स्नैपशॉट लेंगे।
minimum_required_confirmationsintegerहमेशासमावेशी चेन-संबंधी निचली सीमा; 0 केवल पता चलते ही स्वीकृति समर्थित प्रणालियों पर दिखता है।
walletobject | nullहमेशा
नेटिव और टोकन एसेट का साझा चेन वॉलेट।
activation_requiredbooleanहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
activation_verified_attimestamp|nullहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
receive_readinessobject | null5.5.0+
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।विवरण
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
monero_wallet_rpcMoneroWalletRpcBinding | nullहमेशाMonero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।विवरण
Monero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।
balances[]object[]हमेशा
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।विवरण
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।
active_store_countintegerहमेशाअभी यह एसेट चुनने वाली सक्षम दुकानों की संख्या। यह स्वीकृति का दृश्य है; केवल-पढ़ने की बैलेंस ट्रैकिंग स्वतंत्र रहती है।
active_store_ids[]UUID[]हमेशाइस प्रोजेक्ट की सक्षम दुकानें जो अभी एसेट स्वीकार करती हैं। इससे बिना दूसरे API अनुरोध सटीक स्थानीय दुकान फ़िल्टर मिलता है।
tracking_activebooleanहमेशापढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।विवरण
पढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।
balancedecimal string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
balance_atomicinteger string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
statuspending | refreshing | fresh | stale | errorहमेशाकैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।विवरण
कैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।
balance_statuspending | refreshing | fresh | stale | error | unknownहमेशासमग्र कैश ताज़गी; unknown सुरक्षित फ़ॉलबैक है और कोई भी स्थिति इनवॉइस निपटान साबित नहीं करती।
recent_payments[]object[]हमेशा
इसी सटीक वॉलेट से जुड़े अधिकतम तीन हाल के वैध detected, confirming या final अवलोकन।
statusdetected | confirming | finalहमेशावर्तमान वैध अवलोकन स्थिति। Reorged, replaced और invalid अवलोकन बाहर हैं।
wallet_readinessreadiness enumहमेशाकेवल वॉलेट/नीति स्थिति; स्कैनर शर्तों के लिए receive_readiness इस्तेमाल करें।
receive_readinessobject | null5.5.0+
साझा प्राप्ति सेटअप और दुकान स्वीकृति। कैश अवलोकन इस्तेमाल करता है; आरक्षण या गारंटी नहीं। निर्माण आवश्यकताएँ और वास्तविक इनवॉइस विनिमय दर फिर जाँचता है।विवरण
साझा प्राप्ति सेटअप और दुकान स्वीकृति। कैश अवलोकन इस्तेमाल करता है; आरक्षण या गारंटी नहीं। निर्माण आवश्यकताएँ और वास्तविक इनवॉइस विनिमय दर फिर जाँचता है।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
उपयोग संबंधी नोट
- selected ऑन-चेन कॉन्फ़िगरेशन है; wallet_readiness उसकी लाइव पात्रता शर्त है।
- जवाब के lightning सदस्य में payment_rail: lightning, symbol: BTC, asset_decimals: 11, enabled और ready होते हैं। नोड क्रेडेंशियल कभी नहीं होते। यह तरीका दुकान के कंसोल में कॉन्फ़िगर करें; assets ऐरे अपडेट करने से Lightning नहीं बदलता।
- confirmation_policy केवल ऑन-चेन तरीकों पर लागू है। Lightning बिना ब्लॉक पुष्टियों के निपटता है और पूरी BOLT11 राशि चाहिए, आंशिक-भुगतान सहनशीलता के बिना।
- एक चेन के नेटिव और टोकन तरीके उस चेन वॉलेट का एक ही इनवॉइस गंतव्य इस्तेमाल करते हैं।
- शामिल वॉलेट सारांश केवल तैयारी के हैं और बैलेंस खाली रखते हैं; वर्तमान मान के लिए अलग प्रोजेक्ट वॉलेट रूट इस्तेमाल करें।
त्रुटियाँ
PUTदुकान के भुगतान तरीके बदलें/v1/projects/{project_id}/stores/{store_id}/payment-assetsपढ़ना + लिखना
दुकान के पूरे क्रमबद्ध एसेट उपसमूह को अविभाज्य रूप से बदलता है और रीफ़्रेश सूची लौटाता है। छोड़े एसेट चयन से हटते हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | ज़रूरी | application/json |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request PUT \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw '{
"assets": [
{
"asset_id": "YOUR_ASSET_ID",
"display_order": 0
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const body = `{
"assets": [
{
"asset_id": "YOUR_ASSET_ID",
"display_order": 0
}
]
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets", {
method: "PUT",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$body = <<<'JSON'
{
"assets": [
{
"asset_id": "YOUR_ASSET_ID",
"display_order": 0
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"assets": [
{
"asset_id": "YOUR_ASSET_ID",
"display_order": 0
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets",
method="PUT", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{ "asset": { "id": "44444444-4444-4444-8444-444444444444", "symbol": "USDC" }, "selected": true, "display_order": 0, "confirmation_policy": { "finality_mode": "confirmations", "project_required_confirmations": 12, "override_required_confirmations": null, "effective_required_confirmations": 12, "editable": true, "minimum_required_confirmations": 0, "maximum_required_confirmations": 48 }, "wallet_readiness": "ready" }
]
}जवाब फ़ील्ड
data[]object[]
assetobjectहमेशा
प्रोजेक्ट में दिखने वाला नेटिव या सत्यापित टोकन एसेट।
payment_railstringहमेशारनटाइम प्रणाली: utxo, evm-native, solana-native, account-native, privacy-native या token-transfer।
contract_addressstring | nullहमेशाटोकन के लिए कैनॉनिकल ERC-20 कॉन्ट्रैक्ट या SPL मिंट; नेटिव एसेट के लिए null।
coingecko_idstring | nullहमेशाखोज/मूल्य पहचान। कस्टम कॉन्ट्रैक्ट में null; उनके टिकर से कभी बाज़ार कीमत का अनुमान न लगाएँ। केवल CoinGecko मेटाडेटा टोकन को चयन योग्य नहीं बनाता।
custom_tokenbooleanहमेशाप्रोजेक्ट-दायरे के तय USD या चुने DEX पूल मूल्य के साथ कस्टम ऑन-चेन-सत्यापित कॉन्ट्रैक्ट।
payment_supportedbooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
scanner_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
balance_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
default_finality_modeconfirmations | finalizedहमेशानई प्रोजेक्ट नीति को विरासत में मिलने वाला डिफ़ॉल्ट अंतिमता मॉडल।
project_policyobject | nullहमेशा
मूल प्रोजेक्ट नीति।
enabledbooleanज़रूरीप्रोजेक्ट के लिए एसेट सक्षम या बंद करता है। किसी टोकन से पहले नेटिव चेन सक्षम होनी चाहिए।
finality_modeconfirmations | finalizedज़रूरीएसेट प्रणाली समर्थित अंतिमता नीति। finalized के लिए required_confirmations=1 चाहिए।
required_confirmationsintegerज़रूरीBitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।विवरण
Bitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।
selectedbooleanहमेशाक्या यह तरीका दुकान के सहेजे इच्छित कॉन्फ़िगरेशन का हिस्सा है। प्रोजेक्ट नीति, वॉलेट, इंस्टॉल एडॉप्टर और मूल्य वैध होने पर उपलब्ध होता है। अस्थायी स्कैनर बाधाएँ इसे नए इनवॉइस से नहीं हटातीं।विवरण
क्या यह तरीका दुकान के सहेजे इच्छित कॉन्फ़िगरेशन का हिस्सा है। प्रोजेक्ट नीति, वॉलेट, इंस्टॉल एडॉप्टर और मूल्य वैध होने पर उपलब्ध होता है। अस्थायी स्कैनर बाधाएँ इसे नए इनवॉइस से नहीं हटातीं।
confirmation_policyobject | nullहमेशा
प्रोजेक्ट-कॉन्फ़िगर एसेट की प्रभावी दुकान नीति। प्रोजेक्ट नीति न हो तो null।
finality_modeconfirmations | finalizedहमेशानिपटान कॉन्फ़िगर करने योग्य ब्लॉक संख्या इस्तेमाल करता है या नेटवर्क अंतिमता।
project_required_confirmationsintegerहमेशादुकान ओवरराइड न होने पर भविष्य के इनवॉइस में इस्तेमाल वर्तमान प्रोजेक्ट डिफ़ॉल्ट।
override_required_confirmationsinteger | nullहमेशादुकान-विशिष्ट संख्या या प्रोजेक्ट डिफ़ॉल्ट अपनाने के लिए null।
effective_required_confirmationsintegerहमेशाइस दुकान और एसेट के नए इनवॉइस जिस संख्या का स्नैपशॉट लेंगे।
minimum_required_confirmationsintegerहमेशासमावेशी चेन-संबंधी निचली सीमा; 0 केवल पता चलते ही स्वीकृति समर्थित प्रणालियों पर दिखता है।
walletobject | nullहमेशा
नेटिव और टोकन एसेट का साझा चेन वॉलेट।
activation_requiredbooleanहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
activation_verified_attimestamp|nullहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
receive_readinessobject | null5.5.0+
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।विवरण
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
monero_wallet_rpcMoneroWalletRpcBinding | nullहमेशाMonero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।विवरण
Monero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।
balances[]object[]हमेशा
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।विवरण
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।
active_store_countintegerहमेशाअभी यह एसेट चुनने वाली सक्षम दुकानों की संख्या। यह स्वीकृति का दृश्य है; केवल-पढ़ने की बैलेंस ट्रैकिंग स्वतंत्र रहती है।
active_store_ids[]UUID[]हमेशाइस प्रोजेक्ट की सक्षम दुकानें जो अभी एसेट स्वीकार करती हैं। इससे बिना दूसरे API अनुरोध सटीक स्थानीय दुकान फ़िल्टर मिलता है।
tracking_activebooleanहमेशापढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।विवरण
पढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।
balancedecimal string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
balance_atomicinteger string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
statuspending | refreshing | fresh | stale | errorहमेशाकैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।विवरण
कैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।
balance_statuspending | refreshing | fresh | stale | error | unknownहमेशासमग्र कैश ताज़गी; unknown सुरक्षित फ़ॉलबैक है और कोई भी स्थिति इनवॉइस निपटान साबित नहीं करती।
recent_payments[]object[]हमेशा
इसी सटीक वॉलेट से जुड़े अधिकतम तीन हाल के वैध detected, confirming या final अवलोकन।
statusdetected | confirming | finalहमेशावर्तमान वैध अवलोकन स्थिति। Reorged, replaced और invalid अवलोकन बाहर हैं।
wallet_readinessreadiness enumहमेशाकेवल वॉलेट/नीति स्थिति; स्कैनर शर्तों के लिए receive_readiness इस्तेमाल करें।
receive_readinessobject | null5.5.0+
साझा प्राप्ति सेटअप और दुकान स्वीकृति। कैश अवलोकन इस्तेमाल करता है; आरक्षण या गारंटी नहीं। निर्माण आवश्यकताएँ और वास्तविक इनवॉइस विनिमय दर फिर जाँचता है।विवरण
साझा प्राप्ति सेटअप और दुकान स्वीकृति। कैश अवलोकन इस्तेमाल करता है; आरक्षण या गारंटी नहीं। निर्माण आवश्यकताएँ और वास्तविक इनवॉइस विनिमय दर फिर जाँचता है।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
उपयोग संबंधी नोट
- ऐरे अधिकतम 64 विशिष्ट एसेट और प्रदर्शन क्रम स्वीकार करता है।
- चयन सहेजा इच्छित कॉन्फ़िगरेशन हैं और वॉलेट बैकअप से पहले या चेन रुकने पर तैयार किए जा सकते हैं। इनवॉइस निर्माण अब भी केवल वे तरीके देता है जिनकी प्रोजेक्ट नीति, नेटिव मूल नीति, वॉलेट और रनटाइम जाँच तैयार हैं।
- कोई भुगतान तरीका न रखने के लिए खाली assets ऐरे भेजें।
त्रुटियाँ
PUTदुकान की पुष्टि नीति सेट करें/v1/projects/{project_id}/stores/{store_id}/payment-assets/{asset_id}/confirmation-policyपढ़ना + लिखना
एक दुकान-विशिष्ट पुष्टि ओवरराइड सेट या साफ़ करता है और रीफ़्रेश दुकान भुगतान-तरीका सूची लौटाता है। एसेट दुकान में पहले चुना होना चाहिए। प्रोजेक्ट, दुकान, चेन या वॉलेट रुके होने पर भी कॉन्फ़िगरेशन उपलब्ध रहता है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | ज़रूरी | application/json |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request PUT \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets/YOUR_ASSET_ID/confirmation-policy" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw '{
"strategy": "custom",
"required_confirmations": 0
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const body = `{
"strategy": "custom",
"required_confirmations": 0
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets/YOUR_ASSET_ID/confirmation-policy", {
method: "PUT",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$body = <<<'JSON'
{
"strategy": "custom",
"required_confirmations": 0
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets/YOUR_ASSET_ID/confirmation-policy");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"strategy": "custom",
"required_confirmations": 0
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/payment-assets/YOUR_ASSET_ID/confirmation-policy",
method="PUT", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{
"asset": { "id": "YOUR_ASSET_ID", "chain_slug": "bitcoin", "symbol": "BTC" },
"selected": true,
"display_order": 0,
"confirmation_policy": {
"finality_mode": "confirmations",
"project_required_confirmations": 2,
"override_required_confirmations": 0,
"effective_required_confirmations": 0,
"editable": true,
"minimum_required_confirmations": 0,
"maximum_required_confirmations": 10000
},
"wallet_readiness": "ready"
}
]
}जवाब फ़ील्ड
data[]object[]
assetobjectहमेशा
प्रोजेक्ट में दिखने वाला नेटिव या सत्यापित टोकन एसेट।
payment_railstringहमेशारनटाइम प्रणाली: utxo, evm-native, solana-native, account-native, privacy-native या token-transfer।
contract_addressstring | nullहमेशाटोकन के लिए कैनॉनिकल ERC-20 कॉन्ट्रैक्ट या SPL मिंट; नेटिव एसेट के लिए null।
coingecko_idstring | nullहमेशाखोज/मूल्य पहचान। कस्टम कॉन्ट्रैक्ट में null; उनके टिकर से कभी बाज़ार कीमत का अनुमान न लगाएँ। केवल CoinGecko मेटाडेटा टोकन को चयन योग्य नहीं बनाता।
custom_tokenbooleanहमेशाप्रोजेक्ट-दायरे के तय USD या चुने DEX पूल मूल्य के साथ कस्टम ऑन-चेन-सत्यापित कॉन्ट्रैक्ट।
payment_supportedbooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
scanner_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
balance_readybooleanहमेशाबिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।विवरण
बिल्ड-समय रजिस्ट्री शर्तें। scanner_ready का मतलब भुगतान स्कैनर रनटाइम इंस्टॉल है; भुगतान पुष्टि के लिए कॉन्फ़िगर की गई संख्या के स्वस्थ सटीक-भूमिका प्रदाता (डिफ़ॉल्ट 2, वैकल्पिक 1) चाहिए; 6.0.6 से अस्थायी स्कैनर उपलब्धता इनवॉइस निर्माण नहीं रोकती। balance_ready केवल लागू किए बैलेंस एडॉप्टर के लिए true है।
default_finality_modeconfirmations | finalizedहमेशानई प्रोजेक्ट नीति को विरासत में मिलने वाला डिफ़ॉल्ट अंतिमता मॉडल।
project_policyobject | nullहमेशा
मूल प्रोजेक्ट नीति।
enabledbooleanज़रूरीप्रोजेक्ट के लिए एसेट सक्षम या बंद करता है। किसी टोकन से पहले नेटिव चेन सक्षम होनी चाहिए।
finality_modeconfirmations | finalizedज़रूरीएसेट प्रणाली समर्थित अंतिमता नीति। finalized के लिए required_confirmations=1 चाहिए।
required_confirmationsintegerज़रूरीBitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।विवरण
Bitcoin और EVM प्रणालियाँ शून्य स्वीकार करती हैं; दूसरी पुष्टि प्रणालियों में कम-से-कम एक, केवल-finalized में ठीक एक चाहिए और EVM 0–48 तक सीमित हैं ताकि हर ट्रांसफ़र लेनदेन रीप्ले विंडो में रहे।
selectedbooleanहमेशाक्या यह तरीका दुकान के सहेजे इच्छित कॉन्फ़िगरेशन का हिस्सा है। प्रोजेक्ट नीति, वॉलेट, इंस्टॉल एडॉप्टर और मूल्य वैध होने पर उपलब्ध होता है। अस्थायी स्कैनर बाधाएँ इसे नए इनवॉइस से नहीं हटातीं।विवरण
क्या यह तरीका दुकान के सहेजे इच्छित कॉन्फ़िगरेशन का हिस्सा है। प्रोजेक्ट नीति, वॉलेट, इंस्टॉल एडॉप्टर और मूल्य वैध होने पर उपलब्ध होता है। अस्थायी स्कैनर बाधाएँ इसे नए इनवॉइस से नहीं हटातीं।
confirmation_policyobject | nullहमेशा
प्रोजेक्ट-कॉन्फ़िगर एसेट की प्रभावी दुकान नीति। प्रोजेक्ट नीति न हो तो null।
finality_modeconfirmations | finalizedहमेशानिपटान कॉन्फ़िगर करने योग्य ब्लॉक संख्या इस्तेमाल करता है या नेटवर्क अंतिमता।
project_required_confirmationsintegerहमेशादुकान ओवरराइड न होने पर भविष्य के इनवॉइस में इस्तेमाल वर्तमान प्रोजेक्ट डिफ़ॉल्ट।
override_required_confirmationsinteger | nullहमेशादुकान-विशिष्ट संख्या या प्रोजेक्ट डिफ़ॉल्ट अपनाने के लिए null।
effective_required_confirmationsintegerहमेशाइस दुकान और एसेट के नए इनवॉइस जिस संख्या का स्नैपशॉट लेंगे।
minimum_required_confirmationsintegerहमेशासमावेशी चेन-संबंधी निचली सीमा; 0 केवल पता चलते ही स्वीकृति समर्थित प्रणालियों पर दिखता है।
walletobject | nullहमेशा
नेटिव और टोकन एसेट का साझा चेन वॉलेट।
activation_requiredbooleanहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
activation_verified_attimestamp|nullहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
receive_readinessobject | null5.5.0+
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।विवरण
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
monero_wallet_rpcMoneroWalletRpcBinding | nullहमेशाMonero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।विवरण
Monero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।
balances[]object[]हमेशा
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।विवरण
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।
active_store_countintegerहमेशाअभी यह एसेट चुनने वाली सक्षम दुकानों की संख्या। यह स्वीकृति का दृश्य है; केवल-पढ़ने की बैलेंस ट्रैकिंग स्वतंत्र रहती है।
active_store_ids[]UUID[]हमेशाइस प्रोजेक्ट की सक्षम दुकानें जो अभी एसेट स्वीकार करती हैं। इससे बिना दूसरे API अनुरोध सटीक स्थानीय दुकान फ़िल्टर मिलता है।
tracking_activebooleanहमेशापढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।विवरण
पढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।
balancedecimal string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
balance_atomicinteger string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
statuspending | refreshing | fresh | stale | errorहमेशाकैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।विवरण
कैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।
balance_statuspending | refreshing | fresh | stale | error | unknownहमेशासमग्र कैश ताज़गी; unknown सुरक्षित फ़ॉलबैक है और कोई भी स्थिति इनवॉइस निपटान साबित नहीं करती।
recent_payments[]object[]हमेशा
इसी सटीक वॉलेट से जुड़े अधिकतम तीन हाल के वैध detected, confirming या final अवलोकन।
statusdetected | confirming | finalहमेशावर्तमान वैध अवलोकन स्थिति। Reorged, replaced और invalid अवलोकन बाहर हैं।
wallet_readinessreadiness enumहमेशाकेवल वॉलेट/नीति स्थिति; स्कैनर शर्तों के लिए receive_readiness इस्तेमाल करें।
receive_readinessobject | null5.5.0+
साझा प्राप्ति सेटअप और दुकान स्वीकृति। कैश अवलोकन इस्तेमाल करता है; आरक्षण या गारंटी नहीं। निर्माण आवश्यकताएँ और वास्तविक इनवॉइस विनिमय दर फिर जाँचता है।विवरण
साझा प्राप्ति सेटअप और दुकान स्वीकृति। कैश अवलोकन इस्तेमाल करता है; आरक्षण या गारंटी नहीं। निर्माण आवश्यकताएँ और वास्तविक इनवॉइस विनिमय दर फिर जाँचता है।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
उपयोग संबंधी नोट
- दुकान ओवरराइड हटाकर भविष्य के इनवॉइस में वर्तमान प्रोजेक्ट डिफ़ॉल्ट अपनाने के लिए {"strategy":"inherit"} इस्तेमाल करें।
- Finalized नेटवर्क editable false लौटाते हैं और नेटवर्क अंतिमता इस्तेमाल करते हैं; कस्टम ब्लॉक-संख्या ओवरराइड स्वीकार नहीं करते।
- 0 का मतलब बिना नेटवर्क पुष्टि और बिना चेन पुनर्गठन सुरक्षा के पता चलते ही स्वीकार करना। यह केवल minimum_required_confirmations 0 होने पर स्वीकार है।
- नीति बदलाव केवल नए इनवॉइस पर लागू होते हैं। मौजूदा इनवॉइस निर्माण के समय लिया प्रोजेक्ट/दुकान पुष्टि नीति स्नैपशॉट रखते हैं।
- अपडेट एक बार में एक एसेट के हैं; एक ही दुकान एसेट के साथ-साथ बदलाव क्रम से करें और रीफ़्रेश जवाब को वर्तमान स्थिति मानें।
त्रुटियाँ
GETप्रोजेक्ट के वॉलेट और बैलेंस की सूची पाएँ/v1/projects/{project_id}/walletsकेवल पढ़ना
सार्वजनिक वॉलेट मेटाडेटा और वॉलेट की सटीक चेन व नेटवर्क का हर पंजीकृत बैलेंस-सक्षम एसेट लौटाता है। सभी 30 नेटिव चेन प्रणालियाँ कवर हैं; सत्यापित ERC-20 और SPL एसेट भी ट्रैक होते हैं। एसेट तुरंत दिखते हैं, पहले स्कैन से पहले भी या भुगतान के लिए अस्वीकार्य होने पर भी। project_enabled भुगतान स्वीकृति बताता है; tracking_active स्वतंत्र रूप से केवल-पढ़ने की रीफ़्रेश पात्रता बताता है। Monero को उसका प्रोजेक्ट से बँधा बाहरी केवल-दृश्य wallet-RPC चाहिए। कंसोल में बैलेंस स्कैन हर एसेट की प्रगति/त्रुटि के साथ सीमित रीड को प्राथमिकता देता है; केवल पूरे चक्र ताज़ा कुल अपडेट करते हैं। इनवॉइस निपटान लेनदेन-स्तरीय निगरानी और पुष्टि नीति से संचालित रहता है, इन कैश बैलेंस से नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/wallets" \
--header "Authorization: Bearer $WHOLLY_TOKEN"// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/wallets", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/wallets");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/wallets",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{
"id": "55555555-5555-4555-8555-555555555555",
"project_id": "11111111-1111-4111-8111-111111111111",
"native_asset_id": "10000000-0000-4000-8000-000000000003",
"chain_slug": "ethereum",
"network": "mainnet",
"asset_symbol": "ETH",
"asset_name": "Ethereum",
"status": "active",
"label": "Primary Ethereum wallet",
"public_key": "0x…",
"primary_address": "0x…",
"derivation_scheme": "bip44",
"address_format": "eip55",
"backup_confirmed_at": "2026-08-31T17:00:00Z",
"last_secret_revealed_at": null,
"secret_reveal_count": 0,
"next_receive_index": 43,
"last_scanned_height": 23123456,
"last_scanned_at": "2026-08-31T18:05:00Z",
"last_error": null,
"balances": [
{ "wallet_id": "55555555-5555-4555-8555-555555555555", "asset_id": "10000000-0000-4000-8000-000000000003", "project_enabled": true, "tracking_active": true, "asset_kind": "native", "contract_address": null, "symbol": "ETH", "name": "Ethereum", "decimals": 18, "coingecko_id": "ethereum", "balance": "0.125", "balance_atomic": "125000000000000000", "price_usd": "4500", "value_usd": "562.50", "status": "fresh", "checked_at": "2026-08-31T18:05:00Z", "last_error": null },
{ "wallet_id": "55555555-5555-4555-8555-555555555555", "asset_id": "10000000-0000-4000-8000-000000000099", "project_enabled": false, "tracking_active": true, "asset_kind": "token", "contract_address": "0xA0b86991c6218b36c1d19d4a2e9eb0cE3606eB48", "symbol": "USDC", "name": "USDC", "decimals": 6, "coingecko_id": "usd-coin", "balance": null, "balance_atomic": null, "price_usd": "1", "value_usd": null, "status": "pending", "checked_at": null, "last_error": null }
],
"total_value_usd": "562.50",
"balance_status": "fresh",
"balance_checked_at": "2026-08-31T18:05:00Z",
"recent_payments": [
{ "invoice_public_id": "0a6a98db-d93d-48ee-8c3c-fd45f90c4a50", "chain_slug": "ethereum", "symbol": "USDC", "transaction_id": "0x…", "event_index": 0, "amount": "25", "status": "final", "confirmations": 12, "observed_at": "2026-08-31T18:04:00Z" }
],
"created_at": "2026-08-31T16:00:00Z",
"updated_at": "2026-08-31T18:05:00Z"
}
]
}जवाब फ़ील्ड
data[]object[]
activation_requiredbooleanहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
activation_verified_attimestamp|nullहमेशाXRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।विवरण
XRP और Stellar साझा खाते तब तक अनुपलब्ध रहते हैं जब तक ऑपरेटर दिखाए पते में फंड न डाले और कॉन्फ़िगर किए स्कैनर प्रदाता उसी खाते को सत्यापित न करें। स्थायी प्रमाण समाप्त नहीं होता; लाइव स्कैनर स्थिति भुगतान सत्यापन के लिए अलग जँचती है, इनवॉइस निर्माण के लिए नहीं।
receive_readinessobject | null5.5.0+
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।विवरण
वॉलेट सूचियों में शामिल: प्रोजेक्ट प्राप्ति सेटअप और चेन स्कैनर की शर्तें। बैलेंस, टोकन गैस और भेजने की तैयारी से अलग। दूसरे वॉलेट जवाब इसे null रख सकते हैं।
readybooleanहमेशाप्राप्ति सेटअप जाँच पास हैं। खर्च की तैयारी, गैस, बैलेंस रीफ़्रेश या भविष्य के गारंटीकृत कोट को नहीं बताता।
invoice_creatableboolean6.0.6+कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।विवरण
कॉन्फ़िगरेशन अस्थायी स्कैनर चेतावनियों के बावजूद इनवॉइस तरीके की अनुमति देता है। मुद्रा मूल्य निर्माण के समय जाँचे जाते हैं। यह भुगतान सत्यापन नहीं: invoice_creatable true होने पर ready false हो सकता है। अनुपस्थित वॉलेट, बंद नीति और असमर्थित एडॉप्टर तब भी सुरक्षित रूप से विफल होते हैं।
issues[]object[]हमेशा
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।विवरण
तैयार होने पर खाली; वरना प्राप्ति चेतावनी या कॉन्फ़िगरेशन रुकावट। अस्थायी स्कैनर चेतावनी और इनवॉइस सेटअप विफलता अलग करने के लिए invoice_creatable जाँचें।
reason_codestringहमेशाscanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।विवरण
scanner_provider_quorum, scanner_not_checked, scanner_unavailable, wallet_missing, wallet_disabled, wallet_backup_required, wallet_key_unavailable, wallet_activation_required, monero_binding_unavailable, rate_unavailable, custom_rate_unavailable, lightning_unavailable, project_disabled, store_disabled, chain_disabled, asset_disabled या asset_not_accepted।
messagestringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
actionstringउपलब्ध होने परमर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।विवरण
मर्चेंट को दिखने वाला स्पष्टीकरण और कार्रवाई पहचानकर्ता: chain_connections, wallets, rates, payment_methods, project_settings या store_settings। क्रेडेंशियल या निजी प्रदाता URL नहीं।
required_endpoint_rolestring | nullऑन-चेनपसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।विवरण
पसंदीदा स्कैनर API भूमिका (पुराना फ़ील्ड)। पूरी संगतता सूची के लिए accepted_endpoint_roles इस्तेमाल करें। नोड की मूल स्वस्थ स्थिति भुगतान-इतिहास समर्थन साबित नहीं करती।
accepted_endpoint_roles[]string[] | nullऑन-चेनसंगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।विवरण
संगत API प्रकार, एंडपॉइंट इतिहास या क्षमता का प्रमाण नहीं। रॉ node-rpc, BTC/BCH/LTC/DOGE/DASH और पारदर्शी ZEC (पूरे डिकोड ब्लॉक, 1–48 पुष्टियाँ), solidified नेटिव TRX, algod से नेटिव ALGO, Octez से XTZ, SCALE मेटाडेटा से finalized Asset Hub DOT और इनवॉइस memo ID के साथ Stellar RPC से नेटिव XLM का समर्थन करता है। छँटा या अधूरा इतिहास योग्य नहीं है। ये रॉ एडॉप्टर टोकन प्रणालियाँ नहीं जोड़ते। इंडेक्स्ड API विकल्प बने रहते हैं; नीचे प्रणाली तालिका देखें। मिश्रित रॉ/इंडेक्स्ड स्रोत सीमित विंडो स्वतंत्र रूप से सत्यापित करते हैं; डिफ़ॉल्ट दो स्वतंत्र प्रदाता ही हैं, एक ऑपरेटर के उपनाम नहीं। सामान्य नोड ऊँचाई, ORDnet चेन जानकारी और गैर-EVM प्रणाली के लिए EVM रिले प्राप्ति प्रमाण नहीं हैं। Monero को अब भी प्रोजेक्ट से बँधा केवल-दृश्य wallet-RPC चाहिए।
usable_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
required_independent_providersintegerऑन-चेनउपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।विवरण
उपयोग योग्य सत्यापन स्लॉट, अधिकतम दो। required_independent_providers चेन सेटिंग है: डिफ़ॉल्ट 2 या एडमिनिस्ट्रेटर के स्पष्ट चयन के बाद 1। दो-प्रदाता मोड में अलग प्रदाता कुंजियाँ और होस्ट दोनों चाहिए। बंद, पुराने (दस मिनट से अधिक) या कूलडाउन स्रोत स्लॉट नहीं भरते। Lightning अपने कनेक्शन नियम इस्तेमाल करता है।
monero_wallet_rpcMoneroWalletRpcBinding | nullहमेशाMonero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।विवरण
Monero के लिए संवेदनशील डेटा हटाई गई बाहरी केवल-दृश्य wallet-RPC बाइंडिंग स्थिति। इसमें एंडपॉइंट, प्रमाणीकरण मोड, account-0 प्राथमिक पता, तकनीकी प्रमाण संकेत/ऊँचाइयाँ और ऑपरेटर प्रमाणन टाइमस्टैम्प हैं; क्रेडेंशियल, वॉलेट कुंजियाँ और वॉलेट फ़ाइलें कभी सीरियलाइज़ नहीं होतीं।
balances[]object[]हमेशा
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।विवरण
सभी 30 नेटिव चेन प्रणालियों और सत्यापित ERC-20 व SPL एसेट के कैश बैलेंस। Monero के लिए कॉन्फ़िगर किया बाहरी केवल-दृश्य wallet-RPC चाहिए।
active_store_countintegerहमेशाअभी यह एसेट चुनने वाली सक्षम दुकानों की संख्या। यह स्वीकृति का दृश्य है; केवल-पढ़ने की बैलेंस ट्रैकिंग स्वतंत्र रहती है।
active_store_ids[]UUID[]हमेशाइस प्रोजेक्ट की सक्षम दुकानें जो अभी एसेट स्वीकार करती हैं। इससे बिना दूसरे API अनुरोध सटीक स्थानीय दुकान फ़िल्टर मिलता है।
tracking_activebooleanहमेशापढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।विवरण
पढ़ने में सक्षम यह वॉलेट और उसी चेन का पंजीकृत एसेट पृष्ठभूमि बैलेंस रीफ़्रेश के योग्य हैं या नहीं। प्रोजेक्ट और भुगतान-तरीका स्वीकृति स्विच केवल-पढ़ने की ट्रैकिंग नहीं रोकते।
balancedecimal string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
balance_atomicinteger string|nullहमेशावॉलेट के प्राथमिक पते और जारी इनवॉइस पतों का सटीक प्रदर्शन व परमाणु इकाई बैलेंस। पूर्ण मान अनुपलब्ध होने पर null।
statuspending | refreshing | fresh | stale | errorहमेशाकैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।विवरण
कैश स्कैन स्थिति। refreshing पूरा हुआ बैलेंस रख सकता है: उसकी उम्र के लिए checked_at देखें। Pending का मतलब पूरा स्नैपशॉट नहीं। इनमें से कोई स्थिति ट्रांसफ़र लंबित या इनवॉइस निपटा होना साबित नहीं करती।
balance_statuspending | refreshing | fresh | stale | error | unknownहमेशासमग्र कैश ताज़गी; unknown सुरक्षित फ़ॉलबैक है और कोई भी स्थिति इनवॉइस निपटान साबित नहीं करती।
recent_payments[]object[]हमेशा
इसी सटीक वॉलेट से जुड़े अधिकतम तीन हाल के वैध detected, confirming या final अवलोकन।
statusdetected | confirming | finalहमेशावर्तमान वैध अवलोकन स्थिति। Reorged, replaced और invalid अवलोकन बाहर हैं।
उपयोग संबंधी नोट
- यह bearer रूट कभी रिकवरी फ़्रेज़, निजी कुंजी, एन्क्रिप्टेड सीक्रेट या खर्च मेथड नहीं लौटाता।
- उसी चेन का नया पंजीकृत एसेट पहले पूरे स्कैन से पहले null बैलेंस और pending स्थिति के साथ लौटता है; गढ़े शून्य के रूप में कभी नहीं दिखता।
- प्रोजेक्ट, भुगतान स्वीकृति के लिए वॉलेट, नेटिव प्रणाली या अलग एसेट बंद करने से केवल-पढ़ने की बैलेंस ट्रैकिंग नहीं रुकती: प्राथमिक पते वाले सक्रिय और बंद वॉलेट उसी चेन के हर पंजीकृत समर्थित एसेट को रीफ़्रेश करते रहते हैं। Pending और error वॉलेट स्कैन नहीं होते।
- project_enabled केवल प्रोजेक्ट की एसेट स्वीकृति नीति बताता है और tracking_active true रहने पर false हो सकता है।
- balance और balance_atomic सटीक स्ट्रिंग हैं; price_usd, value_usd और total_value_usd संकेतात्मक हैं और null हो सकते हैं। ताज़ा बैलेंस स्थिति ताज़ा बाज़ार कीमत की गारंटी नहीं देती।
- मूल्यांकन दो घंटे तक पुरानी CoinGecko कीमतों को प्राथमिकता देता है। नेटिव कॉइन और सत्यापित कैनॉनिकल USDC/USDT पाँच मिनट तक पुराने सक्षम Kraken/Binance USD कोट पर फ़ॉलबैक कर सकते हैं, प्राथमिक प्रदाता पहले। डॉलर पेग मान लेना या केवल टिकर से कस्टम-टोकन मूल्य नहीं; प्रोजेक्ट fixed/DEX कीमतें अलग रहती हैं। इनवॉइस कोट नहीं बदलते।
- Pending में पूरा स्नैपशॉट नहीं। Refreshing आखिरी पूरी राशि और checked_at रखता है; इसका मतलब ब्लॉकचेन ट्रांसफ़र लंबित नहीं। Stale/error राशियाँ भी पुराने मान रख सकती हैं। अनुपलब्ध कैश को कभी शून्य या लापता भुगतान न मानें। नियमित EVM/Solana रीफ़्रेश ऑडिट के बीच हाल में जाँचे खाली पते 30 मिनट तक फिर इस्तेमाल करते हैं, जबकि फंड वाले, नए और बदले पते फिर जँचते हैं। कंसोल का स्पष्ट बैलेंस स्कैन पूरा स्कैन माँगता है।
- recent_payments हर वॉलेट के तीन अवलोकनों तक सीमित है और अमान्य इतिहास बाहर रखता है।
त्रुटियाँ
POSTइनवॉइस बनाएँ/v1/projects/{project_id}/stores/{store_id}/invoicesपढ़ना + लिखना
वॉलेट गंतव्य, ताज़ा सटीक कोट, ऑडिट इतिहास और सूचना आउटबॉक्स प्रविष्टियों के साथ इनवॉइस अविभाज्य रूप से बनाता है। उसी क्रेडेंशियल और Idempotency-Key से समान रॉ बॉडी बाइट दोहराने पर मूल इनवॉइस लौटता है।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Idempotency-Key | ज़रूरी | बिना व्हाइटस्पेस के विशिष्ट 1–128 दृश्य ASCII अक्षर। |
| Content-Type | सुझाया गया | application/json। वर्तमान रॉ-बॉडी हैंडलर मीडिया प्रकार लागू किए बिना JSON पार्स करता है। |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
project_idUUIDज़रूरीप्रोजेक्ट → सेटिंग → API ID से प्रोजेक्ट API ID कॉपी करें। क्रेडेंशियल को असाइन होना चाहिए; पठनीय प्रोजेक्ट पहचानकर्ता स्वीकार नहीं।
store_idUUIDज़रूरीप्रोजेक्ट → दुकानें → दुकान चुनें → मूल → API ID से दुकान API ID कॉपी करें। डिफ़ॉल्ट दुकान के लिए भी ज़रूरी; सक्षम और project_id की होनी चाहिए।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "49.90",
"currency": "USD"
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"amount": "49.90",
"currency": "USD"
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"amount": "49.90",
"currency": "USD"
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "49.90",
"currency": "USD"
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response)): "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"payment_methods": [
{
"chain_slug": "bitcoin",
"asset_tickers": [
"BTC"
]
}
],
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"email": "ada@example.com",
"description": "Annual plan",
"underpayment_tolerance_percent": "1",
"ipn_url": "https://merchant.example/wholly/ipn",
"redirect_url": "https://merchant.example/orders/1042",
"cancel_url": "https://merchant.example/cart",
"redirect_automatically": true,
"language": "en",
"metadata": {
"cart_id": "cart-681",
"firstname": "Ada",
"lastname": "Lovelace",
"street": "12 Example Street",
"street2": "Suite 2",
"zip": "10115",
"city": "Berlin",
"country": "Germany",
"countryiso2": "DE",
"company": "Example GmbH",
"vatid": "DE123456789"
},
"exchange_rate_spread_percent": "0.5",
"checkout_appearance": {
"title": "Complete your order",
"intro": "Thanks for choosing our annual plan.",
"outro": "Questions? https://merchant.example/help",
"intro_font_size": 18,
"outro_font_size": 14,
"theme": "light",
"accent_color": "#1768CE",
"messages": {
"en": {
"paid": "Your order is ready."
}
}
}
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"payment_methods": [
{
"chain_slug": "bitcoin",
"asset_tickers": [
"BTC"
]
}
],
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"email": "ada@example.com",
"description": "Annual plan",
"underpayment_tolerance_percent": "1",
"ipn_url": "https://merchant.example/wholly/ipn",
"redirect_url": "https://merchant.example/orders/1042",
"cancel_url": "https://merchant.example/cart",
"redirect_automatically": true,
"language": "en",
"metadata": {
"cart_id": "cart-681",
"firstname": "Ada",
"lastname": "Lovelace",
"street": "12 Example Street",
"street2": "Suite 2",
"zip": "10115",
"city": "Berlin",
"country": "Germany",
"countryiso2": "DE",
"company": "Example GmbH",
"vatid": "DE123456789"
},
"exchange_rate_spread_percent": "0.5",
"checkout_appearance": {
"title": "Complete your order",
"intro": "Thanks for choosing our annual plan.",
"outro": "Questions? https://merchant.example/help",
"intro_font_size": 18,
"outro_font_size": 14,
"theme": "light",
"accent_color": "#1768CE",
"messages": {
"en": {
"paid": "Your order is ready."
}
}
}
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"payment_methods": [
{
"chain_slug": "bitcoin",
"asset_tickers": [
"BTC"
]
}
],
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"email": "ada@example.com",
"description": "Annual plan",
"underpayment_tolerance_percent": "1",
"ipn_url": "https://merchant.example/wholly/ipn",
"redirect_url": "https://merchant.example/orders/1042",
"cancel_url": "https://merchant.example/cart",
"redirect_automatically": true,
"language": "en",
"metadata": {
"cart_id": "cart-681",
"firstname": "Ada",
"lastname": "Lovelace",
"street": "12 Example Street",
"street2": "Suite 2",
"zip": "10115",
"city": "Berlin",
"country": "Germany",
"countryiso2": "DE",
"company": "Example GmbH",
"vatid": "DE123456789"
},
"exchange_rate_spread_percent": "0.5",
"checkout_appearance": {
"title": "Complete your order",
"intro": "Thanks for choosing our annual plan.",
"outro": "Questions? https://merchant.example/help",
"intro_font_size": 18,
"outro_font_size": 14,
"theme": "light",
"accent_color": "#1768CE",
"messages": {
"en": {
"paid": "Your order is ready."
}
}
}
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"payment_methods": [
{
"chain_slug": "bitcoin",
"asset_tickers": [
"BTC"
]
}
],
"amount": "49.90",
"currency": "USD",
"order_id": "order-1042",
"email": "ada@example.com",
"description": "Annual plan",
"underpayment_tolerance_percent": "1",
"ipn_url": "https://merchant.example/wholly/ipn",
"redirect_url": "https://merchant.example/orders/1042",
"cancel_url": "https://merchant.example/cart",
"redirect_automatically": true,
"language": "en",
"metadata": {
"cart_id": "cart-681",
"firstname": "Ada",
"lastname": "Lovelace",
"street": "12 Example Street",
"street2": "Suite 2",
"zip": "10115",
"city": "Berlin",
"country": "Germany",
"countryiso2": "DE",
"company": "Example GmbH",
"vatid": "DE123456789"
},
"exchange_rate_spread_percent": "0.5",
"checkout_appearance": {
"title": "Complete your order",
"intro": "Thanks for choosing our annual plan.",
"outro": "Questions? https://merchant.example/help",
"intro_font_size": 18,
"outro_font_size": 14,
"theme": "light",
"accent_color": "#1768CE",
"messages": {
"en": {
"paid": "Your order is ready."
}
}
}
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))अनुरोध बॉडी
amountstringज़रूरीबिना चिह्न की साधारण दशमलव स्ट्रिंग; चिह्न या घातांक नहीं, अधिकतम 48 पूर्णांक अंक और 30 दशमलव स्थान। डिफ़ॉल्ट रूप से सकारात्मक होनी चाहिए। दुकान, दुकानें → इनवॉइस में शून्य-राशि इनवॉइस स्वीकार कर सकती है; शून्य कुल बिना फंड प्राप्ति, पता आवंटन या प्रोसेसिंग शुल्क के निपटते हैं।विवरण
बिना चिह्न की साधारण दशमलव स्ट्रिंग; चिह्न या घातांक नहीं, अधिकतम 48 पूर्णांक अंक और 30 दशमलव स्थान। डिफ़ॉल्ट रूप से सकारात्मक होनी चाहिए। दुकान, दुकानें → इनवॉइस में शून्य-राशि इनवॉइस स्वीकार कर सकती है; शून्य कुल बिना फंड प्राप्ति, पता आवंटन या प्रोसेसिंग शुल्क के निपटते हैं।
currencystring | nullवैकल्पिकसमर्थित तीन-अक्षर फ़िएट मुद्रा, बड़े अक्षरों में सामान्यीकृत। न देने या null पर दुकान की इनवॉइस मुद्रा अपनती है। निर्माण के लिए स्वतंत्र रूप से उपलब्ध बिलिंग रूपांतरण दर भी चाहिए।विवरण
समर्थित तीन-अक्षर फ़िएट मुद्रा, बड़े अक्षरों में सामान्यीकृत। न देने या null पर दुकान की इनवॉइस मुद्रा अपनती है। निर्माण के लिए स्वतंत्र रूप से उपलब्ध बिलिंग रूपांतरण दर भी चाहिए।
payment_methods[]object[] | nullवैकल्पिक
इस इनवॉइस के लिए दुकान-सक्षम तरीके चुनें। Merchant 5.4.0+: अज्ञात/निष्क्रिय/अस्वीकार्य विकल्प अनदेखे करें; कोई मेल न हो तो दुकान डिफ़ॉल्ट इस्तेमाल करें। अनुपस्थित/null पर भी दुकान डिफ़ॉल्ट; [] अमान्य। कभी तरीका सक्षम नहीं करता या दुकान सेटिंग नहीं बदलता। चयन स्कीमा नीचे देखें।विवरण
इस इनवॉइस के लिए दुकान-सक्षम तरीके चुनें। Merchant 5.4.0+: अज्ञात/निष्क्रिय/अस्वीकार्य विकल्प अनदेखे करें; कोई मेल न हो तो दुकान डिफ़ॉल्ट इस्तेमाल करें। अनुपस्थित/null पर भी दुकान डिफ़ॉल्ट; [] अमान्य। कभी तरीका सक्षम नहीं करता या दुकान सेटिंग नहीं बदलता। चयन स्कीमा नीचे देखें।
chain_slugstringज़रूरीप्रोजेक्ट → दुकानें → भुगतान तरीके से chain_slug कॉपी करें या GET /v1/projects/{project_id}/stores/{store_id}/payment-assets से पढ़ें, जैसे ethereum, base या bitcoin। चेन/प्रणाली की जोड़ी केवल एक बार आ सकती है।विवरण
प्रोजेक्ट → दुकानें → भुगतान तरीके से chain_slug कॉपी करें या GET /v1/projects/{project_id}/stores/{store_id}/payment-assets से पढ़ें, जैसे ethereum, base या bitcoin। चेन/प्रणाली की जोड़ी केवल एक बार आ सकती है।
asset_ids[]UUID[] | nullवैकल्पिकऑन-चेन asset.id UUID, कॉन्ट्रैक्ट पते या इनवॉइस भुगतान-तरीका ID नहीं। यह या asset_tickers इस्तेमाल करें। इस चेन के सभी सक्रिय स्वीकार्य एसेट के लिए दोनों चयनकर्ता छोड़ें। [] और डुप्लिकेट/nil ID अमान्य हैं। 5.4.0+ में इस दुकान की इस चेन पर निष्क्रिय/अस्वीकार्य ID अनदेखे होते हैं; पूरी तरह बेमेल चयन दुकान डिफ़ॉल्ट इस्तेमाल करता है।विवरण
ऑन-चेन asset.id UUID, कॉन्ट्रैक्ट पते या इनवॉइस भुगतान-तरीका ID नहीं। यह या asset_tickers इस्तेमाल करें। इस चेन के सभी सक्रिय स्वीकार्य एसेट के लिए दोनों चयनकर्ता छोड़ें। [] और डुप्लिकेट/nil ID अमान्य हैं। 5.4.0+ में इस दुकान की इस चेन पर निष्क्रिय/अस्वीकार्य ID अनदेखे होते हैं; पूरी तरह बेमेल चयन दुकान डिफ़ॉल्ट इस्तेमाल करता है।
asset_tickers[]string[] | nullवैकल्पिकMerchant 5.3.0+। BTC, USDC या PEPE जैसे प्रतीक, chain_slug और इस दुकान के दायरे में। 1–64 विशिष्ट टिकर; किनारे की खाली जगह हटती है/अक्षर आकार से फ़र्क नहीं, 1–40 ASCII अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न। यह या asset_ids इस्तेमाल करें। 5.4.0+ में अज्ञात/निष्क्रिय/अस्वीकार्य टिकर अनदेखे होते हैं। अस्पष्ट स्वीकृत प्रतीक तब भी विफल होते हैं: asset_ids इस्तेमाल करें। सक्रिय चुने तरीकों के लिए वैध वॉलेट और मूल्य चाहिए; 6.0.6 से अस्थायी ऑन-चेन स्कैनर रुकावट निर्माण नहीं रोकती। Lightning वैकल्पिक रूप से केवल BTC स्वीकार करता है।विवरण
Merchant 5.3.0+। BTC, USDC या PEPE जैसे प्रतीक, chain_slug और इस दुकान के दायरे में। 1–64 विशिष्ट टिकर; किनारे की खाली जगह हटती है/अक्षर आकार से फ़र्क नहीं, 1–40 ASCII अक्षर/अंक/बिंदु/अंडरस्कोर/हाइफ़न। यह या asset_ids इस्तेमाल करें। 5.4.0+ में अज्ञात/निष्क्रिय/अस्वीकार्य टिकर अनदेखे होते हैं। अस्पष्ट स्वीकृत प्रतीक तब भी विफल होते हैं: asset_ids इस्तेमाल करें। सक्रिय चुने तरीकों के लिए वैध वॉलेट और मूल्य चाहिए; 6.0.6 से अस्थायी ऑन-चेन स्कैनर रुकावट निर्माण नहीं रोकती। Lightning वैकल्पिक रूप से केवल BTC स्वीकार करता है।
payment_railonchain | lightningवैकल्पिकडिफ़ॉल्ट onchain। Bitcoin Lightning चुनने के लिए बिना asset_ids के {chain_slug: bitcoin, payment_rail: lightning} इस्तेमाल करें; asset_tickers वैकल्पिक रूप से [BTC] हो सकता है। ऑन-चेन Bitcoin में Lightning शामिल नहीं है। दुकान का Lightning कनेक्शन पहले से सक्षम और तैयार होना चाहिए।विवरण
डिफ़ॉल्ट onchain। Bitcoin Lightning चुनने के लिए बिना asset_ids के {chain_slug: bitcoin, payment_rail: lightning} इस्तेमाल करें; asset_tickers वैकल्पिक रूप से [BTC] हो सकता है। ऑन-चेन Bitcoin में Lightning शामिल नहीं है। दुकान का Lightning कनेक्शन पहले से सक्षम और तैयार होना चाहिए।
order_idstring | nullवैकल्पिकमर्चेंट ऑर्डर संदर्भ, किनारे की खाली जगह हटाने के बाद 1–128 अक्षर; नियंत्रण अक्षर अस्वीकार होते हैं।
emailstring | nullवैकल्पिककेवल मर्चेंट का ग्राहक ईमेल, अधिकतम 254 अक्षर के व्यावहारिक ASCII पते में सामान्यीकृत। न देने या null पर ईमेल नहीं रखा जाता।
descriptionstring | nullवैकल्पिकग्राहक को दिखने वाला विवरण, 1–500 अक्षर; नई पंक्तियाँ और टैब स्वीकार हैं।
expires_in_secondsinteger | nullवैकल्पिकइनवॉइस कोट अवधि 300 से 86,400 सेकंड; न देने या null पर दुकान नीति अपनती है।
exchange_rate_spread_percentdecimal string | nullवैकल्पिककोट मार्कअप 0 से 100, अधिकतम दो दशमलव स्थान। न देने या null पर दुकान डिफ़ॉल्ट; "0" इस इनवॉइस के लिए बंद करता है। ऊपर राउंड करने से पहले लागू होता है, फिर लॉक। इनवॉइस फ़िएट राशि या प्रोसेसिंग शुल्क आधार नहीं बदलता।विवरण
कोट मार्कअप 0 से 100, अधिकतम दो दशमलव स्थान। न देने या null पर दुकान डिफ़ॉल्ट; "0" इस इनवॉइस के लिए बंद करता है। ऊपर राउंड करने से पहले लागू होता है, फिर लॉक। इनवॉइस फ़िएट राशि या प्रोसेसिंग शुल्क आधार नहीं बदलता।
underpayment_tolerance_percentdecimal string | nullवैकल्पिकस्वीकृत कमी 0 से 99.99, अधिकतम दो दशमलव स्थान। न देने या null पर दुकान डिफ़ॉल्ट अपनता है।
ipn_urlstring | nullवैकल्पिकसार्वजनिक HTTPS कॉलबैक, अधिकतम 2,048 बाइट, क्रेडेंशियल या फ़्रैगमेंट के बिना। दुकान डिफ़ॉल्ट को बदलता है; null/अनुपस्थित पर वही अपनता है।
redirect_urlstring | nullवैकल्पिकनिपटान के बाद इस्तेमाल होने वाला HTTPS सफलता URL, अधिकतम 2,048 बाइट और बिना अंतर्निहित क्रेडेंशियल। न देने या null पर दुकान डिफ़ॉल्ट अपनता है और उसे साफ़ नहीं कर सकता।
cancel_urlstring | nullवैकल्पिकसफल भुगतान के बिना चेकआउट समाप्त होने पर HTTPS वापसी URL। न देने या null पर दुकान डिफ़ॉल्ट अपनता है और उसे साफ़ नहीं कर सकता।
redirect_automaticallyboolean | nullवैकल्पिकन देने या null पर दुकान नीति अपनती है। true के लिए प्रभावी redirect_url चाहिए।
languagestring | nullवैकल्पिकग्राहक भाषा: en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja। pt का मतलब ब्राज़ीली पुर्तगाली और zh का मतलब सरलीकृत चीनी। de-DE जैसे समर्थित क्षेत्रीय टैग सूचीबद्ध भाषा में सामान्यीकृत होते हैं। न देने या null पर दुकान भाषा अपनती है। कंसोल भाषा अलग है।विवरण
ग्राहक भाषा: en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja। pt का मतलब ब्राज़ीली पुर्तगाली और zh का मतलब सरलीकृत चीनी। de-DE जैसे समर्थित क्षेत्रीय टैग सूचीबद्ध भाषा में सामान्यीकृत होते हैं। न देने या null पर दुकान भाषा अपनती है। कंसोल भाषा अलग है।
checkout_appearanceobject | nullवैकल्पिक
इस इनवॉइस की आंशिक प्रदर्शन सेटिंग। अनुपस्थित/null पर दुकान का वर्तमान डिज़ाइन। {} सहित ऑब्जेक्ट देने पर निर्माण के समय तय डिज़ाइन और चित्र स्थिर हो जाते हैं। नीचे ओवरराइड स्कीमा देखें; वित्तीय सेटिंग, HTML, CSS, JavaScript या रिमोट इमेज URL नहीं।विवरण
इस इनवॉइस की आंशिक प्रदर्शन सेटिंग। अनुपस्थित/null पर दुकान का वर्तमान डिज़ाइन। {} सहित ऑब्जेक्ट देने पर निर्माण के समय तय डिज़ाइन और चित्र स्थिर हो जाते हैं। नीचे ओवरराइड स्कीमा देखें; वित्तीय सेटिंग, HTML, CSS, JavaScript या रिमोट इमेज URL नहीं।
inherit_default_storebooleanवैकल्पिकtrue प्रोजेक्ट की डिफ़ॉल्ट दुकान का डिज़ाइन आधार चुनता है; वरना लक्ष्य दुकान का प्रभावी डिज़ाइन इस्तेमाल होता है। फिर ओवरराइड लागू होकर अलग सहेजे जाते हैं; तय इनवॉइस फ़्लैग false होता है।विवरण
true प्रोजेक्ट की डिफ़ॉल्ट दुकान का डिज़ाइन आधार चुनता है; वरना लक्ष्य दुकान का प्रभावी डिज़ाइन इस्तेमाल होता है। फिर ओवरराइड लागू होकर अलग सहेजे जाते हैं; तय इनवॉइस फ़्लैग false होता है।
introstringवैकल्पिकसादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।विवरण
सादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।
outrostringवैकल्पिकसादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।विवरण
सादा टेक्स्ट, हर एक अधिकतम 2,000 अक्षर। Intro ऊपर, Outro नीचे हर स्थिति में दिखता है। नई पंक्तियाँ बनी रहती हैं; सुरक्षित टेक्स्ट URL लिंक बनते हैं। खाली स्ट्रिंग साफ़ करती है। पुराना customer_message, intro के उपनाम के रूप में स्वीकार है; दोनों न भेजें।
accent_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
background_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
card_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
button_colorstringवैकल्पिक#RRGGBB। स्वचालित रंगों के लिए पृष्ठभूमि, कार्ड और बटन खाली हो सकते हैं। टेक्स्ट कंट्रास्ट स्वचालित है।
imagesobjectवैकल्पिक
कुंजियाँ logo_light, logo_dark, favicon। अनुपस्थित कुंजी आधार चित्र रखती है; null हटाता है। {store_id: UUID, kind?: logo_light|logo_dark|favicon} ऑब्जेक्ट उसी प्रोजेक्ट की उस दुकान का प्रभावी अपलोड चित्र दोबारा इस्तेमाल करता है। kind डिफ़ॉल्ट लक्ष्य कुंजी है। पहले दुकान → चेकआउट में अपलोड करें; मूल → API ID से दुकान API ID कॉपी करें। अनुपस्थित चित्र या दूसरे प्रोजेक्ट ID पर 400 मिलता है। बाहरी URL या इमेज डेटा स्वीकार नहीं।विवरण
कुंजियाँ logo_light, logo_dark, favicon। अनुपस्थित कुंजी आधार चित्र रखती है; null हटाता है। {store_id: UUID, kind?: logo_light|logo_dark|favicon} ऑब्जेक्ट उसी प्रोजेक्ट की उस दुकान का प्रभावी अपलोड चित्र दोबारा इस्तेमाल करता है। kind डिफ़ॉल्ट लक्ष्य कुंजी है। पहले दुकान → चेकआउट में अपलोड करें; मूल → API ID से दुकान API ID कॉपी करें। अनुपस्थित चित्र या दूसरे प्रोजेक्ट ID पर 400 मिलता है। बाहरी URL या इमेज डेटा स्वीकार नहीं।
show_order_idbooleanवैकल्पिकशीर्षक के नीचे ऑर्डर ID विवरण और सादे टेक्स्ट का विवरण दिखाएँ। details_expanded ऑर्डर ID विवरण शुरू से खोलता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
show_descriptionbooleanवैकल्पिकशीर्षक के नीचे ऑर्डर ID विवरण और सादे टेक्स्ट का विवरण दिखाएँ। details_expanded ऑर्डर ID विवरण शुरू से खोलता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
details_expandedbooleanवैकल्पिकशीर्षक के नीचे ऑर्डर ID विवरण और सादे टेक्स्ट का विवरण दिखाएँ। details_expanded ऑर्डर ID विवरण शुरू से खोलता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
show_project_namebooleanवैकल्पिकMerchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।विवरण
Merchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
show_store_namebooleanवैकल्पिकMerchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।विवरण
Merchant 5.6.0+: ग्राहक चेकआउट हेडर में हर नाम दिखाएँ या छिपाएँ। दोनों डिफ़ॉल्ट true। दुकान → चेकआउट में भी उपलब्ध; दूसरी रूप-रंग सेटिंग की तरह विरासत में मिलता और इनवॉइस स्नैपशॉट में रहता है। केवल प्रदर्शन, डेटा छिपाना नहीं।
featured_chains[]string[]वैकल्पिकक्रमबद्ध चेन स्लग, अधिकतम 60 विशिष्ट मान (छोटे अक्षर, अंक, हाइफ़न; 64 अक्षर तक)। [] साफ़ करता है। केवल उपलब्ध इनवॉइस तरीकों का क्रम बदलता है।विवरण
क्रमबद्ध चेन स्लग, अधिकतम 60 विशिष्ट मान (छोटे अक्षर, अंक, हाइफ़न; 64 अक्षर तक)। [] साफ़ करता है। केवल उपलब्ध इनवॉइस तरीकों का क्रम बदलता है।
featured_asset_ids[]UUID[]वैकल्पिकअधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।विवरण
अधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।
default_asset_idUUID|nullवैकल्पिकअधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।विवरण
अधिकतम 100 विशिष्ट क्रमबद्ध एसेट ID; [] साफ़ करता है। डिफ़ॉल्ट एसेट null हो सकता है। ID payment-assets से आते हैं, payment-intent ID नहीं। ये कभी तरीके सक्षम नहीं करते; प्राप्त भुगतान और वैध ग्राहक प्राथमिकताओं को प्राथमिकता मिलती है।
messagesobjectवैकल्पिक
en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja कुंजियों वाले भाषा ऑब्जेक्ट, जिनमें waiting, confirming, paid, underpaid, expired सादी स्ट्रिंग (हर एक 500 अक्षर) हैं। केवल दी गई भाषाएँ/स्थितियाँ बदलती हैं; {} सभी संदेश साफ़ करता है, {en:{}} अंग्रेज़ी साफ़ करता है और खाली स्थिति स्ट्रिंग वह स्थिति साफ़ करती है। अंग्रेज़ी फ़ॉलबैक है। वास्तविक स्थिति नहीं बदलता।विवरण
en, de, es, pt-BR, it, ru, zh-CN, fr, ko या ja कुंजियों वाले भाषा ऑब्जेक्ट, जिनमें waiting, confirming, paid, underpaid, expired सादी स्ट्रिंग (हर एक 500 अक्षर) हैं। केवल दी गई भाषाएँ/स्थितियाँ बदलती हैं; {} सभी संदेश साफ़ करता है, {en:{}} अंग्रेज़ी साफ़ करता है और खाली स्थिति स्ट्रिंग वह स्थिति साफ़ करती है। अंग्रेज़ी फ़ॉलबैक है। वास्तविक स्थिति नहीं बदलता।
enobjectवैकल्पिक
deobjectवैकल्पिक
esobjectवैकल्पिक
pt-BRobjectवैकल्पिक
itobjectवैकल्पिक
ruobjectवैकल्पिक
zh-CNobjectवैकल्पिक
frobjectवैकल्पिक
koobjectवैकल्पिक
support_urlstringवैकल्पिकबिना क्रेडेंशियल के 2,048 अक्षर तक HTTPS URL। खाली साफ़ करता है। लिंक नई विंडो में खुलते हैं।
terms_urlstringवैकल्पिकबिना क्रेडेंशियल के 2,048 अक्षर तक HTTPS URL। खाली साफ़ करता है। लिंक नई विंडो में खुलते हैं।
privacy_urlstringवैकल्पिकबिना क्रेडेंशियल के 2,048 अक्षर तक HTTPS URL। खाली साफ़ करता है। लिंक नई विंडो में खुलते हैं।
return_button_textstringवैकल्पिक60 अक्षर तक लेबल। इनवॉइस व्यवहार के लिए शीर्ष-स्तरीय redirect_url/cancel_url/redirect_automatically/language इस्तेमाल करें।
show_return_buttonbooleanवैकल्पिकअंतिम स्थितियों सहित चेकआउट में मैन्युअल मर्चेंट पर लौटें/रद्द बटन दिखाएँ। दुकान रूप-रंग अपनाने के लिए न दें (डिफ़ॉल्ट true); false छिपाता है। इनवॉइस रद्द नहीं करता, JSON में URL नहीं छिपाता और स्वचालित सफलता रीडायरेक्ट बंद नहीं करता। ज़रूरत हो तो शीर्ष-स्तरीय redirect_automatically अलग से false करें। मर्चेंट 8.1.4 या नया चाहिए।विवरण
अंतिम स्थितियों सहित चेकआउट में मैन्युअल मर्चेंट पर लौटें/रद्द बटन दिखाएँ। दुकान रूप-रंग अपनाने के लिए न दें (डिफ़ॉल्ट true); false छिपाता है। इनवॉइस रद्द नहीं करता, JSON में URL नहीं छिपाता और स्वचालित सफलता रीडायरेक्ट बंद नहीं करता। ज़रूरत हो तो शीर्ष-स्तरीय redirect_automatically अलग से false करें। मर्चेंट 8.1.4 या नया चाहिए।
metadataobject | nullवैकल्पिक
केवल मर्चेंट का JSON ऑब्जेक्ट; अनुपस्थित या null से {}, अधिकतम 4,096 एन्कोडेड बाइट और पाँच नेस्टेड स्तर। firstname, lastname, street, street2, zip, city, country, countryiso2, company और vatid सत्यापित, सामान्यीकृत होकर ग्राहक सारांश फ़ील्ड में आते हैं।विवरण
केवल मर्चेंट का JSON ऑब्जेक्ट; अनुपस्थित या null से {}, अधिकतम 4,096 एन्कोडेड बाइट और पाँच नेस्टेड स्तर। firstname, lastname, street, street2, zip, city, country, countryiso2, company और vatid सत्यापित, सामान्यीकृत होकर ग्राहक सारांश फ़ील्ड में आते हैं।
जवाब 201 new invoice; 200 exact idempotent replay
उदाहरण जवाब
{
"data": {
"id": "2f798f9f-01f2-42f0-9d10-5581d6116b4c",
"invoice_id": "0a6a98db-d93d-48ee-8c3c-fd45f90c4a50",
"project_id": "11111111-1111-4111-8111-111111111111",
"store_id": "22222222-2222-4222-8222-222222222222",
"source": "api",
"order_id": "order-1042",
"email": "ada@example.com",
"customer_name": "Ada Lovelace · Example GmbH",
"customer_address": "Example GmbH · 12 Example Street · Suite 2 · 10115 Berlin · Germany (DE) · VAT DE123456789",
"description": "Annual plan",
"amount": "49.9",
"currency": "USD",
"exchange_rate_spread_percent": "0.5",
"underpayment_tolerance_percent": "1",
"status": "new",
"amount_status": "none",
"timing_status": "on_time",
"resolution": "automatic",
"sequence": 1,
"winning_payment_intent_id": null,
"expires_at": "2026-08-31T18:15:00Z",
"monitoring_expires_at": "2026-09-07T18:15:00Z",
"settled_at": null,
"cancelled_at": null,
"archived_at": null,
"created_at": "2026-08-31T18:00:00Z",
"updated_at": "2026-08-31T18:00:00Z",
"ipn_url": "https://merchant.example/wholly/ipn",
"redirect_url": "https://merchant.example/orders/1042",
"cancel_url": "https://merchant.example/cart",
"redirect_automatically": true,
"checkout_language": "en",
"metadata": { "cart_id": "cart-681", "firstname": "Ada", "lastname": "Lovelace", "street": "12 Example Street", "street2": "Suite 2", "zip": "10115", "city": "Berlin", "country": "Germany", "countryiso2": "DE", "company": "Example GmbH", "vatid": "DE123456789" },
"payment_intents": [
{
"id": "33333333-3333-4333-8333-333333333333",
"asset_id": "10000000-0000-4000-8000-000000000001",
"asset_key": "bip122:000000000019d6689c085ae165831e93/slip44:0",
"chain_slug": "bitcoin",
"network": "mainnet",
"caip_network_id": "bip122:000000000019d6689c085ae165831e93",
"caip_asset_id": "bip122:000000000019d6689c085ae165831e93/slip44:0",
"symbol": "BTC",
"asset_decimals": 8,
"status": "pending",
"finality_mode": "confirmations",
"required_confirmations": 1,
"quote_rate": "0.000009218",
"quote_details": null,
"expected_amount": "0.00046",
"expected_amount_atomic": "46000",
"minimum_payment_amount": "0.0004554",
"minimum_payment_amount_atomic": "45540",
"received_amount": "0",
"received_amount_atomic": "0",
"confirmed_amount": "0",
"confirmed_amount_atomic": "0",
"destination_address": "bc1q…example",
"destination_tag": null,
"derivation_index": 42,
"quote_expires_at": "2026-08-31T18:15:00Z",
"monitoring_expires_at": "2026-09-07T18:15:00Z",
"next_check_at": "2026-08-31T18:00:00Z",
"last_checked_at": null,
"last_chain_height": null,
"last_anchor_hash": null,
"last_monitor_error": null,
"first_payment_at": null,
"fully_paid_at": null,
"finalized_at": null
}
]
},
"links": {
"checkout": "https://pay.example.com/invoice/0a6a98db-d93d-48ee-8c3c-fd45f90c4a50"
}
}जवाब फ़ील्ड
dataobject
customer_addressstring | nullहमेशानिजी company, street, street2, zip, city, country, countryiso2 और vatid मेटाडेटा से निकला एक-पंक्ति मर्चेंट पता।
exchange_rate_spread_percentdecimal stringहमेशालॉक किया कोट स्प्रेड: निर्माण ओवरराइड या न देने पर दुकान डिफ़ॉल्ट। ऊपर राउंड करने से पहले लागू; इस इनवॉइस पर कभी नहीं बदलता।
underpayment_tolerance_percentdecimal stringहमेशाइनवॉइस बनते समय स्नैपशॉट किया अपरिवर्तनीय स्वीकृत कमी प्रतिशत।
amount_statusamount statusहमेशाnone, partial, paid या overpaid। स्पष्ट अनुमति वाला शून्य-राशि इनवॉइस none और बिना भुगतान तरीकों के निपटता है।
winning_payment_intent_idUUID | nullहमेशाचुने जाने पर वह भुगतान तरीका जिसने इनवॉइस का परिणाम तय किया।
monitoring_expires_atRFC 3339 timestampहमेशासभी भुगतान तरीकों में कॉन्फ़िगर किया सबसे बाद का देर-निगरानी कटऑफ़।
ipn_urlstring | nullहमेशाहर इनवॉइस का प्रभावी IPN लक्ष्य। केवल मर्चेंट जवाब; सार्वजनिक चेकआउट में नहीं।
metadataobjectहमेशा
मर्चेंट मेटाडेटा। सार्वजनिक चेकआउट कभी नहीं लौटाता। कंसोल भुगतान टूल payment_tool स्रोत जानकारी (id, kind, title, pricing, requested_amount, request_id) जोड़ते हैं; यह भुगतान साबित नहीं करती। कॉलबैक प्रमाणित करें और हर invoice_id पर invoice.settled एक बार पूरा करें।विवरण
मर्चेंट मेटाडेटा। सार्वजनिक चेकआउट कभी नहीं लौटाता। कंसोल भुगतान टूल payment_tool स्रोत जानकारी (id, kind, title, pricing, requested_amount, request_id) जोड़ते हैं; यह भुगतान साबित नहीं करती। कॉलबैक प्रमाणित करें और हर invoice_id पर invoice.settled एक बार पूरा करें।
payment_intents[]object[]हमेशा
कोट किए भुगतान तरीके और निगरानी स्थिति।
payment_railonchain | lightningहमेशाइनवॉइस ट्रांसपोर्ट। Bitcoin ऑन-चेन और Lightning समान asset_id साझा कर सकते हैं; केवल प्रतीक नहीं, इंटेंट id के साथ यह फ़ील्ड इस्तेमाल करें। यह एसेट कैटलॉग के स्कैनर payment_rail से अलग है।विवरण
इनवॉइस ट्रांसपोर्ट। Bitcoin ऑन-चेन और Lightning समान asset_id साझा कर सकते हैं; केवल प्रतीक नहीं, इंटेंट id के साथ यह फ़ील्ड इस्तेमाल करें। यह एसेट कैटलॉग के स्कैनर payment_rail से अलग है।
bolt11string | nullहमेशाLightning भुगतान अनुरोध, वरना null। यह अनुरोध Lightning वॉलेट से चुकाएँ; इसके payment hash पर कभी ऑन-चेन फंड न भेजें।
asset_decimalsintegerहमेशापरमाणु इकाई सटीकता। Lightning BTC में 11 (millisatoshi), ऑन-चेन Bitcoin के 8 नहीं। कोट पूरे satoshi में हैं; प्राप्तियाँ millisatoshi सटीकता रखती हैं।
quote_ratedecimal stringहमेशालॉक स्प्रेड सहित इनवॉइस मुद्रा की एक इकाई के प्रति एसेट इकाइयाँ। जैसे प्रति USD 1.02 USDC। उलटी दर नहीं।
quote_detailsobject | nullहमेशालॉक कोट का स्रोत विवरण: स्प्रेड से पहले reference_rate, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at और asset_fetched_at। पुराने इनवॉइस में null; ऐतिहासिक मान गढ़े नहीं जाते।विवरण
लॉक कोट का स्रोत विवरण: स्प्रेड से पहले reference_rate, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at और asset_fetched_at। पुराने इनवॉइस में null; ऐतिहासिक मान गढ़े नहीं जाते।
expected_amountdecimal stringहमेशास्प्रेड और ऊपर की राउंडिंग के बाद चुकाने की सटीक लॉक एसेट राशि। 4.1.1 से पहचाने सत्यापित फ़िएट स्टेबलकॉइन (जैसे USDC, USDT, DAI, USDS, EURC) अधिकतम दो दशमलव तक ऊपर राउंड होते हैं; 1.321 से 1.33 होता है, कभी 1.32 नहीं। शून्य सहनशीलता पर भी यही अपेक्षित राशि है। अन्य एसेट अनुकूलित सटीकता रखते हैं। मौजूदा इनवॉइस की कीमत कभी दोबारा नहीं तय होती।विवरण
स्प्रेड और ऊपर की राउंडिंग के बाद चुकाने की सटीक लॉक एसेट राशि। 4.1.1 से पहचाने सत्यापित फ़िएट स्टेबलकॉइन (जैसे USDC, USDT, DAI, USDS, EURC) अधिकतम दो दशमलव तक ऊपर राउंड होते हैं; 1.321 से 1.33 होता है, कभी 1.32 नहीं। शून्य सहनशीलता पर भी यही अपेक्षित राशि है। अन्य एसेट अनुकूलित सटीकता रखते हैं। मौजूदा इनवॉइस की कीमत कभी दोबारा नहीं तय होती।
minimum_payment_amountdecimal stringहमेशाइनवॉइस सहनशीलता लागू करने के बाद paid मानी जाने वाली न्यूनतम राशि।
destination_addressstringहमेशाऑन-चेन प्राप्ति पता या Lightning का 64-अक्षर payment hash। Lightning भुगतान के लिए bolt11 इस्तेमाल करें; उसका हैश Bitcoin पता नहीं है।
destination_tagstring | nullहमेशाजहाँ प्रणाली इस्तेमाल करती हो, ज़रूरी सार्वजनिक भुगतान संदर्भ: XRP destination tag, Stellar memo ID या TON इनवॉइस टिप्पणी। विशिष्ट-पते वाली प्रणालियों में null।
उपयोग संबंधी नोट
- payment_methods केवल इस इनवॉइस के लिए दुकान-सक्षम तरीके फ़िल्टर करता है। अनुपस्थित/null पर दुकान के सभी तरीके; [] अमान्य। प्रोजेक्ट → दुकानें → भुगतान तरीके में छोटा chain_slug संकेत और दिखाए एसेट टिकर देखें। API payment-assets सूची chain_slug, asset.symbol और asset.id देती है। स्वीकृत Ethereum टोकन के लिए {chain_slug: ethereum, asset_tickers: [USDC, USDT]} इस्तेमाल करें; BTC और PEPE अपनी चुनी चेन पर वैसे ही काम करते हैं। टिकर अक्षर आकार से स्वतंत्र, चेन-दायरे में हैं और केवल दुकान के भीतर हल होते हैं। एक टिकर वाले दो स्वीकृत कॉन्ट्रैक्ट एक चुनने के बजाय 400 लौटाते हैं, भले एक तैयार न हो; वहाँ asset_ids इस्तेमाल करें। नेटिव एसेट, कैटलॉग और कस्टम टोकन समान नियम अपनाते हैं। हर चेन/प्रणाली एक बार आ सकती है; अधिकतम 64 अंतिम तरीके। Merchant 5.4.0+: अज्ञात, बंद, गलत-चेन या अस्वीकार्य विकल्प अनदेखे होते हैं। पूरे चयन में सक्रिय स्वीकार्य मेल न हों तो दुकान डिफ़ॉल्ट लागू; वरना केवल मेल खाते विकल्प। केवल चेन प्रविष्टि में हर सक्रिय स्वीकार्य ऑन-चेन एसेट शामिल होता है। सक्रिय चुने तरीकों को वैध वॉलेट, इंस्टॉल स्कैनर एडॉप्टर और विश्वसनीय दरें चाहिए। 6.0.6 से अनुपलब्ध स्कैनर, कूलडाउन और लंबित/पुरानी स्थिति जाँच इनवॉइस निर्माण नहीं रोकतीं या कॉन्फ़िगर ऑन-चेन तरीके नहीं हटातीं। पता लगाने का पुनः प्रयास स्वचालित है; निपटान को अब भी प्रदाता कोरम और पुष्टियाँ चाहिए। receive_readiness मॉनिटर करें और प्रदाता उपलब्ध रखें: स्कैनर ठीक होने तक इनवॉइस असत्यापित रह सकता है। Monero उपपता आवंटन और Lightning BOLT11 निर्माण को अब भी बाहरी वॉलेट/नोड सेवा चाहिए। विफलताएँ error.message तथा error.details.payment_methods लौटाती हैं, जिनमें chain_slug, asset_ticker, reason_code और स्कैनर निदान के लिए required_endpoint_role, healthy_endpoints तथा required_independent_providers हैं। TRON इंडेक्स किया इतिहास या समर्थित रॉ solidified नेटिव-ब्लॉक API स्वीकार करता है; केवल मूल स्वस्थ स्थिति स्कैनर संगतता साबित नहीं करती। मूल्य विफलताएँ एसेट/मुद्रा पहचानती हैं। कुछ भी अस्वीकार्य एसेट सक्षम या दुकान नीति नहीं बदलता। 5.4.0 से पहले मर्चेंट संस्करणों में अज्ञात/निष्क्रिय स्पष्ट विकल्प विफल होते हैं। दुकान सेटिंग बदलने पर मौजूदा इनवॉइस तरीके कभी नहीं बढ़ते। Lightning अलग चुनना होगा। रीप्ले मूल तरीके रखते हैं और उसी Idempotency-Key से चयन बदलने पर 409 मिलता है।
- checkout_appearance ऊपर सूचीबद्ध हर प्रदर्शन सेटिंग समर्थित करता है। अनुपस्थित फ़ील्ड विरासत लेते हैं, ऐरे बदलते हैं और नेस्टेड संदेश फ़ील्ड मिलते हैं; खाली संदेश ऑब्जेक्ट वह दायरा साफ़ करता है। तय डिज़ाइन और चित्र दुकान बदले बिना इस इनवॉइस के लिए सहेजे जाते हैं। नतीजा जाँचने के लिए सार्वजनिक चेकआउट JSON से appearance पढ़ें। पूरा अनुरोध 32 KiB और तय सेटिंग 20 KiB तक सीमित हैं।
- उसी Idempotency-Key से checkout_appearance बदलने पर 409 मिलता है; समान रॉ बाइट से फिर प्रयास करें। रूप-रंग राशियाँ, दरें, स्वीकृत एसेट, पुष्टि आवश्यकताएँ, वास्तविक स्थिति या एम्बेडिंग अनुमतियाँ नहीं बदलता। HTML, CSS, स्क्रिप्ट या रिमोट इमेज प्राप्ति नहीं।
- exchange_rate_spread_percent इस इनवॉइस में दुकान डिफ़ॉल्ट बदलता है: अपनाने के लिए न दें या null भेजें, बंद करने के लिए "0" भेजें। मौजूदा इनवॉइस कोट कभी नहीं बदलते।
- स्प्रेड ऊपर राउंड करने से पहले लागू होता है। शुल्क मूल इनवॉइस फ़िएट राशि पर ही रहता है, स्प्रेड छोड़कर।
- हमेशा लौटी expected_amount या expected_amount_atomic भेजें। राउंडिंग ऊपर होती है, एसेट सटीकता, राशि के 0.1% और एक फ़िएट लघु इकाई तक सीमित।
- पुनः प्रयास में वही क्रेडेंशियल, Idempotency-Key और सटीक बॉडी बाइट रखें। उसी कुंजी से स्प्रेड बदलने पर 409 idempotency_conflict मिलता है।
- नया कोट, कॉलबैक DNS या पता तैयारी से पहले सटीक रीप्ले जाँचा जाता है। हर अनुरोध पर क्रेडेंशियल दायरा और प्रोजेक्ट/दुकान प्राधिकरण तब भी जँचते हैं।
- प्रभावी ipn_url के लिए दुकान IPN हस्ताक्षर सीक्रेट चाहिए। अज्ञात बॉडी फ़ील्ड अस्वीकार हैं।
त्रुटियाँ
GETइनवॉइस की सूची पाएँ/v1/projects/{project_id}/invoicesकेवल पढ़ना
सीमित दायरे के इनवॉइस सारांश का संक्षिप्त नया-पहले पृष्ठ लौटाता है, जिसमें केवल-मर्चेंट ईमेल और पहचाने मेटाडेटा से निकले ग्राहक फ़ील्ड हैं। खोज, स्थिति और दुकान फ़िल्टर सर्वर पर जँचते हैं; पूर्वानुमेय पृष्ठ विभाजन के लिए जवाब में total और has_more हैं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
क्वेरी पैरामीटर
searchstringवैकल्पिक अक्षर आकार से स्वतंत्र invoice-id, order-id या ईमेल शुरुआत; सटीक इनवॉइस UUID; या विवरण और पहचाने ग्राहक फ़ील्ड का अंश। सभी मेटाडेटा कुंजियाँ और टेक्स्ट, संख्यात्मक व बूलियन मान (नेस्टेड ऑब्जेक्ट/ऐरे सहित) इंडेक्स वाली शब्द-प्रारंभ खोज भी समर्थित करते हैं: हर खोज शब्द मेल खाना चाहिए, विराम चिह्न विभाजक माने जाते हैं। किनारे की खाली जगह हटती है, अधिकतम 100 अक्षर, नियंत्रण अक्षर नहीं। मेटाडेटा मेल सूची जवाब में रॉ मेटाडेटा नहीं जोड़ते; पढ़ने के लिए इनवॉइस विवरण लें।विवरण
वैकल्पिक अक्षर आकार से स्वतंत्र invoice-id, order-id या ईमेल शुरुआत; सटीक इनवॉइस UUID; या विवरण और पहचाने ग्राहक फ़ील्ड का अंश। सभी मेटाडेटा कुंजियाँ और टेक्स्ट, संख्यात्मक व बूलियन मान (नेस्टेड ऑब्जेक्ट/ऐरे सहित) इंडेक्स वाली शब्द-प्रारंभ खोज भी समर्थित करते हैं: हर खोज शब्द मेल खाना चाहिए, विराम चिह्न विभाजक माने जाते हैं। किनारे की खाली जगह हटती है, अधिकतम 100 अक्षर, नियंत्रण अक्षर नहीं। मेटाडेटा मेल सूची जवाब में रॉ मेटाडेटा नहीं जोड़ते; पढ़ने के लिए इनवॉइस विवरण लें।
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices?search=order-1042&status=processing&limit=50&offset=0" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Accept: application/json'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices?search=order-1042&status=processing&limit=50&offset=0", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
"Accept": "application/json"
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices?search=order-1042&status=processing&limit=50&offset=0");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Accept: application/json"],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Accept": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices?search=order-1042&status=processing&limit=50&offset=0",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": [
{
"id": "2f798f9f-01f2-42f0-9d10-5581d6116b4c",
"invoice_id": "0a6a98db-d93d-48ee-8c3c-fd45f90c4a50",
"project_id": "11111111-1111-4111-8111-111111111111",
"store_id": "22222222-2222-4222-8222-222222222222",
"source": "api",
"order_id": "order-1042",
"email": "ada@example.com",
"customer_name": "Ada Lovelace · Example GmbH",
"customer_address": "Example GmbH · 12 Example Street · Suite 2 · 10115 Berlin · Germany (DE) · VAT DE123456789",
"description": "Annual plan",
"amount": "49.9",
"currency": "USD",
"exchange_rate_spread_percent": "0.5",
"underpayment_tolerance_percent": "1",
"status": "processing",
"amount_status": "paid",
"timing_status": "on_time",
"resolution": "automatic",
"sequence": 3,
"winning_payment_intent_id": "33333333-3333-4333-8333-333333333333",
"expires_at": "2026-08-31T18:15:00Z",
"monitoring_expires_at": "2026-09-07T18:15:00Z",
"settled_at": null,
"cancelled_at": null,
"archived_at": null,
"created_at": "2026-08-31T18:00:00Z",
"updated_at": "2026-08-31T18:04:10Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 143,
"has_more": true
}
}जवाब फ़ील्ड
data[]object[]
customer_addressstring | nullहमेशानिजी company, street, street2, zip, city, country, countryiso2 और vatid मेटाडेटा से निकला एक-पंक्ति मर्चेंट पता।
exchange_rate_spread_percentdecimal stringहमेशालॉक किया कोट स्प्रेड: निर्माण ओवरराइड या न देने पर दुकान डिफ़ॉल्ट। ऊपर राउंड करने से पहले लागू; इस इनवॉइस पर कभी नहीं बदलता।
underpayment_tolerance_percentdecimal stringहमेशाइनवॉइस बनते समय स्नैपशॉट किया अपरिवर्तनीय स्वीकृत कमी प्रतिशत।
amount_statusamount statusहमेशाnone, partial, paid या overpaid। स्पष्ट अनुमति वाला शून्य-राशि इनवॉइस none और बिना भुगतान तरीकों के निपटता है।
winning_payment_intent_idUUID | nullहमेशाचुने जाने पर वह भुगतान तरीका जिसने इनवॉइस का परिणाम तय किया।
monitoring_expires_atRFC 3339 timestampहमेशासभी भुगतान तरीकों में कॉन्फ़िगर किया सबसे बाद का देर-निगरानी कटऑफ़।
paginationobject
उपयोग संबंधी नोट
- created_at घटते क्रम में, फिर आंतरिक id घटते क्रम में।
- सूची आइटम InvoiceSummary ऑब्जेक्ट हैं; email, customer_name और customer_address केवल मर्चेंट के लिए। रॉ मेटाडेटा और भुगतान इंटेंट के लिए विवरण कॉल करें।
- अगले पृष्ठ के लिए offset को pagination.offset + pagination.limit केवल has_more true होने पर सेट करें।
- संख्या और पृष्ठ एक repeatable-read डेटाबेस स्नैपशॉट से पढ़े जाते हैं; साथ के लेखन अगले अनुरोध में दिखते हैं।
त्रुटियाँ
GETइनवॉइस प्राप्त करें/v1/projects/{project_id}/invoices/{invoice_id}केवल पढ़ना
पूरा मर्चेंट इनवॉइस विवरण और वर्तमान सक्रिय चेकआउट URL लौटाता है। पोलिंग और मिलान के लिए यह रूट इस्तेमाल करें।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Accept: application/json'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
"Accept": "application/json"
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Accept: application/json"],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Accept": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"id": "2f798f9f-01f2-42f0-9d10-5581d6116b4c",
"invoice_id": "0a6a98db-d93d-48ee-8c3c-fd45f90c4a50",
"project_id": "11111111-1111-4111-8111-111111111111",
"store_id": "22222222-2222-4222-8222-222222222222",
"source": "api",
"order_id": "order-1042",
"email": "ada@example.com",
"customer_name": "Ada Lovelace · Example GmbH",
"customer_address": "Example GmbH · 12 Example Street · Suite 2 · 10115 Berlin · Germany (DE) · VAT DE123456789",
"description": "Annual plan",
"amount": "49.9",
"currency": "USD",
"exchange_rate_spread_percent": "0.5",
"underpayment_tolerance_percent": "1",
"status": "settled",
"amount_status": "paid",
"timing_status": "on_time",
"resolution": "automatic",
"sequence": 4,
"winning_payment_intent_id": "33333333-3333-4333-8333-333333333333",
"expires_at": "2026-08-31T18:15:00Z",
"monitoring_expires_at": "2026-09-07T18:15:00Z",
"settled_at": "2026-08-31T18:05:00Z",
"cancelled_at": null,
"archived_at": null,
"created_at": "2026-08-31T18:00:00Z",
"updated_at": "2026-08-31T18:05:00Z",
"ipn_url": "https://merchant.example/wholly/ipn",
"redirect_url": "https://merchant.example/orders/1042",
"cancel_url": "https://merchant.example/cart",
"redirect_automatically": true,
"checkout_language": "en",
"metadata": { "cart_id": "cart-681", "firstname": "Ada", "lastname": "Lovelace", "street": "12 Example Street", "street2": "Suite 2", "zip": "10115", "city": "Berlin", "country": "Germany", "countryiso2": "DE", "company": "Example GmbH", "vatid": "DE123456789" },
"payment_intents": [
{
"id": "33333333-3333-4333-8333-333333333333",
"asset_id": "10000000-0000-4000-8000-000000000001",
"asset_key": "bip122:000000000019d6689c085ae165831e93/slip44:0",
"chain_slug": "bitcoin",
"network": "mainnet",
"caip_network_id": "bip122:000000000019d6689c085ae165831e93",
"caip_asset_id": "bip122:000000000019d6689c085ae165831e93/slip44:0",
"symbol": "BTC",
"asset_decimals": 8,
"status": "paid",
"finality_mode": "confirmations",
"required_confirmations": 1,
"quote_rate": "0.000009218",
"quote_details": null,
"expected_amount": "0.00046",
"expected_amount_atomic": "46000",
"minimum_payment_amount": "0.0004554",
"minimum_payment_amount_atomic": "45540",
"received_amount": "0.0004554",
"received_amount_atomic": "45540",
"confirmed_amount": "0.0004554",
"confirmed_amount_atomic": "45540",
"destination_address": "bc1q…example",
"destination_tag": null,
"derivation_index": 42,
"quote_expires_at": "2026-08-31T18:15:00Z",
"monitoring_expires_at": "2026-09-07T18:15:00Z",
"next_check_at": null,
"last_checked_at": "2026-08-31T18:05:00Z",
"last_chain_height": 912345,
"last_anchor_hash": "000000000000000000example",
"last_monitor_error": null,
"first_payment_at": "2026-08-31T18:03:00Z",
"fully_paid_at": "2026-08-31T18:03:00Z",
"finalized_at": "2026-08-31T18:05:00Z"
}
]
},
"links": {
"checkout": "https://pay.example.com/invoice/0a6a98db-d93d-48ee-8c3c-fd45f90c4a50"
}
}जवाब फ़ील्ड
dataobject
customer_addressstring | nullहमेशानिजी company, street, street2, zip, city, country, countryiso2 और vatid मेटाडेटा से निकला एक-पंक्ति मर्चेंट पता।
exchange_rate_spread_percentdecimal stringहमेशालॉक किया कोट स्प्रेड: निर्माण ओवरराइड या न देने पर दुकान डिफ़ॉल्ट। ऊपर राउंड करने से पहले लागू; इस इनवॉइस पर कभी नहीं बदलता।
underpayment_tolerance_percentdecimal stringहमेशाइनवॉइस बनते समय स्नैपशॉट किया अपरिवर्तनीय स्वीकृत कमी प्रतिशत।
amount_statusamount statusहमेशाnone, partial, paid या overpaid। स्पष्ट अनुमति वाला शून्य-राशि इनवॉइस none और बिना भुगतान तरीकों के निपटता है।
winning_payment_intent_idUUID | nullहमेशाचुने जाने पर वह भुगतान तरीका जिसने इनवॉइस का परिणाम तय किया।
monitoring_expires_atRFC 3339 timestampहमेशासभी भुगतान तरीकों में कॉन्फ़िगर किया सबसे बाद का देर-निगरानी कटऑफ़।
ipn_urlstring | nullहमेशाहर इनवॉइस का प्रभावी IPN लक्ष्य। केवल मर्चेंट जवाब; सार्वजनिक चेकआउट में नहीं।
metadataobjectहमेशा
मर्चेंट मेटाडेटा। सार्वजनिक चेकआउट कभी नहीं लौटाता। कंसोल भुगतान टूल payment_tool स्रोत जानकारी (id, kind, title, pricing, requested_amount, request_id) जोड़ते हैं; यह भुगतान साबित नहीं करती। कॉलबैक प्रमाणित करें और हर invoice_id पर invoice.settled एक बार पूरा करें।विवरण
मर्चेंट मेटाडेटा। सार्वजनिक चेकआउट कभी नहीं लौटाता। कंसोल भुगतान टूल payment_tool स्रोत जानकारी (id, kind, title, pricing, requested_amount, request_id) जोड़ते हैं; यह भुगतान साबित नहीं करती। कॉलबैक प्रमाणित करें और हर invoice_id पर invoice.settled एक बार पूरा करें।
payment_intents[]object[]हमेशा
कोट किए भुगतान तरीके और निगरानी स्थिति।
payment_railonchain | lightningहमेशाइनवॉइस ट्रांसपोर्ट। Bitcoin ऑन-चेन और Lightning समान asset_id साझा कर सकते हैं; केवल प्रतीक नहीं, इंटेंट id के साथ यह फ़ील्ड इस्तेमाल करें। यह एसेट कैटलॉग के स्कैनर payment_rail से अलग है।विवरण
इनवॉइस ट्रांसपोर्ट। Bitcoin ऑन-चेन और Lightning समान asset_id साझा कर सकते हैं; केवल प्रतीक नहीं, इंटेंट id के साथ यह फ़ील्ड इस्तेमाल करें। यह एसेट कैटलॉग के स्कैनर payment_rail से अलग है।
bolt11string | nullहमेशाLightning भुगतान अनुरोध, वरना null। यह अनुरोध Lightning वॉलेट से चुकाएँ; इसके payment hash पर कभी ऑन-चेन फंड न भेजें।
asset_decimalsintegerहमेशापरमाणु इकाई सटीकता। Lightning BTC में 11 (millisatoshi), ऑन-चेन Bitcoin के 8 नहीं। कोट पूरे satoshi में हैं; प्राप्तियाँ millisatoshi सटीकता रखती हैं।
quote_ratedecimal stringहमेशालॉक स्प्रेड सहित इनवॉइस मुद्रा की एक इकाई के प्रति एसेट इकाइयाँ। जैसे प्रति USD 1.02 USDC। उलटी दर नहीं।
quote_detailsobject | nullहमेशालॉक कोट का स्रोत विवरण: स्प्रेड से पहले reference_rate, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at और asset_fetched_at। पुराने इनवॉइस में null; ऐतिहासिक मान गढ़े नहीं जाते।विवरण
लॉक कोट का स्रोत विवरण: स्प्रेड से पहले reference_rate, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at और asset_fetched_at। पुराने इनवॉइस में null; ऐतिहासिक मान गढ़े नहीं जाते।
expected_amountdecimal stringहमेशास्प्रेड और ऊपर की राउंडिंग के बाद चुकाने की सटीक लॉक एसेट राशि। 4.1.1 से पहचाने सत्यापित फ़िएट स्टेबलकॉइन (जैसे USDC, USDT, DAI, USDS, EURC) अधिकतम दो दशमलव तक ऊपर राउंड होते हैं; 1.321 से 1.33 होता है, कभी 1.32 नहीं। शून्य सहनशीलता पर भी यही अपेक्षित राशि है। अन्य एसेट अनुकूलित सटीकता रखते हैं। मौजूदा इनवॉइस की कीमत कभी दोबारा नहीं तय होती।विवरण
स्प्रेड और ऊपर की राउंडिंग के बाद चुकाने की सटीक लॉक एसेट राशि। 4.1.1 से पहचाने सत्यापित फ़िएट स्टेबलकॉइन (जैसे USDC, USDT, DAI, USDS, EURC) अधिकतम दो दशमलव तक ऊपर राउंड होते हैं; 1.321 से 1.33 होता है, कभी 1.32 नहीं। शून्य सहनशीलता पर भी यही अपेक्षित राशि है। अन्य एसेट अनुकूलित सटीकता रखते हैं। मौजूदा इनवॉइस की कीमत कभी दोबारा नहीं तय होती।
minimum_payment_amountdecimal stringहमेशाइनवॉइस सहनशीलता लागू करने के बाद paid मानी जाने वाली न्यूनतम राशि।
destination_addressstringहमेशाऑन-चेन प्राप्ति पता या Lightning का 64-अक्षर payment hash। Lightning भुगतान के लिए bolt11 इस्तेमाल करें; उसका हैश Bitcoin पता नहीं है।
destination_tagstring | nullहमेशाजहाँ प्रणाली इस्तेमाल करती हो, ज़रूरी सार्वजनिक भुगतान संदर्भ: XRP destination tag, Stellar memo ID या TON इनवॉइस टिप्पणी। विशिष्ट-पते वाली प्रणालियों में null।
उपयोग संबंधी नोट
- सीमित-दायरे का लुकअप जानबूझकर invoice_not_found लौटाता है जब सार्वजनिक ID अधिकृत प्रोजेक्ट में न हो।
- links.checkout दुकान → मूल → दुकान डोमेन इस्तेमाल करता है: इस दुकान का सक्रिय pay होस्टनाम, फिर उसकी डिफ़ॉल्ट दुकान का चयन, फिर सिस्टम प्राथमिक। हटे/ड्राफ़्ट या गलत-सेवा होस्ट अनदेखे होते हैं। निर्माण और MCP जवाब पर भी यही लागू; इडेम्पोटेंट रीप्ले सहित जवाब के समय लिंक तय होते हैं। हस्ताक्षरित कॉलबैक लिंक इवेंट निर्माण पर स्थिर होते हैं, पुनः प्रयास पर नहीं बदले जाते। ये प्राथमिकताएँ केवल लिंक बनाती हैं; ट्रैफ़िक रीडायरेक्ट या IP प्रतिबंध नहीं बदलतीं।
त्रुटियाँ
GETइनवॉइस के भुगतानों की सूची पाएँ/v1/projects/{project_id}/invoices/{invoice_id}/paymentsकेवल पढ़ना
पूरा वर्तमान ट्रांसफ़र इतिहास, अमान्य अवलोकनों सहित। कॉलबैक payments_truncated चिह्नित करे तो इसे लें। यह वर्तमान स्थिति है, पुराने इवेंट का पुनर्निर्माण नहीं।
प्रमाणीकरण और हेडर
| हेडर | उपस्थिति | नियम |
|---|---|---|
| Authorization | ज़रूरी | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | सुझाया गया | application/json |
पथ पैरामीटर
क्वेरी पैरामीटर
अनुरोध
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID/payments?limit=25&offset=0" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Accept: application/json'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID/payments?limit=25&offset=0", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
"Accept": "application/json"
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID/payments?limit=25&offset=0");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Accept: application/json"],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Accept": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/invoices/YOUR_PUBLIC_INVOICE_ID/payments?limit=25&offset=0",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"invoice_id": "11111111-2222-4333-8444-555555555555",
"data": [{
"payment_id": "44444444-4444-4444-8444-444444444444",
"payment_method_id": "33333333-3333-4333-8333-333333333333",
"transaction_id": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"payment_hash": null,
"event_index": 12,
"payment_rail": "onchain",
"chain_slug": "ethereum",
"network": "mainnet",
"asset_id": "55555555-5555-4555-8555-555555555555",
"asset_key": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"caip_asset_id": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"symbol": "USDC",
"asset_decimals": 6,
"amount": "58.17342",
"amount_atomic": "58173420",
"status": "final",
"counts_towards_received": true,
"confirmations": 2,
"block_height": 25975377,
"observed_at": "2026-09-14T12:03:00Z",
"chain_time": "2026-09-14T12:02:48Z",
"finalized_at": "2026-09-14T12:04:00Z",
"explorer_name": "Etherscan",
"explorer_url": "https://etherscan.io/tx/0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}],
"pagination": {"limit": 25, "offset": 0, "total": 1, "has_more": false}
}जवाब फ़ील्ड
invoice_idstringdata[]object[]
payment_idstringpayment_method_idstringtransaction_idstringpayment_hashJSON | nullevent_indexintegerpayment_railstringchain_slugstringnetworkstringasset_idstringasset_keystringcaip_asset_idstringsymbolstringasset_decimalsintegeramountstringamount_atomicstringstatusstringcounts_towards_receivedbooleanconfirmationsintegerblock_heightintegerobserved_atstringchain_timestringfinalized_atstringexplorer_namestringexplorer_urlstringउपयोग संबंधी नोट
- अवलोकन टोकन लॉग, UTXO आउटपुट या दूसरी प्रणाली का ट्रांसफ़र है, ज़रूरी नहीं कि विशिष्ट लेनदेन हैश हो। payment_id से डुप्लिकेट हटाएँ; transaction_id और event_index चेन ट्रांसफ़र पहचानते हैं।
- status detected, confirming, final, reorged, replaced या invalid है। केवल counts_towards_received अवलोकन प्राप्त राशि में जुड़ते हैं। अलग एसेट की राशियाँ कभी न जोड़ें।
- Lightning रिकॉर्ड null transaction_id, confirmations और एक्सप्लोरर लिंक के साथ payment_hash इस्तेमाल करते हैं; BTC सटीकता 11 (millisatoshi) है। प्रीइमेज, BOLT11 या वॉलेट सीक्रेट नहीं दिखते।
- observed_at घटते क्रम में, फिर payment_id घटते क्रम में। संख्या और पृष्ठ एक repeatable-read स्नैपशॉट इस्तेमाल करते हैं; भुगतान आने पर आगे के पृष्ठ बदल सकते हैं। लाइव इनवॉइस के पृष्ठ लेते समय payment_id से डुप्लिकेट हटाएँ।
- मौजूदा केवल-पढ़ने का प्रोजेक्ट दायरा, IP प्रतिबंध और प्रति-क्रेडेंशियल रेट लिमिट लागू हैं। टोकन के साथ कॉलबैक लिंक कभी न खोलें जब तक उसका origin आपके कॉन्फ़िगर API होस्ट से मेल न खाए।
त्रुटियाँ
GETचेकआउट ढाँचा/सार्वजनिक
प्रबंधित चेकआउट-होस्ट रूट जो इनवॉइस चुने बिना चेकआउट एप्लिकेशन देता है। ग्राहक इंटीग्रेशन को आम तौर पर links.checkout इस्तेमाल करना चाहिए।
प्रमाणीकरण और हेडर
सार्वजनिक
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/" \
--output 'checkout.html'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("checkout.html", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("checkout.html", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("checkout.html").write_bytes(response.read())जवाब 200 text/html
उदाहरण जवाब
<!doctype html>
<!-- Hosted Wholly Crypto checkout shell -->उपयोग संबंधी नोट
- Bearer टोकन की ज़रूरत नहीं।
- प्रबंधित चेकआउट एज GET/HEAD स्वीकार करता है और अन्य मेथड अस्वीकार करता है।
त्रुटियाँ
GETहोस्टेड चेकआउट पृष्ठ/invoice/{invoice_id}सार्वजनिक
ग्राहक को दिखने वाला HTML चेकआउट। पृष्ठ उसी चेकआउट होस्ट से चेकआउट-सुरक्षित JSON लेता है। एम्बेडिंग तब तक बंद है जब तक दुकान सक्षम करके मूल HTTPS origin की स्पष्ट अनुमति न दे।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/invoice/YOUR_PUBLIC_INVOICE_ID" \
--output 'checkout.html'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/invoice/YOUR_PUBLIC_INVOICE_ID", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("checkout.html", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/invoice/YOUR_PUBLIC_INVOICE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("checkout.html", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/invoice/YOUR_PUBLIC_INVOICE_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("checkout.html").write_bytes(response.read())जवाब 200 text/html
उदाहरण जवाब
<!doctype html>
<!-- Hosted Wholly Crypto checkout application -->उपयोग संबंधी नोट
- Bearer टोकन न स्वीकार है, न ज़रूरी।
- इनवॉइस अनुपस्थित होने पर भी HTML ढाँचा 200 लौटाता है; उसके चेकआउट JSON अनुरोध को फिर invoice_not_found मिलता है।
- जवाब no-store, noindex है और इसमें इनवॉइस-विशिष्ट frame-ancestors CSP है।
- बंद प्रोजेक्ट/दुकान या अज्ञात इनवॉइस चेकआउट डेटा नहीं दिखाता।
त्रुटियाँ
GETचेकआउट में सुरक्षित इनवॉइस/checkout-api/invoices/{invoice_id}सार्वजनिक
केवल चेकआउट दिखाने के ज़रूरी फ़ील्ड लौटाता है। जानबूझकर आंतरिक ID, ग्राहक ईमेल और निकले पता फ़ील्ड, IPN URL, मर्चेंट मेटाडेटा, वॉलेट ID, derivation पथ और मॉनिटर निदान छोड़ता है।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID" \
--header 'Accept: application/json'// Node.js 18+ · run on your server, never in browser code.
const response = await fetch("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID", {
method: "GET",
headers: {
"Accept": "application/json"
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ["Accept: application/json"],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Accept": "application/json"
}
request = Request("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"invoice_id": "0a6a98db-d93d-48ee-8c3c-fd45f90c4a50",
"order_id": "order-1042",
"description": "Annual plan",
"amount": "49.9",
"currency": "USD",
"exchange_rate_spread_percent": "0.5",
"underpayment_tolerance_percent": "1",
"status": "processing",
"amount_status": "partial",
"timing_status": "on_time",
"sequence": 3,
"active_payment_method_id": "33333333-3333-4333-8333-333333333333",
"payment_method_locked": true,
"server_time": "2026-08-31T18:10:00Z",
"expires_at": "2026-08-31T18:15:00Z",
"expires_in_seconds": 300,
"payment_open": true,
"redirect_url": "https://merchant.example/orders/1042",
"cancel_url": "https://merchant.example/cart",
"redirect_automatically": true,
"checkout_language": "en",
"project": {
"name": "Example project",
"checkout_title": "Complete your payment",
"checkout_description": "Send the exact amount shown.",
"theme": "system",
"accent_color": "#42e39b",
"logo_url": "/checkout-api/invoices/…/logo/…/image.png"
},
"store": { "name": "Online shop" },
"payment_methods": [
{
"id": "33333333-3333-4333-8333-333333333333",
"asset_key": "bip122:000000000019d6689c085ae165831e93/slip44:0",
"chain_slug": "bitcoin",
"chain_name": "Bitcoin",
"network": "mainnet",
"caip_network_id": "bip122:000000000019d6689c085ae165831e93",
"caip_asset_id": "bip122:000000000019d6689c085ae165831e93/slip44:0",
"asset_name": "Bitcoin",
"symbol": "BTC",
"asset_icon_url": "/assets/coingecko/bitcoin.png",
"asset_kind": "native",
"contract_address": null,
"token_standard": null,
"asset_decimals": 8,
"status": "partial",
"payable": true,
"finality_mode": "confirmations",
"required_confirmations": 1,
"expected_amount": "0.00046",
"expected_amount_atomic": "46000",
"minimum_payment_amount": "0.0004554",
"minimum_payment_amount_atomic": "45540",
"received_amount": "0.0002",
"received_amount_atomic": "20000",
"remaining_amount": "0.0002554",
"remaining_amount_atomic": "25540",
"confirmed_amount": "0",
"confirmed_amount_atomic": "0",
"destination_address": "bc1q…example",
"destination_tag": null,
"quote_expires_at": "2026-08-31T18:15:00Z",
"payment_uri": "bitcoin:bc1q…example?amount=0.00026",
"qr_url": "/checkout-api/invoices/…/payment-methods/…/qr.svg?sequence=3&amount_atomic=26000",
"address_explorer_name": "mempool.space",
"address_explorer_url": "https://mempool.space/address/…",
"transaction_count": 0,
"transactions_truncated": false,
"transactions": []
}
]
}
}जवाब फ़ील्ड
dataobject
exchange_rate_spread_percentdecimal stringहमेशानिर्माण पर लॉक प्रभावी कोट स्प्रेड, प्रति-इनवॉइस ओवरराइड सहित।
amount_statusamount statusहमेशाnone, partial, paid या overpaid। स्पष्ट अनुमति वाला शून्य-राशि इनवॉइस none और बिना भुगतान तरीकों के निपटता है।
active_payment_method_idUUID | nullहमेशासूचीबद्ध भुगतान तरीका जिसे फंड मिले हैं। चेकआउट इसी तरीके पर रहता है ताकि कम भुगतान असंगत एसेट से आगे न भरा जाए।
server_timeRFC 3339 timestampहमेशाइस जवाब के लिए कैप्चर सर्वर घड़ी; ग्राहक डिवाइस की गलत घड़ी से बचने के लिए expires_at के साथ इस्तेमाल करें।
payment_openbooleanहमेशाकेवल तब True जब new या processing इनवॉइस अपनी समय-सीमा से पहले हो और कम-से-कम एक भुगतान योग्य तरीके में राशि बाकी हो।
projectobjectहमेशा
name, checkout_title, checkout_description, theme, accent_color और logo_url।
appearanceobjectहमेशा
प्रभावी प्रस्तुति: देने पर स्थिर प्रति-इनवॉइस ओवरराइड, वरना दुकान का वर्तमान डिज़ाइन। वित्तीय फ़ील्ड या सुरक्षा चेतावनियाँ कभी नहीं बदलती।
inherit_default_storebooleanहमेशाप्रोजेक्ट की डिफ़ॉल्ट दुकान यह रूप-रंग देती हो तो True। स्वतंत्र दुकान और स्थिर इनवॉइस ओवरराइड के लिए False।
invoice_overridebooleanहमेशाइनवॉइस निर्माण पर checkout_appearance दिया हो तो True। अनुपस्थित/null पर false रहता है।
titlestringहमेशासादा मर्चेंट शीर्षक, ऊपर और नीचे का संदेश। intro, customer_message की जगह लेता है; पुरानी सहेजी प्रति बनी रहती है। कभी मार्कअप की तरह न चलाएँ।
introstringहमेशासादा मर्चेंट शीर्षक, ऊपर और नीचे का संदेश। intro, customer_message की जगह लेता है; पुरानी सहेजी प्रति बनी रहती है। कभी मार्कअप की तरह न चलाएँ।
outrostringहमेशासादा मर्चेंट शीर्षक, ऊपर और नीचे का संदेश। intro, customer_message की जगह लेता है; पुरानी सहेजी प्रति बनी रहती है। कभी मार्कअप की तरह न चलाएँ।
customer_messagestringहमेशाintro का पुराना, अब हतोत्साहित संगतता उपनाम। नए इंटीग्रेशन में intro इस्तेमाल करें।
accent_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
background_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
card_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
button_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
logo_alignmentstringहमेशाsmall, medium या large; left या center। चित्र पूरे समाते हैं, काटे नहीं जाते।
imagesobjectहमेशावैकल्पिक logo_light, logo_dark और favicon URL: सीमित-दायरे के, समान-origin सामान्यीकृत PNG चित्र।
show_order_idbooleanहमेशाऑर्डर ID की दृश्यता, शीर्षक के नीचे विवरण और शुरुआत में ऑर्डर ID खोलना। राशि दिखती रहती है; ये प्रदर्शन नियंत्रण हैं, डेटा छिपाना नहीं।
show_descriptionbooleanहमेशाऑर्डर ID की दृश्यता, शीर्षक के नीचे विवरण और शुरुआत में ऑर्डर ID खोलना। राशि दिखती रहती है; ये प्रदर्शन नियंत्रण हैं, डेटा छिपाना नहीं।
details_expandedbooleanहमेशाऑर्डर ID की दृश्यता, शीर्षक के नीचे विवरण और शुरुआत में ऑर्डर ID खोलना। राशि दिखती रहती है; ये प्रदर्शन नियंत्रण हैं, डेटा छिपाना नहीं।
show_project_namebooleanहमेशाMerchant 5.6.0+: हेडर नाम की दृश्यता। दोनों डिफ़ॉल्ट true। प्रोजेक्ट/दुकान पहचान JSON में उपलब्ध रहती है।
show_store_namebooleanहमेशाMerchant 5.6.0+: हेडर नाम की दृश्यता। दोनों डिफ़ॉल्ट true। प्रोजेक्ट/दुकान पहचान JSON में उपलब्ध रहती है।
featured_chains[]arrayहमेशाक्रमबद्ध प्राथमिकताएँ, केवल इनवॉइस में पहले से मौजूद तरीकों पर लागू। अनुपस्थित या बंद तरीके अनदेखे होते हैं।
featured_asset_ids[]arrayहमेशाक्रमबद्ध प्राथमिकताएँ, केवल इनवॉइस में पहले से मौजूद तरीकों पर लागू। अनुपस्थित या बंद तरीके अनदेखे होते हैं।
default_asset_idUUID | nullहमेशासुझाया शुरुआती तरीका। ग्राहक की याद रखी वैध प्राथमिकता या पहले फंड पा रहा तरीका प्राथमिक है।
messagesobjectहमेशा
en, de, es, pt-BR, it, ru, zh-CN, fr, ko और ja के लिए सादा टेक्स्ट, waiting, confirming, paid, underpaid और expired कुंजियों से। मर्चेंट संदेश न मिलने पर अंग्रेज़ी फ़ॉलबैक। पूरक; वास्तविक स्थिति कभी नहीं बदलता। मर्चेंट-लिखित सामग्री अपने आप अनूदित नहीं होती।विवरण
en, de, es, pt-BR, it, ru, zh-CN, fr, ko और ja के लिए सादा टेक्स्ट, waiting, confirming, paid, underpaid और expired कुंजियों से। मर्चेंट संदेश न मिलने पर अंग्रेज़ी फ़ॉलबैक। पूरक; वास्तविक स्थिति कभी नहीं बदलता। मर्चेंट-लिखित सामग्री अपने आप अनूदित नहीं होती।
support_emailstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
support_urlstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
terms_urlstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
privacy_urlstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
return_button_textstringहमेशाकेवल वैकल्पिक लेबल। सफलता/रद्द लक्ष्य और रीडायरेक्ट नीति अब भी इनवॉइस की हैं।
show_return_buttonbooleanहमेशामैन्युअल वापसी/रद्द बटन की दृश्यता; डिफ़ॉल्ट true। सक्रिय और अंतिम स्थितियों पर लागू, स्वचालित सफलता रीडायरेक्ट पर नहीं। मर्चेंट 8.1.4 से उपलब्ध।
payment_methods[]object[]हमेशा
चेकआउट-सुरक्षित भुगतान तरीके।
payment_railonchain | lightningहमेशाLightning, Bitcoin तरीका ही है, ऑन-चेन BTC से अलग। चयन की पहचान इंटेंट id और प्रणाली से करें, केवल asset_id से नहीं।
bolt11string | nullहमेशाहस्ताक्षरित Lightning अनुरोध; ऑन-चेन तरीकों में null। payable false होने के बाद कभी भुगतान न करें।
payment_hashstring | nullहमेशामिलान के लिए Lightning payment hash, प्राप्ति पता नहीं। ऑन-चेन तरीकों में null।
caip_asset_idstring | nullहमेशाकैनॉनिकल सटीक एसेट पहचान, लागू हो तो सत्यापित टोकन कॉन्ट्रैक्ट या मिंट सहित।
asset_icon_urlstring | nullहमेशासमान-origin स्थानीय कैश एसेट आइकन या सत्यापित CoinGecko मैपिंग न हो तो null।
contract_addressstring | nullहमेशाटोकन का कैनॉनिकल ERC-20 कॉन्ट्रैक्ट या SPL मिंट; नेटिव मुद्रा में null।
asset_decimalsintegerहमेशापरमाणु इकाई सटीकता: Lightning BTC millisatoshi के लिए 11, ऑन-चेन BTC satoshi के लिए 8।
payablebooleanहमेशाकेवल तब True जब यही तरीका अभी भुगतान स्वीकार कर सकता हो; दूसरे एसेट को फंड मिलने के बाद निष्क्रिय तरीकों में false।
expected_amountdecimalहमेशाप्रदर्शन और वास्तविक ऑन-चेन इकाइयों में पूरा लॉक कोट। पहचाने फ़िएट स्टेबलकॉइन अधिकतम दो कोट दशमलव इस्तेमाल करते हैं, स्प्रेड के बाद हमेशा ऊपर राउंड; दूसरे एसेट अनुकूलित सटीकता रखते हैं। वास्तविक टोकन दशमलव, प्राप्त फंड और आंशिक-भुगतान शेष सटीक रहते हैं। लौटी राशियाँ बिना बदलाव इस्तेमाल करें।विवरण
प्रदर्शन और वास्तविक ऑन-चेन इकाइयों में पूरा लॉक कोट। पहचाने फ़िएट स्टेबलकॉइन अधिकतम दो कोट दशमलव इस्तेमाल करते हैं, स्प्रेड के बाद हमेशा ऊपर राउंड; दूसरे एसेट अनुकूलित सटीकता रखते हैं। वास्तविक टोकन दशमलव, प्राप्त फंड और आंशिक-भुगतान शेष सटीक रहते हैं। लौटी राशियाँ बिना बदलाव इस्तेमाल करें।
expected_amount_atomicinteger stringहमेशाप्रदर्शन और वास्तविक ऑन-चेन इकाइयों में पूरा लॉक कोट। पहचाने फ़िएट स्टेबलकॉइन अधिकतम दो कोट दशमलव इस्तेमाल करते हैं, स्प्रेड के बाद हमेशा ऊपर राउंड; दूसरे एसेट अनुकूलित सटीकता रखते हैं। वास्तविक टोकन दशमलव, प्राप्त फंड और आंशिक-भुगतान शेष सटीक रहते हैं। लौटी राशियाँ बिना बदलाव इस्तेमाल करें।विवरण
प्रदर्शन और वास्तविक ऑन-चेन इकाइयों में पूरा लॉक कोट। पहचाने फ़िएट स्टेबलकॉइन अधिकतम दो कोट दशमलव इस्तेमाल करते हैं, स्प्रेड के बाद हमेशा ऊपर राउंड; दूसरे एसेट अनुकूलित सटीकता रखते हैं। वास्तविक टोकन दशमलव, प्राप्त फंड और आंशिक-भुगतान शेष सटीक रहते हैं। लौटी राशियाँ बिना बदलाव इस्तेमाल करें।
minimum_payment_amount_atomicinteger stringहमेशाकम-भुगतान सहनशीलता लगाने के बाद स्वीकृत निपटान सीमा।
remaining_amountdecimal stringहमेशास्वीकृत सीमा तक पहुँचने के लिए बाकी सटीक प्रदर्शन राशि, न्यूनतम शून्य।
remaining_amount_atomicinteger stringहमेशापरमाणु इकाइयों में स्वीकृत सीमा तक कमी। यह माँगी भुगतान राशि नहीं: सहनशीलता केवल स्वीकृति प्रभावित करती है।
destination_addressstringहमेशाऑन-चेन गंतव्य और वैकल्पिक संदर्भ। Lightning में यह बिना टैग payment hash है; इसके बजाय bolt11/payment_uri चुकाएँ।
destination_tagstring|nullहमेशाऑन-चेन गंतव्य और वैकल्पिक संदर्भ। Lightning में यह बिना टैग payment hash है; इसके बजाय bolt11/payment_uri चुकाएँ।
payment_uristring | nullहमेशाचेन-अनुकूल अनुरोध: ERC-681, Solana Pay, नेटिव URI या lightning:<bolt11>। राशि वाले अनुरोध पूरी अपेक्षित राशि में से प्राप्त फंड घटाते हैं, सहनशीलता सीमा कभी नहीं। payable false होने पर null, सहनशील कमी स्वीकार होने के बाद भी। Lightning QR पूरा Lightning अनुरोध एन्कोड करता है, payment hash नहीं।विवरण
चेन-अनुकूल अनुरोध: ERC-681, Solana Pay, नेटिव URI या lightning:<bolt11>। राशि वाले अनुरोध पूरी अपेक्षित राशि में से प्राप्त फंड घटाते हैं, सहनशीलता सीमा कभी नहीं। payable false होने पर null, सहनशील कमी स्वीकार होने के बाद भी। Lightning QR पूरा Lightning अनुरोध एन्कोड करता है, payment hash नहीं।
qr_urlpath | nullहमेशाsequence और सटीक शेष के संशोधन वाला समान-origin SVG QR पथ या payable false होने पर null। SVG no-store है।
transactions[]object[]हमेशा
अधिकतम 10 हाल के सार्वजनिक वैध लेनदेन। सटीक प्राप्त कुल इस प्रदर्शन सीमा से स्वतंत्र रहते हैं।
उपयोग संबंधी नोट
- Bearer टोकन की ज़रूरत नहीं।
- Cache-Control no-store है और खोज इंडेक्सिंग बंद है।
- invoice_id को ग्राहक-पक्ष पहुँच देने वाला डेटा मानें; अनावश्यक रूप से प्रकाशित न करें।
- asset_icon_url समान-origin स्थानीय संसाधन है; दिखाने के लिए ग्राहक चेकआउट को CoinGecko से कभी संपर्क नहीं चाहिए।
- destination_tag गैर-null हो तो पते के पास दिखाएँ और कॉपी करें: यह ज़रूरी XRP destination tag, Stellar memo ID या TON इनवॉइस टिप्पणी है और बिल्कुल सही भेजना चाहिए।
- सत्यापित टोकन में asset_kind token है, contract_address सटीक ERC-20 कॉन्ट्रैक्ट या SPL मिंट पहचानता है, token_standard प्रणाली बताता है और payment_uri वह टोकन पहचान रखता है।
त्रुटियाँ
GETदुकान के चेकआउट का पूर्वावलोकन/invoice/preview/{project_id}सार्वजनिक
उदाहरण राशि और वास्तविक स्वीकृत-एसेट मेटाडेटा के साथ सहेजा दुकान रूप-रंग दिखाता है। भुगतान बनाए बिना waiting, confirming, paid, underpaid और expired उदाहरण बदलें।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
क्वेरी पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/invoice/preview/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID&state=confirming" \
--output 'checkout-preview.html'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/invoice/preview/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID&state=confirming", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("checkout-preview.html", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/invoice/preview/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID&state=confirming");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("checkout-preview.html", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/invoice/preview/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID&state=confirming",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("checkout-preview.html").write_bytes(response.read())जवाब 200 text/html
उदाहरण जवाब
<!doctype html>
<!-- Hosted branding preview; no invoice is created -->उपयोग संबंधी नोट
- पूर्वावलोकन केवल ब्रांडिंग के लिए है और ग्राहक को भुगतान अनुरोध बनाकर कभी नहीं भेजना चाहिए।
- प्राप्ति पता, भुगतान योग्य QR, वॉलेट कार्रवाई, रीडायरेक्ट या भुगतान पोलिंग नहीं। उदाहरण वास्तविक इनवॉइस स्थिति नहीं बदलते।
- जवाब no-store, noindex है और एम्बेड नहीं किया जा सकता।
त्रुटियाँ
GETचेकआउट पूर्वावलोकन डेटा/checkout-api/previews/{project_id}सार्वजनिक
प्रभावी दुकान रूप-रंग और सुरक्षित स्वीकृत-एसेट मेटाडेटा लौटाता है। payment_methods खाली रहता है; preview_methods में भुगतान पते, कोट या निजी वॉलेट डेटा नहीं होते।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
क्वेरी पैरामीटर
store_idUUID,वैकल्पिकइस प्रोजेक्ट का होना चाहिए; बेमेल ID पर 404। अज्ञात क्वेरी फ़ील्ड अस्वीकार हैं।
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID" \
--header 'Accept: application/json'// Node.js 18+ · run on your server, never in browser code.
const response = await fetch("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID", {
method: "GET",
headers: {
"Accept": "application/json"
},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ["Accept: application/json"],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {
"Accept": "application/json"
}
request = Request("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID?store_id=YOUR_STORE_ID",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))जवाब 200 application/json
उदाहरण जवाब
{
"data": {
"preview": true,
"invoice_id": "YOUR_PROJECT_ID",
"amount": "100.00",
"currency": "USD",
"project": {
"name": "Example project",
"checkout_title": "Complete your payment",
"checkout_description": "Choose a network and send the exact amount shown.",
"theme": "system",
"accent_color": "#42e39b",
"logo_url": "/checkout-api/previews/…/logo/…/image.png"
},
"appearance": {"inherit_default_store": true, "theme": "system", "accent_color": "#42E39B", "images": {}},
"preview_methods": [],
"payment_methods": []
}
}जवाब फ़ील्ड
dataobject
previewbooleaninvoice_idstringamountstringcurrencystringprojectobject
appearanceobject
inherit_default_storebooleanहमेशाप्रोजेक्ट की डिफ़ॉल्ट दुकान यह रूप-रंग देती हो तो True। स्वतंत्र दुकान और स्थिर इनवॉइस ओवरराइड के लिए False।
invoice_overridebooleanहमेशाइनवॉइस निर्माण पर checkout_appearance दिया हो तो True। अनुपस्थित/null पर false रहता है।
titlestringहमेशासादा मर्चेंट शीर्षक, ऊपर और नीचे का संदेश। intro, customer_message की जगह लेता है; पुरानी सहेजी प्रति बनी रहती है। कभी मार्कअप की तरह न चलाएँ।
introstringहमेशासादा मर्चेंट शीर्षक, ऊपर और नीचे का संदेश। intro, customer_message की जगह लेता है; पुरानी सहेजी प्रति बनी रहती है। कभी मार्कअप की तरह न चलाएँ।
outrostringहमेशासादा मर्चेंट शीर्षक, ऊपर और नीचे का संदेश। intro, customer_message की जगह लेता है; पुरानी सहेजी प्रति बनी रहती है। कभी मार्कअप की तरह न चलाएँ।
customer_messagestringहमेशाintro का पुराना, अब हतोत्साहित संगतता उपनाम। नए इंटीग्रेशन में intro इस्तेमाल करें।
accent_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
background_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
card_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
button_colorstringहमेशासख़्त #RRGGBB रंग। स्वचालित मानों के लिए वैकल्पिक रंग खाली; अग्रभूमि कंट्रास्ट की गणना होती है।
logo_alignmentstringहमेशाsmall, medium या large; left या center। चित्र पूरे समाते हैं, काटे नहीं जाते।
imagesobjectहमेशावैकल्पिक logo_light, logo_dark और favicon URL: सीमित-दायरे के, समान-origin सामान्यीकृत PNG चित्र।
show_order_idbooleanहमेशाऑर्डर ID की दृश्यता, शीर्षक के नीचे विवरण और शुरुआत में ऑर्डर ID खोलना। राशि दिखती रहती है; ये प्रदर्शन नियंत्रण हैं, डेटा छिपाना नहीं।
show_descriptionbooleanहमेशाऑर्डर ID की दृश्यता, शीर्षक के नीचे विवरण और शुरुआत में ऑर्डर ID खोलना। राशि दिखती रहती है; ये प्रदर्शन नियंत्रण हैं, डेटा छिपाना नहीं।
details_expandedbooleanहमेशाऑर्डर ID की दृश्यता, शीर्षक के नीचे विवरण और शुरुआत में ऑर्डर ID खोलना। राशि दिखती रहती है; ये प्रदर्शन नियंत्रण हैं, डेटा छिपाना नहीं।
show_project_namebooleanहमेशाMerchant 5.6.0+: हेडर नाम की दृश्यता। दोनों डिफ़ॉल्ट true। प्रोजेक्ट/दुकान पहचान JSON में उपलब्ध रहती है।
show_store_namebooleanहमेशाMerchant 5.6.0+: हेडर नाम की दृश्यता। दोनों डिफ़ॉल्ट true। प्रोजेक्ट/दुकान पहचान JSON में उपलब्ध रहती है।
featured_chains[]arrayहमेशाक्रमबद्ध प्राथमिकताएँ, केवल इनवॉइस में पहले से मौजूद तरीकों पर लागू। अनुपस्थित या बंद तरीके अनदेखे होते हैं।
featured_asset_ids[]arrayहमेशाक्रमबद्ध प्राथमिकताएँ, केवल इनवॉइस में पहले से मौजूद तरीकों पर लागू। अनुपस्थित या बंद तरीके अनदेखे होते हैं।
default_asset_idUUID | nullहमेशासुझाया शुरुआती तरीका। ग्राहक की याद रखी वैध प्राथमिकता या पहले फंड पा रहा तरीका प्राथमिक है।
messagesobjectहमेशा
en, de, es, pt-BR, it, ru, zh-CN, fr, ko और ja के लिए सादा टेक्स्ट, waiting, confirming, paid, underpaid और expired कुंजियों से। मर्चेंट संदेश न मिलने पर अंग्रेज़ी फ़ॉलबैक। पूरक; वास्तविक स्थिति कभी नहीं बदलता। मर्चेंट-लिखित सामग्री अपने आप अनूदित नहीं होती।विवरण
en, de, es, pt-BR, it, ru, zh-CN, fr, ko और ja के लिए सादा टेक्स्ट, waiting, confirming, paid, underpaid और expired कुंजियों से। मर्चेंट संदेश न मिलने पर अंग्रेज़ी फ़ॉलबैक। पूरक; वास्तविक स्थिति कभी नहीं बदलता। मर्चेंट-लिखित सामग्री अपने आप अनूदित नहीं होती।
support_emailstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
support_urlstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
terms_urlstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
privacy_urlstringहमेशावैकल्पिक संपर्क और HTTPS लिंक, URL क्रेडेंशियल के बिना। बाहरी लिंक नई विंडो में खुलते हैं।
return_button_textstringहमेशाकेवल वैकल्पिक लेबल। सफलता/रद्द लक्ष्य और रीडायरेक्ट नीति अब भी इनवॉइस की हैं।
show_return_buttonbooleanहमेशामैन्युअल वापसी/रद्द बटन की दृश्यता; डिफ़ॉल्ट true। सक्रिय और अंतिम स्थितियों पर लागू, स्वचालित सफलता रीडायरेक्ट पर नहीं। मर्चेंट 8.1.4 से उपलब्ध।
preview_methods[]arraypayment_methods[]arrayउपयोग संबंधी नोट
- Bearer टोकन न स्वीकार है, न ज़रूरी।
- इनवॉइस, गंतव्य, वॉलेट, लेनदेन, IPN, वेबहुक या मर्चेंट मेटाडेटा नहीं लौटता।
- सही pay-domain पूर्वावलोकन लिंक के लिए प्रमाणित कंसोल इस्तेमाल करें।
त्रुटियाँ
GETदुकान का चेकआउट चित्र/checkout-api/invoices/{invoice_id}/appearance-images/{kind}/{revision}/image.pngसार्वजनिक
इस इनवॉइस का सामान्यीकृत दुकान लोगो या फ़ेविकॉन लौटाता है। चेकआउट डेटा के appearance.images URL इस्तेमाल करें।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png" \
--output 'store-logo.png'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("store-logo.png", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("store-logo.png", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("store-logo.png").write_bytes(response.read())जवाब 200 image/png
उदाहरण जवाब
(binary PNG response)उपयोग संबंधी नोट
- चेकआउट JSON का appearance.images इस्तेमाल करें। स्रोत दुकान अपलोड बदले या हटाए तो भी स्थिर इनवॉइस चित्र काम करते हैं। स्पष्ट रूप से हटाए, गलत-इनवॉइस, गलत-kind और अज्ञात संशोधन 404 लौटाते हैं; स्नैपशॉट कभी वर्तमान दुकान चित्र पर फ़ॉलबैक नहीं करता।
- इनवॉइस ओवरराइड के बिना वर्तमान प्रभावी दुकान चित्र इस्तेमाल होता है और बदले/हटाए संशोधन 404 लौटाते हैं। केवल PNG, nosniff और निजी कैशिंग।
- दुकान चित्र अपलोड प्रमाणित कंसोल में सीमित PNG, JPEG या WebP स्वीकार करते हैं; SVG, HTML या रिमोट इमेज URL कभी नहीं।
त्रुटियाँ
GETदुकान का पूर्वावलोकन चित्र/checkout-api/previews/{project_id}/stores/{store_id}/appearance-images/{kind}/{revision}/image.pngसार्वजनिक
केवल मेल खाते प्रोजेक्ट, दुकान, kind और वर्तमान संशोधन के लिए सामान्यीकृत पूर्वावलोकन चित्र लौटाता है।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png" \
--output 'store-preview-logo.png'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("store-preview-logo.png", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("store-preview-logo.png", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/appearance-images/logo_light/YOUR_IMAGE_REVISION/image.png",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("store-preview-logo.png").write_bytes(response.read())जवाब 200 image/png
उदाहरण जवाब
(binary PNG response)उपयोग संबंधी नोट
- पूर्वावलोकन डेटा का appearance.images इस्तेमाल करें। अज्ञात या बेमेल ID पर 404। वॉलेट या भुगतान जानकारी नहीं दिखती।
त्रुटियाँ
GETसंस्करणयुक्त पूर्वावलोकन लोगो/checkout-api/previews/{project_id}/logo/{revision}/image.pngसार्वजनिक
केवल प्रोजेक्ट और कैश-सुरक्षित लोगो संशोधन मेल खाने पर सामान्यीकृत प्रोजेक्ट लोगो लौटाता है। यह URL बनाने के बजाय पूर्वावलोकन डेटा का project.logo_url इस्तेमाल करें।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/logo/YOUR_LOGO_REVISION/image.png" \
--output 'checkout-preview-logo.png'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/logo/YOUR_LOGO_REVISION/image.png", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("checkout-preview-logo.png", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/logo/YOUR_LOGO_REVISION/image.png");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("checkout-preview-logo.png", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/checkout-api/previews/YOUR_PROJECT_ID/logo/YOUR_LOGO_REVISION/image.png",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("checkout-preview-logo.png").write_bytes(response.read())जवाब 200 image/png
उदाहरण जवाब
(binary PNG response)उपयोग संबंधी नोट
- अज्ञात प्रोजेक्ट और पुराने लोगो संशोधन invoice_not_found लौटाते हैं, यह बताए बिना कि कौन-सा भाग अनुपस्थित था।
- सफल संस्करणयुक्त चित्र अपरिवर्तनीय है और कैश किया जा सकता है।
त्रुटियाँ
GETभुगतान QR चित्र/checkout-api/invoices/{invoice_id}/payment-methods/{intent_id}/qr.svgसार्वजनिक
इनवॉइस भुगतान तरीके के सटीक चेन-अनुकूल भुगतान पेलोड के लिए 512×512 SVG QR बनाता है।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/payment-methods/YOUR_INTENT_ID/qr.svg" \
--output 'payment-qr.svg'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/payment-methods/YOUR_INTENT_ID/qr.svg", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("payment-qr.svg", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/payment-methods/YOUR_INTENT_ID/qr.svg");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("payment-qr.svg", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/payment-methods/YOUR_INTENT_ID/qr.svg",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("payment-qr.svg").write_bytes(response.read())जवाब 200 image/svg+xml
उदाहरण जवाब
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">…</svg>उपयोग संबंधी नोट
- Bearer टोकन की ज़रूरत नहीं।
- चेकआउट JSON से लौटा sequence और शेष-संशोधन वाला qr_url इस्तेमाल करें; SVG निजी और no-store है।
- आंशिक भुगतान के बाद सटीक बाकी राशि माँगता है और उसी एसेट पर लॉक रहता है।
- समाप्ति, पूर्णता या दूसरा तरीका सक्रिय होने पर 409; अनुरोध एन्कोड करने के लिए बहुत बड़ा हो तो payment_qr_unavailable (422) लौटाता है।
त्रुटियाँ
GETसंस्करणयुक्त चेकआउट लोगो/checkout-api/invoices/{invoice_id}/logo/{revision}/image.pngसार्वजनिक
इनवॉइस और वर्तमान लोगो संशोधन मेल खाने पर ही सामान्यीकृत प्रोजेक्ट चेकआउट लोगो लौटाता है। रूट बनाने के बजाय चेकआउट JSON का project.logo_url लें।
प्रमाणीकरण और हेडर
सार्वजनिक
पथ पैरामीटर
अनुरोध
curl --fail-with-body --max-time 30 \
--request GET \
--url "https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/logo/YOUR_LOGO_REVISION/image.png" \
--output 'checkout-logo.png'// Node.js 18+ · run on your server, never in browser code.
import { writeFile } from "node:fs/promises";
const response = await fetch("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/logo/YOUR_LOGO_REVISION/image.png", {
method: "GET",
headers: {},
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
await writeFile("checkout-logo.png", Buffer.from(await response.arrayBuffer()));<?php
// PHP 8+ with the cURL extension; run on your server.
$ch = curl_init("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/logo/YOUR_LOGO_REVISION/image.png");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
file_put_contents("checkout-logo.png", $response);# Python 3 · standard library; run on your server.
import json
from pathlib import Path
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
headers = {}
request = Request("https://pay.example.com/checkout-api/invoices/YOUR_PUBLIC_INVOICE_ID/logo/YOUR_LOGO_REVISION/image.png",
method="GET", headers=headers)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
Path("checkout-logo.png").write_bytes(response.read())जवाब 200 image/png
उदाहरण जवाब
(binary PNG response)उपयोग संबंधी नोट
- Bearer टोकन की ज़रूरत नहीं।
- immutable के साथ सार्वजनिक कैश अवधि एक साल है क्योंकि संशोधन सामग्री-पते की स्थिति दर्शाता है।
- अज्ञात/बेमेल संशोधन invoice_not_found लौटाते हैं।
त्रुटियाँ
Wholly Crypto 8.3.2 का संदर्भ। अपने इंस्टॉल संस्करण के लिए कंसोल में सेटिंग → API पहुँच → दस्तावेज़ खोलें। रिलीज़ देखें.