เอกสารสำหรับนักพัฒนา
เอกสาร 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 IDs → Project API ID → คัดลอก โดยแสดงในแท็บพื้นฐานของร้านค้าด้วย | คำขอระดับโปรเจกต์และระดับร้านค้า |
| YOUR_STORE_ID | โปรเจกต์ → ร้านค้า → เลือกร้านค้า → พื้นฐาน → API IDs → Store API ID → คัดลอก | คำขอสร้างใบแจ้งหนี้และวิธีชำระเงินของร้านค้า |
- การสร้างใบแจ้งหนี้ต้องใช้ทั้งสอง ID แม้เป็นร้านค้าเริ่มต้น ร้านค้าต้องอยู่ในโปรเจกต์นั้น และข้อมูลรับรอง API ต้องมีสิทธิ์เข้าถึงโปรเจกต์
- การสร้าง แสดงรายการ ดูรายละเอียด และหน้าชำระเงินของใบแจ้งหนี้จะคืนค่า invoice_id ซึ่งเป็น UUID เดียวกับที่ส่งใน IPN/webhook ใช้ค่านี้ในพาธใบแจ้งหนี้ ไม่ใช่ id ภายในหรือ order_id ตั้งแต่ merchant 4.0.0 ฟิลด์ public_id เดิมในการตอบกลับถูกนำออกแล้ว ให้อัปเดตการเชื่อมต่อก่อนอัปเกรด
- REST API ไม่มีเส้นทางแสดงรายการโปรเจกต์/ร้านค้า ให้คัดลอก ID ในคอนโซล หรือใช้เครื่องมือ MCP list_projects และ list_stores ที่จำกัดขอบเขตสิทธิ์ใน merchant 5.0.0+
- ร้านค้า → พื้นฐาน → โดเมนร้านค้า ใช้เลือกโฮสต์เนม merchant, pay และ API ที่ใช้งานอยู่ ลิงก์หน้าชำระเงินที่คืนค่าและลิงก์ callback ใหม่จะเลือกร้านค้านั้นก่อน ตามด้วยร้านค้าเริ่มต้น แล้วจึงค่าเริ่มต้นของระบบ ชื่อที่เลิกใช้หรือยังไม่เปิดใช้จะไม่ถูกเลือก ตั้งค่า SDK ด้วยโฮสต์เนม API ที่ต้องการ การเปลี่ยนค่าที่เลือกไม่ได้เปลี่ยนเส้นทางชื่อแทนอื่นที่ยังใช้งานอยู่
การยืนยันตัวตนและขอบเขตสิทธิ์
เก็บข้อมูลรับรองไว้บนเซิร์ฟเวอร์ของคุณและให้สิทธิ์เท่าที่จำเป็นเท่านั้น
| โฮสต์เริ่มต้น | จุดประสงค์ |
|---|---|
| merchant.example.com | คอนโซลผู้ค้าและการตั้งค่า |
| pay.example.com | หน้าชำระเงินของลูกค้า |
| api.example.com | คำขอ API ของผู้ค้า |
แทนที่ example.com ด้วยโดเมนของคุณ ระบบที่ติดตั้งแล้วจะคงชื่อที่ตั้งไว้ จัดการชื่อแทนได้ใน การตั้งค่า → ระบบ
Authorization: Bearer YOUR_MERCHANT_API_TOKEN| การตั้งค่า | วิธีทำงาน |
|---|---|
| ระดับการเข้าถึง | ข้อมูลรับรองแบบอ่านอย่างเดียวแสดงรายการและดึงข้อมูลได้ แบบอ่าน/เขียนยังสร้างใบแจ้งหนี้และอัปเดตนโยบายสินทรัพย์ตามที่ระบุในเอกสารได้ด้วย |
| โปรเจกต์ | กำหนดโปรเจกต์ที่ข้อมูลรับรองเข้าถึงได้ ID ร้านค้าและใบแจ้งหนี้ต้องอยู่ในโปรเจกต์ที่กำหนด |
| ข้อจำกัด IP | เลือกอนุญาตที่อยู่ IPv4 หรือ IPv6 สาธารณะขาออกแบบตรงตัวได้ใน การตั้งค่า → การเข้าถึง API |
| การจัดเก็บข้อมูลรับรอง | เก็บโทเคนในการตั้งค่าแบ็กเอนด์ ห้ามใส่ข้อมูลรับรอง bearer ในเบราว์เซอร์หรือลิงก์หน้าชำระเงิน |
เส้นทางหน้าชำระเงินสาธารณะใช้ ID สาธารณะของใบแจ้งหนี้และเปิดเผยเฉพาะข้อมูลที่แสดงบนหน้าชำระเงินได้อย่างปลอดภัย เซสชันคอนโซลและส่วนควบคุมผู้ดูแลแยกจากข้อมูลรับรอง API ของผู้ค้า
สินทรัพย์และกระเป๋า
เลือกวิธีชำระเงินแยกกันสำหรับแต่ละร้านค้า
- อ่าน สินทรัพย์รับชำระของโปรเจกต์ และความพร้อมของแต่ละรายการ
- เปิดใช้เชนของเหรียญหลักและตั้งค่ากระเป๋ากับผู้ให้บริการ
- เรียกดู โทเคนที่อาจใช้ได้ และ ตรวจสอบคอนแทรกต์หรือ mint ก่อนเปิดใช้โทเคน
- เลือกและเรียงลำดับ วิธีชำระเงินของร้านค้า ใบแจ้งหนี้ใหม่ใช้รายการที่เลือกและพร้อมใช้งาน
โทเคนใช้กระเป๋าร่วมกับเชนของเหรียญหลัก ยอดคงเหลือในกระเป๋า คืนค่าจำนวนหน่วยย่อยที่แน่นอนและมูลค่าเงินเฟียตเพื่อประกอบการพิจารณา ใช้ฟิลด์ความพร้อมที่คืนค่ามาเพื่อระบุว่าวิธีใดรับชำระเงินได้
โทเคน 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 และ mint โดยใช้ผลต่างยอดโทเคนที่แน่นอนในธุรกรรมที่แยกวิเคราะห์แล้วเพื่อระบุการชำระเงิน |
| ช่องทางเหรียญหลัก UTXO เพิ่มเติม | รองรับ | สแกนธุรกรรม | BCH/LTC/DOGE ใช้ Esplora; BCH/DOGE รองรับ Bitcore ด้วย, LTC/DOGE/DASH รองรับ BlockCypher, Dash รองรับ Insight และ ZEC แบบโปร่งใสรองรับ zcash-explorer ทั้งหมดยังรองรับบล็อก node-rpc ที่เข้ากันได้กับ Core และเก็บไว้อย่างครบถ้วน โหมด raw ต้องมี 1–48 การยืนยัน ไม่ใช่การตรวจพบใน mempool ไม่รองรับ Zcash แบบ shielded |
| ช่องทางเหรียญหลักแบบบัญชีที่จัดทำดัชนี | รองรับ | สแกนธุรกรรม | TRON ใช้ tron-indexer หรือ node-rpc แบบ solidified; XRP ใช้ xrpl-jsonrpc; Stellar ใช้ stellar-horizon หรือ ledger ของ Stellar node-rpc ที่เก็บไว้; Cosmos Hub ใช้ cometbft-jsonrpc; Algorand ใช้ algorand-indexer หรือ algod node-rpc; Hedera ต้องใช้ hedera-mirror ไม่ใช่ EVM relay |
| ช่องทางชำระเหรียญหลักแบบ ledger | รองรับ | สแกนธุรกรรม | Aptos ใช้ aptos-rest; Sui ใช้ sui-graphql; NEAR ใช้ near-jsonrpc; Kaspa ใช้ kaspa-rest ส่วน Polkadot Asset Hub รองรับ substrate-rest หรือ node-rpc ที่อ่าน metadata และบล็อก finalized ได้; Tezos รองรับ tezos-tzkt หรือ operation แบบเต็มจาก Octez node-rpc รับเฉพาะเหรียญหลัก ต้องเก็บข้อมูลย้อนหลังสำหรับใบแจ้งหนี้เก่า |
| ช่องทางเหรียญหลัก Cardano และ TON | รองรับ | สแกนธุรกรรม | Cardano ต้องใช้ cardano-koios และ TON ต้องใช้ toncenter-v3 แท็ก XRP, memo ID ของ Stellar และคอมเมนต์ใบแจ้งหนี้ TON จะคืนค่าเป็น destination_tag และต้องส่งให้ตรงทุกตัว |
| ความถูกต้องของการชำระเสร็จสิ้น | รองรับ | การตรวจสอบอย่างเป็นอิสระ | ตามค่าเริ่มต้น การชำระเสร็จสิ้นขั้นสุดท้ายต้องมีผู้ให้บริการอิสระสองรายที่เห็นตรงกันในธุรกรรม/อีเวนต์ จำนวนเงิน บล็อกหรือสล็อตบนเชนหลักที่ยอมรับ และความเป็นที่สุด ช่วงข้อมูล raw และ EVM ที่ใช้ร่วมกันยังตรวจสอบความครอบคลุมที่ครบถ้วนด้วย ผู้ดูแลอาจเลือกให้เชนใช้ผู้ให้บริการที่เชื่อถือเพียงรายเดียวอย่างชัดเจน ซึ่งยกเลิกการตรวจสอบไขว้อิสระ แต่ไม่ได้ยกเลิกการตรวจสอบตัวตน ความครบถ้วน หรือความเป็นที่สุด |
| ช่องทางเหรียญหลัก Monero | รองรับ | RPC กระเป๋าดูอย่างเดียวที่ผูกกับโปรเจกต์ | wallet-RPC ภายนอกแบบ watch-only โดยเฉพาะหนึ่งตัวอยู่หลังเกตเวย์ HTTPS ที่อนุญาตเฉพาะเมธอดในรายการ และสร้าง subaddress ของ account-0 เกณฑ์ daemon บน mainnet ที่ตั้งไว้ (ค่าเริ่มต้น 2 แหล่งอิสระ หรือเลือก 1 แหล่ง) ให้หลักฐานการชำระเสร็จสิ้น ตัวเลือก --restricted-rpc แบบ native ใช้กับ create_address ไม่ได้ ผู้ดูแลระบบต้องรับรองชัดเจนว่ามีการสำรองกระเป๋าและไม่มีคีย์ใช้จ่าย โดยไม่ส่งข้อมูลคีย์ใดไปยัง Wholly Crypto |
ยอดคงเหลือในเอ็กซ์เชนจ์และตัวเลือกการรวบรวมเงินไปกระเป๋าหรือเอ็กซ์เชนจ์แยกตามสินทรัพย์มีในคอนโซล ไม่ใช่ผ่าน API v1 สาธารณะ ดูการตั้งค่าเอ็กซ์เชนจ์.
วงจรสถานะใบแจ้งหนี้
หลักฐานการชำระเงิน การชำระเสร็จสิ้น และการดำเนินการตามคำสั่งซื้อ
| สถานะ | ความหมาย |
|---|---|
| new | รอการชำระเงิน |
| processing | ตรวจพบการชำระเงิน รอจำนวนที่ยอมรับหรือความเป็นที่สุด |
| settled | ยอมรับตามนโยบายการชำระเสร็จสิ้นของใบแจ้งหนี้ หรือยอมรับด้วยตนเอง |
| expired | พ้นกำหนดแล้ว อาจยังติดตามการชำระล่าช้า |
| invalid | ไม่สามารถยอมรับการชำระเงินอัตโนมัติได้ |
| cancelled | ยกเลิกแล้ว เปิดใหม่ได้ด้วยการกระทบยอดอย่างชัดเจนเท่านั้น |
amount_status บันทึก none, partial, paid หรือ overpaid. timing_status แยกการชำระตรงเวลาและล่าช้า กฎของร้านค้ากำหนดจำนวนการยืนยันที่ต้องการและส่วนต่างชำระขาดที่ยอมรับ
ใช้ค่าของใบแจ้งหนี้ invoice_id ร่วมกับ เส้นทางรายละเอียดใบแจ้งหนี้ การเปลี่ยนเส้นทางจากหน้าชำระเงินเพียงอย่างเดียวไม่ใช่หลักฐานว่าชำระเสร็จสิ้น ตรวจสอบข้อยกเว้นผ่าน การกระทบยอด.
การลองใหม่อย่างปลอดภัย
การสร้างใบแจ้งหนี้ต้องใช้ Idempotency-Key หลังหมดเวลารอ ให้ลองใหม่ด้วยข้อมูลรับรอง คีย์ และเนื้อหาคำขอเดิมทุกไบต์ ใช้คีย์ใหม่เฉพาะเมื่อสร้างใบแจ้งหนี้ใหม่
การสแกนการชำระเงิน EVM
การค้นหาบล็อกเหรียญหลักและ ERC-20 แบบใช้ร่วมกันแยกกลุ่มใบแจ้งหนี้ล่าสุดออกจากงานไล่ตรวจข้อมูลเก่า แต่ละใบแจ้งหนี้เก็บเคอร์เซอร์ประวัติแบบถาวรของตนเอง คำขอโทเคนใช้ไม่เกิน 100 บล็อกต่อคำขอและลดขนาดเมื่อผู้ให้บริการจำกัดเข้มกว่า ตามค่าเริ่มต้นผู้ให้บริการอิสระสองรายจะตรวจสอบทุกช่วงข้อมูล ใน การตั้งค่า → การเชื่อมต่อเชน → รายละเอียด สามารถเลือกให้เชนใช้แหล่งที่เชื่อถือเพียงรายเดียวโดยไม่มีการตรวจสอบไขว้อิสระ แต่ยังตรวจสอบธุรกรรมบนเชนหลักที่ยอมรับ จำนวนเงิน และการยืนยัน รายละเอียดการเชื่อมต่อแยกความล่าช้าของสแกนเนอร์ ข้อจำกัดข้อมูลย้อนหลัง และช่วงพักโควตาออกจากสถานะพื้นฐานของโหนด ไม่รับประกันความจุของ RPC สาธารณะ
IPN และ webhook
รับและตรวจสอบอีเวนต์การชำระเงิน
IPN รับทุกอีเวนต์ใบแจ้งหนี้ที่สร้างขึ้นทาง ipn_url ที่มีผลของใบแจ้งหนี้ ส่วน webhook รับเฉพาะอีเวนต์ที่เลือกไว้สำหรับเอนด์พอยต์ร้านค้าแต่ละตัวที่เปิดใช้ ทั้งคู่ส่ง POST ด้วยภาพข้อมูล JSON เดียวกัน แต่ทำงานอิสระต่อกัน ดังนั้นการเปิดทั้งคู่อาจแจ้งแอปพลิเคชันของคุณสองครั้ง
กำหนด ipn_url เมื่อสร้างใบแจ้งหนี้ หรือใช้ค่าเริ่มต้นของร้านค้า IPN ใช้ ร้าน → IPN เป็นซีเคร็ต ส่วนแต่ละ ร้าน → Webhook เอนด์พอยต์มีซีเคร็ตของตนเอง ทั้งสองอย่างไม่ใช่คีย์ API ของคุณ
ควรดำเนินการตามคำสั่งซื้อเมื่อใด
สำหรับการจัดการตามอีเวนต์ ให้ใช้ event_type = invoice.settled ร่วมกับ status = settled เพื่อเริ่มตรวจสอบคำสั่งซื้อ ตรวจสอบใบแจ้งหนี้ปัจจุบันและดำเนินการแต่ละคำสั่งซื้อเพียงครั้งเดียว
status คือสถานะใบแจ้งหนี้เมื่อสร้างอีเวนต์ ส่วน event_type บอกว่าเกิดอะไรขึ้น payment.received อาจมีค่า processing หรือ settled ไม่ได้หมายถึงการชำระครั้งที่สองและไม่ใช่สัญญาณให้ดำเนินการตามคำสั่งซื้อโดยลำพัง
ส่งอีเวนต์และสถานะใดบ้าง
| อีเวนต์ในการตั้งค่า/ประวัติ | สถานะในเนื้อหา | ความหมาย |
|---|---|---|
| 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 |
ตัวอย่างเหล่านี้แสดงการสร้างอีเวนต์ ไม่ได้รับประกันลำดับการส่ง ทั้งสองรูปแบบเกิดบนเชนอื่นได้ ขึ้นกับเวลาที่ตรวจพบและนโยบายการชำระเสร็จสิ้น อย่ากำหนดว่าต้องมีอีเวนต์ processing ก่อน settled
ดำเนินการครั้งเดียว: ตัวอย่างตัวรับและการป้องกันรายการซ้ำ
| แนวทาง | วิธีจัดการ |
|---|---|
| ตัวรับตามอีเวนต์ | เก็บแต่ละอีเวนต์แยกด้วย event_id ที่ลงนาม แล้วเลือก invoice.settled ที่มี status = settled อย่าทิ้งอีเวนต์นี้เพราะ payment.received ที่มี sequence เดียวกันมาถึงก่อน |
| กล่องรับสถานะคำสั่งซื้อของ 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 |
| การจัดเชนใหม่ / การทำให้ไม่ถูกต้อง | รุ่นแก้ไขใหม่อาจทำให้หลักฐานการชำระเงินเดิมใช้ไม่ได้ ดึงสถานะปัจจุบันใหม่และจัดการการย้อนกลับผ่านการกระทบยอด อย่ามองข้ามเพียงเพราะคำสั่งซื้อเคยชำระเสร็จสิ้นแล้ว |
| ศูนย์การยืนยัน / จำนวนเงินศูนย์ | การชำระเสร็จสิ้นแบบศูนย์การยืนยันอาจเกิดทันทีที่ตรวจพบและมีความเสี่ยงจากการจัดเชนใหม่ ใบแจ้งหนี้จำนวนศูนย์ที่อนุญาตอย่างชัดเจนจะเสร็จสิ้นโดยไม่ชำระเงิน ทั้งสองกรณีไม่จำเป็นต้องมีอีเวนต์ payment.received ก่อน |
ใช้ status = settled เพื่อดำเนินการตามคำสั่งซื้อ ไม่ใช่ amount_status = paid หรือการเปลี่ยนเส้นทางจากหน้าชำระเงิน หากกำหนดศูนย์การยืนยัน อาจชำระเสร็จสิ้นทันทีที่ตรวจพบ ซึ่งมีความเสี่ยงจากการจัดเชนใหม่
ชำระขาดคือ amount_status = partial; ชำระเกินคือ overpaid ส่วน paid หมายถึงได้รับขั้นต่ำที่ยอมรับแล้ว รวมส่วนต่างชำระขาดที่ใบแจ้งหนี้ยอมรับ ค่าเหล่านี้เป็นสถานะจำนวนเงิน ไม่ใช่สถานะใบแจ้งหนี้ late เป็น timing_status ไม่ใช่อีเวนต์แยก
ลำดับทั่วไปคือ new → processing → settled แต่อาจข้ามสถานะระหว่างทางได้ ใบแจ้งหนี้จำนวนศูนย์ที่อนุญาตอย่างชัดเจนจะเสร็จสิ้นโดยไม่ชำระเงินและคง amount_status = none การยอมรับด้วยตนเองระบุเป็น manually_settled
Callback เป็นภาพข้อมูลที่แก้ไขไม่ได้ ไม่ใช่การตอบสถานะสด อาจมาช้า ไม่ตามลำดับ หรือมากกว่าหนึ่งครั้ง อีเวนต์การชำระเงินและสถานะอาจมี sequence ของใบแจ้งหนี้และฟิลด์สถานะเหมือนกัน แต่ค่า event_id และ event_type ที่ลงนามต่างกัน จำนวนการยืนยันไม่ได้รับประกันว่าจะมี callback ทุกบล็อก
สิ่งที่คุณได้รับ
{
"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 อีเวนต์ และขอบเขตโปรเจกต์/ร้านค้าด้วย
ฟิลด์ callback ทั้งหมดและข้อมูลใบแจ้งหนี้เพิ่มเติม
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
| 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 เช่น EUR สำหรับใบแจ้งหนี้ EUR ที่ชำระด้วย USDC |
| order_id | string | null | เลขอ้างอิงคำสั่งซื้อของผู้ค้า |
| payload_version | integer | 2 สำหรับอีเวนต์ที่สร้างใหม่ใน 4.1.0+ ไม่มีค่านี้ในอีเวนต์รุ่นเก่าที่เก็บไว้ |
| event_id | UUID | ตัวระบุอีเวนต์ที่ลงนาม ไม่เปลี่ยนเมื่อส่งซ้ำหรือลองใหม่ด้วยตนเอง |
| event_type | string | หนึ่งในเจ็ดอีเวนต์ที่สมัครรับได้ |
| occurred_at | timestamp | เวลาที่สร้างอีเวนต์ซึ่งแก้ไขไม่ได้นี้ ไม่ใช่เวลาส่ง |
| project_id | UUID | ขอบเขตโปรเจกต์ของผู้ค้า ให้ตรงกับตัวรับที่ตั้งค่าไว้ |
| store_id | UUID | ขอบเขตร้านค้าของผู้ค้า ให้ตรงกับตัวรับที่ตั้งค่าไว้ |
| description | string | null | คำอธิบายเดิมของใบแจ้งหนี้ |
| string | null | อีเมลลูกค้าที่อาจระบุไว้ขณะสร้างอีเวนต์ | |
| customer | object | ฟิลด์ metadata ลูกค้าแบบไม่บังคับที่ระบบรู้จัก ไม่มีข้อมูลส่วนบุคคลที่คาดเดาหรือเสริมขึ้น |
| metadata | object | metadata เดิมของผู้ค้าตามที่มีอยู่ขณะสร้างอีเวนต์ |
| created_at | timestamp | เวลาสร้างใบแจ้งหนี้ |
| updated_at | timestamp | เวลาอัปเดตสถานะใบแจ้งหนี้ |
| expires_at | timestamp | กำหนดชำระใบแจ้งหนี้ |
| monitoring_expires_at | timestamp | กำหนดสิ้นสุดการติดตามชำระล่าช้า |
| settled_at | timestamp | null | เวลาชำระเสร็จสิ้น |
| paid_chain | string | null | 4.1.2+: slug ของเชนสำหรับวิธีที่พิสูจน์แล้วว่าทำให้ชำระเสร็จสิ้น เช่น ethereum; เป็น null หากไม่มีข้อมูลการชำระเสร็จสิ้นที่ผ่านเกณฑ์บันทึกไว้ |
| paid_asset | string | null | 4.1.2+: ticker ของเหรียญหลักหรือโทเคน เช่น 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 ของ intent ที่ทำให้ชำระเสร็จสิ้น ตรงกับ 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 ที่ฝังมาไม่ครบหรือไม่ |
| methods[] | object[] | วิธีที่ตรวจพบไม่เกินแปดวิธี โดยวิธีที่ใช้งานอยู่มาก่อน ไม่มีการรวมยอดข้ามสินทรัพย์ |
| payment_method_id / payment_rail | UUID / string | ตัวระบุ intent ของใบแจ้งหนี้และช่องทาง 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 | ชื่อแสดงผลของสินทรัพย์ ticker และชนิดเหรียญหลักหรือโทเคน |
| contract_address / token_standard | string | null | คอนแทรกต์หรือ mint ของโทเคนและมาตรฐาน เป็น null สำหรับสินทรัพย์เหรียญหลัก |
| asset_decimals | integer | ความละเอียดของหน่วยย่อย Lightning BTC ใช้ 11 |
| destination_address / destination_tag | string | null | ที่อยู่รับเงินสาธารณะและ memo/tag ที่จำเป็น ที่อยู่เป็น null สำหรับ Lightning ไม่ใช่คีย์ส่วนตัวเด็ดขาด |
| 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 | ค่าต่ำสุดจากข้อมูลที่ตรวจพบและถูกต้องทั้งหมด ไม่ใช่เฉพาะการโอนล่าสุด เป็น null สำหรับ Lightning หรือเมื่อไม่มีข้อมูลที่ถูกต้อง |
| 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 ใช้ stablecoin เป็นตัวแทนหรือไม่ สกุลเงินอ้างอิงคือ USD สถานะเก่าใช้ประกอบการพิจารณา ไม่ใช่ราคาเสนอใหม่ |
ระเบียนการโอน: methods[].payments[] และ GET …/payments
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
| payment_id / payment_method_id | UUID | ตัวระบุข้อมูลที่ตรวจพบ / ตัวระบุ intent หลัก ใช้ payment_id ตัดรายการซ้ำในประวัติ |
| transaction_id / payment_hash / event_index | string | null / integer | แฮชบนเชนและดัชนี transfer/log/output หรือแฮช Lightning โดย Lightning ไม่มีธุรกรรมหรือลิงก์ explorer |
| 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 | ข้อมูลบล็อกของรายการที่ตรวจพบ confirmations เป็น null สำหรับ Lightning |
| observed_at / chain_time / finalized_at | timestamp | null | เวลาพบครั้งแรกในระบบ เวลาบนเชนที่เชื่อถือได้หากมี และเวลาที่ผ่านความเป็นที่สุดตามนโยบายหากถึงแล้ว |
| explorer_name / explorer_url | string | null | ลิงก์อ้างอิง block explorer สาธารณะที่ตรวจสอบแล้ว ในเครือข่ายที่รองรับ |
Merchant 5.13.3 ไม่นับการโอนเติมแก๊สภายในที่ตรวจสอบแล้วในยอดชำระของลูกค้า payment_info, API รายการชำระใบแจ้งหนี้ วงเงินคืนเงิน และอีเวนต์ payment.received ระเบียนเชน/คลังเงินของรายการเหล่านั้นยังใช้ทำบัญชีกระเป๋าได้ การโอนปกติและยอดชำระเกินจริงยังนับอยู่ เนื้อหา callback ที่ลงนามแล้วจะไม่ถูกเขียนใหม่ หากการชำระเสร็จสิ้นในอดีตอาศัยเงินเติมภายในแทนเงินลูกค้า การกระทบยอดจะส่ง invoice.invalid พร้อม reason_code internal_gas_funding_excluded ให้ตรวจสอบแทนการดำเนินการตามคำสั่งซื้อซ้ำ
Merchant 4.1.0 เพิ่ม payload_version 2 โดยไม่ย้ายหรือเปลี่ยนเก้าฟิลด์เดิม อีเวนต์ที่เข้าคิวไว้ก่อนยังคงเนื้อหาเดิมและอาจไม่มี payload_version ตอนนี้ event_id, event_type และ ID โปรเจกต์/ร้านค้าอยู่ในเนื้อหาที่ลงนามแล้ว ส่วนเฮดเดอร์อีเวนต์/การส่งยังไม่ได้ลงนาม
payment_info อธิบายการชำระเงินที่ตรวจพบ ไม่ใช่ทุกตัวเลือกบนหน้าชำระเงิน ก่อนตรวจพบ active_payment_method_id เป็น null และ methods ว่าง ข้อมูลที่ reorged/invalid อาจยังอยู่ใน methods แม้วิธีที่ใช้งานจะกลายเป็น null แล้ว ห้ามบวกจำนวนเงินต่างสินทรัพย์หรือต่างเครือข่ายเข้าด้วยกัน
จำนวนเงิน จำนวนเต็มหน่วยย่อย อัตรา และเปอร์เซ็นต์ทั้งหมดเป็นสตริง received_amount รวมเงินที่ถูกต้องซึ่งรอยืนยัน ส่วน confirmed_amount ผ่านนโยบายความเป็นที่สุดของวิธีนั้นแล้ว remaining_amount คือ max(minimum_payment_amount ลบ received_amount, 0); remaining_to_full_amount คือ max(expected_amount ลบ received_amount, 0) ตัวอย่าง: เรียกเก็บ 100 USDC รับ 99 ยอมรับส่วนต่าง 1% จะได้ remaining_amount 0 และ remaining_to_full_amount 1 แต่ยังต้องผ่านความเป็นที่สุด
quote คือการคำนวณใบแจ้งหนี้ที่ล็อกไว้ เป็นหน่วยสินทรัพย์ต่อหนึ่งหน่วยสกุลเงินใบแจ้งหนี้ บวกสเปรดก่อนปัดขึ้น ใช้ expected_amount_atomic เพื่อเทียบการชำระอย่างแม่นยำ อัตราที่แสดงอย่างเดียวอาจคำนวณผลปัดขึ้นซ้ำไม่ได้ ใบแจ้งหนี้เก่าที่ไม่ได้เก็บที่มาของแหล่งข้อมูลจะแสดงฟิลด์ source/reference/rounding เป็น null และ provenance_available เป็น false ไม่ใช้ข้อมูลวันนี้แสดงเป็นราคาในอดีต
market_rate_at_event เป็นข้อมูลแคชก่อนสเปรดเพื่อประกอบการพิจารณา ตรึงไว้เมื่อสร้างอีเวนต์ มีเวลาแหล่งข้อมูล ธง stale และตัวแทนค่าอ้างอิง เป็น 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_amount และ paid_asset_amount_received เป็นสตริงทศนิยมที่แน่นอนในหน่วย paid_asset โดย payload_version ยังเป็น 2 ค่า paid_asset_amount คือราคาเต็มที่ล็อกไว้ รวมสเปรดและการปัดขึ้น ไม่ใช่เกณฑ์ส่วนต่างที่ยอมรับหรือยอดที่เหลือ paid_asset_amount_received คือยอดรับที่ถูกต้องทั้งหมดของวิธีที่ทำให้ชำระเสร็จสิ้น ณ เวลานั้น รวมเงินรอยืนยันและยอดขาดหรือเกินที่ยอมรับ ตัวอย่าง: เสนอราคา 100 USDC รับ 99 และยอมรับด้วยส่วนต่าง จะได้ 100 กับ 99 ไม่ใช่ 99 กับ 99 ทั้งคู่ตรึงตามภาพข้อมูลการชำระเสร็จสิ้น ใช้ payment_info.methods[].amounts เพื่อดูยอดรับในแต่ละอีเวนต์ หรือ API รายการชำระเงินเพื่อดูระเบียนปัจจุบัน ทั้งสองค่าเป็น null หากไม่มีภาพข้อมูลที่ผ่านเกณฑ์และสำหรับภาพข้อมูลก่อน 5.0.1 เนื้อหาอีเวนต์เก่าที่เข้าคิวไม่เปลี่ยน ห้ามแปลงสตริงทศนิยมที่แน่นอนเป็นเลขทศนิยมลอยตัวเพื่อทำบัญชี
settlement_exchange_rate คือข้อมูลตลาดจากแคชก่อนสเปรดที่บันทึกพร้อมการชำระเสร็จสิ้น ไม่ใช่ราคาใบแจ้งหนี้ที่ล็อกไว้หรือการซื้อขายในเอ็กซ์เชนจ์ที่ดำเนินการแล้ว มีรูปแบบเดียวกับ market_rate_at_event ค่า 1.17 asset_per_invoice_currency กับ EUR/USDC หมายถึง 1 EUR = 1.17 USDC เวลาแหล่งข้อมูลและธง stale/fixed/proxy บอกคุณภาพ หากไม่มีคู่ราคา อัตราจะเป็น null แต่วิธีที่พิสูจน์แล้วยังมีฟิลด์ paid_* ค่านี้ไม่เปลี่ยนยอดที่ต้องชำระและไม่รอเรียกผู้ให้บริการสด การชำระภายหลังด้วยวิธีเดิม การลองใหม่ และการส่งซ้ำไม่สามารถแทนภาพข้อมูลที่บันทึกไว้ รวมถึงอัตรา null ที่บันทึกไว้ การชำระเสร็จสิ้นใหม่จริงหรือการเปลี่ยนวิธีที่ทำให้เสร็จสิ้นจะบันทึกภาพข้อมูลใหม่ observed_at ระบุการบันทึกนั้น ส่วน settled_at อาจคงเวลาชำระเสร็จสิ้นครั้งแรก เนื้อหาอีเวนต์เก่าไม่เปลี่ยน
รวมวิธีที่ตรวจพบไม่เกินแปดวิธีและข้อมูลการชำระล่าสุดไม่เกินห้ารายการต่อวิธี พร้อมจำนวนรวมและธงการตัดรายการ ขีดจำกัดขนาด payload อาจลดอาร์เรย์เหล่านี้อีก ข้อมูลการชำระหนึ่งรายการคือ transfer/log/เอาต์พุต UTXO หนึ่งรายการ ไม่จำเป็นต้องเป็นแฮชธุรกรรมที่ไม่ซ้ำ ใช้ GET /v1/projects/YOUR_PROJECT_ID/invoices/{invoice_id}/payments พร้อม payment_method_id, limit และ offset เพื่อดูประวัติปัจจุบันทั้งหมด รายละเอียดใบแจ้งหนี้เก็บทุกวิธีที่เสนอราคาและ quote_details ของแต่ละวิธี ลิงก์ API ต้องใช้โฮสต์และข้อมูลรับรองที่คุณตั้งค่าไว้ ห้ามส่งต่อ bearer token ไปยัง URL ใดก็ได้ที่ callback ให้มา
Lightning ใช้ payment_hash แทน transaction_id ที่อยู่รับเงิน explorer และจำนวนการยืนยันที่ตรวจพบเป็น null จำนวน BTC ที่แน่นอนใช้ทศนิยม 11 ตำแหน่ง (millisatoshis) และส่วนต่างที่ยอมรับจริงเป็นศูนย์ ไม่รวม preimage การชำระ BOLT11 คีย์กระเป๋า ซีเคร็ตลงนาม หรือข้อมูลรับรองผู้ให้บริการ ฟิลด์ลูกค้า/metadata มีได้เฉพาะในการตอบกลับผู้ค้าและ callback ที่ลงนาม ห้ามอยู่ในหน้าชำระเงินสาธารณะ อย่าใส่ข้อมูลรับรองใน metadata
รับข้อมูลอย่างปลอดภัย
- ตรวจสอบเนื้อหาดิบทุกไบต์ด้วยซีเคร็ตที่ตรงกันก่อนแยกวิเคราะห์ ร้านค้า → IPN ให้ซีเคร็ต IPN รวมถึงการส่งไป ipn_url ที่กำหนดเอง แต่ละเอนด์พอยต์ใน ร้านค้า → Webhooks มีซีเคร็ตของตนเอง ทั้งสองไม่ใช่โทเคน API การหมุนเวียนตัวหนึ่งไม่หมุนเวียนตัวอื่น
- ตรวจสอบเวลาที่ลงนาม (ค่าเริ่มต้น SDK: คลาดได้ห้านาทีทั้งก่อนและหลัง) และจับคู่ ID โปรเจกต์/ร้านค้าที่ลงนามกับการตั้งค่าตัวรับเมื่อมีค่า บันทึกลงคิวแบบถาวรก่อนคืน HTTP 2xx สำหรับประมวลผลรายอีเวนต์ event_id ของ v2 มีลายเซ็น ID ในเฮดเดอร์เพียงอย่างเดียวป้องกัน replay ไม่ได้เพราะเฮดเดอร์เหล่านั้นไม่ได้ลงนาม สำหรับกล่องรับสถานะคำสั่งซื้อ ให้ตัดซ้ำด้วย invoice_id และ sequence และเทียบฟิลด์สถานะใบแจ้งหนี้เดิม ไม่ใช่เนื้อหา v2 ทั้งก้อน เพราะชนิด/ID อีเวนต์ต่างกันอาจมีรุ่นแก้ไขเดียวกัน
- ใน worker ให้ดึงใบแจ้งหนี้ปัจจุบันจาก API origin ที่คุณตั้งค่า ไม่ใช่ลิงก์ callback ใดก็ได้ ตรวจให้ตรงกับคำสั่งซื้อ โปรเจกต์/ร้านค้า จำนวนเงิน และสกุลเงินที่บันทึกไว้ กำหนดให้สถานะปัจจุบันเป็น 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 |
| ลายเซ็น | HMAC-SHA256 ของ <unix timestamp>.<exact raw body>; รูปแบบเฮดเดอร์คือ t=<timestamp>,v1=<64 lowercase hex> |
| สำเร็จ | การตอบกลับ HTTP 2xx ใดก็ได้ ไม่ตามการเปลี่ยนเส้นทาง การตอบกลับที่ไม่ใช่ 2xx ถือว่าล้มเหลว |
| การหมดเวลารอ | หมดเวลารอเชื่อมต่อที่ 5 วินาที และหมดเวลารอคำขอรวมที่ 10 วินาที |
| กำหนดการลองใหม่ | พยายามได้สูงสุด 8 ครั้งสำหรับความล้มเหลวที่ลองใหม่ได้: ทันที แล้วเว้นระยะ 10s, 1m, 5m, 15m, 1h, 6h และ 24h หลังความพยายามก่อนหน้าจบ IPN ลองใหม่อัตโนมัติ ส่วน webhook ปิดการลองใหม่อัตโนมัติแยกตามเอนด์พอยต์ได้ |
| ความปลอดภัยของปลายทาง | เฉพาะ HTTPS สาธารณะ ตรวจสอบ DNS ใหม่และตรึงปลายทางก่อนส่ง ปฏิเสธปลายทาง local/private/reserved |
| การเก็บรักษาเหตุการณ์ | กำหนดเก็บ payload เหตุการณ์แจ้งเตือนและข้อมูลการส่งเป็นเวลา 90 วัน รายละเอียดที่เก็บจะถูกล้างเป็นชุดจำกัดขนาด |
| การตัดรายการซ้ำ | บันทึก invoice_id และ sequence ที่ลงนามแบบถาวร โดยจำกัดขอบเขตตามโปรเจกต์ที่ตั้งค่า Wholly-Event-Id ระบุเหตุการณ์; Wholly-Delivery-Id ระบุระเบียนการส่ง (การลองใหม่ใช้ค่าเดิม การส่งซ้ำด้วยตนเองสร้างรายการใหม่) เฮดเดอร์ ID ทั้งสองไม่ได้ลงนาม |
| การตั้งชื่อเหตุการณ์ | เวอร์ชัน 2 ลงนาม event_id และ event_type ในเนื้อหา เหตุการณ์รุ่นเก่าที่เข้าคิวไว้ไม่มีทั้งสองค่า เหตุการณ์ต่างชนิดอาจใช้ sequence ของใบแจ้งหนี้เดียวกัน ให้กระทบยอดสถานะใบแจ้งหนี้ตามรุ่นแก้ไข หรือตัดเหตุการณ์ซ้ำด้วย event_id ที่ลงนาม |
| การหมุนเวียนซีเคร็ต | การหมุนเวียนไม่มีช่วงใช้งานทับซ้อนหรือเฮดเดอร์เวอร์ชัน และเปลี่ยนลายเซ็นทันทีสำหรับรายการที่เข้าคิว ลองใหม่ และส่งด้วยตนเอง |
| การส่งที่พักไว้ | เครดิตประมวลผลไม่เพียงพอทำให้ IPN/webhook หยุดพัก รวมถึงการลองใหม่ เงินขาเข้ายังรับต่อ การแจ้งเตือนในคิวจะส่งต่อหลังเติมเครดิตภายในช่วงเก็บรักษา payload |
ผู้ช่วย AI · MCP
เชื่อมต่อผู้ช่วยกับระบบผู้ค้าของคุณ
Merchant 5.0.0 มีเซิร์ฟเวอร์ MCP แบบเลือกเปิดใช้บนโดเมน API ที่คุณตั้งค่า ทำงานภายในระบบของคุณ ไม่ได้ผ่านรีเลย์ Wholly Crypto ที่ใช้ร่วมกัน
- เปิด การตั้งค่า → การเข้าถึง API สร้างข้อมูลรับรองเฉพาะ กำหนดเฉพาะโปรเจกต์ที่ผู้ช่วยต้องใช้ และเริ่มด้วยสิทธิ์อ่านอย่างเดียว สำหรับบัญชีที่ผู้ดำเนินระบบโฮสต์ให้ ผู้ดำเนินระบบต้องเปิดบริการ MCP ของระบบก่อน คุณจัดการได้เฉพาะข้อมูลรับรองและสิทธิ์ของตนเอง
- ใน การเชื่อมต่อ AI · MCP ให้เปิด MCP เลือกข้อมูลรับรอง และบันทึกสิทธิ์ MCP ข้อมูลรับรองเดิมไม่มีสิทธิ์ MCP จนกว่าจะเปิดอย่างชัดเจน
- คัดลอก URL เซิร์ฟเวอร์ MCP ไปยังการตั้งค่าเซิร์ฟเวอร์ HTTP ระยะไกลของไคลเอนต์ หากใช้ OAuth ให้เข้าสู่คอนโซลผู้ค้า ตรวจสอบชื่อไคลเอนต์และที่อยู่ส่งกลับ เลือกข้อมูลรับรองแล้วอนุมัติ การป้องกัน Basic Auth และ TOTP เดิมยังมีผล
- การสร้างใบแจ้งหนี้ต้องมีข้อมูลรับรองอ่าน/เขียน นโยบาย MCP แบบอ่านและสร้างใบแจ้งหนี้ ขอบเขต OAuth mcp:invoice:create และการอนุมัติอย่างชัดเจนเพิ่มเติม การเชื่อมต่อ OAuth จะไม่ได้สิทธิ์ในโปรเจกต์ที่เพิ่มให้ข้อมูลรับรองภายหลังการอนุมัติ
{
"mcpServers": {
"whollycrypto": {
"url": "https://api.example.com/mcp"
}
}
}| เครื่องมือ | การเข้าถึง | จุดประสงค์ |
|---|---|---|
| list_projects | อ่าน | โปรเจกต์ที่เปิดใช้และกำหนดให้การเชื่อมต่อ แบ่งหน้าด้วย limit/offset |
| list_stores | อ่าน | ร้านค้า ID และสถานะเปิดใช้ภายใน project_id แบ่งหน้าด้วย limit/offset |
| list_payment_methods | อ่าน | วิธีชำระเชน โทเคน และ Lightning ที่ตั้งค่าไว้สำหรับ project_id + store_id |
| get_wallet_balances | อ่าน | ที่อยู่รับเงินและยอดคงเหลือจากแคช พร้อมฟิลด์ความใหม่/ความพร้อมใช้งาน ไม่มีความลับของกระเป๋าเด็ดขาด |
| list_invoices | อ่าน | ใบแจ้งหนี้ของโปรเจกต์ กรองตามร้านค้า สถานะ หรือคำค้น แบ่งหน้าด้วย limit/offset |
| get_invoice | อ่าน | รายละเอียดใบแจ้งหนี้ทั้งหมดและลิงก์หน้าชำระเงินโดยใช้ project_id + invoice_id |
| get_delivery_history | อ่าน | สถานะ IPN/webhook ของร้านค้า ความพยายามส่ง และผล HTTP กรอง invoice_id/kind ได้ ไม่มีซีเคร็ตหรือเนื้อหา callback |
| 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 และความปลอดภัย
ใช้ Streamable HTTP ผ่าน HTTPS ตกลงเวอร์ชันโปรโตคอลที่ประกาศรองรับ และใส่ MCP-Protocol-Version ใน POST ถัดไป ส่ง Content-Type: application/json และ Accept: application/json, text/event-stream การตอบกลับเป็น JSON ที่มีจุดสิ้นสุด การเชื่อมต่อใหม่ไม่ต้องใช้ ID เซสชัน MCP
OAuth ใช้โทเคนเข้าถึงอายุสั้น (15 นาที) รหัส S256 PKCE ใช้ครั้งเดียว (5 นาที) และโทเคนรีเฟรชแบบหมุนเวียน (อายุการเชื่อมต่อ 30 วัน) การใช้โทเคนรีเฟรชที่ใช้แล้วซ้ำจะเพิกถอนการเชื่อมต่อนั้น ให้เชื่อมต่อใหม่หลังหมดอายุ หมุนเวียนข้อมูลรับรอง เปลี่ยนนโยบาย หรือเปลี่ยนโดเมน API หลัก
OAuth discovery เปิดสาธารณะเฉพาะเมื่อเปิด MCP พารามิเตอร์ resource ต้องตรงกับ URL หลักที่ discovery คืนมา รวม /mcp รองรับการลงทะเบียนแบบไดนามิก แต่ไม่รองรับเอกสาร metadata client-ID ระยะไกลและ client secret
สำหรับไคลเอนต์ที่รองรับเฮดเดอร์ Authorization กำหนดเอง สามารถใช้โทเคน API ผู้ค้าที่เปิด MCP เป็น Bearer แทนได้ โทเคนยังคงสิทธิ์ REST แยกของตนเอง แนะนำ OAuth สำหรับการเชื่อมต่อที่จำกัดเฉพาะ MCP ห้ามวางข้อมูลรับรองในแชต URL อาร์กิวเมนต์เครื่องมือ หรือระบบควบคุมซอร์ส
MCP ใช้โควตา REST ต่อนาทีและข้อจำกัด IP ต้นทางแบบตรงตัวร่วมกับข้อมูลรับรอง รวมถึงข้อจำกัด IP ของโฮสต์ API OAuth ไม่ข้ามรายการอนุญาต สำหรับไคลเอนต์ AI ระยะไกล ให้อนุญาต IP ขาออกตามเอกสารของไคลเอนต์ หรือเลือกปิดข้อจำกัดนี้อย่างตั้งใจ ไม่ควรใช้การทดสอบความปลอดภัยเว็บหรือแคชกับเส้นทาง MCP/OAuth
ข้อผิดพลาด HTTP: 401 ต้องยืนยันตัวตน, 403 ปฏิเสธ origin/IP/สิทธิ์, 404 หมายถึงปิด MCP หรือใช้โฮสต์ผิด, 405 หมายถึงให้ใช้ POST, 413 หมายถึงเกินเนื้อหา 32 KiB, 429 มี Retry-After ข้อผิดพลาด JSON-RPC ใช้ error.code ความล้มเหลวระดับเครื่องมือใช้ result.isError=true แม้ HTTP 200 ผลสำเร็จมี content และ structuredContent
รายการใช้ค่าเริ่มต้น 25 แถว สูงสุด 100; offset จำกัดที่ 1000000 การตอบเครื่องมือจำกัด 2 MiB สิทธิ์ คำขออนุมัติ และ bucket จำกัดอัตราที่หมดอายุจะถูกล้างอัตโนมัติ การตั้งค่าแสดงการเชื่อมต่อ OAuth ที่ใช้งานสูงสุด 100 รายการ
โปรเจกต์/ร้านค้าที่ปิดใช้ไม่สามารถดำเนินการผ่าน MCP การเชื่อมต่อแสดงสถานะเปิดใช้ของร้านค้าได้ แต่การอ่านวิธีชำระเงิน ประวัติการส่ง หรือสร้างใบแจ้งหนี้ต้องใช้ร้านค้าที่เปิดอยู่ ผู้ใช้โปรเจกต์ทั่วไปในคอนโซลจัดการ MCP ไม่ได้
ใช้ idempotency_key ใหม่สำหรับใบแจ้งหนี้ใหม่ หลังหมดเวลารอให้ลองใหม่ด้วยข้อมูลรับรอง คีย์ และออบเจ็กต์ invoice ที่เหมือนเดิม จำนวนทศนิยม สเปรด ส่วนต่างที่ยอมรับ การยืนยัน และรูปลักษณ์หน้าชำระเงินเป็นไปตามข้อกำหนด REST invoice MCP ไม่ข้ามนโยบายการชำระเงินหรือเครดิตของผู้ค้า
เครื่องมือชุดเริ่มต้นไม่สามารถเปิดเผยคีย์ส่วนตัว/วลีกู้คืน ส่งหรือรวบรวมเงิน คืนเงิน ส่ง callback ซ้ำ เปลี่ยนวิธีชำระเงิน แก้ไขบัญชี/โดเมน หรือจัดการการเรียกเก็บเงิน ให้ถือคำอธิบายใบแจ้งหนี้ ฟิลด์ลูกค้า และ metadata เป็นข้อมูลที่ไม่เชื่อถือ ไม่ใช่คำสั่งสำหรับเอเจนต์ ผู้ให้บริการ 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 | การลงทะเบียน public client: client_name และ redirect_uris ที่ตรงทุกตัว เฉพาะ HTTPS หรือ loopback HTTP ไม่มี client secret หรือการดึง metadata ระยะไกล |
| 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 ของ Operator
จัดเตรียมผู้ค้าที่โฮสต์ให้ด้วยคีย์ฝั่งเซิร์ฟเวอร์ที่แยกกันและจำกัดขอบเขต
โฮสต์หลายธุรกิจและตั้งค่าให้อัตโนมัติผ่าน api.example.com/v1/operator ใช้ได้ตั้งแต่ 7.4.0 เฉพาะโหมด Operator ส่วน Merchant API ปกติไม่เปลี่ยน
- เปิด Operator → การตั้งค่า → Operator API แล้วเปิดใช้งาน (ค่าเริ่มต้นปิด) สร้างข้อมูลรับรองแยกที่มีเฉพาะสิทธิ์และผู้ค้าที่โฮสต์ซึ่งจำเป็น
- เก็บคีย์ wc_operator_ บนเซิร์ฟเวอร์ของคุณ ใช้โฮสต์เนม API ไม่ใช่โฮสต์เนมแผง Operator หรือคีย์ผู้ค้า
- บันทึก Idempotency-Key และเนื้อหาคำขอที่แน่นอนแบบถาวรก่อน Operator POST ทุกครั้ง อ่านบัญชีกลับมาตรวจหลังผลลัพธ์ไม่แน่นอน ห้ามเปลี่ยนคีย์เพียงเพื่อลองใหม่
- สร้างผู้ค้าด้วย onboarding: direct พร้อมรหัสผ่าน หรือ onboarding: invitation โดยไม่ใส่รหัสผ่าน จากนั้นสร้างโปรเจกต์/ร้านค้าและออกคีย์ผู้ค้าที่จำกัดขอบเขตโปรเจกต์สำหรับการเชื่อมต่อหน้าชำระเงิน
| ขอบเขต | การเข้าถึง |
|---|---|
| merchants.read / merchants.write | แสดงรายการ/อ่าน และสร้าง/อัปเดตผู้ค้าที่โฮสต์ |
| users.read / users.write / users.security | อ่าน/สร้าง/อัปเดตผู้ใช้ เปลี่ยนรหัสผ่านหรือเพิกถอนเซสชันแยกกัน ไม่สร้างผู้ดูแล Operator เด็ดขาด |
| 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 | อ่านประวัติวงจรสถานะ ตั้งค่า callback วงจรสถานะที่ลงนาม อ่านบันทึกตรวจสอบ/ความสามารถ/สถานะโหนด |
การเริ่มใช้งาน เครดิต สิทธิ์ และการลองใหม่อย่างปลอดภัย
| หัวข้อ | กฎ |
|---|---|
| ข้อมูลรับรอง | กำหนดวันหมดอายุและรายการอนุญาต IPv4/IPv6 แบบตรงตัวได้ ค่าเริ่มต้น 60 คำขอ/นาที ปรับได้ 1–600 ทุกคำขอตรวจสอบผู้ดูแลที่ออกคีย์และขอบเขตสิทธิ์ปัจจุบัน HTTP 429 มี Retry-After |
| การแยกขอบเขต | คีย์เข้าถึงได้เฉพาะผู้ค้าที่โฮสต์ซึ่งกำหนดไว้ การสร้างผู้ค้าและดูรายงานทั้งระบบต้องมีสิทธิ์เข้าถึงผู้ค้าทั้งหมด ไม่รวมธุรกิจของผู้ดำเนินระบบเอง |
| เข้าสู่ระบบครั้งแรก | บัญชีแบบตรงยอมรับว่าผู้โฮสต์เข้าถึงคีย์กระเป๋าได้ require_password_change เพิ่มการเปลี่ยนรหัสผ่านเมื่อเข้าสู่ระบบครั้งแรก การตอบรับคำเชิญต้องยอมรับการถือครองคีย์อย่างชัดเจน แล้วจึงเข้าสู่ระบบตามปกติ Basic Auth และ TOTP เดิมยังมีผล |
| คำเชิญ | ลิงก์ผู้ใช้ใหม่มีอายุ 48 ชั่วโมง ลิงก์รีเซ็ตรหัสผ่านหนึ่งชั่วโมง โทเคนใช้ครั้งเดียว การออกใหม่เพิกถอนลิงก์เก่า SMTP ยอมรับไม่ได้รับประกันว่าจะถึงกล่องจดหมาย ให้ตรวจ email_delivery |
| การลองใหม่อย่างปลอดภัย | Operator 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 เปลี่ยนโดเมน หรือการตั้งค่าระดับเซิร์ฟเวอร์ คำขอใบแจ้งหนี้ปกติยังใช้คีย์ผู้ค้าและ Merchant API |
Webhook วงจรสถานะ Operator
| เหตุการณ์ | ข้อมูล |
|---|---|
| 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 อ่านสกุลเครดิตของผู้ค้าหรือรายละเอียดบัญชีแยกประเภทเมื่อกระทบยอด |
เหตุการณ์วงจรสถานะ Operator แยกจาก IPN ใบแจ้งหนี้/webhook ร้านค้า การสมัครรับเป็นของข้อมูลรับรอง Operator ที่สร้าง โดยมีได้ไม่เกิน 10 เอนด์พอยต์ต่อคีย์ เข้าคิวเฉพาะเหตุการณ์ใหม่ที่ตรงเงื่อนไข ใช้ GET /events เพื่อดูประวัติที่เก็บไว้
เนื้อหามี event_id, event_type, merchant_id, occurred_at และ data ตรวจ Wholly-Signature จากเนื้อหาดิบทุกไบต์ด้วย signing_secret ของเอนด์พอยต์ที่แสดงครั้งเดียว: 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 แสดงผลและ payload ที่แก้ไขไม่ได้ 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 ของ Marketplace
หน้าชำระเงินเดียว พร้อมส่วนแบ่งผู้ขายที่คุ้มครองและการจ่ายเงินที่ควบคุมได้
ใบแจ้งหนี้ลูกค้าหนึ่งใบ ส่วนแบ่งผู้ขายที่แน่นอน และการจ่ายสินทรัพย์เดิมแบบควบคุม เลือกเปิดแยกตามโปรเจกต์ เวอร์ชัน 8.0.0 รองรับ Bitcoin mainnet และเหรียญหลัก EVM / โทเคน ERC-20 มาตรฐานที่ตั้งค่าและรองรับ ไม่ใช่ทุกเครือข่ายรับเงิน
- เปิด Marketplace ในโปรเจกต์ เลือกร้านค้าที่เข้าร่วม และพักการจ่ายเงินไว้ระหว่างตั้งค่า
- ลงทะเบียนผู้ขายและตรวจสอบที่อยู่รับเงินของพวกเขาอย่างอิสระ การสร้างปลายทางอยู่ในสถานะรอ การอนุมัติต้องใช้ destinations.approve
- สร้างข้อมูลรับรอง Marketplace แยกใน การตั้งค่า → การเข้าถึง API ข้อมูลรับรอง Merchant, Operator และ MCP ปกติใช้เงิน Marketplace ไม่ได้
- สร้างใบแจ้งหนี้พร้อมการจัดสรร 1–100 รายการที่เป็นสตริงทศนิยมบวก และรวมกันเท่ากับจำนวนใบแจ้งหนี้พอดี ผู้ขายทุกคนต้องมีปลายทางที่อนุมัติบนเครือข่ายร่วมที่ร้านค้ารองรับ
- รอให้ยอดจัดสรรที่ตรวจสอบแล้วพร้อมใช้ เตรียมการจ่ายเงิน อ่านผู้รับและขีดจำกัดต้นทุนที่แก้ไขไม่ได้ แล้วอนุมัติ revision และ plan_hash ที่ตรงทุกตัว ตรวจสถานะการจ่ายเงินเป็นระยะหรือตรวจเหตุการณ์ที่ลงนาม
| หัวข้อ | กฎ |
|---|---|
| การถือครองคีย์และเงิน | เงินลูกค้าเข้ากระเป๋าที่โปรเจกต์ควบคุมก่อน เจ้าของ Marketplace/เซิร์ฟเวอร์ควบคุมคีย์จนกว่าจ่ายผู้ขายแล้ว นี่ไม่ใช่การจ่ายตรงจากลูกค้าถึงผู้ขาย เอสโครว์ หรือระบบล็อกอินผู้ขาย |
| ผู้ขายสามราย | ใบแจ้งหนี้ 300 USD แบ่งสามส่วนรายละ 100 USD และค่าคอมมิชชัน 4% จะจัดสรรคริปโตตามราคาเสนอเทียบเท่า 96 USD ให้แต่ละผู้ขาย เก็บค่าคอมมิชชันรวมเทียบเท่า 12 USD แผนรับประกันจำนวนหน่วยย่อยคริปโต ไม่ใช่มูลค่าเงินตราทั่วไปในอนาคต |
| ค่าธรรมเนียม | ค่าประมวลผลเดิมใช้ครั้งเดียวกับจำนวน/สกุลเงินเดิมของใบแจ้งหนี้ที่ชำระเสร็จสิ้น หากตั้ง 1% จะใช้เครดิตชำระล่วงหน้า 3 USD เหลือค่าคอมมิชชันเทียบเท่า 9 USD ก่อนค่าธรรมเนียมเชน การจ่ายผู้ขายไม่สร้างค่าธรรมเนียมการขายลูกค้าเพิ่ม |
| การจัดสรร | การจัดสรรแบบเศษมากที่สุดรักษาทุกหน่วยย่อย ค่าคอมมิชชันปัดลง ยอดสุทธิผู้ขายคือส่วนที่เหลือ เก็บภาพข้อมูลค่า override ของการจัดสรร ใบแจ้งหนี้ ผู้ขาย และค่าเริ่มต้นร้านค้า/โปรเจกต์ ไม่ใช้อัตราแลกเปลี่ยนใหม่ตอนจ่ายเงิน |
| เงินที่คุ้มครอง | การส่ง รวบรวมเงิน ฝากศูนย์ซื้อขาย และเติมเครดิตอัตโนมัติแบบปกติไม่ใช้ที่อยู่รับเงิน Marketplace ค่าธรรมเนียมเครือข่ายและแก๊สโทเคนต้องมีเหรียญหลักที่ว่างแยกต่างหาก มูลค่ากระเป๋าจากแคชใช้ประกอบการพิจารณา ตรวจสอบเงินรองรับสดจากแหล่งอิสระก่อนลงนาม |
| ความเป็นที่สุด | หลักฐานการจ่าย Marketplace ต้องมีขั้นต่ำการยืนยันของเชนมากกว่าศูนย์และผู้ให้บริการอิสระที่เข้ากันได้สองราย แม้หน้าชำระเงินยอมรับศูนย์การยืนยันหรือสแกนเนอร์เดียว ช่วงพักผู้ให้บริการเลื่อนการตรวจชำระ/จ่ายเงิน ไม่ได้ขัดขวางการสร้างใบแจ้งหนี้ที่ถูกต้องในด้านอื่น |
| ข้อยกเว้น | ยอดชำระขาดที่หน้าชำระเงินปกติยอมรับตามส่วนต่างจะถูกระงับ ไม่จัดสรรเกินเงิน การปล่อยโดยสิทธิ์พิเศษอาจอนุมัติส่วนแบ่งที่เล็กลงอย่างแน่นอนและมีเงินรองรับครบ การชำระเกินเพียงอย่างเดียวไม่ขัดขวางส่วนแบ่งผู้ขายตามราคาเสนอใน BTC หรือวิธี EVM เหรียญหลัก/ERC-20 ที่รองรับ ยอดเกินถูกระงับแยก Bitcoin คืนเงินทอนที่คุ้มครองไปยังที่อยู่ใบแจ้งหนี้ เงินโปรเจกต์แยกใช้จ่ายค่าธรรมเนียมและเติมให้ถึงขั้นต่ำ dust หากจำเป็น วิธีผสม การชำระล่าช้า/กำกวม/ถูกจัดเชนใหม่ และเงินรองรับที่ขาดต้องตรวจสอบ |
| การคืนเงิน | เตรียมคืนเงินเต็มจำนวนในสินทรัพย์เดิมจากวิธีรับเงินที่ยืนยันและไม่กำกวมหนึ่งวิธี จากนั้นอนุมัติแยกเป็นการจ่ายเงิน ยอดจัดสรรที่ยังไม่จ่ายและค่าคอมมิชชันจะถูกกลับรายการ เมื่อจ่ายผู้ขายทุกคนแล้ว ต้องเติมที่อยู่กระเป๋าหลักแยก ไม่มีการดึงเงินกลับ การจ่ายผู้ขายบางส่วนและการคืนหลายสินทรัพย์ต้องกระทบยอดก่อน เวอร์ชัน 8.0.0 ไม่เปิดให้คืนบางจำนวนหรือถอนค่าคอมมิชชัน |
| การลองใหม่ | ทุก POST ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน |
| รุ่นแก้ไข | ระเบียนที่แก้ไขได้ต้องใช้ revision ปัจจุบัน การอนุมัติ/ดำเนินต่อยังต้องมี expected_plan_hash และ confirm:true การเตรียมสำรองเงิน 15 นาที การอนุมัติให้เวลาหนึ่งชั่วโมง งานหมดอายุที่ยังไม่ลงนามปล่อยเงินอย่างปลอดภัย การโอนที่ลงนามแล้ว/ไม่แน่นอนยังเก็บตัวระบุและยอดสำรอง |
| การจ่ายเงินอัตโนมัติ | ปิดตามค่าเริ่มต้น นโยบายรายสินทรัพย์อนุมัติปลายทางที่อนุมัติแล้ว ขั้นต่ำบวก ขีดจำกัดเงินต้นต่อการจ่าย/ช่วง 24 ชั่วโมงย้อนหลังต่อเนื่อง และค่าธรรมเนียมเหรียญหลัก/แก๊ส พร้อมช่วงเวลาและการยืนยัน การเปลี่ยน/เพิกถอนอำนาจหยุดงานที่ยังไม่ส่ง แต่การติดตามต่อ ขีดจำกัดรวมแผนที่สำรองและไม่แน่นอน นโยบายที่พักเพราะการเรียกเก็บเงินจะจัดตารางใหม่อย่างเป็นธรรม ใบแจ้งหนี้ไม่ถูกต้องถูกระงับเพื่อตรวจสอบโดยไม่ขวางกลุ่มใบแจ้งหนี้อื่นที่มีสิทธิ์ |
| การพักและกู้คืน | เครดิตต่ำและกลไกความปลอดภัยการโอนยังพักการใช้เงิน การติดตามและกระทบยอดบัญชียังดำเนินต่อ การดำเนินต่อเป็นการตรวจแผนเดิมที่เก็บไว้ การ revert ของ EVM บนเชนหลักที่ยอมรับซึ่งผู้ให้บริการอิสระสองรายพิสูจน์แล้ว สามารถแทนที่หลังอนุมัติชัดเจนภายในงบค่าธรรมเนียมที่เหลือ โดยยังบันทึกแฮชและค่าธรรมเนียมเดิม ผลไม่ทราบแน่หรือยอดโทเคนส่งถึงไม่ตรงยังถูกระงับ สำรองฐานข้อมูลและคีย์ทั้งหมด หลังคืนค่าต้องกระทบยอดแฮชที่ส่งแล้วก่อนอนุญาตจ่ายเงิน |
| ตัวระบุและการแบ่งหน้า | ใช้ UUID โปรเจกต์จากการตั้งค่าโปรเจกต์ และ UUID ร้านค้าจาก ร้านค้า → พื้นฐาน → API IDs โดย API นี้คืน ID ผู้ขาย/การจ่าย/สินทรัพย์ invoice_id คือ UUID สาธารณะของใบแจ้งหนี้ ทรัพยากรแบ่งหน้าคืน data และ pagination {page,per_page,total,pages}; ค่าเริ่มต้น 1/25 สูงสุด 100 แถว ค่าจำนวนเงินที่แน่นอนเป็นสตริง |
| ขอบเขตข้อมูลรับรอง | คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย |
สิทธิ์ Marketplace
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
อีเวนต์ Marketplace
ใช้ซีเคร็ตลงนาม Marketplace แยก โดยใช้เฮดเดอร์ลายเซ็น Wholly และอัลกอริทึม HMAC ตรวจเนื้อหาดิบเดียวกับ callback ใบแจ้งหนี้ ตรวจเวลา/ลายเซ็น ตัด event_id ซ้ำ และคืน 2xx โดยเร็ว ส่งอย่างน้อยหนึ่งครั้ง พยายามสูงสุดแปดครั้ง ประวัติส่งเหตุการณ์เดิมซ้ำได้ การแก้เอนด์พอยต์ยกเลิกรายการเก่าที่ยังไม่ส่งแทนการเปลี่ยนปลายทางข้อมูลลูกค้า การชำระเสร็จสิ้นของใบแจ้งหนี้ไม่ใช่การจ่ายผู้ขายเสร็จ ห้ามส่งเงินเพียงเพราะ callback ภายนอกสั่ง
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"
}
]
}
}ตั้งค่าการชำระเงินสำหรับผู้ขายหลายราย · สร้างใบแจ้งหนี้ Marketplace
ข้อผิดพลาดและขีดจำกัด
จัดการการตรวจสอบ โควตา และการลองใหม่อย่างคาดการณ์ได้
ตรวจสถานะ HTTP และ Content-Type ก่อนแยกวิเคราะห์การตอบกลับ สำหรับ 429ให้รออย่างน้อยตาม Retry-After ระยะเวลาก่อนลองใหม่
| ขีดจำกัด | รายละเอียด |
|---|---|
| อัตราคำขอ | โควตาต่อข้อมูลรับรอง: ค่าเริ่มต้น 120 คำขอต่อนาที UTC ตั้งได้ 1 ถึง 6000 ใน การตั้งค่า → API การอ่านและเขียน v1 ที่ยืนยันตัวตนทั้งหมด รวมการลองใหม่แบบ idempotent และความล้มเหลวของสิทธิ์/การตรวจสอบหลังยืนยันตัวตน ใช้โควตาร่วมข้ามโดเมน โปรเจกต์ และโปรเซส ข้อมูลรับรองไม่ถูกต้อง เส้นทางคอนโซล และหน้าชำระเงินสาธารณะไม่ใช้โควตานี้ |
| เฮดเดอร์จำกัดอัตรา | การตอบกลับ v1 ที่ยืนยันตัวตนมี X-RateLimit-Limit, X-RateLimit-Remaining และ X-RateLimit-Reset (วินาที Unix ณ ขอบนาที UTC ถัดไป) คำขอเกินคืน JSON 429 rate_limit_exceeded และ Retry-After เป็นวินาทีจำนวนเต็ม รออย่างน้อยตามนั้นและสุ่มระยะเพิ่มก่อนลองใหม่ ช่วงเวลาคงที่ยอมให้ส่งเป็นชุดมากที่ขอบนาที นี่ไม่ใช่การรับประกันคำขอต่อวินาที |
| เนื้อหาคำขอ Merchant | สูงสุด 32 KiB ที่เราเตอร์แอปพลิเคชัน ระบบขอบเครือข่ายอาจปฏิเสธคำขอใหญ่เกินก่อนสร้างโครงข้อผิดพลาด JSON |
| รายการใบแจ้งหนี้ | limit มีค่าเริ่มต้น 50 และรับ 1–100; offset รับ 0–1,000,000 คำค้นยาวไม่เกิน 100 อักขระ ผลเรียงใหม่สุดก่อนและมี metadata total/has_more |
| วิธีชำระของร้านค้า | เลือกสินทรัพย์ได้ไม่เกิน 64 รายการต่อร้านค้า เพียงพอสำหรับเหรียญหลักทั้ง 30 เชนและแค็ตตาล็อกโทเคนที่ตรวจสอบแล้วซึ่งมีขีดจำกัด นโยบายโปรเจกต์ ความสามารถสแกนเนอร์ และกระเป๋าเชนที่พร้อมและสำรองแล้ว ยังคงเป็นเงื่อนไขการสร้างใบแจ้งหนี้ |
| การค้นพบโทเคน | จำนวนโทเคนผู้สมัครมีค่าเริ่มต้น 50 และรับ 1–100 ผลการค้นพบยังไม่เป็นสินทรัพย์รับชำระจนกว่าตรวจสอบบนเชนสำเร็จ |
| โทเคนโปรเจกต์ที่ลงทะเบียนแล้ว | มีสินทรัพย์โทเคนถาวรได้ไม่เกิน 20 รายการต่อโปรเจกต์ สินทรัพย์ที่ลงทะเบียนแล้วใช้ซ้ำได้โดยไม่กินช่องเพิ่ม |
| การทำซ้ำโดยไม่เกิดผลซ้ำ | จำเป็นสำหรับสร้างใบแจ้งหนี้ ใช้ ASCII ที่มองเห็นได้ 1–128 อักขระโดยไม่มีช่องว่าง คีย์ไม่ซ้ำภายในแต่ละร้านค้า และการเรียกซ้ำต้องใช้ข้อมูลรับรองเดิมกับเนื้อหาดิบเดิมทุกไบต์ |
| Metadata | เฉพาะออบเจ็กต์ JSON ขนาดเข้ารหัสสูงสุด 4,096 ไบต์และซ้อนกันได้ห้าระดับ |
| Callback | URL HTTPS สาธารณะยาวไม่เกิน 2,048 ไบต์ เนื้อหาคำขอแจ้งเตือนจำกัด 256 KiB ส่วน payload เหตุการณ์ใบแจ้งหนี้ที่เก็บไว้จำกัด 64 KiB พร้อมประวัติการชำระเงินจำกัดจำนวน |
| ไฟล์ประกอบหน้าชำระเงิน | การตอบกลับ QR SVG เป็น private และ no-store เพราะการชำระขาดเปลี่ยนยอดที่เหลืออย่างแน่นอน โลโก้ PNG ตามรุ่นแก้ไขแคชสาธารณะได้หนึ่งปีและแก้ไขไม่ได้ |
| ระบบขอบเครือข่าย API | คำขอ upstream ของ API ที่จัดการไว้มีเวลารออ่าน 30 วินาที ออกแบบผู้เรียกให้กำหนดเวลารอที่สั้นกว่างบเวลาของงานอย่างชัดเจน |
| ความล้มเหลวที่ไม่ใช่ JSON | การแยก UUID/query ที่ผิดรูปแบบ เมธอดผิด และตัวตรวจความยาว 32 KiB อาจคืนข้อความจากเฟรมเวิร์กหรือการตอบกลับว่าง ปัจจุบันพาธ /v1 ที่ไม่รู้จักคืน 404 พร้อม HTML คอนโซล ตรวจสถานะและ Content-Type ก่อนแยกวิเคราะห์ |
อ้างอิงข้อผิดพลาด
| HTTP | รหัสข้อผิดพลาด | ความหมาย |
|---|---|---|
| 400 | invalid_reconciliation_action | ตัวกรองสถานะข้อยกเว้น เหตุผล คำค้น หรือหน้าประวัติไม่ถูกต้อง |
| 500 | reconciliation_unavailable | โหลดคิวข้อยกเว้นหรือหลักฐานไม่ได้ ลองอ่านใหม่โดยเว้นระยะเพิ่มขึ้น |
| 402 | billing_required | ทุกใบแจ้งหนี้ใหม่ต้องมีบัญชีเครดิตที่จับคู่และตรวจสอบแล้วพร้อมการอนุมัติสด เครดิตชำระล่วงหน้าไม่เพียงพอไม่ขัดขวางการสร้างหรือรับเงิน แต่พัก IPN, webhook และ Sweep แทน ขณะที่ค่าธรรมเนียมยังสะสม การสร้างยังถูกบล็อกสำหรับบัญชีระงับ การตรวจสอบการเรียกเก็บเงินหมดอายุ/ไม่ถูกต้อง บริการเครดิตเข้าถึงไม่ได้ หรือฐานเงินตราทั่วไปของใบแจ้งหนี้ไม่ได้รับอนุญาต ค่าธรรมเนียมใช้จำนวนเงินตราทั่วไปเดิมของใบแจ้งหนี้ ไม่ใช่คริปโตที่รับ สเปรด ยอดเกิน หรือค่าธรรมเนียมเครือข่าย จำนวนดังกล่าวและการแปลงอย่างอิสระถูกลงทะเบียนก่อนสร้างหน้าชำระเงิน การติดตามเดิมและดึงใบแจ้งหนี้ยังดำเนินต่อระหว่างบริการล่ม หลังเติมเครดิต การแจ้งเตือนในคิวส่งต่อภายในช่วงเก็บ payload ปกติ และกฎรวบรวมเงินที่เปิดไว้กลับมาทำงาน ตรวจ การตั้งค่า → ค่าธรรมเนียม และลองสร้างที่ล้มเหลวใหม่ด้วย 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+ เพิ่มสรุปข้อยกเว้นที่ปลอดภัยและนำไปแก้ได้ พร้อมตัวช่วย issue ส่วน PHP SDK รุ่นเก่าให้ getApiMessage() |
| 400 | invalid_invoice_status | สถานะสำหรับแสดงรายการอยู่นอกหกสถานะใบแจ้งหนี้ในเอกสาร |
| 400 | invalid_callback_url | ปลายทาง IPN ที่มีผลไม่ผ่านการตรวจ HTTPS ที่อยู่สาธารณะ DNS หรือ SSRF |
| 400 | invalid_wallet_request | ข้อมูลเตรียมกระเป๋า/ที่อยู่ไม่ถูกต้อง |
| 400 | invalid_token_asset | เชนโทเคน คำค้นผู้สมัคร ตัวระบุ CoinGecko, metadata แค็ตตาล็อก หรือข้อมูลคอนแทรกต์/mint ไม่ถูกต้อง |
| 401 | authentication_required | ไม่มี bearer token หรือรูปแบบผิด ปิดใช้ หมุนเวียนแล้ว หรือไม่รู้จัก |
| 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 กระเป๋ารับเงิน Operator สงวนให้แผง Operator ไม่ใช่ข้อมูลรับรอง 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 | ไม่มีวิธีของร้านค้าที่พร้อม อ่าน error.message และ error.details.payment_methods เพื่อดู chain_slug, asset_ticker และ reason_code การสำรอง/เปิดกระเป๋า อะแดปเตอร์ที่ติดตั้ง และราคาต้องถูกต้อง ตั้งแต่ 6.0.6 ช่วงพักสแกนเนอร์ ผลตรวจสุขภาพที่ล้มเหลวหรือเก่า และผู้ให้บริการไม่ครบองค์ประชุมไม่ขัดขวางการสร้าง |
| 409 | payment_method_unavailable | วิธีที่เลือกไม่พร้อมใช้งานระหว่างตรวจซ้ำแบบอะตอมมิกขณะสร้าง |
| 409 | store_payment_method_not_selected | ขอ override การยืนยันของร้านค้าสำหรับสินทรัพย์ที่ร้านค้านั้นยังไม่ได้เลือกอยู่ |
| 409 | wallet_unavailable | กระเป๋ารับชำระไม่พร้อมใช้งานระหว่างตรวจซ้ำแบบอะตอมมิกขณะสร้าง |
| 409 | ipn_secret_required | มี IPN URL ที่มีผล แต่ร้านค้าไม่มีซีเคร็ตลงนาม IPN |
| 409 | payment_resource_not_ready | สินทรัพย์รับชำระหรือกระเป๋าที่จำเป็นปิดใช้ ยังไม่สำรอง รอหลักฐานเปิดบัญชีร่วม ใช้ความจุหมด หรือยังไม่พร้อมด้วยเหตุอื่น |
| 409 | account_activation_unverified | พิสูจน์การเปิดบัญชี XRP Ledger หรือ Stellar กับเอนด์พอยต์ mainnet ที่ทำงานปกติตามจำนวนที่ตั้งไว้ไม่ได้ (ค่าเริ่มต้น 2 เลือก 1 ได้) เติมเงินเข้าบัญชีที่ตรงกันแล้วลองตรวจสอบใหม่ |
| 400 | invalid_monero_wallet_rpc | เอนด์พอยต์ HTTPS ที่อยู่หลัก mainnet แบบตรงตัว ป้ายชื่อ หรือข้อมูลยืนยันตัวตน Digest/Basic/header ที่ครบถ้วนไม่ถูกต้อง |
| 404 | monero_wallet_rpc_not_found | ไม่มีการผูก Monero wallet-RPC ในขอบเขตโปรเจกต์ |
| 409 | monero_wallet_rpc_not_ready | สินทรัพย์ Monero องค์ประชุมสอง daemon การผูกที่แก้ไขไม่ได้ หรือคำรับรองการสำรอง/ดูอย่างเดียวอย่างชัดเจนยังไม่พร้อม |
| 409 | monero_wallet_rpc_unavailable | การสร้างใบแจ้งหนี้ต้องมีการผูก Monero wallet-RPC ของโปรเจกต์ที่เปิดใช้ ตรวจสอบและรับรองแล้ว พร้อมข้อมูลรับรองฝั่งเซิร์ฟเวอร์ที่ถูกต้อง |
| 503 | lightning_unavailable | วิธีเดียวที่ร้านค้าพร้อมคือ Lightning แต่ตรวจสอบกระเป๋าหรือราคาไม่ได้ ลองใหม่ด้วย idempotency key เดิม หากมีวิธีบนเชนอื่นที่พร้อม จะละเว้น Lightning ที่ไม่พร้อมแทน |
| 422 | monero_wallet_rpc_verification_failed | การตรวจสอบกระเป๋าที่ตรงตัว การตรึง HTTPS การซิงก์ องค์ประชุม daemon mainnet หรือหลักฐานเกตเวย์ปฏิเสธเมธอดล้มเหลว |
| 503 | monero_wallet_rpc_failed | wallet-RPC ภายนอกแบบ watch-only ไม่สามารถสร้างและอ่าน subaddress ใบแจ้งหนี้ซ้ำอย่างปลอดภัย ไม่สร้างที่อยู่สำรองขึ้นเอง |
| 409 | token_chain_not_ready | สินทรัพย์เหรียญหลักของเชนปิดใช้ การจับคู่การค้นพบเปลี่ยนระหว่างตรวจสอบ หรือโปรเจกต์มีสินทรัพย์โทเคนลงทะเบียนถึงสูงสุดปัจจุบัน 20 รายการแล้ว |
| 503 | dex_price_unavailable | ผู้ให้บริการ DEX ไม่พร้อม ไม่ว่าง จำกัดอัตรา ตอบข้อมูลเก่า หรือข้อมูลผิดรูปแบบ ลองใหม่หลังหนึ่งนาที ราคาคงที่ยังใช้ได้ |
| 422 | invalid_dex_price | ชุดโหมดราคาไม่ถูกต้อง หรือพูลที่เลือกให้ราคาที่ผ่านเกณฑ์สำหรับคอนแทรกต์ตรงตัวไม่ได้ เลือกพูลอื่นหรือราคาคงที่ USD |
| 422 | token_verification_failed | โหนดที่มีสิทธิ์ทั้งหมดไม่ผ่านการตรวจตัวตนเชน โค้ดคอนแทรกต์ ทศนิยม การค้นยอด หรือ mint |
| 422 | invalid_store_confirmation_policy | override ของร้านค้าใช้กับโหมดความเป็นที่สุดนี้ไม่ได้ อยู่นอกขอบเขตที่คืนมาตามเชน หรือขอยอมรับศูนย์การยืนยันที่ไม่รองรับ |
| 409 | invoice_not_payable | ใบแจ้งหนี้บนหน้าชำระเงินอยู่ในสถานะสิ้นสุดหรือพ้นกำหนดชำระแล้ว |
| 409 | invoice_payment_method_locked | การชำระที่ถูกต้องเลือกสินทรัพย์อื่นไว้แล้ว ให้ดำเนินต่อด้วย active_payment_method_id |
| 409 | payment_method_not_payable | วิธีที่เลือกเสร็จแล้วหรือไม่รับการชำระเพิ่มอีก |
| 422 | payment_qr_unavailable | คำขอชำระเงินใหญ่เกินกว่าจะเข้ารหัสเป็นรูป QR SVG |
| 503 | payment_rates_unavailable | ไม่มีราคาเสนอใหม่ที่เชื่อถือได้สำหรับวิธีชำระเงินที่พร้อมใดเลย |
| 500 | authentication_unavailable | การยืนยันตัวตน bearer ไม่สามารถอ่านหรือตรวจสอบข้อมูลรับรองที่เก็บไว้อย่างปลอดภัย |
| 429 | rate_limit_exceeded | ข้อมูลรับรองนี้ใช้โควตานาที UTC ปัจจุบันหมดแล้ว รออย่างน้อย Retry-After วินาที และลองสร้างใบแจ้งหนี้ใหม่ด้วย idempotency key เดิม |
| 500 | database_error / internal_error | ความล้มเหลวชั่วคราวฝั่งเซิร์ฟเวอร์ ลองใหม่อย่างปลอดภัยด้วย idempotency key เดิม |
ภาพรวม 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 ของ Marketplace
GETความสามารถ/v1/marketplace/capabilitiesGETรายงาน Marketplace/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ใบแจ้งหนี้ Marketplace/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/policiesGETWebhook ของ Marketplace/v1/marketplace/webhooksPOSTสร้าง webhook ของ Marketplace/v1/marketplace/webhooksPOSTอัปเดต webhook ของ Marketplace/v1/marketplace/webhooks/{webhook_id}/updatePOSTปิดใช้งาน webhook ของ Marketplace/v1/marketplace/webhooks/{webhook_id}/disableGETอีเวนต์ Marketplace/v1/marketplace/eventsGETอ่านอีเวนต์ที่เก็บไว้/v1/marketplace/events/{event_id}GETประวัติการส่งของ Marketplace/v1/marketplace/webhook-deliveriesGETรายละเอียดการส่ง/v1/marketplace/webhook-deliveries/{delivery_id}POSTส่งอีเวนต์เดิมอีกครั้ง/v1/marketplace/webhook-deliveries/{delivery_id}/resendAPI ของ Operator
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แสดงรายการ webhook/v1/operator/webhooksPOSTสร้าง webhook/v1/operator/webhooksPOSTอัปเดต webhook/v1/operator/webhooks/{webhook_id}POSTหมุนเวียนซีเคร็ต webhook/v1/operator/webhooks/{webhook_id}/rotateGETแสดงรายการส่ง webhook/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แสดงรายการ webhook ของร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksPOSTสร้าง webhook ของร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksPOSTอัปเดต webhook ของร้านค้า/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บริการ
GETการค้นพบบริการ API/GETสถานะการทำงานของบริการ/healthzGETความสามารถ/v1/operator/capabilitiesอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETสถานะการทำงาน/v1/operator/healthอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการผู้ค้า/v1/operator/merchantsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
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% หากไม่ระบุจะใช้ค่าเริ่มต้น Operator ต้องมี 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ต้องเข้าถึงผู้ค้าทั้งหมด การ override ค่าธรรมเนียมชัดเจนยังต้องมี fees.write; starting_credit ที่ไม่ใช่ศูนย์ต้องมี credits.write การเริ่มใช้งานด้วยคำเชิญยังต้องมี invitations.write ไม่มีการล็อกอินอัตโนมัติ ไม่ข้าม Basic Auth และไม่ให้เครดิตย้อนหลังเมื่อลองใหม่
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลผู้ค้า/v1/operator/merchants/{merchant_id}อ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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" \
--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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดตผู้ค้า/v1/operator/merchants/{merchant_id}อ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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" \
--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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการผู้ใช้/v1/operator/merchants/{merchant_id}/usersอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้างผู้ใช้/v1/operator/merchants/{merchant_id}/usersอ่าน + เขียน
เพิ่มผู้ดูแลผู้ค้าหรือผู้ใช้ที่จำกัดเฉพาะโปรเจกต์ที่เลือก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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" \
--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 เป็นผู้ดูแลของผู้ค้ารายนี้เท่านั้น ไม่ใช่ผู้ดูแลระบบติดตั้ง/Operator
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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลผู้ใช้/v1/operator/merchants/{merchant_id}/users/{user_id}อ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดตผู้ใช้/v1/operator/merchants/{merchant_id}/users/{user_id}อ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTเพิกถอนเซสชันผู้ใช้/v1/operator/merchants/{merchant_id}/users/{user_id}/revoke-sessionsอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการคำเชิญ/v1/operator/merchants/{merchant_id}/invitationsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้างคำเชิญ/v1/operator/merchants/{merchant_id}/invitationsอ่าน + เขียน
สร้างหรือแทนที่ลิงก์เชิญหรือรีเซ็ตรหัสผ่านแบบใช้ครั้งเดียว
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลคำเชิญ/v1/operator/invitations/{invitation_id}อ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTส่งคำเชิญอีกครั้ง/v1/operator/invitations/{invitation_id}/resendอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTเพิกถอนคำเชิญ/v1/operator/invitations/{invitation_id}/revokeอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลเครดิต/v1/operator/merchants/{merchant_id}/creditsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการบัญชีแยกประเภทเครดิต/v1/operator/merchants/{merchant_id}/credits/ledgerอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
qไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTปรับเครดิต/v1/operator/merchants/{merchant_id}/credits/adjustmentsอ่าน + เขียน
เพิ่มรายการให้เครดิตหรือแก้ไขพร้อมเหตุผลในบัญชีชำระล่วงหน้าของผู้ค้านี้
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการเติมเงิน/v1/operator/merchants/{merchant_id}/topupsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้างรายการเติมเงิน/v1/operator/merchants/{merchant_id}/topupsอ่าน + เขียน
สร้างหน้าชำระเติมเครดิตล่วงหน้า ห้ามทำเครื่องหมายว่าชำระแล้วด้วยตนเอง
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลรายการเติมเงิน/v1/operator/merchants/{merchant_id}/topups/{topup_id}อ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETรายงาน/v1/operator/reportsอ่านอย่างเดียว
อ่านภาพรวมการเงิน Operator ต้องมีสิทธิ์เข้าถึงผู้ค้าที่โฮสต์ทั้งหมด
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์ query
periodไม่บังคับตัวกรองการเงิน period มีค่าเริ่มต้น last30; ใช้ custom พร้อม start/end รูปแบบ YYYY-MM-DD เฉพาะข้อมูลรับรองที่เข้าถึงผู้ค้าทั้งหมด
startไม่บังคับตัวกรองการเงิน period มีค่าเริ่มต้น last30; ใช้ custom พร้อม start/end รูปแบบ YYYY-MM-DD เฉพาะข้อมูลรับรองที่เข้าถึงผู้ค้าทั้งหมด
endไม่บังคับตัวกรองการเงิน period มีค่าเริ่มต้น last30; ใช้ custom พร้อม start/end รูปแบบ YYYY-MM-DD เฉพาะข้อมูลรับรองที่เข้าถึงผู้ค้าทั้งหมด
currencyไม่บังคับตัวกรองการเงิน period มีค่าเริ่มต้น last30; ใช้ custom พร้อม start/end รูปแบบ YYYY-MM-DD เฉพาะข้อมูลรับรองที่เข้าถึงผู้ค้าทั้งหมด
merchant_idไม่บังคับตัวกรองการเงิน period มีค่าเริ่มต้น last30; ใช้ custom พร้อม start/end รูปแบบ YYYY-MM-DD เฉพาะข้อมูลรับรองที่เข้าถึงผู้ค้าทั้งหมด
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัดแถว ต้นทุน และจำนวนของธุรกิจเจ้าของเองก่อนคำนวณยอดรวม ตัวกรอง merchant_id ของธุรกิจเจ้าของคืน 404 รายงานใช้เขตเวลาของระบบติดตั้ง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการบันทึกตรวจสอบ/v1/operator/auditอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์ query
merchant_idไม่บังคับกรองผู้ค้าที่ได้รับอนุญาต ชนิดเหตุการณ์แบบตรงตัว (events) หรือข้อความการกระทำ (audit) เก็บเหตุการณ์ 30 วัน
searchไม่บังคับกรองผู้ค้าที่ได้รับอนุญาต ชนิดเหตุการณ์แบบตรงตัว (events) หรือข้อความการกระทำ (audit) เก็บเหตุการณ์ 30 วัน
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการอีเวนต์/v1/operator/eventsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์ query
merchant_idไม่บังคับกรองผู้ค้าที่ได้รับอนุญาต ชนิดเหตุการณ์แบบตรงตัว (events) หรือข้อความการกระทำ (audit) เก็บเหตุการณ์ 30 วัน
event_typeไม่บังคับกรองผู้ค้าที่ได้รับอนุญาต ชนิดเหตุการณ์แบบตรงตัว (events) หรือข้อความการกระทำ (audit) เก็บเหตุการณ์ 30 วัน
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการ webhook/v1/operator/webhooksอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้าง webhook/v1/operator/webhooksอ่าน + เขียน
สมัครรับเหตุการณ์วงจรสถานะ Operator ในอนาคต ไม่ใช่ webhook การชำระของร้านค้า
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดต webhook/v1/operator/webhooks/{webhook_id}อ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTหมุนเวียนซีเคร็ต webhook/v1/operator/webhooks/{webhook_id}/rotateอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการส่ง webhook/v1/operator/webhooks/{webhook_id}/deliveriesอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการโปรเจกต์/v1/operator/merchants/{merchant_id}/projectsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้างโปรเจกต์/v1/operator/merchants/{merchant_id}/projectsอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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" \
--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จำเป็นชื่อและตัวระบุโปรเจกต์ที่คงที่และไม่ซ้ำ สร้างกระเป๋าภายในด้วยกระบวนการเริ่มโปรเจกต์เดิม ไม่โอนเงินเด็ดขาด
checkout_descriptionไม่บังคับ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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลโปรเจกต์/v1/operator/merchants/{merchant_id}/projects/{project_id}อ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดตโปรเจกต์/v1/operator/merchants/{merchant_id}/projects/{project_id}อ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้างร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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ไม่บังคับใช้สตริงทศนิยมสำหรับเปอร์เซ็นต์ ร้านค้าใหม่ใช้รูปลักษณ์ร้านค้าเริ่มต้นของโปรเจกต์
allow_zero_amount_invoicesไม่บังคับตั้งสินทรัพย์ที่ยอมรับด้วย payment-assets ใบแจ้งหนี้จำนวนศูนย์ปิดตามค่าเริ่มต้น
allow_underpaymentsไม่บังคับตั้งสินทรัพย์ที่ยอมรับด้วย payment-assets ใบแจ้งหนี้จำนวนศูนย์ปิดตามค่าเริ่มต้น
allow_overpaymentsไม่บังคับตั้งสินทรัพย์ที่ยอมรับด้วย payment-assets ใบแจ้งหนี้จำนวนศูนย์ปิดตามค่าเริ่มต้น
allowed_chain_slugsไม่บังคับตั้งสินทรัพย์ที่ยอมรับด้วย payment-assets ใบแจ้งหนี้จำนวนศูนย์ปิดตามค่าเริ่มต้น
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 สำหรับฝังอย่างชัดเจน
allowed_embed_originsไม่บังคับใช้ภาษาที่รองรับและโดเมนตามบทบาทที่ใช้งาน ตั้ง 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}อ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดตร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}อ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลรูปลักษณ์ร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดตรูปลักษณ์ร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceอ่าน + เขียน
บันทึกดีไซน์ร้านค้าที่ตรวจสอบและป้องกันด้วยรุ่นแก้ไข
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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จำเป็นอ่าน revision ปัจจุบันด้วย GET ก่อน รุ่นแก้ไขเก่าจะล้มเหลวโดยไม่ทับงานผู้แก้ไขคนอื่น
settingsobjectจำเป็น
รูปลักษณ์หน้าชำระเงินที่ตรวจสอบแล้ว รวม inherit_default_store, แบรนด์ ข้อความนำ/ท้าย ขนาดตัวอักษร และการแสดงผล ไม่อนุญาต HTML/JavaScript ตามอำเภอใจ อัปโหลดไบต์รูปภาพได้เฉพาะคอนโซลรายละเอียด
รูปลักษณ์หน้าชำระเงินที่ตรวจสอบแล้ว รวม inherit_default_store, แบรนด์ ข้อความนำ/ท้าย ขนาดตัวอักษร และการแสดงผล ไม่อนุญาต HTML/JavaScript ตามอำเภอใจ อัปโหลดไบต์รูปภาพได้เฉพาะคอนโซล
การตอบกลับ 200 application/json
ตัวอย่างการตอบกลับ
{
"settings": {
"inherit_default_store": false,
"title": "Pay securely",
"theme": "light"
},
"revision": 2
}ฟิลด์การตอบกลับ
หมายเหตุการใช้งาน
- ต้องมี projects.write เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการสินทรัพย์รับชำระของร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดตสินทรัพย์รับชำระของร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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[]จำเป็น
แทนที่วิธีบนเชนทั้งหมดด้วย UUID asset_id และ display_order ค่า [] ล้างสินทรัพย์บนเชนที่ยอมรับ ใช้เฉพาะสินทรัพย์โปรเจกต์ที่ตรวจสอบแล้ว ไม่ตั้งค่า Lightningรายละเอียด
แทนที่วิธีบนเชนทั้งหมดด้วย UUID asset_id และ display_order ค่า [] ล้างสินทรัพย์บนเชนที่ยอมรับ ใช้เฉพาะสินทรัพย์โปรเจกต์ที่ตรวจสอบแล้ว ไม่ตั้งค่า Lightning
การตอบกลับ 200 application/json
ตัวอย่างการตอบกลับ
{
"data": []
}ฟิลด์การตอบกลับ
data[]arrayหมายเหตุการใช้งาน
- ต้องมี projects.write เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการ webhook ของร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้าง webhook ของร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 และ webhook
enabledbooleansไม่บังคับการสร้างคืนซีเคร็ตลงนามครั้งเดียว นี่คือ callback การชำระของร้านค้า ไม่ใช่เหตุการณ์วงจรสถานะ Operator
automatic_redeliverybooleansไม่บังคับการสร้างคืนซีเคร็ตลงนามครั้งเดียว นี่คือ callback การชำระของร้านค้า ไม่ใช่เหตุการณ์วงจรสถานะ Operator
การตอบกลับ 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดต webhook ของร้านค้า/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooks/{webhook_id}อ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 และ webhook
enabledbooleansไม่บังคับการสร้างคืนซีเคร็ตลงนามครั้งเดียว นี่คือ callback การชำระของร้านค้า ไม่ใช่เหตุการณ์วงจรสถานะ Operator
automatic_redeliverybooleansไม่บังคับการสร้างคืนซีเคร็ตลงนามครั้งเดียว นี่คือ callback การชำระของร้านค้า ไม่ใช่เหตุการณ์วงจรสถานะ Operator
การตอบกลับ 200 application/json
ตัวอย่างการตอบกลับ
{
"id": "44444444-4444-4444-8444-444444444444",
"name": "Orders",
"enabled": true
}ฟิลด์การตอบกลับ
หมายเหตุการใช้งาน
- ต้องมี projects.write เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการใบแจ้งหนี้/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoicesอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETดึงข้อมูลใบแจ้งหนี้/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoices/{invoice_id}อ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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/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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
- invoice_id คือ ID สาธารณะของใบแจ้งหนี้ที่คืนเมื่อสร้างและใน callback ไม่ใช่ id ภายใน
ข้อผิดพลาด
GETแสดงรายการกระเป๋า/v1/operator/merchants/{merchant_id}/projects/{project_id}/walletsอ่านอย่างเดียว
อ่านยอดคงเหลือสาธารณะของกระเป๋าจากแคช ไม่อ่านคีย์ส่วนตัวหรือวลีกู้คืนเด็ดขาด
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ยอดคงเหลือเป็นข้อมูลที่ตรวจพบและแคชไว้พร้อมฟิลด์ความใหม่ ไม่รับประกันยอดที่ใช้จ่ายได้ API นี้ส่งเงินหรือส่งออกคีย์ไม่ได้
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการที่อยู่กระเป๋า/v1/operator/merchants/{merchant_id}/projects/{project_id}/wallets/{wallet_id}/addressesอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
limitไม่บังคับLimit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อยรายละเอียด
Limit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อย
beforeไม่บังคับLimit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อยรายละเอียด
Limit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อย
searchไม่บังคับLimit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อยรายละเอียด
Limit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อย
has_balanceไม่บังคับLimit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อยรายละเอียด
Limit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อย
hide_small_balancesไม่บังคับLimit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ has_balance=false และ hide_small_balances=false เพื่อรวมยอดว่าง/ยอดน้อยรายละเอียด
Limit 1–50 ค่าเริ่มต้น 25 ส่ง next_cursor เป็น before เพื่ออ่านหน้าถัดไป ไม่ใส่ before สำหรับหน้า 1 ใช้ 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
GETแสดงรายการข้อมูลรับรองของผู้ค้า/v1/operator/merchants/{merchant_id}/api-credentialsอ่านอย่างเดียว
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_OPERATOR_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
pageไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
searchไม่บังคับหน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเองรายละเอียด
หน้าเริ่มที่ 1 หน้าละ 25 รายการ ค้นหาได้ในผู้ค้า ผู้ใช้ โปรเจกต์ ร้านค้า กระเป๋า ข้อมูลรับรอง และ webhook รายการเหตุการณ์เฉพาะใช้ตัวกรองของตนเอง
คำขอ
: "${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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTสร้างข้อมูลรับรองผู้ค้า/v1/operator/merchants/{merchant_id}/api-credentialsอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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" \
--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))เนื้อหาคำขอ
access_levelread_only | read_writeไม่บังคับสิทธิ์อ่าน/เขียนเปิดความสามารถตามข้อกำหนด API ผู้ค้าเดิม
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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTอัปเดตข้อมูลรับรองผู้ค้า/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}อ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTหมุนเวียนข้อมูลรับรองผู้ค้า/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/rotateอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTเพิกถอนข้อมูลรับรองผู้ค้า/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/revokeอ่าน + เขียน
จัดการหรือตรวจทรัพยากรผู้ค้าที่โฮสต์ตามชื่อ โดยใช้ข้อมูลรับรอง Operator แยก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 เฉพาะผู้ค้าที่โฮสต์และได้รับอนุญาต คีย์ Operator ไม่เข้าถึงพื้นที่ธุรกิจของเจ้าของเอง
- บันทึก Idempotency-Key ที่ไม่ซ้ำและเนื้อหาเดิมทุกไบต์แบบถาวรก่อนส่ง การลองใหม่ไม่ทำซ้ำการกระทำที่ commit แล้ว การเรียกซ้ำละเว้นฟิลด์ซีเคร็ต หากการตอบกลับซีเคร็ตสูญหาย ให้ตรวจทรัพยากรที่สร้างแล้วหมุนเวียน/ออกใหม่อย่างชัดเจน 409 operator_request_in_progress อาจหมายถึงคำขอถูกขัดจังหวะและไม่ทราบผล ตรวจทรัพยากร/บันทึกตรวจสอบ อย่าลองด้วยคีย์ใหม่โดยไม่ตรวจดู
- ตัวอย่างการตอบกลับแสดงฟิลด์ที่เลือกไว้ ให้ถือฟิลด์เพิ่มเติมในการตอบกลับเป็นการเพิ่มที่รองรับได้
ข้อผิดพลาด
POSTตรวจสอบโทเคนคำเชิญ/v1/onboarding/invitations/checkสาธารณะ
เริ่มใช้งานด้วยโทเคนเท่านั้น ไม่รับคีย์ Operator หรือเข้าสู่ระบบอัตโนมัติ การล็อกอินคอนโซลยังต้องผ่าน 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สาธารณะ
เริ่มใช้งานด้วยโทเคนเท่านั้น ไม่รับคีย์ Operator หรือเข้าสู่ระบบอัตโนมัติ การล็อกอินคอนโซลยังต้องผ่าน 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETรายงาน Marketplace/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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTสร้างผู้ขาย/v1/marketplace/vendorsอ่าน + เขียน
ต้องมีชื่อ (160 อักขระ); external_id ไม่บังคับและไม่ซ้ำในโปรเจกต์ (128); email ไม่บังคับ (254); description สูงสุด 2000 ค่า commission_percent null ใช้ค่าร้านค้า override ที่ไม่ใช่ 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETดึงข้อมูลผู้ขาย/v1/marketplace/vendors/{vendor_id}อ่านอย่างเดียว
คืนผู้ขายหนึ่งราย revision และค่า override คอมมิชชัน
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTเพิ่มปลายทางจ่ายเงิน/v1/marketplace/vendors/{vendor_id}/destinationsอ่าน + เขียน
ลงทะเบียนที่อยู่ BTC mainnet หรือ 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETใบแจ้งหนี้ Marketplace/v1/marketplace/invoicesอ่านอย่างเดียว
ใบแจ้งหนี้แบบแบ่งหน้า q ค้นคำสั่งซื้อ อีเมล คำอธิบาย metadata และ UUID ใบแจ้งหนี้ กรอง store_id, vendor_id และสถานะ Marketplace ไม่รวมใบแจ้งหนี้ปกติ
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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/rail ปรากฏได้ครั้งเดียวรายละเอียด
คัดลอก chain_slug ใน โปรเจกต์ → ร้านค้า → วิธีชำระเงิน หรืออ่านจาก GET /v1/projects/{project_id}/stores/{store_id}/payment-assets เช่น ethereum, base หรือ bitcoin คู่ chain/rail ปรากฏได้ครั้งเดียว
asset_ids[]UUID[] | nullไม่บังคับUUID asset.id บนเชน ไม่ใช่ที่อยู่คอนแทรกต์หรือ ID วิธีชำระของใบแจ้งหนี้ ใช้ค่านี้หรือ asset_tickers อย่างใดอย่างหนึ่ง ไม่ใส่ทั้งสองตัวเลือกเพื่อเลือกทุกสินทรัพย์ที่ใช้งานและยอมรับบนเชนนี้ [] และ ID ซ้ำ/ศูนย์ไม่ถูกต้อง ใน 5.4.0+ ละเว้น ID ที่ไม่ใช้งาน/ไม่ยอมรับบนเชนนี้ในร้านค้านี้ หากไม่ตรงทั้งหมดจะใช้ค่าเริ่มต้นร้านค้ารายละเอียด
UUID asset.id บนเชน ไม่ใช่ที่อยู่คอนแทรกต์หรือ ID วิธีชำระของใบแจ้งหนี้ ใช้ค่านี้หรือ asset_tickers อย่างใดอย่างหนึ่ง ไม่ใส่ทั้งสองตัวเลือกเพื่อเลือกทุกสินทรัพย์ที่ใช้งานและยอมรับบนเชนนี้ [] และ ID ซ้ำ/ศูนย์ไม่ถูกต้อง ใน 5.4.0+ ละเว้น ID ที่ไม่ใช้งาน/ไม่ยอมรับบนเชนนี้ในร้านค้านี้ หากไม่ตรงทั้งหมดจะใช้ค่าเริ่มต้นร้านค้า
asset_tickers[]string[] | nullไม่บังคับMerchant 5.3.0+ สัญลักษณ์เช่น BTC, USDC หรือ PEPE ในขอบเขต chain_slug และร้านค้านี้ ticker ไม่ซ้ำ 1–64 ค่า ตัดช่องว่างขอบ/ไม่แยกตัวพิมพ์เล็กใหญ่ ใช้ตัวอักษร ASCII/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–40 ตัว ใช้ค่านี้หรือ asset_ids อย่างใดอย่างหนึ่ง ใน 5.4.0+ ละเว้น ticker ที่ไม่รู้จัก/ไม่ใช้งาน/ไม่ยอมรับ สัญลักษณ์ที่ยอมรับแต่กำกวมยังล้มเหลว ให้ใช้ asset_ids วิธีที่เลือกและเปิดใช้ต้องมีกระเป๋ากับราคาที่ถูกต้อง สแกนเนอร์บนเชนล่มชั่วคราวไม่บล็อกการสร้างตั้งแต่ 6.0.6 Lightning รับ ticker ได้เฉพาะ BTC หากระบุรายละเอียด
Merchant 5.3.0+ สัญลักษณ์เช่น BTC, USDC หรือ PEPE ในขอบเขต chain_slug และร้านค้านี้ ticker ไม่ซ้ำ 1–64 ค่า ตัดช่องว่างขอบ/ไม่แยกตัวพิมพ์เล็กใหญ่ ใช้ตัวอักษร ASCII/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–40 ตัว ใช้ค่านี้หรือ asset_ids อย่างใดอย่างหนึ่ง ใน 5.4.0+ ละเว้น ticker ที่ไม่รู้จัก/ไม่ใช้งาน/ไม่ยอมรับ สัญลักษณ์ที่ยอมรับแต่กำกวมยังล้มเหลว ให้ใช้ asset_ids วิธีที่เลือกและเปิดใช้ต้องมีกระเป๋ากับราคาที่ถูกต้อง สแกนเนอร์บนเชนล่มชั่วคราวไม่บล็อกการสร้างตั้งแต่ 6.0.6 Lightning รับ ticker ได้เฉพาะ BTC หากระบุ
payment_railonchain | lightningไม่บังคับค่าเริ่มต้น onchain หากเลือก Bitcoin Lightning ใช้ {chain_slug: bitcoin, payment_rail: lightning} โดยไม่มี asset_ids; asset_tickers อาจเป็น [BTC] ได้ Bitcoin บนเชนไม่รวม Lightning การเชื่อมต่อ Lightning ของร้านค้าต้องเปิดและพร้อมแล้วรายละเอียด
ค่าเริ่มต้น onchain หากเลือก Bitcoin Lightning ใช้ {chain_slug: bitcoin, payment_rail: lightning} โดยไม่มี asset_ids; asset_tickers อาจเป็น [BTC] ได้ Bitcoin บนเชนไม่รวม Lightning การเชื่อมต่อ Lightning ของร้านค้าต้องเปิดและพร้อมแล้ว
order_idstring | nullไม่บังคับเลขอ้างอิงคำสั่งซื้อผู้ค้า 1–128 อักขระหลังตัดช่องว่างขอบ ปฏิเสธอักขระควบคุม
emailstring | nullไม่บังคับอีเมลลูกค้าสำหรับผู้ค้าเท่านั้น ปรับเป็นที่อยู่ ASCII ที่ใช้ได้จริงไม่เกิน 254 อักขระ ไม่ระบุหรือ null จะไม่เก็บอีเมล
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ไม่บังคับcallback HTTPS สาธารณะไม่เกิน 2,048 ไบต์ ไม่มีข้อมูลรับรองหรือ fragment ใช้แทนค่าเริ่มต้นร้านค้า; null/ไม่ระบุใช้ค่าเดิม
redirect_urlstring | nullไม่บังคับURL HTTPS สำเร็จที่ใช้หลังชำระเสร็จสิ้น ไม่เกิน 2,048 ไบต์และไม่มีข้อมูลรับรองฝังอยู่ ไม่ระบุหรือ null ใช้ค่าเริ่มต้นร้านค้าและล้างค่าไม่ได้
cancel_urlstring | nullไม่บังคับURL HTTPS ส่งกลับเมื่อหน้าชำระเงินจบโดยไม่ชำระสำเร็จ ไม่ระบุหรือ 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 ใช้ดีไซน์ปัจจุบันของร้านค้า ออบเจ็กต์รวมถึง {} จะตรึงดีไซน์และรูปภาพที่คำนวณได้เมื่อสร้าง ดูโครงสร้าง override ด้านล่าง ไม่มีการตั้งค่าการเงิน HTML, CSS, JavaScript หรือ URL รูปภาพภายนอกรายละเอียด
การตั้งค่าการแสดงผลบางส่วนสำหรับใบแจ้งหนี้นี้ ไม่ระบุ/null ใช้ดีไซน์ปัจจุบันของร้านค้า ออบเจ็กต์รวมถึง {} จะตรึงดีไซน์และรูปภาพที่คำนวณได้เมื่อสร้าง ดูโครงสร้าง override ด้านล่าง ไม่มีการตั้งค่าการเงิน HTML, CSS, JavaScript หรือ URL รูปภาพภายนอก
inherit_default_storebooleanไม่บังคับtrue เลือกดีไซน์ร้านค้าเริ่มต้นของโปรเจกต์เป็นฐาน มิฉะนั้นใช้ดีไซน์ที่มีผลของร้านค้าเป้าหมาย จากนั้นใช้ override และบันทึกแยก ธงในใบแจ้งหนี้หลังคำนวณเป็น falseรายละเอียด
true เลือกดีไซน์ร้านค้าเริ่มต้นของโปรเจกต์เป็นฐาน มิฉะนั้นใช้ดีไซน์ที่มีผลของร้านค้าเป้าหมาย จากนั้นใช้ override และบันทึกแยก ธงในใบแจ้งหนี้หลังคำนวณเป็น 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 อย่าส่งทั้งสอง
intro_font_sizeintegerไม่บังคับพิกเซล: 12, 14, 16, 18, 20 หรือ 24 ค่าเริ่มต้น 16 เว้นแต่สืบทอดค่าต่างออกไป
outro_font_sizeintegerไม่บังคับพิกเซล: 12, 14, 16, 18, 20 หรือ 24 ค่าเริ่มต้น 16 เว้นแต่สืบทอดค่าต่างออกไป
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 มีค่าเริ่มต้นเป็นคีย์เป้าหมาย อัปโหลดใน ร้านค้า → หน้าชำระเงิน ก่อน คัดลอก Store API ID จาก พื้นฐาน → API IDs รูปไม่มีหรือ ID ข้ามโปรเจกต์คืน 400 ไม่รับ URL ภายนอกหรือข้อมูลรูปภาพรายละเอียด
คีย์ logo_light, logo_dark, favicon ไม่ระบุคีย์จะคงรูปฐาน; null ลบรูป ออบเจ็กต์ {store_id: UUID, kind?: logo_light|logo_dark|favicon} ใช้รูปอัปโหลดที่มีผลของร้านค้านั้นซ้ำในโปรเจกต์เดียวกันเท่านั้น kind มีค่าเริ่มต้นเป็นคีย์เป้าหมาย อัปโหลดใน ร้านค้า → หน้าชำระเงิน ก่อน คัดลอก Store API ID จาก พื้นฐาน → API IDs รูปไม่มีหรือ 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[]ไม่บังคับslug เชนเรียงลำดับ ไม่เกิน 60 ค่าที่ไม่ซ้ำ (ตัวพิมพ์เล็ก ตัวเลข ขีดกลาง ไม่เกิน 64 อักขระ) [] ล้างค่า เรียงใหม่เฉพาะวิธีที่มีในใบแจ้งหนี้รายละเอียด
slug เชนเรียงลำดับ ไม่เกิน 60 ค่าที่ไม่ซ้ำ (ตัวพิมพ์เล็ก ตัวเลข ขีดกลาง ไม่เกิน 64 อักขระ) [] ล้างค่า เรียงใหม่เฉพาะวิธีที่มีในใบแจ้งหนี้
featured_asset_ids[]UUID[]ไม่บังคับID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่ารายละเอียด
ID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่า
default_asset_idUUID|nullไม่บังคับID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่ารายละเอียด
ID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่า
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ไม่บังคับURL HTTPS ไม่เกิน 2,048 อักขระ ไม่มีข้อมูลรับรอง ค่าว่างล้างค่า ลิงก์เปิดหน้าต่างใหม่
terms_urlstringไม่บังคับURL HTTPS ไม่เกิน 2,048 อักขระ ไม่มีข้อมูลรับรอง ค่าว่างล้างค่า ลิงก์เปิดหน้าต่างใหม่
privacy_urlstringไม่บังคับURL HTTPS ไม่เกิน 2,048 อักขระ ไม่มีข้อมูลรับรอง ค่าว่างล้างค่า ลิงก์เปิดหน้าต่างใหม่
return_button_textstringไม่บังคับป้ายชื่อไม่เกิน 60 อักขระ ใช้ redirect_url/cancel_url/redirect_automatically/language ระดับบนสุดเพื่อกำหนดพฤติกรรมใบแจ้งหนี้
show_return_buttonbooleanไม่บังคับแสดงปุ่มกลับไปยังผู้ค้า/ยกเลิกแบบกดเองในหน้าชำระเงิน รวมสถานะสิ้นสุด ไม่ระบุจะใช้รูปลักษณ์ร้านค้า (ค่าเริ่มต้น true); false ซ่อนปุ่ม ไม่ยกเลิกใบแจ้งหนี้ ไม่ซ่อน URL ใน JSON และไม่ปิดการเปลี่ยนเส้นทางเมื่อสำเร็จอัตโนมัติ หากต้องการให้ตั้ง redirect_automatically ระดับบนสุดเป็น false แยก ต้องใช้ merchant 8.1.4 หรือใหม่กว่ารายละเอียด
แสดงปุ่มกลับไปยังผู้ค้า/ยกเลิกแบบกดเองในหน้าชำระเงิน รวมสถานะสิ้นสุด ไม่ระบุจะใช้รูปลักษณ์ร้านค้า (ค่าเริ่มต้น true); false ซ่อนปุ่ม ไม่ยกเลิกใบแจ้งหนี้ ไม่ซ่อน URL ใน JSON และไม่ปิดการเปลี่ยนเส้นทางเมื่อสำเร็จอัตโนมัติ หากต้องการให้ตั้ง redirect_automatically ระดับบนสุดเป็น false แยก ต้องใช้ merchant 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTยกเลิกใบแจ้งหนี้ที่ยังไม่ชำระ/v1/marketplace/invoices/{invoice_id}/cancelอ่าน + เขียน
เฉพาะใบแจ้งหนี้ new หรือ expired ที่ยังไม่ชำระ ยอดรับล่าช้าถูกระงับเพื่อตรวจสอบ revision คือรุ่นแก้ไขใบแจ้งหนี้ Marketplace
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETยอดคงเหลือในบัญชีแยกประเภทของโปรเจกต์/v1/marketplace/balancesอ่านอย่างเดียว
ยอดรวมสินทรัพย์/บัญชีที่แน่นอนตามกลุ่ม รวม held, available, reserved, paid, commission, refunds และค่าธรรมเนียมเครือข่าย ไม่รวมบัญชีปรับสมดุลภายนอก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTเตรียมการจ่ายเงิน/v1/marketplace/payoutsอ่าน + เขียน
สำรอง ID ยอดจัดสรรที่พร้อม 1–100 รายการในสินทรัพย์/กระเป๋าเดียว 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETรายละเอียดการจ่ายเงิน/v1/marketplace/payouts/{payout_id}อ่านอย่างเดียว
แผน/แฮชที่แก้ไขไม่ได้ revision วันหมดอายุ รายการผู้รับ ความพยายามย่อยที่เก็บไว้ ความคืบหน้า ค่าธรรมเนียมแน่นอน และลิงก์ explorer ไม่มีคีย์ส่วนตัวหรือไบต์ที่ลงนามแล้ว
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTตรวจสอบและดำเนินการจ่ายเงินต่อ/v1/marketplace/payouts/{payout_id}/resumeอ่าน + เขียน
เฉพาะ needs_attention ใช้แผน/แฮชที่เก็บไว้ซ้ำ ไม่ส่งให้ผู้รับที่ยืนยันแล้วอีก ผู้ให้บริการอิสระสองรายต้องพิสูจน์ EVM revert บนเชนหลักที่ยอมรับและยืนยันเพียงพอ ก่อนแทนงานย่อยที่ล้มเหลว ค่าธรรมเนียมก่อนหน้ายังใช้จากงบอนุมัติและทุกแฮชคงอยู่ในประวัติ การส่งโทเคนที่ไม่ทราบผล/ถึงบางส่วนคืน 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTยกเลิกงานที่ยังไม่ได้ลงนาม/v1/marketplace/payouts/{payout_id}/cancelอ่าน + เขียน
ปล่อยเฉพาะยอดสำรองที่มั่นใจว่ายังไม่ลงนาม/ส่ง ผู้รับที่ยืนยันแล้วและบันทึกตรวจสอบยังอยู่ งานลงนาม/ไม่แน่นอนยกเลิกไม่ได้ revert ที่พิสูจน์และกู้คืนอย่างชัดเจนแล้วจะไม่ขวางการยกเลิกงานที่เหลือซึ่งยังไม่ลงนาม
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTอนุมัตินโยบายจ่ายเงิน/v1/marketplace/policiesอ่าน + เขียน
สตริงหน่วยย่อยที่แน่นอน; minimum <= transfer <= daily principal และเพดาน fee/gas <= งบรายวันของแต่ละส่วน 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETWebhook ของ Marketplace/v1/marketplace/webhooksอ่านอย่างเดียว
สูงสุด 20 เอนด์พอยต์พร้อม event_types ที่รองรับ ไม่คืนซีเคร็ตลงนามทั้งแบบเข้ารหัสหรือข้อความธรรมดา
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTสร้าง webhook ของ Marketplace/v1/marketplace/webhooksอ่าน + เขียน
เฉพาะ HTTPS สาธารณะ ไม่มีข้อมูลรับรอง ปลายทางส่วนตัว หรือการเปลี่ยนเส้นทาง คืน signing_secret หนึ่งครั้งต่อการตอบกลับสร้างแบบ idempotent ที่เก็บไว้ ให้เก็บอย่างปลอดภัย แยกจากซีเคร็ต 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTอัปเดต webhook ของ Marketplace/v1/marketplace/webhooks/{webhook_id}/updateอ่าน + เขียน
การเปลี่ยนแปลงยกเลิกการส่งเก่าที่ยังไม่ส่ง ซีเคร็ตไม่เปลี่ยน payload เก่าที่แก้ไขไม่ได้ไม่ถูกเปลี่ยนปลายทางไป 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
POSTปิดใช้งาน webhook ของ Marketplace/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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETอีเวนต์ Marketplace/v1/marketplace/eventsอ่านอย่างเดียว
ข้อมูลอ้างอิงเหตุการณ์ที่แก้ไขไม่ได้แบบแบ่งหน้า q ค้นชนิด/อ้างอิง; status กรอง event_type
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETอ่านอีเวนต์ที่เก็บไว้/v1/marketplace/events/{event_id}อ่านอย่างเดียว
คืน payload เหตุการณ์ต้นฉบับที่แก้ไขไม่ได้ ไม่สร้างใหม่จากยอดปัจจุบัน
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETประวัติการส่งของ Marketplace/v1/marketplace/webhook-deliveriesอ่านอย่างเดียว
รายการส่งแบบแบ่งหน้า ชนิดเหตุการณ์ จำนวนครั้ง และผลล่าสุด กรอง status pending/sending/succeeded/failed/cancelled; q ค้นชนิดเหตุการณ์
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETรายละเอียดการส่ง/v1/marketplace/webhook-deliveries/{delivery_id}อ่านอย่างเดียว
URL เดิม payload ที่เก็บไว้ ผล HTTP และข้อผิดพลาดที่ปลอดภัย ไม่มีซีเคร็ตลงนาม
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MARKETPLACE_API_TOKEN |
| พารามิเตอร์ | ชนิด / ตำแหน่ง | กฎ |
|---|---|---|
| permission | credential scope | marketplace.read |
พารามิเตอร์ query
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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง 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 ต้องมี Idempotency-Key 16–128 อักขระที่บันทึกถาวร (ตัวอักษร ตัวเลข -, _ หรือ .) หลังหมดเวลารอ ใช้คีย์และคำสั่ง JSON เดิม คำสั่งต่างกันคืน 409 เก็บการตอบกลับที่เสร็จแล้ว 30 วัน คีย์เก่ากลายเป็นระเบียนห้ามใช้ซ้ำ ห้ามเปลี่ยนคีย์เพียงเพื่อข้ามผลลัพธ์ที่ไม่แน่นอน
- คีย์มีรายการโปรเจกต์ ข้อจำกัดร้านค้าของใบแจ้งหนี้ที่เลือกได้ วันหมดอายุ รายการอนุญาต IP และโควตา 1–600/นาที (ค่าเริ่มต้น 60) HTTP 429 มี Retry-After คีย์จำกัดร้านค้าไม่เห็นผู้ขาย ยอดโปรเจกต์ บัญชีแยกประเภท การจ่ายเงิน หรือการตั้งค่า เก็บข้อมูลรับรองใช้เงินไว้เฉพาะเซิร์ฟเวอร์ที่เชื่อถือ ห้ามอยู่ในเบราว์เซอร์หรือแอปมือถือที่แจกจ่าย
ข้อผิดพลาด
GETแสดงรายการข้อยกเว้นของการชำระเงิน/v1/projects/{project_id}/reconciliationอ่านอย่างเดียว
คิวตรวจสอบแบบแบ่งหน้าเดียวสำหรับการชำระขาด เกิน ล่าช้า ถูกจัดเชนใหม่ หรือกำกวม การส่งล้มเหลว และวิธีที่ปิด/หมดอายุ กรณีที่ผู้ดำเนินระบบรับทราบแล้วเปิดใหม่เมื่อมีหลักฐานใหม่
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MERCHANT_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
reasonstringunderpaid, overpaid, late, reorged, ambiguous, delivery_failed, disabled_method หรือ expired_method
คำขอ
: "${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[]เสมอ
กรณีที่อัปเดตล่าสุดมาก่อน ใช้ invoice_id ไม่ใช่ id ภายใน ใน URL รายละเอียดผู้ค้า
invoice_idUUIDเสมอID ระเบียนภายใน / UUID ใบแจ้งหนี้ที่ลูกค้าเห็น invoice_id ตรงกับ payload callback
paginationobjectเสมอ
page (1–40001), per_page (25), จำนวนแถวตรงเงื่อนไขทั้งหมด, has_more
หมายเหตุการใช้งาน
- อ่านอย่างเดียว จำกัดขอบเขตโปรเจกต์ และใช้โควตาข้อมูลรับรอง การตัดสินใจทางการเงินและคืนเงินยังทำได้เฉพาะคอนโซล
- แต่ละแถวมี id (UUID ภายใน), invoice_id (UUID สาธารณะเดียวกับ callback), ข้อมูลร้านค้า จำนวน/สกุลเงินตราทั่วไปเดิม invoice_status, สถานะกรณี เหตุผล revision และ updated_at ใช้ invoice_id ในเอนด์พอยต์รายละเอียดผู้ค้า
- การตรวจพบอัตโนมัติใช้ช่วงติดตามเดิมของใบแจ้งหนี้ Rescan ขยายการติดตามหนึ่งชั่วโมงโดยไม่เปิดหน้าชำระเงิน วิธีหลังชำระเสร็จสิ้น/ยกเลิกยังติดตามภายในช่วงนั้น
ข้อผิดพลาด
GETอ่านหลักฐานการกระทบยอด/v1/projects/{project_id}/reconciliation/{invoice_id}อ่านอย่างเดียว
คืนใบแจ้งหนี้ กรณี ยอดรวมวิธีที่แน่นอนและจำนวนคืนได้ ธุรกรรมที่ตรวจพบ ประวัติการส่ง การตัดสินใจของผู้ค้า และการโอนคืนเงินที่เชื่อมโยง ไม่เปิดเผยคีย์ลงนามหรือซีเคร็ต callback
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MERCHANT_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
คำขอ
: "${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เสมอ
ใบแจ้งหนี้ผู้ค้าฉบับเต็ม: ฟิลด์สรุป metadata ส่วนตัว และ payment_intents ไม่ห่อใน data
customer_addressstring | nullเสมอที่อยู่บรรทัดเดียวในข้อมูลผู้ค้า ซึ่งได้จาก metadata ส่วนตัว company, street, street2, zip, city, country, countryiso2 และ vatid
exchange_rate_spread_percentdecimal stringเสมอสเปรดราคาเสนอที่ล็อกไว้: ค่า override ตอนสร้าง หรือค่าเริ่มต้นร้านค้าหากไม่ระบุ ใช้ก่อนปัดขึ้นและไม่เปลี่ยนในใบแจ้งหนี้นี้
underpayment_tolerance_percentdecimal stringเสมอเปอร์เซ็นต์ยอดขาดที่ยอมรับแบบแก้ไขไม่ได้ เก็บภาพข้อมูลเมื่อสร้างใบแจ้งหนี้
amount_statusamount statusเสมอnone, partial, paid หรือ overpaid ใบแจ้งหนี้จำนวนศูนย์ที่อนุญาตชัดเจนชำระเสร็จสิ้นด้วย none และไม่มีวิธีชำระเงิน
monitoring_expires_atRFC 3339 timestampเสมอเวลาสิ้นสุดการติดตามล่าช้าที่ช้าที่สุดตามการตั้งค่าในทุกวิธีชำระเงิน
ipn_urlstring | nullเสมอปลายทาง IPN ที่มีผลต่อใบแจ้งหนี้ คืนเฉพาะผู้ค้า ไม่รวมในหน้าชำระเงินสาธารณะ
metadataobjectเสมอmetadata ผู้ค้า ไม่คืนผ่านหน้าชำระเงินสาธารณะ เครื่องมือชำระเงินในคอนโซลเพิ่มข้อมูลที่มา payment_tool (id, kind, title, pricing, requested_amount, request_id) ซึ่งไม่พิสูจน์การชำระเงิน ยืนยัน callback และดำเนินการ invoice.settled ครั้งเดียวต่อ invoice_idรายละเอียด
metadata ผู้ค้า ไม่คืนผ่านหน้าชำระเงินสาธารณะ เครื่องมือชำระเงินในคอนโซลเพิ่มข้อมูลที่มา payment_tool (id, kind, title, pricing, requested_amount, request_id) ซึ่งไม่พิสูจน์การชำระเงิน ยืนยัน callback และดำเนินการ invoice.settled ครั้งเดียวต่อ invoice_id
payment_intents[]object[]เสมอ
วิธีชำระเงินที่เสนอราคาและสถานะติดตาม
payment_railonchain | lightningเสมอช่องทางของใบแจ้งหนี้ Bitcoin บนเชนและ Lightning อาจใช้ asset_id เดียวกัน ให้ใช้ intent id ร่วมกับฟิลด์นี้ ไม่ใช่สัญลักษณ์อย่างเดียว ต่างจาก payment_rail ของสแกนเนอร์ในแค็ตตาล็อกสินทรัพย์รายละเอียด
ช่องทางของใบแจ้งหนี้ Bitcoin บนเชนและ Lightning อาจใช้ asset_id เดียวกัน ให้ใช้ intent id ร่วมกับฟิลด์นี้ ไม่ใช่สัญลักษณ์อย่างเดียว ต่างจาก payment_rail ของสแกนเนอร์ในแค็ตตาล็อกสินทรัพย์
bolt11string | nullเสมอคำขอชำระ Lightning มิฉะนั้นเป็น null ชำระคำขอนี้ด้วยกระเป๋า Lightning ห้ามส่งเงินบนเชนไปยัง payment hash
asset_decimalsintegerเสมอความละเอียดหน่วยย่อย Lightning BTC ใช้ 11 (millisatoshis) ไม่ใช่ 8 ของ Bitcoin บนเชน ราคาเสนอเป็น satoshi เต็มหน่วย ยอดรับคงความละเอียด millisatoshi
quote_ratedecimal stringเสมอหน่วยสินทรัพย์ต่อหนึ่งหน่วยสกุลเงินใบแจ้งหนี้ รวมสเปรดที่ล็อกไว้ เช่น 1.02 USDC ต่อ USD ไม่ใช่อัตรากลับด้าน
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 stablecoin อิงเงินตราทั่วไปที่รู้จักและตรวจสอบแล้ว (เช่น USDC, USDT, DAI, USDS, EURC) ปัดขึ้นให้มีทศนิยมไม่เกินสองตำแหน่ง; 1.321 เป็น 1.33 ไม่ใช่ 1.32 นี่คือจำนวนที่คาดหวังแม้ยอมรับส่วนต่างศูนย์ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ไม่คำนวณราคาใหม่ให้ใบแจ้งหนี้เดิมรายละเอียด
จำนวนสินทรัพย์ที่แน่นอนและล็อกไว้ให้ชำระหลังสเปรดและปัดขึ้น ตั้งแต่ 4.1.1 stablecoin อิงเงินตราทั่วไปที่รู้จักและตรวจสอบแล้ว (เช่น USDC, USDT, DAI, USDS, EURC) ปัดขึ้นให้มีทศนิยมไม่เกินสองตำแหน่ง; 1.321 เป็น 1.33 ไม่ใช่ 1.32 นี่คือจำนวนที่คาดหวังแม้ยอมรับส่วนต่างศูนย์ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ไม่คำนวณราคาใหม่ให้ใบแจ้งหนี้เดิม
destination_addressstringเสมอที่อยู่รับเงินบนเชน หรือ payment hash 64 อักขระสำหรับ Lightning ใช้ bolt11 ชำระ Lightning แฮชไม่ใช่ที่อยู่ Bitcoin
destination_tagstring | nullเสมอเลขอ้างอิงชำระเงินสาธารณะที่จำเป็นเมื่อช่องทางใช้: destination tag ของ XRP, memo ID ของ Stellar หรือคอมเมนต์ใบแจ้งหนี้ TON เป็น null สำหรับช่องทางที่ใช้ที่อยู่ไม่ซ้ำ
caseobject | nullเสมอ
กรณีปัจจุบันพร้อม status, reasons, revision และเวลา เป็น 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[]object[]เสมอการตัดสินใจล่าสุด 25 รายการของหน้านี้: id, action, note, actor, result, created_at
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 ไม่มีซีเคร็ต callback
หมายเหตุการใช้งาน
- case เป็น null เมื่อใบแจ้งหนี้ยังไม่เกิดข้อยกเว้น คืนข้อมูลที่ตรวจพบล่าสุด 100 รายการและการส่งล่าสุด 50 รายการ ประวัติการตัดสินใจแบ่งหน้า
- refundable_atomic ต้องมีอย่างน้อยหนึ่งการยืนยันเครือข่าย ไม่รวมยอดสำรองคืนเงินเดิม และไม่รับประกันเงินกระเป๋าที่ใช้จ่ายได้ ราคาเสนอสดยังตรวจความพร้อมกระเป๋า ยอดต้นทาง และค่าธรรมเนียมเพิ่มเติม
- การคืนเงินสถานะ broadcast หมายถึงส่งให้เอนด์พอยต์เชนแล้ว ไม่ใช่ยืนยันอย่างอิสระว่าลูกค้าได้รับ ค่าธรรมเนียมคิดเพิ่ม และค่าประมวลผลในเงินตราทั่วไปไม่คืนเครดิตอัตโนมัติเพียงเพราะออกเงินคืน
- เมนูโปรเจกต์ในคอนโซล → ต้องตรวจสอบ มีการยกเลิก ยอมรับ ปฏิเสธ เปิดใหม่ ตรวจทาน บันทึกหมายเหตุ Rescan ลองส่งใหม่ และคืนเงินบนเชนที่รองรับ การตัดสินใจใช้เซสชันป้องกัน CSRF, request_id ที่ไม่ซ้ำ, revision กรณีปัจจุบัน หมายเหตุที่จำเป็น และการยืนยันชัดเจน bearer token เรียกการเปลี่ยนแปลงเหล่านี้ไม่ได้
ข้อผิดพลาด
GETการค้นพบบริการ API/สาธารณะ
การตอบกลับจากขอบเครือข่ายของโฮสต์ API ที่จัดการไว้ ยืนยันบทบาท API สาธารณะ v1 การตอบนี้สร้างโดยพร็อกซีที่จัดการ ไม่ใช่เราเตอร์ 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 token
- มีเฉพาะโฮสต์เนม API ที่จัดการไว้ซึ่งรับประกันการตอบกลับรากแบบนี้ทุกประการ
ข้อผิดพลาด
GETสถานะการทำงานของบริการ/healthzสาธารณะ
ตรวจว่าเข้าถึงแอปพลิเคชันได้และ ping ฐานข้อมูลภายในสองวินาที ใช้ติดตามการทำงาน ไม่ใช่แทนสถานะใบแจ้งหนี้
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
คำขอ
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 token
- ค่า version คือเวอร์ชันแพ็กเกจที่กำลังทำงาน ไม่ใช่เวอร์ชันพาธ API
ข้อผิดพลาด
GETแสดงรายการสินทรัพย์รับชำระของโปรเจกต์/v1/projects/{project_id}/payment-assetsอ่านอย่างเดียว
แสดงเหรียญหลักและโทเคนที่ตรวจสอบแล้วพร้อมนโยบายโปรเจกต์ ความพร้อมกระเป๋าเชน และความสามารถสแกนเนอร์/ยอดคงเหลือที่ติดตั้ง scanner_ready เป็นเงื่อนไขอะแดปเตอร์ใน build ไม่ใช่ผลองค์ประชุมเอนด์พอยต์สด ตั้งแต่ 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 หรือ mint SPL มาตรฐานสำหรับโทเคน เป็น null สำหรับเหรียญหลัก
coingecko_idstring | nullเสมอตัวระบุการค้นพบ/ราคา เป็น null สำหรับคอนแทรกต์กำหนดเอง ห้ามอนุมานราคาตลาดจาก ticker metadata ของ CoinGecko เพียงอย่างเดียวไม่ทำให้เลือกโทเคนได้
custom_tokenbooleanเสมอคอนแทรกต์กำหนดเองที่ตรวจสอบบนเชน พร้อมราคาคงที่ USD หรือราคาพูล DEX ที่เลือกในขอบเขตโปรเจกต์
token_standarderc20 | spl-token | nullเสมอมาตรฐานโทเคนที่รันไทม์ตรวจสอบแล้ว เป็น null สำหรับเหรียญหลัก
payment_supportedbooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
scanner_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
balance_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย 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) ราคากำหนดเองใช้ร่วมกันโดยร้านค้าในโปรเจกต์นี้
finality_modeconfirmations | finalizedจำเป็นนโยบายความเป็นที่สุดที่ช่องทางสินทรัพย์รองรับ finalized ต้องมี required_confirmations=1
required_confirmationsintegerจำเป็นช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลังรายละเอียด
ช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ 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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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เสมอสถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋ารายละเอียด
สถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋า
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 เป็นค่าทดแทนเพื่อความปลอดภัย และไม่มีสถานะใดพิสูจน์การชำระเสร็จสิ้นของใบแจ้งหนี้
balance_checked_attimestamp | nullเสมอเวลาตรวจยอดสำเร็จที่เก่าที่สุดซึ่งเกี่ยวข้องและรวมอยู่ในยอดรวม
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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 ไม่เข้ากันจะไม่นับ
- โทเคนใช้กระเป๋าโปรเจกต์ร่วมกับเชนของเหรียญหลัก ไม่สร้างวลี seed อีกชุด
- สรุปกระเป๋าที่ฝังมาบอกเฉพาะความพร้อมและปล่อยยอดว่าง ใช้ 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))เนื้อหาคำขอ
finality_modeconfirmations | finalizedจำเป็นนโยบายความเป็นที่สุดที่ช่องทางสินทรัพย์รองรับ finalized ต้องมี required_confirmations=1
required_confirmationsintegerจำเป็นช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลังรายละเอียด
ช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ 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 หรือ mint SPL มาตรฐานสำหรับโทเคน เป็น null สำหรับเหรียญหลัก
coingecko_idstring | nullเสมอตัวระบุการค้นพบ/ราคา เป็น null สำหรับคอนแทรกต์กำหนดเอง ห้ามอนุมานราคาตลาดจาก ticker metadata ของ CoinGecko เพียงอย่างเดียวไม่ทำให้เลือกโทเคนได้
custom_tokenbooleanเสมอคอนแทรกต์กำหนดเองที่ตรวจสอบบนเชน พร้อมราคาคงที่ USD หรือราคาพูล DEX ที่เลือกในขอบเขตโปรเจกต์
token_standarderc20 | spl-token | nullเสมอมาตรฐานโทเคนที่รันไทม์ตรวจสอบแล้ว เป็น null สำหรับเหรียญหลัก
payment_supportedbooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
scanner_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
balance_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย 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) ราคากำหนดเองใช้ร่วมกันโดยร้านค้าในโปรเจกต์นี้
finality_modeconfirmations | finalizedจำเป็นนโยบายความเป็นที่สุดที่ช่องทางสินทรัพย์รองรับ finalized ต้องมี required_confirmations=1
required_confirmationsintegerจำเป็นช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลังรายละเอียด
ช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ 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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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เสมอสถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋ารายละเอียด
สถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋า
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 เป็นค่าทดแทนเพื่อความปลอดภัย และไม่มีสถานะใดพิสูจน์การชำระเสร็จสิ้นของใบแจ้งหนี้
balance_checked_attimestamp | nullเสมอเวลาตรวจยอดสำเร็จที่เก่าที่สุดซึ่งเกี่ยวข้องและรวมอยู่ในยอดรวม
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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 |
พารามิเตอร์พาธ
พารามิเตอร์ query
คำขอ
: "${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[]
หมายเหตุการใช้งาน
- อะแดปเตอร์โทเคนที่รองรับ: ERC-20 บน Ethereum, Base, BNB Chain, HyperEVM, Avalanche, Polygon, Arbitrum และ Optimism; SPL บน Solana
- เชนในแค็ตตาล็อกที่ไม่รองรับถูกปฏิเสธแทนการแสดงให้เลือก
- อันดับ ไอคอน และราคา CoinGecko เป็นข้อมูลการค้นพบประกอบการพิจารณา
ข้อผิดพลาด
POSTตรวจสอบและลงทะเบียนโทเคน/v1/projects/{project_id}/payment-token-assetsอ่าน + เขียน
นำผู้สมัครปัจจุบันหนึ่งรายการเข้าสู่ทะเบียนรับชำระถาวร ต่อเมื่อโหนดที่ตั้งค่าตรวจตัวตนเชน ตัวตนคอนแทรกต์/mint ทศนิยม และคำขออ่านยอดที่ใช้ได้แล้ว การลงทะเบียนไม่เชื่อ metadata 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 นี้จากชื่อหรือ ticker โทเคนรายละเอียด
ตัวระบุผู้สมัครแบบตรงตัวจากการค้นโทเคน รักษาขีดล่างหรือขีดกลางนำหน้า เช่น _ หรือ -6 อย่าสร้าง ID นี้จากชื่อหรือ ticker โทเคน
การตอบกลับ 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อ่านอย่างเดียว
ค้นพูลที่เข้าเกณฑ์สูงสุด 12 พูลด้วยเชนและคอนแทรกต์โทเคนฐานแบบตรงตัวผ่าน DEX Screener เรียงตามสภาพคล่อง ไม่ลงทะเบียนหรือเปิดโทเคน
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MERCHANT_API_TOKEN |
พารามิเตอร์พาธ
พารามิเตอร์ query
คำขอ
: "${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) และ ticker คู่ที่ใช้แสดงเท่านั้น
dex_idstringเสมอตัวระบุพูลที่แน่นอน ID ศูนย์ซื้อขาย (เช่น uniswap/pancakeswap) และ ticker คู่ที่ใช้แสดงเท่านั้น
quote_symbolstringเสมอตัวระบุพูลที่แน่นอน ID ศูนย์ซื้อขาย (เช่น uniswap/pancakeswap) และ ticker คู่ที่ใช้แสดงเท่านั้น
price_usddecimal stringเสมอราคา USD ของโทเคนฐานที่ขอและสภาพคล่องรวมของพูล ต้องมีสภาพคล่องอย่างน้อย $10,000 และมีการซื้อขายในชั่วโมงล่าสุด
liquidity_usddecimal stringเสมอราคา USD ของโทเคนฐานที่ขอและสภาพคล่องรวมของพูล ต้องมีสภาพคล่องอย่างน้อย $10,000 และมีการซื้อขายในชั่วโมงล่าสุด
fetched_atRFC 3339 timestampเสมอเวลาที่เซิร์ฟเวอร์ดึงข้อมูลจากผู้ให้บริการ ไม่ใช่เวลาการซื้อขายบนเชน
หมายเหตุการใช้งาน
- อาร์เรย์ data ว่างหมายถึงไม่พบพูลผ่านเกณฑ์ คืนเฉพาะพูลที่คอนแทรกต์ที่ขอตรงตัวเป็นโทเคนฐาน ไม่สมมติราคา USD ของฝั่ง quote
- การมีชื่อใน DEX ไม่ใช่การตรวจสอบความปลอดภัย สภาพคล่องขั้นต่ำและกิจกรรมล่าสุดช่วยลดราคาเสนอที่ใช้ไม่ได้ แต่ไม่ป้องกันการปั่นราคา
- รองรับ Uniswap, PancakeSwap และ DEX อื่นที่จัดทำดัชนี เมื่อสแกนเนอร์เชนเดิมรองรับโทเคน การเข้าถึง API ยังจำกัดโปรเจกต์และอัตรา การเรียกผู้ให้บริการยังจัดให้ทำทีละรายการและจำกัดความถี่
ข้อผิดพลาด
POSTเพิ่มหรือเปลี่ยนราคาโทเคนกำหนดเอง/v1/projects/{project_id}/payment-token-assets/customอ่าน + เขียน
ตรวจคอนแทรกต์กำหนดเองด้วยโหนดเชนที่ตั้งไว้และลงทะเบียนโดยไม่ต้องมีใน CoinGecko ราคาคงที่ USD หรือพูล DEX อัตโนมัติที่เลือกเป็นของโปรเจกต์นี้ ไม่ใช่ของ ticker หรือโปรเจกต์อื่น ส่งตัวระบุเดิมซ้ำจะอัปเดตราคาโปรเจกต์โดยไม่เปลี่ยนนโยบายเปิด/ปิดเดิม
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 ตัว) หรือ mint classic SPL โหนดตรวจตัวตนเครือข่ายและทศนิยมที่แน่นอน ปฏิเสธทศนิยมและ URL RPC ที่ผู้เรียกส่งมารายละเอียด
คอนแทรกต์ ERC-20 (0x ตามด้วยเลขฐานสิบหก 40 ตัว) หรือ mint classic SPL โหนดตรวจตัวตนเครือข่ายและทศนิยมที่แน่นอน ปฏิเสธทศนิยมและ URL RPC ที่ผู้เรียกส่งมา
namestringจำเป็นชื่อแสดงผล (1–80 อักขระ) และ ticker (ตัวอักษร/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–16 ตัว ตัวแรกเป็นตัวอักษรหรือตัวเลข) เอนด์พอยต์นี้เปลี่ยนชื่อตัวระบุเดิมไม่ได้รายละเอียด
ชื่อแสดงผล (1–80 อักขระ) และ ticker (ตัวอักษร/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–16 ตัว ตัวแรกเป็นตัวอักษรหรือตัวเลข) เอนด์พอยต์นี้เปลี่ยนชื่อตัวระบุเดิมไม่ได้
symbolstringจำเป็นชื่อแสดงผล (1–80 อักขระ) และ ticker (ตัวอักษร/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–16 ตัว ตัวแรกเป็นตัวอักษรหรือตัวเลข) เอนด์พอยต์นี้เปลี่ยนชื่อตัวระบุเดิมไม่ได้รายละเอียด
ชื่อแสดงผล (1–80 อักขระ) และ ticker (ตัวอักษร/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–16 ตัว ตัวแรกเป็นตัวอักษรหรือตัวเลข) เอนด์พอยต์นี้เปลี่ยนชื่อตัวระบุเดิมไม่ได้
price_modefixed | dexไม่บังคับค่าเริ่มต้น fixed เพื่อเข้ากันได้ย้อนหลัง DEX ใช้พูลเฉพาะที่ค้นพบสำหรับเชนและคอนแทรกต์ตรงตัว
price_usddecimal stringโหมด fixedมูลค่า USD คงที่ของโทเคนหนึ่งหน่วย เป็นบวก ทศนิยมไม่เกิน 30 ตำแหน่ง สูงสุด 1000000000000000000000000 ไม่มีเลขยกกำลังหรือ float ไม่ใส่ในโหมด dex
dex_pair_addressstringโหมด dexที่อยู่พูลจาก payment-token-dex-pools จำเป็นในโหมด dex ไม่ใส่ในโหมด fixed เซิร์ฟเวอร์ตรวจตัวตนพูล ราคา สภาพคล่อง และกิจกรรมซ้ำทุกครั้งที่บันทึกรายละเอียด
ที่อยู่พูลจาก payment-token-dex-pools จำเป็นในโหมด dex ไม่ใส่ในโหมด fixed เซิร์ฟเวอร์ตรวจตัวตนพูล ราคา สภาพคล่อง และกิจกรรมซ้ำทุกครั้งที่บันทึก
การตอบกลับ 200 application/json
ตัวอย่างการตอบกลับ
{"data":{"asset_id":"44444444-4444-4444-8444-444444444444"}}ฟิลด์การตอบกลับ
หมายเหตุการใช้งาน
- หลังลงทะเบียน เลือก asset_id ในเอนด์พอยต์ payment-assets ของร้านค้า การลงทะเบียนอย่างเดียวไม่เปิดวิธีร้านค้า
- โทเคนกำหนดเองและจากแค็ตตาล็อกใช้เพดาน 20 โทเคนต่อโปรเจกต์ร่วมกัน คอนแทรกต์เดียวกันต่างเชนเป็นสินทรัพย์รับชำระคนละรายการ
- คอนแทรกต์ที่มีในแค็ตตาล็อกแล้วคืน 409 ให้ใช้การลงทะเบียนแค็ตตาล็อกเพื่อคงอัตราตลาดอัตโนมัติ ticker กำหนดเองไม่ยืมราคาจากโทเคนชื่อเหมือน
- ราคาคงที่เป็นการประเมินของผู้ดำเนินระบบ ราคา DEX อัตโนมัติเป็นข้อมูลสปอตจากพูลที่เลือกผ่าน DEX Screener ไม่ใช่ oracle ที่ต้านการปั่นราคา สเปรดร้านค้าและการปัดขึ้นยังมีผล พร้อมอัตราเงินตราทั่วไปใหม่ ราคาเสนอที่ออกแล้วไม่เปลี่ยน
- สำหรับโหมด DEX ให้ค้นพูลก่อน แล้วส่ง price_mode: dex และ dex_pair_address โดยไม่ใส่ price_usd งานเบื้องหลังร่วมรีเฟรชพูลที่เลือกทุกนาที การตรวจล้มเหลวหรือราคาเก่ากว่าห้านาทีจะนำโทเคนนี้ออกจากราคาเสนอใหม่ ไม่มีการเปลี่ยนไปใช้ราคาคงที่หรือ ticker สำรองเงียบ ๆ
- รับเฉพาะ ERC-20 มาตรฐานและ classic SPL ปฏิเสธ Token-2022/ส่วนขยายและเชนที่รับแต่เหรียญหลัก การตรวจทางเทคนิคไม่ใช่การตรวจความปลอดภัยผู้ออก/คอนแทรกต์ โทเคนหักค่าธรรมเนียมตอนโอน ปรับยอด rebasing หรือขึ้นบัญชีดำอาจทำงานไม่เข้ากัน
- ใช้เวลารอไคลเอนต์อย่างน้อย 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 หรือ mint SPL มาตรฐานสำหรับโทเคน เป็น null สำหรับเหรียญหลัก
coingecko_idstring | nullเสมอตัวระบุการค้นพบ/ราคา เป็น null สำหรับคอนแทรกต์กำหนดเอง ห้ามอนุมานราคาตลาดจาก ticker metadata ของ CoinGecko เพียงอย่างเดียวไม่ทำให้เลือกโทเคนได้
custom_tokenbooleanเสมอคอนแทรกต์กำหนดเองที่ตรวจสอบบนเชน พร้อมราคาคงที่ USD หรือราคาพูล DEX ที่เลือกในขอบเขตโปรเจกต์
token_standarderc20 | spl-token | nullเสมอมาตรฐานโทเคนที่รันไทม์ตรวจสอบแล้ว เป็น null สำหรับเหรียญหลัก
payment_supportedbooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
scanner_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
balance_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
default_finality_modeconfirmations | finalizedเสมอรูปแบบความเป็นที่สุดเริ่มต้นที่นโยบายโปรเจกต์ใหม่สืบทอด
project_policyobject | nullเสมอ
นโยบายโปรเจกต์หลัก
finality_modeconfirmations | finalizedจำเป็นนโยบายความเป็นที่สุดที่ช่องทางสินทรัพย์รองรับ finalized ต้องมี required_confirmations=1
required_confirmationsintegerจำเป็นช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลังรายละเอียด
ช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลัง
selectedbooleanเสมอวิธีนี้อยู่ในชุดการตั้งค่าที่ร้านค้าต้องการและบันทึกไว้หรือไม่ จะเสนอเมื่อมีนโยบายโปรเจกต์ กระเป๋า อะแดปเตอร์ติดตั้ง และราคาที่ถูกต้อง สแกนเนอร์ล่มชั่วคราวไม่นำวิธีนี้ออกจากใบแจ้งหนี้ใหม่รายละเอียด
วิธีนี้อยู่ในชุดการตั้งค่าที่ร้านค้าต้องการและบันทึกไว้หรือไม่ จะเสนอเมื่อมีนโยบายโปรเจกต์ กระเป๋า อะแดปเตอร์ติดตั้ง และราคาที่ถูกต้อง สแกนเนอร์ล่มชั่วคราวไม่นำวิธีนี้ออกจากใบแจ้งหนี้ใหม่
confirmation_policyobject | nullเสมอ
นโยบายร้านค้าที่มีผลสำหรับสินทรัพย์ที่ตั้งในโปรเจกต์ เป็น null หากไม่มีนโยบายโปรเจกต์
finality_modeconfirmations | finalizedเสมอการชำระเสร็จสิ้นใช้จำนวนบล็อกที่ตั้งได้หรือความเป็นที่สุดของเครือข่าย
project_required_confirmationsintegerเสมอค่าเริ่มต้นโปรเจกต์ปัจจุบันที่ใบแจ้งหนี้ในอนาคตใช้เมื่อไม่มี override ร้านค้า
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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เสมอสถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋ารายละเอียด
สถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋า
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 เป็นค่าทดแทนเพื่อความปลอดภัย และไม่มีสถานะใดพิสูจน์การชำระเสร็จสิ้นของใบแจ้งหนี้
balance_checked_attimestamp | nullเสมอเวลาตรวจยอดสำเร็จที่เก่าที่สุดซึ่งเกี่ยวข้องและรวมอยู่ในยอดรวม
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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 หรือ mint SPL มาตรฐานสำหรับโทเคน เป็น null สำหรับเหรียญหลัก
coingecko_idstring | nullเสมอตัวระบุการค้นพบ/ราคา เป็น null สำหรับคอนแทรกต์กำหนดเอง ห้ามอนุมานราคาตลาดจาก ticker metadata ของ CoinGecko เพียงอย่างเดียวไม่ทำให้เลือกโทเคนได้
custom_tokenbooleanเสมอคอนแทรกต์กำหนดเองที่ตรวจสอบบนเชน พร้อมราคาคงที่ USD หรือราคาพูล DEX ที่เลือกในขอบเขตโปรเจกต์
token_standarderc20 | spl-token | nullเสมอมาตรฐานโทเคนที่รันไทม์ตรวจสอบแล้ว เป็น null สำหรับเหรียญหลัก
payment_supportedbooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
scanner_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
balance_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
default_finality_modeconfirmations | finalizedเสมอรูปแบบความเป็นที่สุดเริ่มต้นที่นโยบายโปรเจกต์ใหม่สืบทอด
project_policyobject | nullเสมอ
นโยบายโปรเจกต์หลัก
finality_modeconfirmations | finalizedจำเป็นนโยบายความเป็นที่สุดที่ช่องทางสินทรัพย์รองรับ finalized ต้องมี required_confirmations=1
required_confirmationsintegerจำเป็นช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลังรายละเอียด
ช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลัง
selectedbooleanเสมอวิธีนี้อยู่ในชุดการตั้งค่าที่ร้านค้าต้องการและบันทึกไว้หรือไม่ จะเสนอเมื่อมีนโยบายโปรเจกต์ กระเป๋า อะแดปเตอร์ติดตั้ง และราคาที่ถูกต้อง สแกนเนอร์ล่มชั่วคราวไม่นำวิธีนี้ออกจากใบแจ้งหนี้ใหม่รายละเอียด
วิธีนี้อยู่ในชุดการตั้งค่าที่ร้านค้าต้องการและบันทึกไว้หรือไม่ จะเสนอเมื่อมีนโยบายโปรเจกต์ กระเป๋า อะแดปเตอร์ติดตั้ง และราคาที่ถูกต้อง สแกนเนอร์ล่มชั่วคราวไม่นำวิธีนี้ออกจากใบแจ้งหนี้ใหม่
confirmation_policyobject | nullเสมอ
นโยบายร้านค้าที่มีผลสำหรับสินทรัพย์ที่ตั้งในโปรเจกต์ เป็น null หากไม่มีนโยบายโปรเจกต์
finality_modeconfirmations | finalizedเสมอการชำระเสร็จสิ้นใช้จำนวนบล็อกที่ตั้งได้หรือความเป็นที่สุดของเครือข่าย
project_required_confirmationsintegerเสมอค่าเริ่มต้นโปรเจกต์ปัจจุบันที่ใบแจ้งหนี้ในอนาคตใช้เมื่อไม่มี override ร้านค้า
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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เสมอสถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋ารายละเอียด
สถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋า
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 เป็นค่าทดแทนเพื่อความปลอดภัย และไม่มีสถานะใดพิสูจน์การชำระเสร็จสิ้นของใบแจ้งหนี้
balance_checked_attimestamp | nullเสมอเวลาตรวจยอดสำเร็จที่เก่าที่สุดซึ่งเกี่ยวข้องและรวมอยู่ในยอดรวม
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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อ่าน + เขียน
ตั้งหรือล้าง override การยืนยันเฉพาะร้านค้าหนึ่งรายการ และคืนรายการวิธีชำระร้านค้าที่รีเฟรช สินทรัพย์ต้องถูกเลือกในร้านค้าแล้ว ยังตั้งค่าได้ขณะโปรเจกต์ ร้านค้า เชน หรือกระเป๋าพัก
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| 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 หรือ mint SPL มาตรฐานสำหรับโทเคน เป็น null สำหรับเหรียญหลัก
coingecko_idstring | nullเสมอตัวระบุการค้นพบ/ราคา เป็น null สำหรับคอนแทรกต์กำหนดเอง ห้ามอนุมานราคาตลาดจาก ticker metadata ของ CoinGecko เพียงอย่างเดียวไม่ทำให้เลือกโทเคนได้
custom_tokenbooleanเสมอคอนแทรกต์กำหนดเองที่ตรวจสอบบนเชน พร้อมราคาคงที่ USD หรือราคาพูล DEX ที่เลือกในขอบเขตโปรเจกต์
token_standarderc20 | spl-token | nullเสมอมาตรฐานโทเคนที่รันไทม์ตรวจสอบแล้ว เป็น null สำหรับเหรียญหลัก
payment_supportedbooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
scanner_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
balance_readybooleanเสมอเงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้วรายละเอียด
เงื่อนไขทะเบียนขณะ build โดย scanner_ready หมายถึงติดตั้งรันไทม์สแกนการชำระแล้ว การยืนยันชำระต้องมีผู้ให้บริการทำงานปกติและตรงบทบาทตามจำนวนที่ตั้งไว้ (ค่าเริ่มต้น 2 เลือก 1 ได้) ความพร้อมชั่วคราวของสแกนเนอร์ไม่บล็อกการสร้างใบแจ้งหนี้ตั้งแต่ 6.0.6 ส่วน balance_ready เป็น true เฉพาะอะแดปเตอร์ยอดคงเหลือที่มีการใช้งานแล้ว
default_finality_modeconfirmations | finalizedเสมอรูปแบบความเป็นที่สุดเริ่มต้นที่นโยบายโปรเจกต์ใหม่สืบทอด
project_policyobject | nullเสมอ
นโยบายโปรเจกต์หลัก
finality_modeconfirmations | finalizedจำเป็นนโยบายความเป็นที่สุดที่ช่องทางสินทรัพย์รองรับ finalized ต้องมี required_confirmations=1
required_confirmationsintegerจำเป็นช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลังรายละเอียด
ช่องทาง Bitcoin และ EVM รับศูนย์ได้ ช่องทางแบบยืนยันอื่นต้องอย่างน้อยหนึ่ง ช่องทาง finalized-only ต้องหนึ่งพอดี และ EVM จำกัด 0–48 เพื่อให้ทุกการโอนอยู่ในช่วงเล่นธุรกรรมย้อนหลัง
selectedbooleanเสมอวิธีนี้อยู่ในชุดการตั้งค่าที่ร้านค้าต้องการและบันทึกไว้หรือไม่ จะเสนอเมื่อมีนโยบายโปรเจกต์ กระเป๋า อะแดปเตอร์ติดตั้ง และราคาที่ถูกต้อง สแกนเนอร์ล่มชั่วคราวไม่นำวิธีนี้ออกจากใบแจ้งหนี้ใหม่รายละเอียด
วิธีนี้อยู่ในชุดการตั้งค่าที่ร้านค้าต้องการและบันทึกไว้หรือไม่ จะเสนอเมื่อมีนโยบายโปรเจกต์ กระเป๋า อะแดปเตอร์ติดตั้ง และราคาที่ถูกต้อง สแกนเนอร์ล่มชั่วคราวไม่นำวิธีนี้ออกจากใบแจ้งหนี้ใหม่
confirmation_policyobject | nullเสมอ
นโยบายร้านค้าที่มีผลสำหรับสินทรัพย์ที่ตั้งในโปรเจกต์ เป็น null หากไม่มีนโยบายโปรเจกต์
finality_modeconfirmations | finalizedเสมอการชำระเสร็จสิ้นใช้จำนวนบล็อกที่ตั้งได้หรือความเป็นที่สุดของเครือข่าย
project_required_confirmationsintegerเสมอค่าเริ่มต้นโปรเจกต์ปัจจุบันที่ใบแจ้งหนี้ในอนาคตใช้เมื่อไม่มี override ร้านค้า
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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เสมอสถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋ารายละเอียด
สถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋า
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 เป็นค่าทดแทนเพื่อความปลอดภัย และไม่มีสถานะใดพิสูจน์การชำระเสร็จสิ้นของใบแจ้งหนี้
balance_checked_attimestamp | nullเสมอเวลาตรวจยอดสำเร็จที่เก่าที่สุดซึ่งเกี่ยวข้องและรวมอยู่ในยอดรวม
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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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"} เพื่อลบ override ร้านค้าและใช้ค่าเริ่มต้นโปรเจกต์ปัจจุบันสำหรับใบแจ้งหนี้ในอนาคต
- เครือข่าย finalized คืน editable false และใช้ความเป็นที่สุดของเครือข่าย ไม่รับ override จำนวนบล็อกกำหนดเอง
- ค่า 0 หมายถึงยอมรับเมื่อตรวจพบโดยไม่มีการยืนยันเครือข่ายหรือการป้องกันจัดเชนใหม่ ยอมรับได้เฉพาะที่ minimum_required_confirmations เป็น 0
- การเปลี่ยนนโยบายมีผลเฉพาะใบแจ้งหนี้ใหม่ ใบแจ้งหนี้เดิมเก็บภาพนโยบายการยืนยันโปรเจกต์/ร้านค้า ณ เวลาสร้าง
- อัปเดตทีละสินทรัพย์ จัดการแก้ไขพร้อมกันของสินทรัพย์ร้านค้าเดียวให้ทำตามลำดับ และใช้การตอบกลับที่รีเฟรชเป็นสถานะปัจจุบัน
ข้อผิดพลาด
GETแสดงรายการกระเป๋าและยอดคงเหลือของโปรเจกต์/v1/projects/{project_id}/walletsอ่านอย่างเดียว
คืน metadata กระเป๋าสาธารณะพร้อมทุกสินทรัพย์ที่ลงทะเบียนและอ่านยอดได้บนเชนและเครือข่ายตรงกันของกระเป๋า ครอบคลุมช่องทางเหรียญหลักทั้ง 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+การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัยรายละเอียด
การตั้งค่าอนุญาตวิธีใบแจ้งหนี้แม้มีคำเตือนสแกนเนอร์ชั่วคราว ตรวจราคาสกุลเงินเมื่อสร้าง นี่ไม่ใช่การยืนยันชำระ: ready อาจเป็น false ขณะที่ invoice_creatable เป็น true กระเป๋าขาด นโยบายปิด และอะแดปเตอร์ไม่รองรับยังล้มเหลวอย่างปลอดภัย
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 ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ EVM ไม่ใช่หลักฐานรับเงิน Monero ยังต้องมี wallet-RPC ดูอย่างเดียวที่ผูกโปรเจกต์รายละเอียด
รูปแบบ API ที่เข้ากันได้ ไม่ใช่หลักฐานประวัติหรือความจุเอนด์พอยต์ Raw node-rpc รองรับ BTC/BCH/LTC/DOGE/DASH และ ZEC โปร่งใส (บล็อกที่ถอดรหัสครบ 1–48 การยืนยัน), TRX เหรียญหลักแบบ solidified, ALGO เหรียญหลักผ่าน algod, XTZ ผ่าน Octez, DOT บน Asset Hub แบบ finalized ผ่าน SCALE metadata และ XLM เหรียญหลักผ่าน Stellar RPC พร้อม memo ID ใบแจ้งหนี้ ประวัติที่ prune หรือไม่ครบไม่ผ่านเกณฑ์ อะแดปเตอร์ raw เหล่านี้ไม่เพิ่มช่องทางโทเคน API จัดทำดัชนียังเป็นทางเลือก ดูตารางช่องทางด้านล่าง แหล่ง raw/indexed แบบผสมตรวจช่วงข้อมูลจำกัดอย่างอิสระ ค่าเริ่มต้นยังเป็นผู้ให้บริการอิสระสองราย ไม่ใช่ชื่อแทนของผู้ดำเนินรายเดียว ความสูงโหนดพื้นฐาน ข้อมูลเชน ORDnet และ EVM relay สำหรับช่องทางที่ไม่ใช่ 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เสมอสถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋ารายละเอียด
สถานะการผูก wallet-RPC ภายนอกแบบดูอย่างเดียวสำหรับ Monero ที่ตัดข้อมูลอ่อนไหวแล้ว รวมเอนด์พอยต์ โหมดการยืนยันตัวตน ที่อยู่หลัก account-0 ธง/ความสูงหลักฐานทางเทคนิค และเวลารับรองของผู้ดำเนินระบบ ไม่ serialize ข้อมูลรับรอง คีย์กระเป๋า หรือไฟล์กระเป๋า
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 เป็นค่าทดแทนเพื่อความปลอดภัย และไม่มีสถานะใดพิสูจน์การชำระเสร็จสิ้นของใบแจ้งหนี้
balance_checked_attimestamp | nullเสมอเวลาตรวจยอดสำเร็จที่เก่าที่สุดซึ่งเกี่ยวข้องและรวมอยู่ในยอดรวม
recent_payments[]object[]เสมอ
ข้อมูลล่าสุดที่ถูกต้องในสถานะ detected, confirming หรือ final ไม่เกินสามรายการที่ระบุว่าเป็นของกระเป๋านี้ตรงตัว
statusdetected | confirming | finalเสมอสถานะข้อมูลที่ตรวจพบและยังถูกต้อง ไม่รวม reorged, replaced และ invalid
หมายเหตุการใช้งาน
- เส้นทาง bearer นี้ไม่คืนวลีกู้คืน คีย์ส่วนตัว ซีเคร็ตเข้ารหัส หรือวิธีใช้จ่าย
- สินทรัพย์เชนเดียวกันที่เพิ่งลงทะเบียนคืนยอด null และสถานะ pending ก่อนสแกนครบครั้งแรก ไม่รายงานศูนย์ที่สร้างขึ้นเอง
- การปิดโปรเจกต์ กระเป๋าสำหรับรับชำระ ช่องทางเหรียญหลัก หรือสินทรัพย์รายตัวไม่หยุดติดตามยอดแบบอ่านอย่างเดียว กระเป๋า active และ disabled ที่มีที่อยู่หลักยังรีเฟรชทุกสินทรัพย์เชนเดียวกันที่ลงทะเบียนและรองรับ กระเป๋า pending และ error ไม่ถูกสแกน
- project_enabled รายงานเฉพาะนโยบายยอมรับสินทรัพย์ของโปรเจกต์ และเป็น false ได้ขณะที่ tracking_active ยัง true
- balance และ balance_atomic เป็นสตริงแน่นอน; price_usd, value_usd และ total_value_usd ใช้ประกอบการพิจารณาและเป็น null ได้ สถานะยอดใหม่ไม่รับประกันว่าราคาตลาดใหม่
- การตีมูลค่าเลือกใช้ราคา CoinGecko อายุไม่เกินสองชั่วโมงก่อน เหรียญหลักและ USDC/USDT มาตรฐานที่ตรวจสอบแล้วใช้ราคา USD จาก Kraken/Binance ที่เปิดไว้และอายุไม่เกินห้านาทีเป็นสำรองได้ โดยผู้ให้บริการหลักมาก่อน ไม่สมมติว่าตรึงดอลลาร์หรือใช้ ticker อย่างเดียวหาราคาโทเคนกำหนดเอง ราคาคงที่/DEX ของโปรเจกต์แยกไว้ ราคาเสนอใบแจ้งหนี้ไม่เปลี่ยน
- Pending ยังไม่มีภาพข้อมูลครบ Refreshing คงจำนวนล่าสุดที่สแกนเสร็จและ checked_at ไม่ได้หมายถึงการโอนบล็อกเชนกำลังรอ ยอด stale/error อาจยังเก็บค่าเก่า อย่าถือแคชที่ใช้ไม่ได้เป็นศูนย์หรือการชำระที่หายไป การรีเฟรช EVM/Solana ปกติใช้ผลที่อยู่ว่างที่เพิ่งตรวจซ้ำได้นานถึง 30 นาทีระหว่างการตรวจครบ ส่วนที่อยู่มีเงิน ใหม่ หรือเปลี่ยนแปลงจะตรวจใหม่ คำสั่งสแกนยอดในคอนโซลอย่างชัดเจนขอสแกนทั้งหมด
- recent_payments จำกัดสามข้อมูลที่ตรวจพบต่อกระเป๋าและไม่รวมประวัติที่ทำให้ไม่ถูกต้อง
ข้อผิดพลาด
POSTสร้างใบแจ้งหนี้/v1/projects/{project_id}/stores/{store_id}/invoicesอ่าน + เขียน
สร้างใบแจ้งหนี้แบบอะตอมมิกพร้อมปลายทางกระเป๋า ราคาเสนอใหม่ที่แน่นอน ประวัติตรวจสอบ และรายการ outbox แจ้งเตือน เรียกซ้ำด้วยเนื้อหาดิบไบต์เหมือนเดิม ข้อมูลรับรองเดิม และ Idempotency-Key เดิม จะคืนใบแจ้งหนี้ต้นฉบับ
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MERCHANT_API_TOKEN |
| Idempotency-Key | จำเป็น | ASCII ที่มองเห็นได้และไม่ซ้ำ 1–128 อักขระ ไม่มีช่องว่าง |
| Content-Type | แนะนำ | application/json ตัวจัดการเนื้อหาดิบปัจจุบันแยก JSON โดยไม่บังคับชนิดสื่อ |
| Accept | แนะนำ | application/json |
พารามิเตอร์พาธ
คำขอ
: "${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/rail ปรากฏได้ครั้งเดียวรายละเอียด
คัดลอก chain_slug ใน โปรเจกต์ → ร้านค้า → วิธีชำระเงิน หรืออ่านจาก GET /v1/projects/{project_id}/stores/{store_id}/payment-assets เช่น ethereum, base หรือ bitcoin คู่ chain/rail ปรากฏได้ครั้งเดียว
asset_ids[]UUID[] | nullไม่บังคับUUID asset.id บนเชน ไม่ใช่ที่อยู่คอนแทรกต์หรือ ID วิธีชำระของใบแจ้งหนี้ ใช้ค่านี้หรือ asset_tickers อย่างใดอย่างหนึ่ง ไม่ใส่ทั้งสองตัวเลือกเพื่อเลือกทุกสินทรัพย์ที่ใช้งานและยอมรับบนเชนนี้ [] และ ID ซ้ำ/ศูนย์ไม่ถูกต้อง ใน 5.4.0+ ละเว้น ID ที่ไม่ใช้งาน/ไม่ยอมรับบนเชนนี้ในร้านค้านี้ หากไม่ตรงทั้งหมดจะใช้ค่าเริ่มต้นร้านค้ารายละเอียด
UUID asset.id บนเชน ไม่ใช่ที่อยู่คอนแทรกต์หรือ ID วิธีชำระของใบแจ้งหนี้ ใช้ค่านี้หรือ asset_tickers อย่างใดอย่างหนึ่ง ไม่ใส่ทั้งสองตัวเลือกเพื่อเลือกทุกสินทรัพย์ที่ใช้งานและยอมรับบนเชนนี้ [] และ ID ซ้ำ/ศูนย์ไม่ถูกต้อง ใน 5.4.0+ ละเว้น ID ที่ไม่ใช้งาน/ไม่ยอมรับบนเชนนี้ในร้านค้านี้ หากไม่ตรงทั้งหมดจะใช้ค่าเริ่มต้นร้านค้า
asset_tickers[]string[] | nullไม่บังคับMerchant 5.3.0+ สัญลักษณ์เช่น BTC, USDC หรือ PEPE ในขอบเขต chain_slug และร้านค้านี้ ticker ไม่ซ้ำ 1–64 ค่า ตัดช่องว่างขอบ/ไม่แยกตัวพิมพ์เล็กใหญ่ ใช้ตัวอักษร ASCII/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–40 ตัว ใช้ค่านี้หรือ asset_ids อย่างใดอย่างหนึ่ง ใน 5.4.0+ ละเว้น ticker ที่ไม่รู้จัก/ไม่ใช้งาน/ไม่ยอมรับ สัญลักษณ์ที่ยอมรับแต่กำกวมยังล้มเหลว ให้ใช้ asset_ids วิธีที่เลือกและเปิดใช้ต้องมีกระเป๋ากับราคาที่ถูกต้อง สแกนเนอร์บนเชนล่มชั่วคราวไม่บล็อกการสร้างตั้งแต่ 6.0.6 Lightning รับ ticker ได้เฉพาะ BTC หากระบุรายละเอียด
Merchant 5.3.0+ สัญลักษณ์เช่น BTC, USDC หรือ PEPE ในขอบเขต chain_slug และร้านค้านี้ ticker ไม่ซ้ำ 1–64 ค่า ตัดช่องว่างขอบ/ไม่แยกตัวพิมพ์เล็กใหญ่ ใช้ตัวอักษร ASCII/ตัวเลข/จุด/ขีดล่าง/ขีดกลาง 1–40 ตัว ใช้ค่านี้หรือ asset_ids อย่างใดอย่างหนึ่ง ใน 5.4.0+ ละเว้น ticker ที่ไม่รู้จัก/ไม่ใช้งาน/ไม่ยอมรับ สัญลักษณ์ที่ยอมรับแต่กำกวมยังล้มเหลว ให้ใช้ asset_ids วิธีที่เลือกและเปิดใช้ต้องมีกระเป๋ากับราคาที่ถูกต้อง สแกนเนอร์บนเชนล่มชั่วคราวไม่บล็อกการสร้างตั้งแต่ 6.0.6 Lightning รับ ticker ได้เฉพาะ BTC หากระบุ
payment_railonchain | lightningไม่บังคับค่าเริ่มต้น onchain หากเลือก Bitcoin Lightning ใช้ {chain_slug: bitcoin, payment_rail: lightning} โดยไม่มี asset_ids; asset_tickers อาจเป็น [BTC] ได้ Bitcoin บนเชนไม่รวม Lightning การเชื่อมต่อ Lightning ของร้านค้าต้องเปิดและพร้อมแล้วรายละเอียด
ค่าเริ่มต้น onchain หากเลือก Bitcoin Lightning ใช้ {chain_slug: bitcoin, payment_rail: lightning} โดยไม่มี asset_ids; asset_tickers อาจเป็น [BTC] ได้ Bitcoin บนเชนไม่รวม Lightning การเชื่อมต่อ Lightning ของร้านค้าต้องเปิดและพร้อมแล้ว
order_idstring | nullไม่บังคับเลขอ้างอิงคำสั่งซื้อผู้ค้า 1–128 อักขระหลังตัดช่องว่างขอบ ปฏิเสธอักขระควบคุม
emailstring | nullไม่บังคับอีเมลลูกค้าสำหรับผู้ค้าเท่านั้น ปรับเป็นที่อยู่ ASCII ที่ใช้ได้จริงไม่เกิน 254 อักขระ ไม่ระบุหรือ null จะไม่เก็บอีเมล
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ไม่บังคับcallback HTTPS สาธารณะไม่เกิน 2,048 ไบต์ ไม่มีข้อมูลรับรองหรือ fragment ใช้แทนค่าเริ่มต้นร้านค้า; null/ไม่ระบุใช้ค่าเดิม
redirect_urlstring | nullไม่บังคับURL HTTPS สำเร็จที่ใช้หลังชำระเสร็จสิ้น ไม่เกิน 2,048 ไบต์และไม่มีข้อมูลรับรองฝังอยู่ ไม่ระบุหรือ null ใช้ค่าเริ่มต้นร้านค้าและล้างค่าไม่ได้
cancel_urlstring | nullไม่บังคับURL HTTPS ส่งกลับเมื่อหน้าชำระเงินจบโดยไม่ชำระสำเร็จ ไม่ระบุหรือ 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 ใช้ดีไซน์ปัจจุบันของร้านค้า ออบเจ็กต์รวมถึง {} จะตรึงดีไซน์และรูปภาพที่คำนวณได้เมื่อสร้าง ดูโครงสร้าง override ด้านล่าง ไม่มีการตั้งค่าการเงิน HTML, CSS, JavaScript หรือ URL รูปภาพภายนอกรายละเอียด
การตั้งค่าการแสดงผลบางส่วนสำหรับใบแจ้งหนี้นี้ ไม่ระบุ/null ใช้ดีไซน์ปัจจุบันของร้านค้า ออบเจ็กต์รวมถึง {} จะตรึงดีไซน์และรูปภาพที่คำนวณได้เมื่อสร้าง ดูโครงสร้าง override ด้านล่าง ไม่มีการตั้งค่าการเงิน HTML, CSS, JavaScript หรือ URL รูปภาพภายนอก
inherit_default_storebooleanไม่บังคับtrue เลือกดีไซน์ร้านค้าเริ่มต้นของโปรเจกต์เป็นฐาน มิฉะนั้นใช้ดีไซน์ที่มีผลของร้านค้าเป้าหมาย จากนั้นใช้ override และบันทึกแยก ธงในใบแจ้งหนี้หลังคำนวณเป็น falseรายละเอียด
true เลือกดีไซน์ร้านค้าเริ่มต้นของโปรเจกต์เป็นฐาน มิฉะนั้นใช้ดีไซน์ที่มีผลของร้านค้าเป้าหมาย จากนั้นใช้ override และบันทึกแยก ธงในใบแจ้งหนี้หลังคำนวณเป็น 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 อย่าส่งทั้งสอง
intro_font_sizeintegerไม่บังคับพิกเซล: 12, 14, 16, 18, 20 หรือ 24 ค่าเริ่มต้น 16 เว้นแต่สืบทอดค่าต่างออกไป
outro_font_sizeintegerไม่บังคับพิกเซล: 12, 14, 16, 18, 20 หรือ 24 ค่าเริ่มต้น 16 เว้นแต่สืบทอดค่าต่างออกไป
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 มีค่าเริ่มต้นเป็นคีย์เป้าหมาย อัปโหลดใน ร้านค้า → หน้าชำระเงิน ก่อน คัดลอก Store API ID จาก พื้นฐาน → API IDs รูปไม่มีหรือ ID ข้ามโปรเจกต์คืน 400 ไม่รับ URL ภายนอกหรือข้อมูลรูปภาพรายละเอียด
คีย์ logo_light, logo_dark, favicon ไม่ระบุคีย์จะคงรูปฐาน; null ลบรูป ออบเจ็กต์ {store_id: UUID, kind?: logo_light|logo_dark|favicon} ใช้รูปอัปโหลดที่มีผลของร้านค้านั้นซ้ำในโปรเจกต์เดียวกันเท่านั้น kind มีค่าเริ่มต้นเป็นคีย์เป้าหมาย อัปโหลดใน ร้านค้า → หน้าชำระเงิน ก่อน คัดลอก Store API ID จาก พื้นฐาน → API IDs รูปไม่มีหรือ 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[]ไม่บังคับslug เชนเรียงลำดับ ไม่เกิน 60 ค่าที่ไม่ซ้ำ (ตัวพิมพ์เล็ก ตัวเลข ขีดกลาง ไม่เกิน 64 อักขระ) [] ล้างค่า เรียงใหม่เฉพาะวิธีที่มีในใบแจ้งหนี้รายละเอียด
slug เชนเรียงลำดับ ไม่เกิน 60 ค่าที่ไม่ซ้ำ (ตัวพิมพ์เล็ก ตัวเลข ขีดกลาง ไม่เกิน 64 อักขระ) [] ล้างค่า เรียงใหม่เฉพาะวิธีที่มีในใบแจ้งหนี้
featured_asset_ids[]UUID[]ไม่บังคับID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่ารายละเอียด
ID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่า
default_asset_idUUID|nullไม่บังคับID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่ารายละเอียด
ID สินทรัพย์เรียงลำดับไม่ซ้ำสูงสุด 100 ค่า; [] ล้างค่า สินทรัพย์เริ่มต้นเป็น null ได้ ID มาจาก payment-assets ไม่ใช่ ID payment-intent ค่าเหล่านี้ไม่เปิดวิธีชำระ การชำระที่รับแล้วและค่าที่ลูกค้าเลือกอย่างถูกต้องมีลำดับสำคัญกว่า
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ไม่บังคับURL HTTPS ไม่เกิน 2,048 อักขระ ไม่มีข้อมูลรับรอง ค่าว่างล้างค่า ลิงก์เปิดหน้าต่างใหม่
terms_urlstringไม่บังคับURL HTTPS ไม่เกิน 2,048 อักขระ ไม่มีข้อมูลรับรอง ค่าว่างล้างค่า ลิงก์เปิดหน้าต่างใหม่
privacy_urlstringไม่บังคับURL HTTPS ไม่เกิน 2,048 อักขระ ไม่มีข้อมูลรับรอง ค่าว่างล้างค่า ลิงก์เปิดหน้าต่างใหม่
return_button_textstringไม่บังคับป้ายชื่อไม่เกิน 60 อักขระ ใช้ redirect_url/cancel_url/redirect_automatically/language ระดับบนสุดเพื่อกำหนดพฤติกรรมใบแจ้งหนี้
show_return_buttonbooleanไม่บังคับแสดงปุ่มกลับไปยังผู้ค้า/ยกเลิกแบบกดเองในหน้าชำระเงิน รวมสถานะสิ้นสุด ไม่ระบุจะใช้รูปลักษณ์ร้านค้า (ค่าเริ่มต้น true); false ซ่อนปุ่ม ไม่ยกเลิกใบแจ้งหนี้ ไม่ซ่อน URL ใน JSON และไม่ปิดการเปลี่ยนเส้นทางเมื่อสำเร็จอัตโนมัติ หากต้องการให้ตั้ง redirect_automatically ระดับบนสุดเป็น false แยก ต้องใช้ merchant 8.1.4 หรือใหม่กว่ารายละเอียด
แสดงปุ่มกลับไปยังผู้ค้า/ยกเลิกแบบกดเองในหน้าชำระเงิน รวมสถานะสิ้นสุด ไม่ระบุจะใช้รูปลักษณ์ร้านค้า (ค่าเริ่มต้น true); false ซ่อนปุ่ม ไม่ยกเลิกใบแจ้งหนี้ ไม่ซ่อน URL ใน JSON และไม่ปิดการเปลี่ยนเส้นทางเมื่อสำเร็จอัตโนมัติ หากต้องการให้ตั้ง redirect_automatically ระดับบนสุดเป็น false แยก ต้องใช้ merchant 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เสมอที่อยู่บรรทัดเดียวในข้อมูลผู้ค้า ซึ่งได้จาก metadata ส่วนตัว company, street, street2, zip, city, country, countryiso2 และ vatid
exchange_rate_spread_percentdecimal stringเสมอสเปรดราคาเสนอที่ล็อกไว้: ค่า override ตอนสร้าง หรือค่าเริ่มต้นร้านค้าหากไม่ระบุ ใช้ก่อนปัดขึ้นและไม่เปลี่ยนในใบแจ้งหนี้นี้
underpayment_tolerance_percentdecimal stringเสมอเปอร์เซ็นต์ยอดขาดที่ยอมรับแบบแก้ไขไม่ได้ เก็บภาพข้อมูลเมื่อสร้างใบแจ้งหนี้
amount_statusamount statusเสมอnone, partial, paid หรือ overpaid ใบแจ้งหนี้จำนวนศูนย์ที่อนุญาตชัดเจนชำระเสร็จสิ้นด้วย none และไม่มีวิธีชำระเงิน
monitoring_expires_atRFC 3339 timestampเสมอเวลาสิ้นสุดการติดตามล่าช้าที่ช้าที่สุดตามการตั้งค่าในทุกวิธีชำระเงิน
ipn_urlstring | nullเสมอปลายทาง IPN ที่มีผลต่อใบแจ้งหนี้ คืนเฉพาะผู้ค้า ไม่รวมในหน้าชำระเงินสาธารณะ
metadataobjectเสมอ
metadata ผู้ค้า ไม่คืนผ่านหน้าชำระเงินสาธารณะ เครื่องมือชำระเงินในคอนโซลเพิ่มข้อมูลที่มา payment_tool (id, kind, title, pricing, requested_amount, request_id) ซึ่งไม่พิสูจน์การชำระเงิน ยืนยัน callback และดำเนินการ invoice.settled ครั้งเดียวต่อ invoice_idรายละเอียด
metadata ผู้ค้า ไม่คืนผ่านหน้าชำระเงินสาธารณะ เครื่องมือชำระเงินในคอนโซลเพิ่มข้อมูลที่มา payment_tool (id, kind, title, pricing, requested_amount, request_id) ซึ่งไม่พิสูจน์การชำระเงิน ยืนยัน callback และดำเนินการ invoice.settled ครั้งเดียวต่อ invoice_id
payment_intents[]object[]เสมอ
วิธีชำระเงินที่เสนอราคาและสถานะติดตาม
payment_railonchain | lightningเสมอช่องทางของใบแจ้งหนี้ Bitcoin บนเชนและ Lightning อาจใช้ asset_id เดียวกัน ให้ใช้ intent id ร่วมกับฟิลด์นี้ ไม่ใช่สัญลักษณ์อย่างเดียว ต่างจาก payment_rail ของสแกนเนอร์ในแค็ตตาล็อกสินทรัพย์รายละเอียด
ช่องทางของใบแจ้งหนี้ Bitcoin บนเชนและ Lightning อาจใช้ asset_id เดียวกัน ให้ใช้ intent id ร่วมกับฟิลด์นี้ ไม่ใช่สัญลักษณ์อย่างเดียว ต่างจาก payment_rail ของสแกนเนอร์ในแค็ตตาล็อกสินทรัพย์
bolt11string | nullเสมอคำขอชำระ Lightning มิฉะนั้นเป็น null ชำระคำขอนี้ด้วยกระเป๋า Lightning ห้ามส่งเงินบนเชนไปยัง payment hash
asset_decimalsintegerเสมอความละเอียดหน่วยย่อย Lightning BTC ใช้ 11 (millisatoshis) ไม่ใช่ 8 ของ Bitcoin บนเชน ราคาเสนอเป็น satoshi เต็มหน่วย ยอดรับคงความละเอียด millisatoshi
quote_ratedecimal stringเสมอหน่วยสินทรัพย์ต่อหนึ่งหน่วยสกุลเงินใบแจ้งหนี้ รวมสเปรดที่ล็อกไว้ เช่น 1.02 USDC ต่อ USD ไม่ใช่อัตรากลับด้าน
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 stablecoin อิงเงินตราทั่วไปที่รู้จักและตรวจสอบแล้ว (เช่น USDC, USDT, DAI, USDS, EURC) ปัดขึ้นให้มีทศนิยมไม่เกินสองตำแหน่ง; 1.321 เป็น 1.33 ไม่ใช่ 1.32 นี่คือจำนวนที่คาดหวังแม้ยอมรับส่วนต่างศูนย์ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ไม่คำนวณราคาใหม่ให้ใบแจ้งหนี้เดิมรายละเอียด
จำนวนสินทรัพย์ที่แน่นอนและล็อกไว้ให้ชำระหลังสเปรดและปัดขึ้น ตั้งแต่ 4.1.1 stablecoin อิงเงินตราทั่วไปที่รู้จักและตรวจสอบแล้ว (เช่น USDC, USDT, DAI, USDS, EURC) ปัดขึ้นให้มีทศนิยมไม่เกินสองตำแหน่ง; 1.321 เป็น 1.33 ไม่ใช่ 1.32 นี่คือจำนวนที่คาดหวังแม้ยอมรับส่วนต่างศูนย์ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ไม่คำนวณราคาใหม่ให้ใบแจ้งหนี้เดิม
destination_addressstringเสมอที่อยู่รับเงินบนเชน หรือ payment hash 64 อักขระสำหรับ Lightning ใช้ bolt11 ชำระ Lightning แฮชไม่ใช่ที่อยู่ Bitcoin
destination_tagstring | nullเสมอเลขอ้างอิงชำระเงินสาธารณะที่จำเป็นเมื่อช่องทางใช้: destination tag ของ XRP, memo ID ของ Stellar หรือคอมเมนต์ใบแจ้งหนี้ TON เป็น null สำหรับช่องทางที่ใช้ที่อยู่ไม่ซ้ำ
หมายเหตุการใช้งาน
- payment_methods กรองวิธีที่ร้านค้าเปิดใช้เฉพาะใบแจ้งหนี้นี้ ไม่ระบุ/null คงทุกวิธีร้านค้า; [] ไม่ถูกต้อง ดูคำใบ้ chain_slug ตัวเล็กและ ticker สินทรัพย์ที่แสดงใน โปรเจกต์ → ร้านค้า → วิธีชำระเงิน รายการ payment-assets ของ API ให้ chain_slug, asset.symbol และ asset.id ใช้ {chain_slug: ethereum, asset_tickers: [USDC, USDT]} สำหรับโทเคน Ethereum ที่ยอมรับ BTC และ PEPE ใช้กฎเดียวกันบนเชนที่เลือก ticker ไม่แยกตัวพิมพ์เล็กใหญ่ จำกัดตามเชน และจับคู่เฉพาะในร้านค้า สัญญาสองตัวที่ยอมรับและมี ticker เดียวกันคืน 400 แทนการเลือกตัวหนึ่ง แม้ตัวหนึ่งยังไม่พร้อม ให้ใช้ asset_ids กรณีนั้น เหรียญหลัก โทเคนแค็ตตาล็อก และโทเคนกำหนดเองใช้กฎเดียวกัน แต่ละ chain/rail ปรากฏได้ครั้งเดียว วิธีสุดท้ายรวมไม่เกิน 64 รายการ Merchant 5.4.0+: ละเว้นตัวเลือกที่ไม่รู้จัก ปิดอยู่ ผิดเชน หรือไม่ยอมรับ หากทั้งชุดไม่มีรายการที่ใช้งานและยอมรับตรงกัน จะใช้ค่าเริ่มต้นร้านค้า มิฉะนั้นใช้เฉพาะรายการที่ตรง การระบุเพียงเชนรวมทุกสินทรัพย์บนเชนที่ใช้งานและยอมรับ วิธีที่เลือกและเปิดใช้ต้องมีกระเป๋าที่ถูกต้อง อะแดปเตอร์สแกนเนอร์ติดตั้ง และอัตราที่เชื่อถือได้ ตั้งแต่ 6.0.6 สแกนเนอร์ไม่พร้อม ช่วงพัก และผลสุขภาพรอ/เก่าไม่บล็อกการสร้างใบแจ้งหนี้หรือนำวิธีบนเชนที่ตั้งไว้ออก ระบบลองตรวจพบใหม่อัตโนมัติ การชำระเสร็จสิ้นยังต้องมีองค์ประชุมผู้ให้บริการและการยืนยัน ติดตาม receive_readiness และรักษาความพร้อมผู้ให้บริการ ใบแจ้งหนี้อาจยังไม่ผ่านการตรวจจนสแกนเนอร์ฟื้น การจัดสรร subaddress Monero และสร้าง BOLT11 Lightning ยังต้องใช้บริการกระเป๋า/โหนดภายนอก ความล้มเหลวคืน error.message พร้อม error.details.payment_methods ที่มี chain_slug, asset_ticker, reason_code และสำหรับวินิจฉัยสแกนเนอร์ มี required_endpoint_role, healthy_endpoints และ required_independent_providers TRON รับประวัติจัดทำดัชนีหรือ API บล็อกเหรียญหลัก raw solidified ที่รองรับ สถานะสุขภาพพื้นฐานอย่างเดียวไม่พิสูจน์ความเข้ากันได้สแกนเนอร์ ความล้มเหลวด้านราคาระบุสินทรัพย์/สกุลเงิน ไม่มีสิ่งใดเปิดสินทรัพย์ที่ไม่ยอมรับหรือเปลี่ยนนโยบายร้านค้า ใน merchant ก่อน 5.4.0 ตัวเลือกที่ระบุชัดแต่ไม่รู้จัก/ไม่ใช้งานจะล้มเหลวแทน วิธีของใบแจ้งหนี้เดิมไม่ขยายเมื่อเปลี่ยนการตั้งค่าร้านค้า ต้องเลือก Lightning แยก การเรียกซ้ำคงวิธีเดิม และเปลี่ยนตัวเลือกด้วย Idempotency-Key เดิมคืน 409
- checkout_appearance รองรับทุกการตั้งค่าแสดงผลข้างต้น ฟิลด์ที่ไม่ใส่สืบทอดค่า อาร์เรย์แทนที่ และฟิลด์ข้อความซ้อนจะผสาน ออบเจ็กต์ข้อความว่างล้างขอบเขตนั้น ดีไซน์และรูปที่คำนวณได้บันทึกให้ใบแจ้งหนี้นี้โดยไม่แก้ร้านค้า อ่าน appearance จาก JSON หน้าชำระเงินสาธารณะเพื่อตรวจผล คำขอรวมจำกัด 32 KiB และการตั้งค่าหลังคำนวณ 20 KiB
- เปลี่ยน checkout_appearance ด้วย Idempotency-Key เดิมคืน 409 ให้ลองด้วยไบต์ดิบเหมือนเดิม รูปลักษณ์ไม่เปลี่ยนจำนวนเงิน อัตรา สินทรัพย์ที่ยอมรับ จำนวนการยืนยัน สถานะจริง หรือสิทธิ์ฝัง ไม่มี HTML, CSS, สคริปต์ หรือดึงรูปภายนอก
- exchange_rate_spread_percent ใช้แทนค่าเริ่มต้นร้านค้าสำหรับใบแจ้งหนี้นี้ ไม่ใส่หรือส่ง null เพื่อสืบทอด หรือส่ง "0" เพื่อปิด ราคาเสนอใบแจ้งหนี้เดิมไม่เปลี่ยน
- ใช้สเปรดก่อนปัดขึ้น ค่าธรรมเนียมยังอิงจำนวนเงินตราทั่วไปเดิมของใบแจ้งหนี้ ไม่รวมสเปรด
- ส่ง expected_amount หรือ expected_amount_atomic ที่คืนมาเสมอ การปัดเป็นปัดขึ้น จำกัดด้วยความละเอียดสินทรัพย์ 0.1% ของจำนวน และหนึ่งหน่วยย่อยของเงินตราทั่วไป
- การลองใหม่ต้องคงข้อมูลรับรอง Idempotency-Key และไบต์เนื้อหาเดิม เปลี่ยนสเปรดด้วยคีย์เดิมคืน 409 idempotency_conflict
- ตรวจการเรียกซ้ำที่ตรงทุกไบต์ก่อนเตรียมราคาใหม่ DNS callback หรือที่อยู่ ยังตรวจขอบเขตข้อมูลรับรองและสิทธิ์โปรเจกต์/ร้านค้าทุกคำขอ
- ipn_url ที่มีผลต้องมีซีเคร็ตลงนาม IPN ร้านค้า ปฏิเสธฟิลด์เนื้อหาที่ไม่รู้จัก
ข้อผิดพลาด
GETแสดงรายการใบแจ้งหนี้/v1/projects/{project_id}/invoicesอ่านอย่างเดียว
คืนหน้าสรุปใบแจ้งหนี้ในขอบเขตแบบกระชับเรียงใหม่สุดก่อน รวมอีเมลเฉพาะผู้ค้าและฟิลด์ลูกค้าที่ได้จาก metadata ที่รู้จัก ประเมินตัวกรองค้นหา สถานะ และร้านค้าฝั่งเซิร์ฟเวอร์ การตอบกลับมี total และ has_more เพื่อแบ่งหน้าอย่างคาดการณ์ได้
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | แนะนำ | application/json |
พารามิเตอร์พาธ
พารามิเตอร์ query
searchstringไม่บังคับ: คำนำหน้า invoice-id, order-id หรืออีเมลแบบไม่แยกตัวพิมพ์; UUID ใบแจ้งหนี้ตรงตัว; หรือส่วนข้อความในคำอธิบายและฟิลด์ลูกค้าที่รู้จัก ทุกคีย์ metadata และค่าข้อความ ตัวเลข บูลีน (รวมออบเจ็กต์/อาร์เรย์ซ้อน) ยังรองรับค้นคำนำหน้าคำแบบทำดัชนี ทุกคำค้นต้องตรง โดยนับเครื่องหมายวรรคตอนเป็นตัวคั่น ตัดช่องว่างขอบ ไม่เกิน 100 อักขระ ไม่มีตัวควบคุม ผลตรง metadata ไม่เพิ่ม metadata ดิบในรายการ ใช้รายละเอียดใบแจ้งหนี้เพื่ออ่านรายละเอียด
ไม่บังคับ: คำนำหน้า invoice-id, order-id หรืออีเมลแบบไม่แยกตัวพิมพ์; UUID ใบแจ้งหนี้ตรงตัว; หรือส่วนข้อความในคำอธิบายและฟิลด์ลูกค้าที่รู้จัก ทุกคีย์ metadata และค่าข้อความ ตัวเลข บูลีน (รวมออบเจ็กต์/อาร์เรย์ซ้อน) ยังรองรับค้นคำนำหน้าคำแบบทำดัชนี ทุกคำค้นต้องตรง โดยนับเครื่องหมายวรรคตอนเป็นตัวคั่น ตัดช่องว่างขอบ ไม่เกิน 100 อักขระ ไม่มีตัวควบคุม ผลตรง metadata ไม่เพิ่ม metadata ดิบในรายการ ใช้รายละเอียดใบแจ้งหนี้เพื่ออ่าน
คำขอ
: "${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เสมอที่อยู่บรรทัดเดียวในข้อมูลผู้ค้า ซึ่งได้จาก metadata ส่วนตัว company, street, street2, zip, city, country, countryiso2 และ vatid
exchange_rate_spread_percentdecimal stringเสมอสเปรดราคาเสนอที่ล็อกไว้: ค่า override ตอนสร้าง หรือค่าเริ่มต้นร้านค้าหากไม่ระบุ ใช้ก่อนปัดขึ้นและไม่เปลี่ยนในใบแจ้งหนี้นี้
underpayment_tolerance_percentdecimal stringเสมอเปอร์เซ็นต์ยอดขาดที่ยอมรับแบบแก้ไขไม่ได้ เก็บภาพข้อมูลเมื่อสร้างใบแจ้งหนี้
amount_statusamount statusเสมอnone, partial, paid หรือ overpaid ใบแจ้งหนี้จำนวนศูนย์ที่อนุญาตชัดเจนชำระเสร็จสิ้นด้วย none และไม่มีวิธีชำระเงิน
monitoring_expires_atRFC 3339 timestampเสมอเวลาสิ้นสุดการติดตามล่าช้าที่ช้าที่สุดตามการตั้งค่าในทุกวิธีชำระเงิน
หมายเหตุการใช้งาน
- เรียง created_at จากมากไปน้อย แล้ว id ภายในจากมากไปน้อย
- รายการเป็นออบเจ็กต์ InvoiceSummary; email, customer_name และ customer_address เฉพาะผู้ค้า เรียกรายละเอียดเพื่ออ่าน metadata ดิบและ payment intents
- หน้าถัดไปตั้ง 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เสมอที่อยู่บรรทัดเดียวในข้อมูลผู้ค้า ซึ่งได้จาก metadata ส่วนตัว company, street, street2, zip, city, country, countryiso2 และ vatid
exchange_rate_spread_percentdecimal stringเสมอสเปรดราคาเสนอที่ล็อกไว้: ค่า override ตอนสร้าง หรือค่าเริ่มต้นร้านค้าหากไม่ระบุ ใช้ก่อนปัดขึ้นและไม่เปลี่ยนในใบแจ้งหนี้นี้
underpayment_tolerance_percentdecimal stringเสมอเปอร์เซ็นต์ยอดขาดที่ยอมรับแบบแก้ไขไม่ได้ เก็บภาพข้อมูลเมื่อสร้างใบแจ้งหนี้
amount_statusamount statusเสมอnone, partial, paid หรือ overpaid ใบแจ้งหนี้จำนวนศูนย์ที่อนุญาตชัดเจนชำระเสร็จสิ้นด้วย none และไม่มีวิธีชำระเงิน
monitoring_expires_atRFC 3339 timestampเสมอเวลาสิ้นสุดการติดตามล่าช้าที่ช้าที่สุดตามการตั้งค่าในทุกวิธีชำระเงิน
ipn_urlstring | nullเสมอปลายทาง IPN ที่มีผลต่อใบแจ้งหนี้ คืนเฉพาะผู้ค้า ไม่รวมในหน้าชำระเงินสาธารณะ
metadataobjectเสมอ
metadata ผู้ค้า ไม่คืนผ่านหน้าชำระเงินสาธารณะ เครื่องมือชำระเงินในคอนโซลเพิ่มข้อมูลที่มา payment_tool (id, kind, title, pricing, requested_amount, request_id) ซึ่งไม่พิสูจน์การชำระเงิน ยืนยัน callback และดำเนินการ invoice.settled ครั้งเดียวต่อ invoice_idรายละเอียด
metadata ผู้ค้า ไม่คืนผ่านหน้าชำระเงินสาธารณะ เครื่องมือชำระเงินในคอนโซลเพิ่มข้อมูลที่มา payment_tool (id, kind, title, pricing, requested_amount, request_id) ซึ่งไม่พิสูจน์การชำระเงิน ยืนยัน callback และดำเนินการ invoice.settled ครั้งเดียวต่อ invoice_id
payment_intents[]object[]เสมอ
วิธีชำระเงินที่เสนอราคาและสถานะติดตาม
payment_railonchain | lightningเสมอช่องทางของใบแจ้งหนี้ Bitcoin บนเชนและ Lightning อาจใช้ asset_id เดียวกัน ให้ใช้ intent id ร่วมกับฟิลด์นี้ ไม่ใช่สัญลักษณ์อย่างเดียว ต่างจาก payment_rail ของสแกนเนอร์ในแค็ตตาล็อกสินทรัพย์รายละเอียด
ช่องทางของใบแจ้งหนี้ Bitcoin บนเชนและ Lightning อาจใช้ asset_id เดียวกัน ให้ใช้ intent id ร่วมกับฟิลด์นี้ ไม่ใช่สัญลักษณ์อย่างเดียว ต่างจาก payment_rail ของสแกนเนอร์ในแค็ตตาล็อกสินทรัพย์
bolt11string | nullเสมอคำขอชำระ Lightning มิฉะนั้นเป็น null ชำระคำขอนี้ด้วยกระเป๋า Lightning ห้ามส่งเงินบนเชนไปยัง payment hash
asset_decimalsintegerเสมอความละเอียดหน่วยย่อย Lightning BTC ใช้ 11 (millisatoshis) ไม่ใช่ 8 ของ Bitcoin บนเชน ราคาเสนอเป็น satoshi เต็มหน่วย ยอดรับคงความละเอียด millisatoshi
quote_ratedecimal stringเสมอหน่วยสินทรัพย์ต่อหนึ่งหน่วยสกุลเงินใบแจ้งหนี้ รวมสเปรดที่ล็อกไว้ เช่น 1.02 USDC ต่อ USD ไม่ใช่อัตรากลับด้าน
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 stablecoin อิงเงินตราทั่วไปที่รู้จักและตรวจสอบแล้ว (เช่น USDC, USDT, DAI, USDS, EURC) ปัดขึ้นให้มีทศนิยมไม่เกินสองตำแหน่ง; 1.321 เป็น 1.33 ไม่ใช่ 1.32 นี่คือจำนวนที่คาดหวังแม้ยอมรับส่วนต่างศูนย์ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ไม่คำนวณราคาใหม่ให้ใบแจ้งหนี้เดิมรายละเอียด
จำนวนสินทรัพย์ที่แน่นอนและล็อกไว้ให้ชำระหลังสเปรดและปัดขึ้น ตั้งแต่ 4.1.1 stablecoin อิงเงินตราทั่วไปที่รู้จักและตรวจสอบแล้ว (เช่น USDC, USDT, DAI, USDS, EURC) ปัดขึ้นให้มีทศนิยมไม่เกินสองตำแหน่ง; 1.321 เป็น 1.33 ไม่ใช่ 1.32 นี่คือจำนวนที่คาดหวังแม้ยอมรับส่วนต่างศูนย์ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ไม่คำนวณราคาใหม่ให้ใบแจ้งหนี้เดิม
destination_addressstringเสมอที่อยู่รับเงินบนเชน หรือ payment hash 64 อักขระสำหรับ Lightning ใช้ bolt11 ชำระ Lightning แฮชไม่ใช่ที่อยู่ Bitcoin
destination_tagstring | nullเสมอเลขอ้างอิงชำระเงินสาธารณะที่จำเป็นเมื่อช่องทางใช้: destination tag ของ XRP, memo ID ของ Stellar หรือคอมเมนต์ใบแจ้งหนี้ TON เป็น null สำหรับช่องทางที่ใช้ที่อยู่ไม่ซ้ำ
หมายเหตุการใช้งาน
- การค้นในขอบเขตจงใจคืน invoice_not_found เมื่อ ID สาธารณะไม่อยู่ในโปรเจกต์ที่ได้รับอนุญาต
- links.checkout ใช้ ร้านค้า → พื้นฐาน → โดเมนร้านค้า: โฮสต์เนม pay ที่เปิดของร้านค้านี้ก่อน แล้วตัวเลือกของร้านค้าเริ่มต้น แล้วโดเมนหลักระบบ ละเว้นโฮสต์ที่เลิกใช้/ร่างหรือผิดบริการ ใช้กับการตอบสร้างและ MCP ด้วย โดยคำนวณลิงก์ขณะตอบ รวมการเรียกซ้ำแบบ idempotent ลิงก์ callback ที่ลงนามตรึงเมื่อสร้างเหตุการณ์ ไม่เขียนใหม่ตอนลองซ้ำ ค่าที่เลือกเหล่านี้ใช้สร้างลิงก์เท่านั้น ไม่เปลี่ยนเส้นทางทราฟฟิกหรือข้อจำกัด IP
ข้อผิดพลาด
GETแสดงรายการชำระเงินของใบแจ้งหนี้/v1/projects/{project_id}/invoices/{invoice_id}/paymentsอ่านอย่างเดียว
ประวัติการโอนปัจจุบันทั้งหมด รวมข้อมูลที่ทำให้ไม่ถูกต้อง ใช้เมื่อ callback ระบุ payments_truncated นี่คือสถานะปัจจุบัน ไม่ใช่การสร้างเหตุการณ์เก่าขึ้นใหม่
การยืนยันตัวตนและเฮดเดอร์
| เฮดเดอร์ | การระบุค่า | กฎ |
|---|---|---|
| Authorization | จำเป็น | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | แนะนำ | application/json |
พารามิเตอร์พาธ
พารามิเตอร์ query
คำขอ
: "${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หมายเหตุการใช้งาน
- ข้อมูลที่ตรวจพบคือ log โทเคน เอาต์พุต UTXO หรือการโอนช่องทางอื่น ไม่จำเป็นต้องเป็นแฮชธุรกรรมไม่ซ้ำ ตัดซ้ำด้วย payment_id; transaction_id ร่วมกับ event_index ระบุการโอนบนเชน
- status เป็น detected, confirming, final, reorged, replaced หรือ invalid เฉพาะรายการที่ counts_towards_received เท่านั้นนับในยอดรับ ห้ามบวกยอดข้ามสินทรัพย์
- ระเบียน Lightning ใช้ payment_hash โดย transaction_id, confirmations และลิงก์ explorer เป็น null ความละเอียด BTC คือ 11 (millisatoshis) ไม่เปิดเผย preimage, BOLT11 หรือความลับกระเป๋า
- เรียง observed_at จากมากไปน้อย แล้ว payment_id จากมากไปน้อย จำนวนและหน้าใช้ภาพข้อมูล repeatable-read เดียวกัน หน้าภายหลังอาจเปลี่ยนเมื่อมีการชำระเข้า ตัดซ้ำด้วย payment_id เมื่อแบ่งหน้าใบแจ้งหนี้ที่ยังเคลื่อนไหว
- ใช้ขอบเขตโปรเจกต์อ่านอย่างเดียว ข้อจำกัด IP และอัตราต่อข้อมูลรับรองเดิม ห้ามตามลิงก์จาก callback พร้อมโทเคน เว้นแต่ 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 token
- ขอบเครือข่ายหน้าชำระเงินที่จัดการอนุญาต 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 token
- ตัวโครง HTML คืน 200 แม้ไม่มีใบแจ้งหนี้ จากนั้นคำขอ JSON หน้าชำระเงินจะได้รับ invoice_not_found
- การตอบกลับเป็น no-store, noindex และมี CSP frame-ancestors เฉพาะใบแจ้งหนี้
- โปรเจกต์/ร้านค้าปิดหรือใบแจ้งหนี้ไม่รู้จักไม่เปิดเผยข้อมูลหน้าชำระเงิน
ข้อผิดพลาด
GETข้อมูลใบแจ้งหนี้ที่เปิดเผยบนหน้าชำระเงินได้อย่างปลอดภัย/checkout-api/invoices/{invoice_id}สาธารณะ
คืนเฉพาะฟิลด์ที่ใช้แสดงหน้าชำระเงิน จงใจละเว้น ID ภายใน อีเมลลูกค้าและฟิลด์ที่อยู่ที่สร้างจากข้อมูล IPN URL, metadata ผู้ค้า ID กระเป๋า พาธสร้างคีย์ และข้อมูลวินิจฉัยตัวติดตาม
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
พารามิเตอร์พาธ
คำขอ
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เสมอสเปรดราคาเสนอที่มีผลและล็อกเมื่อสร้าง รวม override รายใบแจ้งหนี้
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เสมอ
การแสดงผลที่มีผล: override รายใบแจ้งหนี้ที่ตรึงไว้หากส่งมา มิฉะนั้นดีไซน์ร้านค้าปัจจุบัน ไม่เปลี่ยนฟิลด์การเงินหรือคำเตือนความปลอดภัย
inherit_default_storebooleanเสมอเป็น true เมื่อร้านค้าเริ่มต้นโปรเจกต์ให้รูปลักษณ์นี้ เป็น false สำหรับร้านค้าอิสระและ override ใบแจ้งหนี้ที่ตรึงไว้
invoice_overridebooleanเสมอเป็น true เมื่อส่ง checkout_appearance ตอนสร้างใบแจ้งหนี้ ไม่ใส่/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 เคร่งครัด สีไม่บังคับว่างเพื่อใช้ค่าอัตโนมัติ คำนวณคอนทราสต์สีข้อความ
imagesobjectเสมอURL logo_light, logo_dark และ favicon แบบไม่บังคับ: รูป PNG ที่ปรับรูปแบบแล้วใน origin เดียวกันและจำกัดขอบเขต
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 ใช้กับสถานะใช้งานและสิ้นสุด ไม่ใช่การเปลี่ยนเส้นทางสำเร็จอัตโนมัติ มีตั้งแต่ merchant 8.1.4
payment_methods[]object[]เสมอ
วิธีชำระเงินที่เปิดเผยบนหน้าชำระเงินได้อย่างปลอดภัย
payment_railonchain | lightningเสมอLightning ยังเป็นวิธี Bitcoin แต่แยกจาก BTC บนเชน ระบุตัวเลือกด้วย intent id และ rail ไม่ใช่ asset_id อย่างเดียว
bolt11string | nullเสมอคำขอ Lightning ที่ลงนาม เป็น null สำหรับวิธีบนเชน ห้ามชำระหลัง payable เป็น false
payment_hashstring | nullเสมอpayment hash ของ Lightning เพื่อกระทบยอด ไม่ใช่ที่อยู่รับเงิน เป็น null สำหรับวิธีบนเชน
caip_asset_idstring | nullเสมอตัวระบุสินทรัพย์มาตรฐานที่แน่นอน รวมสัญญาโทเคนหรือ mint ที่ตรวจสอบแล้วเมื่อเกี่ยวข้อง
asset_icon_urlstring | nullเสมอไอคอนสินทรัพย์ที่แคชภายใน origin เดียวกัน หรือ null เมื่อไม่มีการจับคู่ CoinGecko ที่ตรวจสอบแล้ว
contract_addressstring | nullเสมอคอนแทรกต์ ERC-20 หรือ mint SPL มาตรฐานสำหรับโทเคน เป็น null สำหรับเหรียญหลัก
asset_decimalsintegerเสมอความละเอียดหน่วยย่อย: 11 สำหรับ BTC Lightning หน่วย millisatoshi และ 8 สำหรับ BTC บนเชนหน่วย satoshi
payablebooleanเสมอเป็น true เฉพาะเมื่อวิธีนี้ตรงตัวรับชำระได้ในขณะนี้ เป็น false สำหรับวิธีที่ไม่ใช้งานหลังสินทรัพย์อื่นรับเงินแล้ว
expected_amountdecimalเสมอราคาเต็มที่ล็อกไว้ทั้งหน่วยแสดงผลและหน่วยบนเชนจริง stablecoin อิงเงินตราทั่วไปที่รู้จักใช้ทศนิยมราคาเสนอไม่เกินสองตำแหน่งและปัดขึ้นหลังสเปรดเสมอ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ทศนิยมโทเคนจริง เงินที่รับ และยอดเหลือหลังชำระบางส่วนยังแน่นอน ใช้จำนวนที่คืนมาโดยไม่เปลี่ยนรายละเอียด
ราคาเต็มที่ล็อกไว้ทั้งหน่วยแสดงผลและหน่วยบนเชนจริง stablecoin อิงเงินตราทั่วไปที่รู้จักใช้ทศนิยมราคาเสนอไม่เกินสองตำแหน่งและปัดขึ้นหลังสเปรดเสมอ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ทศนิยมโทเคนจริง เงินที่รับ และยอดเหลือหลังชำระบางส่วนยังแน่นอน ใช้จำนวนที่คืนมาโดยไม่เปลี่ยน
expected_amount_atomicinteger stringเสมอราคาเต็มที่ล็อกไว้ทั้งหน่วยแสดงผลและหน่วยบนเชนจริง stablecoin อิงเงินตราทั่วไปที่รู้จักใช้ทศนิยมราคาเสนอไม่เกินสองตำแหน่งและปัดขึ้นหลังสเปรดเสมอ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ทศนิยมโทเคนจริง เงินที่รับ และยอดเหลือหลังชำระบางส่วนยังแน่นอน ใช้จำนวนที่คืนมาโดยไม่เปลี่ยนรายละเอียด
ราคาเต็มที่ล็อกไว้ทั้งหน่วยแสดงผลและหน่วยบนเชนจริง stablecoin อิงเงินตราทั่วไปที่รู้จักใช้ทศนิยมราคาเสนอไม่เกินสองตำแหน่งและปัดขึ้นหลังสเปรดเสมอ สินทรัพย์อื่นใช้ความละเอียดปรับตามค่า ทศนิยมโทเคนจริง เงินที่รับ และยอดเหลือหลังชำระบางส่วนยังแน่นอน ใช้จำนวนที่คืนมาโดยไม่เปลี่ยน
remaining_amountdecimal stringเสมอจำนวนแสดงผลที่แน่นอนซึ่งยังต้องรับเพื่อถึงเกณฑ์ยอมรับ จำกัดค่าต่ำสุดศูนย์
remaining_amount_atomicinteger stringเสมอยอดขาดถึงเกณฑ์ยอมรับในหน่วยย่อย ไม่ใช่จำนวนที่ขอให้ชำระ ส่วนต่างมีผลเฉพาะการยอมรับ
destination_addressstringเสมอปลายทางบนเชนและเลขอ้างอิงถ้ามี สำหรับ Lightning เป็น payment hash ไม่มี tag ให้ชำระ bolt11/payment_uri แทน
destination_tagstring|nullเสมอปลายทางบนเชนและเลขอ้างอิงถ้ามี สำหรับ Lightning เป็น payment hash ไม่มี tag ให้ชำระ bolt11/payment_uri แทน
payment_uristring | nullเสมอคำขอตามเชน: ERC-681, Solana Pay, URI เหรียญหลัก หรือ lightning:<bolt11> คำขอที่มีจำนวนใช้ยอดคาดหวังเต็มลบเงินที่รับ ไม่ใช้เกณฑ์ส่วนต่าง เป็น null เมื่อ payable เป็น false รวมหลังยอมรับยอดขาดที่อยู่ในเกณฑ์ QR Lightning เข้ารหัสคำขอ Lightning ทั้งหมด ไม่ใช่ payment hashรายละเอียด
คำขอตามเชน: ERC-681, Solana Pay, URI เหรียญหลัก หรือ lightning:<bolt11> คำขอที่มีจำนวนใช้ยอดคาดหวังเต็มลบเงินที่รับ ไม่ใช้เกณฑ์ส่วนต่าง เป็น null เมื่อ payable เป็น false รวมหลังยอมรับยอดขาดที่อยู่ในเกณฑ์ QR Lightning เข้ารหัสคำขอ Lightning ทั้งหมด ไม่ใช่ payment hash
qr_urlpath | nullเสมอพาธ QR SVG ใน origin เดียวกันที่มีรุ่นตาม sequence และยอดเหลือแน่นอน หรือ null เมื่อ payable เป็น false SVG เป็น no-store
transactions_truncatedbooleanเสมอเป็น true เมื่อ transaction_count มากกว่ารายการธุรกรรมล่าสุดที่คืนมา
transactions[]object[]เสมอ
ธุรกรรมสาธารณะถูกต้องล่าสุดไม่เกิน 10 รายการ ยอดรับรวมที่แน่นอนไม่ขึ้นกับเพดานการแสดงนี้
หมายเหตุการใช้งาน
- ไม่ต้องใช้ bearer token
- Cache-Control เป็น no-store และปิดการจัดทำดัชนีค้นหา
- ถือ invoice_id เป็นข้อมูลที่ให้สิทธิ์เข้าถึงหน้าสำหรับลูกค้า หลีกเลี่ยงเผยแพร่โดยไม่จำเป็น
- asset_icon_url เป็นไฟล์ภายใน origin เดียวกัน หน้าชำระเงินลูกค้าไม่ต้องติดต่อ CoinGecko เพื่อแสดง
- เมื่อ destination_tag ไม่เป็น null ให้แสดงและคัดลอกคู่ที่อยู่ นี่คือ destination tag XRP, memo ID Stellar หรือคอมเมนต์ใบแจ้งหนี้ TON ที่จำเป็นและต้องส่งตรงทุกตัว
- สำหรับโทเคนที่ตรวจสอบแล้ว asset_kind เป็น token, contract_address ระบุคอนแทรกต์ ERC-20 หรือ mint SPL ตรงตัว, token_standard ระบุช่องทาง และ payment_uri มีตัวระบุโทเคนนั้น
ข้อผิดพลาด
GETตัวอย่างหน้าชำระเงินของร้านค้า/invoice/preview/{project_id}สาธารณะ
แสดงรูปลักษณ์ร้านค้าที่บันทึกไว้ด้วยจำนวนตัวอย่างและ metadata สินทรัพย์ที่ยอมรับจริง สลับตัวอย่าง waiting, confirming, paid, underpaid และ expired โดยไม่สร้างการชำระเงิน
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
พารามิเตอร์พาธ
พารามิเตอร์ query
คำขอ
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}สาธารณะ
คืนรูปลักษณ์ร้านค้าที่มีผลและ metadata สินทรัพย์ที่ยอมรับแบบปลอดภัย payment_methods ยังว่าง; preview_methods ไม่มีที่อยู่ชำระ ราคาเสนอ หรือข้อมูลกระเป๋าส่วนตัว
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
พารามิเตอร์พาธ
พารามิเตอร์ query
คำขอ
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 สำหรับร้านค้าอิสระและ override ใบแจ้งหนี้ที่ตรึงไว้
invoice_overridebooleanเสมอเป็น true เมื่อส่ง checkout_appearance ตอนสร้างใบแจ้งหนี้ ไม่ใส่/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 เคร่งครัด สีไม่บังคับว่างเพื่อใช้ค่าอัตโนมัติ คำนวณคอนทราสต์สีข้อความ
imagesobjectเสมอURL logo_light, logo_dark และ favicon แบบไม่บังคับ: รูป PNG ที่ปรับรูปแบบแล้วใน origin เดียวกันและจำกัดขอบเขต
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 ใช้กับสถานะใช้งานและสิ้นสุด ไม่ใช่การเปลี่ยนเส้นทางสำเร็จอัตโนมัติ มีตั้งแต่ merchant 8.1.4
preview_methods[]arraypayment_methods[]arrayหมายเหตุการใช้งาน
- ไม่รับและไม่ต้องใช้ bearer token
- ไม่คืนใบแจ้งหนี้ ปลายทาง กระเป๋า ธุรกรรม IPN, webhook หรือ metadata ผู้ค้า
- ใช้คอนโซลที่ยืนยันตัวตนเพื่อรับลิงก์ตัวอย่างบนโดเมน pay ที่ถูกต้อง
ข้อผิดพลาด
GETรูปภาพหน้าชำระเงินของร้านค้า/checkout-api/invoices/{invoice_id}/appearance-images/{kind}/{revision}/image.pngสาธารณะ
คืนโลโก้ร้านค้าหรือ favicon ที่ปรับรูปแบบแล้วของใบแจ้งหนี้นี้ ใช้ URL appearance.images จากข้อมูลหน้าชำระเงิน
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
พารามิเตอร์พาธ
คำขอ
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)หมายเหตุการใช้งาน
- ใช้ appearance.images จาก JSON หน้าชำระเงิน รูปใบแจ้งหนี้ที่ตรึงไว้ยังใช้ได้หลังร้านค้าต้นทางแทนที่หรือลบรูปอัปโหลด รูปที่ลบอย่างชัดเจน ผิดใบแจ้งหนี้ ผิดชนิด และรุ่นไม่รู้จักคืน 404 ภาพข้อมูลที่ตรึงไว้ไม่ย้อนใช้รูปร้านค้าปัจจุบัน
- หากไม่มี override ใบแจ้งหนี้ จะใช้รูปร้านค้าที่มีผลปัจจุบัน รุ่นที่ถูกแทนที่/ลบคืน 404 เฉพาะ PNG พร้อม nosniff และแคชส่วนตัว
- อัปโหลดรูปร้านค้ารับ PNG, JPEG หรือ WebP ขนาดจำกัดในคอนโซลที่ยืนยันตัวตน ไม่รับ SVG, HTML หรือ URL รูปภายนอก
ข้อผิดพลาด
GETรูปภาพตัวอย่างร้านค้า/checkout-api/previews/{project_id}/stores/{store_id}/appearance-images/{kind}/{revision}/image.pngสาธารณะ
คืนรูปตัวอย่างที่ปรับรูปแบบแล้วเฉพาะเมื่อโปรเจกต์ ร้านค้า ชนิด และรุ่นปัจจุบันตรงกัน
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
พารามิเตอร์พาธ
คำขอ
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สาธารณะ
คืนโลโก้โปรเจกต์ที่ปรับรูปแบบแล้วเฉพาะเมื่อโปรเจกต์และรุ่นโลโก้ที่แคชได้ปลอดภัยตรงกัน ใช้ project.logo_url จากข้อมูลตัวอย่างแทนประกอบ 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สาธารณะ
สร้าง QR SVG 512×512 สำหรับ payload ชำระเงินตรงตัวตามเชนของวิธีชำระในใบแจ้งหนี้
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
พารามิเตอร์พาธ
คำขอ
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 token
- ใช้ qr_url ที่มีรุ่นตาม sequence และยอดเหลือซึ่ง JSON หน้าชำระเงินคืนมา SVG เป็น private และ no-store
- หลังชำระบางส่วนจะขอยอดเหลือที่แน่นอนและยังล็อกสินทรัพย์นั้น
- คืน 409 หลังหมดอายุ เสร็จสิ้น หรือเมื่อวิธีอื่นใช้งานอยู่ คืน payment_qr_unavailable (422) หากคำขอใหญ่เกินเข้ารหัส
ข้อผิดพลาด
GETโลโก้หน้าชำระเงินตามรุ่นแก้ไข/checkout-api/invoices/{invoice_id}/logo/{revision}/image.pngสาธารณะ
คืนโลโก้หน้าชำระเงินโปรเจกต์ที่ปรับรูปแบบแล้วเฉพาะเมื่อใบแจ้งหนี้และรุ่นโลโก้ปัจจุบันตรงกัน ควรใช้ project.logo_url ที่ JSON หน้าชำระเงินคืนแทนประกอบเส้นทางเอง
การยืนยันตัวตนและเฮดเดอร์
สาธารณะ
พารามิเตอร์พาธ
คำขอ
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 token
- แคชสาธารณะอายุหนึ่งปีพร้อม immutable เพราะรุ่นระบุสถานะตามเนื้อหา
- รุ่นไม่รู้จัก/ไม่ตรงคืน invoice_not_found
ข้อผิดพลาด
เอกสารอ้างอิง Wholly Crypto 8.3.2 สำหรับเวอร์ชันที่ติดตั้ง ให้เปิด การตั้งค่า → การเข้าถึง API → เอกสาร ในคอนโซล ดูรุ่นเผยแพร่.