DOCUMENTATIE VOOR ONTWIKKELAARS
API-documentatie
Integreer facturen, afrekenen en betalingsmeldingen.
Zoekresultaten
Geen resultaten. Probeer de naam van een eindpunt, veld of handleiding.
Snelstart
Maak je eerste factuur.
- Bereid een winkel voor
Schakel de betaalmethoden in, configureer providers en maak een back-up van de projectwallets.
- Maak een API-referentie
Kies in de console onder Instellingen → API-toegang voor lezen/schrijven en wijs het project toe.
- Verstuur het verzoek
Gebruik je API-host en kopieer je project- en winkel-ID's. Verstuur decimale bedragen als tekenreeksen.
- Afrekenpagina openen
Leid door naar
links.checkoutuit het antwoord. Verifieer de voldoening voordat je de bestelling afhandelt.
: "${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))Voorbeelden gebruiken placeholders en versturen geen verzoeken vanaf deze pagina. Bekijk elk factuurveld en het antwoordformaat →
Project- & winkel-ID's
Waar je YOUR_PROJECT_ID en YOUR_STORE_ID vindt.
Gebruik de UUID's uit je console, niet de namen van projecten of winkels of hun leesbare identificaties.
| Placeholder | Waar te vinden | Gebruikt voor |
|---|---|---|
| YOUR_PROJECT_ID | Project → Instellingen → API-ID's → Project-API-ID → Kopiëren. Ook zichtbaar op het tabblad Basis van de winkel. | Verzoeken op project- en winkelniveau. |
| YOUR_STORE_ID | Project → Winkels → selecteer een winkel → Basis → API-ID's → Store-API-ID → Kopiëren. | Factuuraanmaak en verzoeken voor betaalmethoden van de winkel. |
- Een factuur maken vereist beide ID's, ook voor de standaardwinkel. De winkel moet bij dat project horen en de API-referentie moet toegang hebben tot het project.
- Factuuraanmaak, lijsten, details en afrekenen geven invoice_id terug: dezelfde UUID die in IPN/webhooks wordt verstuurd. Gebruik deze in factuurpaden, niet de interne id of order_id. Sinds merchant 4.0.0 is het oude antwoordveld public_id verwijderd; werk integraties bij voordat je upgradet.
- De REST-API biedt geen routes om projecten/winkels op te vragen. Kopieer ID's in de console of gebruik de afgebakende MCP-hulpmiddelen list_projects en list_stores in merchant 5.0.0+.
- Winkel → Basis → Winkeldomeinen selecteert actieve hostnamen voor handelaar, betalen en API. Teruggegeven afrekenlinks en nieuwe callbacklinks kiezen eerst die winkel, daarna de standaardwinkel en dan de systeemstandaarden. Vervallen of niet-geactiveerde namen worden nooit gekozen. Configureer je SDK met de gewenste API-hostnaam; een voorkeur wijzigen leidt andere actieve aliassen niet om.
Authenticatie & bereik
Bewaar inloggegevens op je server en verleen alleen de benodigde toegang.
| Standaardhost | Doel |
|---|---|
| merchant.example.com | Handelaarsconsole en Instellingen |
| pay.example.com | Afrekenen voor klanten |
| api.example.com | Handelaars-API-verzoeken |
Vervang example.com door je domein. Bestaande installaties behouden hun ingestelde namen; beheer aliassen onder Instellingen → Systeem.
Authorization: Bearer YOUR_MERCHANT_API_TOKEN| Instelling | Zo werkt het |
|---|---|
| Toegangsniveau | Alleen-lezen API-referenties kunnen lijsten en gegevens ophalen. API-referenties met lees-/schrijfrechten kunnen ook facturen maken en het gedocumenteerde activabeleid bijwerken. |
| Projecten | Wijs de projecten toe waartoe de API-referentie toegang mag hebben. Winkel- en factuur-ID's moeten bij een toegewezen project horen. |
| IP-beperkingen | Sta optioneel exacte publieke uitgaande IPv4- of IPv6-adressen toe onder Instellingen → API-toegang. |
| Opslag van inloggegevens | Bewaar tokens in je backendconfiguratie. Neem nooit een bearerreferentie op in een browser of afrekenlink. |
Publieke afrekenroutes gebruiken de publieke ID van de factuur en tonen alleen gegevens die veilig voor afrekenen zijn. Consolesessies en beheerdersfuncties staan los van handelaars-API-referenties.
Activa & wallets
Kies betaalmethoden afzonderlijk voor elke winkel.
- Lees betaalactiva van het project en hun gereedheid.
- Schakel het netwerk van de eigen munt in en configureer de wallet en providers.
- Bekijk kandidaattokens en verifieer het contract of de mint voordat je een token inschakelt.
- Selecteer de geordende betaalmethodenvan de winkel. Nieuwe facturen gebruiken de keuzes die gereed zijn.
Tokens delen de wallet van hun eigen blockchain. Walletsaldi geven exacte bedragen in atomaire eenheden en indicatieve fiatwaarden terug. Gebruik de teruggegeven gereedheidsvelden om te bepalen welke methoden betalingen kunnen ontvangen.
Geverifieerde ERC-20-tokens gebruiken de ondersteunde EVM-netwerken; geverifieerde SPL-tokens gebruiken Solana. Betaalmethoden met eigen munten zijn beschikbaar op de 30 geïntegreerde netwerken. Monero gebruikt een externe walletverbinding met alleen inzagerechten, gekoppeld aan het project.
Ontvangst-API's en ondersteuning voor eigen munten/tokens
| Betaalroute | Ondersteuning | Bewijs | Vereisten |
|---|---|---|---|
| Betaalroutes voor eigen munten | ondersteund | Via transactiescans | BTC, SOL, ETH (Ethereum/Base/Arbitrum/OP), BNB, HYPE, AVAX en POL; Bitcoin-outputs, canonieke EVM-transacties/ontvangstbewijzen en geparste Solana-overschrijvingen leveren factuurbewijs. |
| Betaalroutes voor ERC-20-tokens | ondersteund | Via transactiescans | Ethereum, Base, BNB Chain, HyperEVM, Avalanche, Polygon, Arbitrum en Optimism vereisen verificatie op de blockchain; geïndexeerde Transfer-logs leveren betalingstoewijzing. |
| Betaalroutes voor SPL-tokens | ondersteund | Via transactiescans | Solana-kandidaten vereisen mainnet- en mintverificatie; exacte wijzigingen in tokensaldi in geparste transacties leveren betalingstoewijzing. |
| Aanvullende UTXO-routes voor eigen munten | ondersteund | Via transactiescans | BCH/LTC/DOGE gebruiken Esplora; BCH/DOGE accepteren ook Bitcore, LTC/DOGE/DASH accepteren BlockCypher, Dash accepteert Insight en transparante ZEC accepteert zcash-explorer. Alle accepteren ook volledig bewaarde Core-compatibele node-rpc-blokken. Ruwe modus vereist 1–48 bevestigingen, geen mempooldetectie. Afgeschermde Zcash wordt niet ondersteund. |
| Geïndexeerde accountroutes voor eigen munten | ondersteund | Via transactiescans | TRON gebruikt tron-indexer of definitief bevestigde node-rpc; XRP gebruikt xrpl-jsonrpc; Stellar gebruikt stellar-horizon of bewaarde Stellar node-rpc-grootboeken; Cosmos Hub gebruikt cometbft-jsonrpc; Algorand gebruikt algorand-indexer of algod node-rpc; Hedera vereist hedera-mirror, geen EVM-relay. |
| Grootboekbetaalroutes voor eigen munten | ondersteund | Via transactiescans | Aptos gebruikt aptos-rest; Sui gebruikt sui-graphql; NEAR gebruikt near-jsonrpc; Kaspa gebruikt kaspa-rest. Polkadot Asset Hub accepteert substrate-rest of definitief bevestigde node-rpc met metadataondersteuning; Tezos accepteert tezos-tzkt of volledige Octez node-rpc-operaties. Alleen ontvangsten van eigen munten; voor oudere facturen is archiefbewaring vereist. |
| Cardano- en TON-routes voor eigen munten | ondersteund | Via transactiescans | Cardano vereist cardano-koios en TON vereist toncenter-v3. XRP-tags, Stellar-memo-ID's en TON-factuurcommentaren worden teruggegeven als destination_tag en moeten exact worden meegestuurd. |
| Integriteit van betalingsvoldoening | ondersteund | Onafhankelijke verificatie | Standaard vereist definitieve voldoening dat twee onafhankelijke providers het eens zijn over de exacte transactie/gebeurtenis, het bedrag, het canonieke blok of slot en de definitieve bevestiging. Ruwe en gedeelde EVM-vensters verifiëren ook volledige dekking. Een beheerder kan voor een blockchain expliciet één vertrouwde provider kiezen; dit verwijdert de onafhankelijke kruiscontrole, niet de controles van identiteit, volledigheid of definitieve bevestiging. |
| Monero-route voor de eigen munt | ondersteund | Aan het project gekoppelde wallet-RPC met alleen inzagerechten | Eén afzonderlijke externe wallet-RPC met alleen inzagerechten achter een HTTPS-gateway met methodetoelatingslijst maakt subadressen voor account-0. De ingestelde drempel voor mainnet-daemons (standaard 2 onafhankelijke bronnen, optioneel 1) levert bewijs van voldoening. Native --restricted-rpc is onverenigbaar met create_address; de operator verklaart expliciet dat een walletback-up bestaat en er geen bestedingssleutel aanwezig is, terwijl geen sleutelmateriaal naar Wholly Crypto wordt gestuurd. |
Beurssaldi en keuzes per actief om naar een wallet of beurs te sweepen zijn beschikbaar in de console, niet via de publieke v1-API. Bekijk beursconfiguratie.
Factuurlevenscyclus
Betalingsbewijs, voldoening en orderafhandeling.
| Status | Betekenis |
|---|---|
| new | Wacht op een betaling |
| processing | Betaling waargenomen; geaccepteerd bedrag of definitieve bevestiging ontbreekt nog |
| settled | Geaccepteerd volgens het beleid voor factuurvoldoening of handmatig |
| expired | Deadline verstreken; controle op late betalingen kan doorgaan |
| invalid | Betaling kan niet automatisch worden geaccepteerd |
| cancelled | Geannuleerd; alleen expliciete afstemming kan de factuur heropenen |
amount_status registreert none, partial, paid of overpaid. timing_status maakt onderscheid tussen tijdige en late betalingen. Winkelregels bepalen het vereiste aantal bevestigingen en de geaccepteerde onderbetalingstolerantie.
Gebruik de invoice_id van de factuur met de route voor factuurdetails. Alleen een afrekenomleiding is geen bewijs van voldoening. Beoordeel uitzonderingen via afstemming.
Veilig opnieuw proberen
Factuuraanmaak vereist Idempotency-Key. Probeer na een time-out opnieuw met dezelfde API-referentie, sleutel en exacte requestbody. Gebruik alleen voor een nieuwe factuur een nieuwe sleutel.
EVM-betalingen scannen
Gedeelde detectie van blokken voor eigen munten en ERC-20 groepeert recente facturen afzonderlijk van het inhalen van oudere gegevens. Elke factuur behoudt haar duurzaam opgeslagen geschiedeniscursor. Tokenopvragingen gebruiken maximaal 100 blokken per verzoek en worden kleiner bij strengere providerlimieten. Standaard verifiëren twee onafhankelijke providers elk venster. Onder Instellingen → Blockchainverbindingen → Details kun je voor een blockchain één vertrouwde bron kiezen, zonder onafhankelijke kruiscontrole; controles van canonieke transactie, bedrag en bevestigingen blijven bestaan. Verbindingsdetails onderscheiden scannervertragingen, geschiedenisbeperkingen en quotawachttijden van de basisstatus van de node. Publieke RPC-capaciteit is niet gegarandeerd.
IPN & webhooks
Ontvang en verifieer betalingsgebeurtenissen.
IPN ontvangt elke gegenereerde factuurgebeurtenis op de effectieve ipn_url van de factuur. Webhooks ontvangen alleen de gebeurtenissen die voor elk ingeschakeld winkeleindpunt zijn geselecteerd. Beide versturen via POST dezelfde JSON-momentopname; ze zijn onafhankelijk, dus als je beide inschakelt, kan je applicatie twee meldingen ontvangen.
Stel ipn_url in bij het maken van een factuur of neem de winkelstandaard over. IPN gebruikt het Winkel → IPN geheim; elk Winkel → Webhooks eindpunt heeft een eigen geheim. Geen van beide is je API-sleutel.
Wanneer moet ik een bestelling afhandelen?
Gebruik voor gebeurtenisgestuurde verwerking event_type = invoice.settled samen met status = settled om een bestelcontrole te starten. Verifieer de huidige factuur en handel elke bestelling slechts één keer af.
status is de factuurstatus toen de gebeurtenis werd gemaakt. event_type vertelt wat er is gebeurd. payment.received kan processing of settled bevatten; het betekent geen tweede betaling en is geen zelfstandig signaal voor orderafhandeling.
Welke gebeurtenissen en statussen worden verstuurd?
| Gebeurtenis in instellingen/geschiedenis | Status in de body | Betekenis |
|---|---|---|
| invoice.created | new | Factuur gemaakt en wacht op betaling. Ook gebruikt wanneer gecontroleerd heropenen een factuur terugzet naar new. |
| payment.received | Resulting invoice status | Een betaling is geregistreerd of het ontvangen bedrag is gestegen. Gewoonlijk processing of settled; deze gebeurtenis alleen is geen bewijs van voldoening. |
| invoice.processing | processing | Betaling gedetecteerd, maar het geaccepteerde bedrag of de vereiste definitieve bevestiging is nog niet bereikt. Omvat deelbetalingen. |
| invoice.settled | settled | Voldoet aan het betalingsbeleid of is handmatig geaccepteerd. Controleer resolution en je bestelling vóór afhandeling. |
| invoice.expired | expired | Betalingsdeadline verstreken. Een late betaling kan de status nog wijzigen zolang monitoring doorgaat. |
| invoice.invalid | invalid | Kan niet automatisch worden geaccepteerd, betalingsbewijs is verloren gegaan of een handelaar heeft de betaling afgewezen. Beoordeel de factuur. |
| invoice.cancelled | cancelled | Factuur geannuleerd. Niet afhandelen; annulering betaalt een blockchainbetaling niet terug. |
Waarom Ethereum en Solana verschillende gebeurtenisstromen kunnen versturen
Bevestigingen komen later (Ethereum-voorbeeld)
| Volgorde | event_type | status |
|---|---|---|
| 1 | invoice.created | new |
| 2 | payment.received | processing |
| 2 | invoice.processing | processing |
| 3 | invoice.settled | settled |
Al definitief bij detectie (Solana-voorbeeld)
| Volgorde | event_type | status |
|---|---|---|
| 1 | invoice.created | new |
| 2 | payment.received | settled |
| 2 | invoice.settled | settled |
Deze tonen het maken van gebeurtenissen, geen gegarandeerde bezorgvolgorde. Beide processen kunnen op andere blockchains voorkomen, afhankelijk van detectietijdstip en betalingsbeleid. Vereis geen processing-gebeurtenis vóór settled.
Eén keer afhandelen: ontvangervoorbeeld en bescherming tegen dubbele verwerking
| Aanpak | Hoe te verwerken |
|---|---|
| Gebeurtenisgestuurde ontvanger | Bewaar afzonderlijke gebeurtenissen op basis van de ondertekende event_id en selecteer daarna invoice.settled met status = settled. Gooi deze gebeurtenis niet weg omdat payment.received met dezelfde sequence eerder aankwam. |
| SDK-inbox voor bestelstatus | De meegeleverde PHP-, Python- en Node-ontvangervoorbeelden ontdubbelen op project + invoice_id + sequence. Verwerk de opgeslagen status ongeacht event_type, haal de huidige factuur op en handel één keer af als deze settled is. Voeg na deze ontdubbeling geen filter toe dat alleen invoice.settled accepteert. |
Een nieuwe poging behoudt event_id en de oorspronkelijke body. Verschillende gebeurtenissen kunnen dezelfde sequence maar verschillende event_id-waarden hebben. Ontdubbel bezorgingen voor gebeurtenisgestuurde verwerking op ondertekende event_id; bescherm orderafhandeling daarnaast afzonderlijk op ingestelde installatie/project + invoice_id en je bestelling. Een latere hervoldoening mag de bestelling niet dubbel crediteren.
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.Pseudocode, geen direct inzetbare ontvanger.
Alle factuurstatussen en betalingsuitzonderingen
| Veld | Waarden | Betekenis |
|---|---|---|
| status | new, processing, settled, expired, invalid, cancelled | Factuurstatus bij het maken van de gebeurtenis; niet noodzakelijk de huidige status bij bezorging. |
| amount_status | none, partial, paid, overpaid | Ontvangen bedrag, inclusief geaccepteerde tolerantie. paid betekent geen definitieve bevestiging. |
| timing_status | on_time, late | Of de betaling binnen de factuurdeadline viel. |
| resolution | automatic, manually_settled, manually_invalidated | Of normale regels of een handmatige acceptatie/afwijzing het resultaat bepaalden. |
| requires_review | false, true | Aanwijzing voor een uitzondering, geen andere factuurstatus of automatische toestemming voor afhandeling/terugbetaling. |
| Situatie | Verwerking |
|---|---|
| Onderbetaling / tolerantie | Volgens automatische regels leidt partial niet tot voldoening. paid kan een geaccepteerd tekort bevatten, maar definitieve bevestiging blijft vereist. Gebruik de factuurstatus, niet alleen een bedragvergelijking. |
| Overbetaling | overpaid kan samengaan met settled en requires_review = true. Pas je beleid voor te hoge betalingen toe; crediteer de bestelling nooit dubbel en betaal nooit automatisch terug naar een ongeverifieerd adres. |
| Late betaling | expired kan later wijzigen zolang monitoring doorgaat. timing_status = late geeft aan dat beoordeling nodig is; heropen of verzend een geannuleerde bestelling niet automatisch. |
| Handmatige acceptatie | invoice.settled kan resolution = manually_settled hebben zonder kwalificerende blockchainmiddelen. Bepaal of je integratie deze handmatige beslissing accepteert; samenvattingsvelden voor de betaling kunnen null zijn. |
| Reorganisatie / ongeldigverklaring | Een nieuwere revisie kan eerder betalingsbewijs ongeldig maken. Haal de huidige status opnieuw op en verwerk de terugdraaiing via afstemming. Negeer die niet omdat de bestelling ooit voldaan was. |
| Nul bevestigingen / nulbedrag | Voldoening met nul bevestigingen kan bij detectie plaatsvinden en brengt reorganisatierisico mee. Een expliciet toegestane factuur met nulbedrag wordt zonder betaling voldaan. Geen van beide vereist eerst een payment.received-gebeurtenis. |
Gebruik status = settled voor orderafhandeling, niet amount_status = paid en geen afrekenomleiding. Bij nul vereiste bevestigingen kan voldoening bij detectie plaatsvinden; dat brengt reorganisatierisico mee.
Onderbetaald is amount_status = partial; overbetaald is overpaid. paid betekent dat het geaccepteerde minimum, inclusief de onderbetalingstolerantie van de factuur, is ontvangen. Dit zijn bedragstatussen, geen factuurstatussen. late is een timing_status, geen afzonderlijke gebeurtenis.
Een gebruikelijk verloop is new → processing → settled, maar tussenstappen kunnen worden overgeslagen. Een expliciet toegestane factuur met nulbedrag wordt zonder betaling voldaan en behoudt amount_status = none. Handmatige acceptatie wordt gemarkeerd als manually_settled.
Callbacks zijn onwijzigbare momentopnamen, geen live statusantwoorden. Ze kunnen laat, in een andere volgorde of meerdere keren aankomen. Betalings- en statusgebeurtenissen kunnen dezelfde factuur-sequence en factuurstatusvelden delen, maar hebben verschillende ondertekende event_id- en event_type-waarden. Het aantal bevestigingen levert niet gegarandeerd voor elk blok een callback op.
Wat je ontvangt
{
"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 is het oorspronkelijke factuurtotaal. payment_info beschrijft waargenomen crypto-overschrijvingen, nog ontbrekende bedragen en vastgezette koersen. Versie 2 ondertekent ook de gebeurtenisnaam, gebeurtenis-ID en project-/winkelcontext.
Alle callbackvelden en aanvullende factuurgegevens
| Veld | Type | Betekenis |
|---|---|---|
| invoice_id | UUID | Publieke factuur-UUID, gebruikt door de geauthenticeerde route voor factuurdetails |
| status | string | Factuurstatus in de momentopname: new, processing, settled, expired, invalid, cancelled |
| amount_status | string | none, partial, paid of overpaid; paid omvat de geaccepteerde onderbetalingstolerantie, geen definitieve bevestiging |
| timing_status | string | on_time of late |
| resolution | string | automatic, manually_settled of manually_invalidated |
| sequence | integer | Oplopende factuurrevisie; verschillende gebeurtenissen kunnen één revisie delen. Vergelijk zonder precisie van gehele getallen te verliezen |
| amount | decimal string | Oorspronkelijk factuurtotaal, niet het ontvangen cryptobedrag; behoud decimale precisie |
| currency | string | Valuta van amount, bijv. EUR voor een EUR-factuur betaald met USDC |
| order_id | string | null | Bestelreferentie van de handelaar |
| payload_version | integer | 2 voor nieuw gegenereerde 4.1.0+-gebeurtenissen; ontbreekt bij bewaarde oudere gebeurtenissen |
| event_id | UUID | Ondertekende gebeurtenisidentiteit, ongewijzigd bij nieuwe pogingen en handmatige herbezorging |
| event_type | string | Eén van de zeven abonnementsgebeurtenissen |
| occurred_at | timestamp | Wanneer deze onwijzigbare gebeurtenis werd gemaakt, niet de bezorgtijd |
| project_id | UUID | Projectcontext van de handelaar; vergelijk met de ingestelde ontvanger |
| store_id | UUID | Winkelcontext van de handelaar; vergelijk met de ingestelde ontvanger |
| description | string | null | Oorspronkelijke factuuromschrijving |
| string | null | Optioneel e-mailadres van de klant bij het maken van de gebeurtenis | |
| customer | object | Herkende optionele metadatavelden van de klant; geen geraden of verrijkte persoonsgegevens |
| metadata | object | Oorspronkelijke handelaarsmetadata zoals die bestond bij het maken van de gebeurtenis |
| created_at | timestamp | Aanmaaktijd van de factuur |
| updated_at | timestamp | Tijd van bijwerken van de factuurstatus |
| expires_at | timestamp | Betalingsdeadline van de factuur |
| monitoring_expires_at | timestamp | Deadline voor controle op late betalingen |
| settled_at | timestamp | null | Tijdstip van voldoening |
| paid_chain | string | null | 4.1.2+: blockchain-slug van de bewezen betaalmethode waarmee de factuur is voldaan, bijv. ethereum; null zonder opgeslagen kwalificerende voldoening |
| paid_asset | string | null | 4.1.2+: tickersymbool van de eigen munt of token, bijv. BTC, ETH of USDC; een weergavelabel, geen unieke activa-identiteit |
| paid_asset_amount | decimal string | null | 5.0.1+: volledig vastgezet gevraagd bedrag in paid_asset-eenheden, vóór aftrek van tolerantie; opgeslagen bij voldoening |
| paid_asset_amount_received | decimal string | null | 5.0.1+: totaal geldig ontvangen bedrag voor de winnende methode bij voldoening, inclusief geaccepteerde tekorten/overschotten; vastgezet, geen live saldo |
| paid_payment_method_id | UUID | null | 4.1.2+: ID van de betalingsintentie die tot voldoening leidde; komt overeen met payment_info.methods[].payment_method_id en het exacte netwerk/contract daarvan |
| settlement_exchange_rate | object | null | 4.1.2+: bij voldoening opgeslagen marktmomentopname vóór opslag, met expliciete eenheden, valuta, brontijdstempels en kwaliteitsmarkeringen; wordt bij bezorging nooit opnieuw geprijsd |
| cancelled_at | timestamp | null | Annuleringstijd |
| exchange_rate_spread_percent | decimal string | Vastgezette opslag, niet de huidige winkelstandaard |
| underpayment_tolerance_percent | decimal string | Vastgezette factuurtolerantie; elke methode vermeldt ook haar effectieve tolerantie |
| reason_code | string | null | Machineleesbare reden voor statusovergang |
| requires_review | boolean | Aanwijzing voor een betalingsuitzondering; geen toestemming voor automatische afhandeling of terugbetaling |
| links | object | URL's voor afrekenen, geauthenticeerde factuur en betalingen bij het maken van de gebeurtenis. Domeinvoorkeuren onder Winkel → Basis gelden eerst, daarna de standaardwinkel en dan de globale primaire host; alleen actieve domeinen met de juiste rol worden gebruikt. Nieuwe pogingen behouden de oorspronkelijke ondertekende links; null als geen actief hostrecord bestaat. |
| payment_info | object | Werkelijk waargenomen methoden, exacte bedragen, vastgezette prijsopgave, indicatieve marktmomentopname en begrensde betalingswaarnemingen; zie de veldgroepen hieronder |
Samenvatting van voldoening: settlement_exchange_rate
| Veld | Type | Betekenis |
|---|---|---|
| rate / units / currency / symbol | strings | Eenheden van het actief per één eenheid factuurvaluta, vóór opslag. Decimale tekenreeks, geen betaalbedrag of uitgevoerde transactie. |
| observed_at / as_of | timestamps | Registratietijdstip van voldoening / oudere brontijdstempel. Behandel gecachte gegevens niet als een live koers. |
| pricing_provider / asset_provider / pricing_fetched_at / asset_fetched_at | strings / timestamps | Prijsbronnen voor fiatgeld en activa en hun ophaaltijden, opgeslagen bij voldoening. |
| stale / is_fixed / uses_reference_proxy / reference_currency | booleans / string | Dezelfde kwaliteitsmarkeringen als market_rate_at_event. Vaste projectprijzen worden aangeduid; referentievaluta is USD. |
| Missing snapshot or price | null | Geen geraden historische koers. Vóór voldoening zijn alle samenvattingsvelden null; als alleen prijzen ontbreken, blijven bewezen paid_*-identificaties beschikbaar. |
Betaalmethoden: payment_info
| Veld | Type | Betekenis |
|---|---|---|
| active_payment_method_id | UUID | null | Winnende of geselecteerde waargenomen methode. Null vóór detectie of na ongeldigverklaring; er wordt geen standaardmethode geraden. |
| method_count / methods_truncated | integer / boolean | Totaal aantal waargenomen methoden en of de ingesloten methodenlijst onvolledig is. |
| methods[] | object[] | Maximaal acht waargenomen methoden, met de actieve methode eerst. Geen totalen over verschillende activa. |
| payment_method_id / payment_rail | UUID / string | Identiteit van de factuurintentie en onchain- of lightning-transport. |
| chain_slug / network / caip_network_id | string | Netwerkidentiteit. Koppel tokenidentiteit altijd aan het netwerk. |
| asset_id / asset_key / caip_asset_id | UUID / string / nullable string | Geverifieerde registeridentiteit; symbolen alleen zijn niet uniek. |
| asset_name / symbol / asset_kind | string | Weergavenaam van het actief, tickersymbool en type native of token. |
| contract_address / token_standard | string | null | Tokencontract of mint en standaard; null voor eigen munten. |
| asset_decimals | integer | Atomaire precisie; Lightning BTC gebruikt 11. |
| destination_address / destination_tag | string | null | Publiek ontvangstadres en vereist memo/tag. Adres is null voor Lightning; nooit een private sleutel. |
| status | string | Methodestatus: pending, partial, paid, overpaid, expired of invalid. Paid op zichzelf betekent niet dat de factuur is voldaan. |
| payment_count / payments_truncated / payments[] | integer / boolean / object[] | Totaal aantal waarnemingen en de laatste vijf of minder. Elke waarneming wordt hieronder beschreven. |
| links.payments | HTTPS URL | null | Geauthenticeerde gepagineerde geschiedenis voor deze methode op de ingestelde API-oorsprong. |
Exacte bedragen: methods[].amounts
| Veld | Type | Betekenis |
|---|---|---|
| expected_amount | decimal string | Volledige vastgezette prijsopgave, na opslag en afronding naar boven. |
| received_amount / confirmed_amount | decimal strings | Geldig gedetecteerd geld / geld dat voldoet aan het bevestigings- of finaliteitsbeleid van deze methode. |
| unconfirmed_amount | decimal string | max(received - confirmed, 0). Geen extra bedrag om te versturen. |
| minimum_payment_amount | decimal string | Geaccepteerde drempel na tolerantie. Kan lager zijn dan de volledige prijsopgave. |
| remaining_amount | decimal string | max(minimum accepted - received, 0). Extra geld dat nodig is om de geaccepteerde drempel te bereiken, geen bevestigingsvoortgang. |
| remaining_to_full_amount | decimal string | max(full quote - received, 0), zonder rekening te houden met tolerantie. |
| overpaid_amount | decimal string | max(received - full quote, 0). Geeft geen toestemming voor automatische terugbetaling. |
| Every amount's *_atomic companion | integer string | Exacte weergave in de kleinste eenheid. Gebruik bibliotheken voor decimalen of gehele getallen; nooit float of JavaScript Number voor geld. |
Bevestigingsbeleid: methods[].acceptance
| Veld | Type | Betekenis |
|---|---|---|
| finality_mode / required_confirmations | string / integer | Vastgezet aantal bevestigingen of finalized-beleid. Nul bevestigingen is expliciet toegestaan door het handelaarsbeleid, geen universele netwerkfinaliteit. |
| observed_confirmations | integer | null | Minimum over geldige waarnemingen, niet alleen de nieuwste overschrijving. Null voor Lightning of als er geen geldige waarnemingen zijn. |
| underpayment_tolerance_percent | decimal string | Effectieve tolerantie van de methode. Lightning gebruikt nul, ook wanneer de factuur een niet-nultolerantie voor blockchainbetalingen heeft. |
Koersen: methods[].quote en market_rate_at_event
| Veld | Type | Betekenis |
|---|---|---|
| quote.effective_rate / units / currency / symbol | strings | Vastgezette asset_per_invoice_currency-koers inclusief opslag; valuta en symbool geven de richting expliciet aan. |
| quote.exchange_rate_spread_percent / quote_expires_at | decimal string / timestamp | Vastgezette opslag en vervaltijd van de prijsopgave. Worden nooit vervangen door huidige winkelinstellingen. |
| quote.reference_rate / unrounded_payment_amount / rounding_adjustment | decimal string | null | Referentie vóór opslag, betaalbedrag vóór afronding en verhoging door afronding in eenheden van het actief. |
| quote.pricing_provider / asset_provider / pricing_fetched_at / asset_fetched_at | string or timestamp | null | Oorspronkelijke prijsbronnen/tijdstippen voor valuta en actief. Geen API-sleutels of providerinloggegevens. |
| quote.provenance_available / rounding | boolean / string | False voor oude facturen zonder opgeslagen bronmomentopname; afronding is up. |
| market_rate_at_event | object | null | Indicatieve gecachte marktmomentopname bij het maken van deze gebeurtenis. Ontbrekende gegevens blijven null; deze wijzigt factuurbedragen nooit en wacht niet op een netwerkopvraging. |
| market_rate_at_event.rate / units / currency / symbol | strings | Marktkoers vóór opslag, met dezelfde expliciete richting als quote. |
| market_rate_at_event.observed_at / as_of / pricing_fetched_at / asset_fetched_at | timestamps | Tijdstip van gebeurtenismomentopname / oudste van de twee brontijdstippen / elk brontijdstip. |
| market_rate_at_event.pricing_provider / asset_provider | strings | Gecachte valuta- en activabronnen, inclusief ingestelde prijzen voor eigen tokens. |
| market_rate_at_event.stale / is_fixed / uses_reference_proxy / reference_currency | booleans / string | Of de cache verouderd is, de tokenprijs vaststaat of de USD-referentie een stablecoin als benadering gebruikt. Referentievaluta is USD. Stale is indicatief, nooit een actuele prijsopgave. |
Overschrijvingsrecords: methods[].payments[] en GET …/payments
| Veld | Type | Betekenis |
|---|---|---|
| payment_id / payment_method_id | UUID | Waarnemingsidentiteit / identiteit van de bovenliggende intentie. Gebruik payment_id om geschiedenis te ontdubbelen. |
| transaction_id / payment_hash / event_index | string | null / integer | Blockchainhash en transfer-/log-/outputindex, of Lightning-hash. Lightning heeft geen transactie- of explorerlink. |
| payment_rail / chain_slug / network / asset_id / asset_key / caip_asset_id / symbol / asset_decimals | strings / UUID / integer | Dezelfde activa- en netwerkidentificaties als de omvattende methode. |
| amount / amount_atomic | decimal / integer strings | De exacte waarde van deze overschrijving, nooit een fiatconversie. |
| status / counts_towards_received | string / boolean | detected, confirming en final tellen mee; reorged, replaced en invalid niet. Bewaar ongeldig verklaarde geschiedenis voor afstemming. |
| confirmations / block_height | integer | null | Blokgegevens van de waarneming; confirmations is null voor Lightning. |
| observed_at / chain_time / finalized_at | timestamp | null | Lokaal voor het eerst gezien, vertrouwd blockchaintijdstip indien beschikbaar en tijdstip waarop het bevestigingsbeleid is bereikt, indien van toepassing. |
| explorer_name / explorer_url | string | null | Gevalideerde verwijzing naar een publieke blockexplorer, waar ondersteund. |
Merchant 5.13.3 sluit geverifieerde interne gasfinancieringsoverschrijvingen uit van klantbetalingstotalen, payment_info, de factuurbetalingen-API, terugbetalingslimieten en payment.received-gebeurtenissen. Hun blockchain-/treasuryrecords blijven beschikbaar voor walletboekhouding. Gewone overschrijvingen en echte overbetalingen blijven meetellen. Bestaande ondertekende callbackbody's worden nooit herschreven. Als een historische voldoening afhankelijk was van interne financiering in plaats van klantgeld, geeft afstemming invoice.invalid af met reason_code internal_gas_funding_excluded; beoordeel deze in plaats van opnieuw af te handelen.
Merchant 4.1.0 voegt payload_version 2 toe zonder de oorspronkelijke negen velden te verplaatsen of wijzigen. Eerder in de wachtrij geplaatste gebeurtenissen behouden hun oorspronkelijke body en kunnen geen payload_version hebben. event_id, event_type en project-/winkel-ID's staan nu in de ondertekende body; transportheaders voor gebeurtenis/bezorging blijven ongetekend.
payment_info beschrijft waargenomen betalingen, niet elke aangeboden afrekenoptie. Vóór detectie is active_payment_method_id null en methods leeg. Waarnemingen met reorganisatie of ongeldigverklaring kunnen in methods blijven staan nadat de actieve methode null is geworden. Tel bedragen van verschillende activa of netwerken nooit bij elkaar op.
Alle bedragen, atomaire gehele getallen, koersen en percentages zijn tekenreeksen. received_amount omvat geldig geld dat nog op bevestiging wacht; confirmed_amount voldoet aan het finaliteitsbeleid van die methode. remaining_amount is max(minimum_payment_amount minus received_amount, 0); remaining_to_full_amount is max(expected_amount minus received_amount, 0). Voorbeeld: 100 USDC verwacht, 99 ontvangen en 1% tolerantie geeft remaining_amount 0 en remaining_to_full_amount 1. Definitieve bevestiging blijft vereist.
quote is de vastgezette factuurberekening: eenheden van het actief per één eenheid factuurvaluta. Opslag wordt vóór afronding naar boven toegepast. Gebruik expected_amount_atomic voor exacte betaalvergelijking; een weergegeven koers alleen reproduceert de afronding naar boven mogelijk niet. Oude facturen zonder opgeslagen bronherkomst tonen null voor bron-/referentie-/afrondingsvelden en provenance_available false, nooit gegevens van vandaag als historische prijsopgave.
market_rate_at_event is indicatieve gecachte data vóór opslag, vastgezet bij het maken van de gebeurtenis. Deze bevat brontijdstippen en markeringen voor veroudering en referentiebenadering; de waarde is null als er geen bruikbaar gecacht paar bestaat. Een live koersverzoek blokkeert nooit een melding en deze marktwaarneming wijzigt het verschuldigde bedrag nooit. Eigen tokens met vaste prijs zijn gemarkeerd met is_fixed; DEX-tokens gebruiken hun projectspecifieke bron, geen token met hetzelfde symbool.
De velden paid_chain, paid_asset, paid_payment_method_id en settlement_exchange_rate op het hoogste niveau (4.1.2+) identificeren na voldoening de bewezen winnende methode, geen geselecteerde afrekenoptie of som van verschillende methoden. Vóór voldoening, na ongeldigverklaring, bij oudere voldoeningen zonder momentopname of bij handmatige acceptatie zonder kwalificerende middelen die aan het bevestigingsbeleid voldoen, zijn de samenvattingsvelden null. Symbolen zijn weergavelabels: volg de methode-ID voor de exacte netwerk-/activa-/contractidentiteit.
Merchant 5.0.1 voegt paid_asset_amount en paid_asset_amount_received toe als exacte decimale tekenreeksen in paid_asset-eenheden; payload_version blijft 2. paid_asset_amount is de volledige vastgezette prijsopgave, inclusief opslag en afronding naar boven, nooit de tolerantiedrempel of een resterend saldo. paid_asset_amount_received is de totale geldige ontvangst van de winnende methode bij voldoening, inclusief geld dat op bevestiging wacht en eventuele geaccepteerde tekorten of overschotten. Voorbeeld: 100 USDC opgegeven, 99 ontvangen en geaccepteerd met tolerantie geeft 100 en 99, niet 99 en 99. Beide worden vastgezet bij de momentopname van voldoening; gebruik payment_info.methods[].amounts voor ontvangsten bij elke gebeurtenis of de betalingen-API voor actuele records. Ze zijn null zonder kwalificerende momentopname en bij momentopnamen van vóór 5.0.1; oude gebeurtenisbody's in de wachtrij blijven ongewijzigd. Zet exacte decimale tekenreeksen voor de boekhouding nooit om naar drijvendekommagetallen.
settlement_exchange_rate is de gecachte marktwaarneming vóór opslag, vastgelegd bij voldoening, niet de vastgezette factuurprijsopgave of een uitgevoerde beurstransactie. De structuur komt overeen met market_rate_at_event; 1.17 asset_per_invoice_currency met EUR/USDC betekent 1 EUR = 1.17 USDC. Brontijdstempels en stale-/fixed-/proxy-markeringen beschrijven de kwaliteit. Bij een ontbrekend paar blijft de koers null, maar een bewezen methode behoudt paid_*-velden. Deze wijzigt het verschuldigde bedrag nooit en wacht niet op een live provideraanroep. Latere betalingen met dezelfde methode, nieuwe pogingen en herbezorging kunnen de opgeslagen momentopname niet vervangen, ook niet een opgeslagen null-koers. Echte hervoldoening of een gewijzigde methode van voldoening legt een nieuwe momentopname vast; observed_at identificeert die vastlegging, terwijl settled_at het eerste voldoeningstijdstip kan behouden. Oude gebeurtenisbody's blijven ongewijzigd.
Er worden maximaal acht waargenomen methoden en de vijf recentste betalingswaarnemingen per methode opgenomen, met aantallen en afkapmarkeringen. Het payloadbudget kan die arrays verder verkleinen. Een betalingswaarneming is één overschrijving/log/UTXO-output, niet noodzakelijk een unieke transactiehash. Gebruik GET /v1/projects/YOUR_PROJECT_ID/invoices/{invoice_id}/payments met payment_method_id, limit en offset voor de volledige actuele geschiedenis. De factuurdetails behouden elke geoffreerde methode en de bijbehorende quote_details. API-links vereisen je ingestelde host en inloggegevens; stuur nooit een bearertoken door naar een willekeurige URL die via een callback wordt aangeleverd.
Lightning gebruikt payment_hash in plaats van transaction_id; ontvangstadres, explorer en waargenomen bevestigingen zijn null. Het exacte BTC-bedrag gebruikt 11 decimalen (millisatoshi's) en de effectieve tolerantie is nul. Er wordt geen BOLT11-betalingspreimage, walletsleutel, ondertekeningsgeheim of providerreferentie opgenomen. Klant-/metadatavelden horen alleen in handelaarsantwoorden en ondertekende callbacks, nooit in publiek afrekenen; zet geen inloggegevens in metadata.
Veilig ontvangen
- Verifieer de exacte onbewerkte body met het bijbehorende geheim vóór verwerking. Winkel → IPN levert het IPN-geheim, ook voor bezorgingen naar een eigen ipn_url. Elk eindpunt onder Winkel → Webhooks heeft een eigen geheim. Geen van beide is je API-token; één vernieuwen vernieuwt de andere niet.
- Controleer de ondertekende tijdstempel (SDK-standaard: vijf minuten in beide richtingen) en vergelijk ondertekende project-/winkel-ID's, wanneer aanwezig, met je ontvangerconfiguratie. Plaats duurzaam in de wachtrij voordat je HTTP 2xx teruggeeft. Voor verwerking per gebeurtenis is event_id in v2 ondertekend; alleen header-ID's beschermen niet tegen herhaling omdat die headers niet ondertekend zijn. Ontdubbel voor bestelstatusinboxen op invoice_id en sequence en vergelijk de oorspronkelijke factuurstatusvelden, niet de volledige v2-body: verschillende gebeurtenistypen/-ID's kunnen één revisie delen.
- Haal in een worker de huidige factuur op vanaf je ingestelde API-oorsprong, niet via een willekeurige callbacklink. Vergelijk de opgeslagen bestelling, project/winkel, bedrag en valuta, vereis de huidige status settled en pas je beleid voor handmatige acceptatie en uitzonderingen toe. Vergrendel de bestelling en handel één keer af binnen een databasetransactie, onafhankelijk van gebeurtenisontdubbeling.
- Pas nooit een oudere sequence over een nieuwere toe. Verschillende gebeurtenissen kunnen een revisie delen; combineer ontdubbeling op revisieniveau niet met een filter voor alleen invoice.settled. Heropenen/afstemming kan de status wijzigen; sequence, niet een vaste statusrangorde, bepaalt de volgorde van updates. Registreer terugdraaiingen voor beoordeling in plaats van opnieuw af te handelen.
Ontvangervoorbeelden: PHP · Python · Node.js / TypeScript.
Handtekeningverificatie & bezorgregels
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);
}| Bezorgregel | Details |
|---|---|
| Headers | Wholly-Signature, Wholly-Event-Id en Wholly-Delivery-Id; Content-Type is application/json. |
| Handtekening | HMAC-SHA256 over <unix timestamp>.<exact raw body>; headerformaat t=<timestamp>,v1=<64 lowercase hex>. |
| Succes | Elk HTTP 2xx-antwoord. Omleidingen worden niet gevolgd; niet-2xx-antwoorden gelden als mislukt. |
| Time-outs | Verbindingstime-out van 5 seconden en totale verzoektime-out van 10 seconden. |
| Schema voor nieuwe pogingen | Maximaal 8 pogingen voor fouten waarbij opnieuw proberen mogelijk is: onmiddellijk, daarna met vertragingen van 10s, 1m, 5m, 15m, 1h, 6h en 24h nadat de vorige poging is voltooid. IPN probeert automatisch opnieuw; automatisch opnieuw proberen voor webhooks kan per eindpunt worden uitgeschakeld. |
| Veiligheid van bestemmingen | Alleen publieke HTTPS. DNS wordt opnieuw gevalideerd en vastgezet voor bezorging; lokale/private/gereserveerde bestemmingen worden afgewezen. |
| Bewaartermijn voor gebeurtenissen | Payloads van meldingsgebeurtenissen en bezorggegevens worden volgens planning 90 dagen bewaard; bewaarde details worden in begrensde batches verwijderd. |
| Ontdubbeling | Bewaar de ondertekende invoice_id en sequence binnen het ingestelde project. Wholly-Event-Id identificeert een gebeurtenis; Wholly-Delivery-Id identificeert een bezorgrecord (nieuwe pogingen hergebruiken dit; handmatige herbezorging maakt een ander record). Geen van beide ID-headers is ondertekend. |
| Naamgeving van gebeurtenissen | Versie 2 ondertekent event_id en event_type in de body. Oudere gebeurtenissen in de wachtrij hebben geen van beide. Verschillende gebeurtenistypen kunnen een factuur-sequence delen; stem factuurstatus per revisie af of ontdubbel afzonderlijke gebeurtenissen op ondertekende event_id. |
| Geheimen vernieuwen | Vernieuwing heeft geen overlap of versieheader en wijzigt onmiddellijk handtekeningen voor bezorgingen in de wachtrij, nieuwe pogingen en handmatige bezorgingen. |
| Gepauzeerde bezorgingen | Onvoldoende verwerkingstegoed pauzeert IPN/webhooks, inclusief nieuwe pogingen. Inkomende betalingen gaan door; meldingen in de wachtrij worden na opwaarderen hervat binnen hun payloadbewaartermijn. |
AI-assistenten · MCP
Verbind een assistent met je handelaarsinstallatie.
Merchant 5.0.0 bevat een optionele MCP-server op je ingestelde API-domein. Deze draait binnen je installatie, niet via een gedeelde Wholly Crypto-relay.
- Open Instellingen → API-toegang. Maak een afzonderlijke API-referentie, wijs alleen de projecten toe die de assistent nodig heeft en begin met alleen-lezen toegang. Bij een door een operator gehost account schakelt de operator eerst de MCP-service van de installatie in; jij beheert alleen je eigen API-referenties en toestemmingen.
- Schakel onder AI-verbindingen · MCP MCP in, selecteer de API-referentie en sla de MCP-toegang op. Bestaande API-referenties hebben pas MCP-toegang nadat die expliciet is ingeschakeld.
- Kopieer de MCP-server-URL naar de instellingen voor externe HTTP-servers van je client. Log met OAuth in op je handelaarsconsole, controleer de clientnaam en het terugkeeradres, kies een API-referentie en geef toestemming. Je bestaande Basic Auth- en TOTP-beveiliging blijven gelden.
- Factuuraanmaak vereist daarnaast een API-referentie met lees-/schrijfrechten, Lezen + facturen maken in het MCP-beleid, het OAuth-bereik mcp:invoice:create en expliciete toestemming. Een OAuth-verbinding krijgt nooit toegang tot projecten die na de goedkeuring aan een API-referentie worden toegevoegd.
{
"mcpServers": {
"whollycrypto": {
"url": "https://api.example.com/mcp"
}
}
}| Hulpmiddel | Toegang | Doel |
|---|---|---|
| list_projects | Lees | Ingeschakelde projecten die aan de verbinding zijn toegewezen; paginering met limit/offset. |
| list_stores | Lees | Winkels, ID's en ingeschakelde status binnen project_id; paginering met limit/offset. |
| list_payment_methods | Lees | Ingestelde blockchain-, token- en Lightning-methoden voor project_id + store_id. |
| get_wallet_balances | Lees | Ontvangstadressen en gecachte saldi, met velden voor actualiteit/beschikbaarheid; nooit walletgeheimen. |
| list_invoices | Lees | Projectfacturen, gefilterd op winkel, status of zoekterm; paginering met limit/offset. |
| get_invoice | Lees | Volledige factuurdetails en afrekenlink met project_id + invoice_id. |
| get_delivery_history | Lees | IPN-/webhookstatussen van de winkel, pogingen en HTTP-resultaten. Optionele filters invoice_id/kind; geen geheimen of callbackbody's. |
| convert_amount | Lees | Gecachte referentieomrekening met from, to en een decimale tekenreeks voor amount; geen factuurprijsopgave. |
| create_invoice | Expliciet schrijven | project_id, store_id, idempotency_key en invoice (de bestaande body voor factuuraanmaak). invoice.payment_methods filtert ingeschakelde winkelmethoden; 5.4.0+ negeert inactieve/niet-geaccepteerde keuzes en valt terug op winkelstandaarden als niets overeenkomt. Alleen een blockchain kiezen selecteert alle actieve geaccepteerde activa. Tot een blockchain beperkte asset_tickers worden vanaf 5.3.0 ondersteund. Geeft het normale factuurantwoord terug. |
Protocol, OAuth & veiligheid
Gebruik Streamable HTTP via HTTPS. Onderhandel over een geadverteerde protocolversie en voeg MCP-Protocol-Version toe aan volgende POST-verzoeken. Verstuur Content-Type: application/json en Accept: application/json, text/event-stream. Antwoorden zijn eindige JSON; opnieuw verbinden vereist geen MCP-sessie-ID.
OAuth gebruikt kortlevende toegangstokens (15 minuten), eenmalige S256 PKCE-codes (5 minuten) en roterende vernieuwingstokens (verbindingsduur 30 dagen). Een al gebruikt vernieuwingstoken opnieuw gebruiken trekt die verbinding in. Verbind opnieuw na verloop, vernieuwing van API-referenties, beleidswijzigingen of een wijziging van het canonieke API-domein.
OAuth-discovery is alleen publiek als MCP is ingeschakeld. De resource-parameter moet gelijk zijn aan de canonieke URL die discovery teruggeeft, inclusief /mcp. Dynamische registratie wordt ondersteund; externe metadata-documenten voor client-ID's en clientgeheimen niet.
Voor clients die eigen Authorization-headers ondersteunen, kan in plaats daarvan een handelaars-API-token met ingeschakelde MCP als Bearer worden gebruikt. Dit behoudt zijn afzonderlijke REST-rechten; gebruik bij voorkeur OAuth voor een verbinding die tot MCP is beperkt. Plak inloggegevens nooit in chat, URL's, hulpmiddelargumenten of versiebeheer.
MCP deelt het REST-quotum per minuut en de exacte bron-IP-beperkingen van de API-referentie, plus de IP-beperkingen van de API-host. OAuth omzeilt geen toelatingslijst. Sta voor externe AI-clients hun gedocumenteerde uitgaande IP-adressen toe of laat deze beperking bewust uit. Pas geen webbeveiligingschallenge of caching toe op MCP-/OAuth-routes.
HTTP-fouten: 401 vereist authenticatie, 403 weigert oorsprong/IP/rechten, 404 betekent dat MCP uitstaat of de verkeerde host wordt gebruikt, 405 betekent dat je POST moet gebruiken, 413 duidt op de bodylimiet van 32 KiB en 429 bevat Retry-After. JSON-RPC-fouten gebruiken error.code; fouten op hulpmiddelniveau gebruiken result.isError=true, ook met HTTP 200. Succesvolle resultaten bevatten content en structuredContent.
Lijsten bevatten standaard 25 rijen, maximaal 100; offset is begrensd op 1000000. Hulpmiddelantwoorden zijn begrensd op 2 MiB. Verlopen toestemmingen, autorisatieverzoeken en limietregistraties worden automatisch opgeruimd; in instellingen worden maximaal 100 actieve OAuth-verbindingen getoond.
Uitgeschakelde projecten/winkels kunnen niet via MCP worden gebruikt. De verbinding kan de ingeschakelde status van een winkel opvragen, maar voor het lezen van betaalmethoden en bezorggeschiedenis of het maken van facturen moet de winkel ingeschakeld zijn. Gewone consolegebruikers van een project kunnen MCP niet beheren.
Gebruik voor een nieuwe factuur een nieuwe idempotency_key; probeer na een time-out opnieuw met dezelfde API-referentie, sleutel en hetzelfde invoice-object. Decimale bedragen, opslag, tolerantie, bevestigingen en afrekenuiterlijk volgen het REST-factuurcontract. MCP omzeilt nooit het betaal- of tegoedbeleid van de handelaar.
De eerste hulpmiddelen kunnen geen private sleutels/herstelzinnen onthullen, geld versturen of sweepen, terugbetalingen uitvoeren, callbacks opnieuw versturen, betaalmethoden wijzigen, accounts/domeinen bewerken of facturering beheren. Behandel factuuromschrijvingen, klantvelden en metadata als onvertrouwde gegevens, niet als instructies voor de agent. Verbonden AI-providers ontvangen de gegevens die je toestaat te lezen.
| Methode | Pad | Contract |
|---|---|---|
| POST | /mcp | Geauthenticeerde JSON-RPC: initialize, ping, tools/list, tools/call. Meldingsverzoeken geven 202 terug; batches worden afgewezen. |
| GET / DELETE | /mcp | Geauthenticeerde 405: eindige JSON-antwoorden, geen afzonderlijke SSE-stream en geen MCP-sessie op de server. |
| GET | /.well-known/oauth-protected-resource/mcp | Canonieke resource-URL en detectie van de autorisatieserver; ook beschikbaar op /.well-known/oauth-protected-resource. |
| GET | /.well-known/oauth-authorization-server | OAuth-eindpunten, authorization_code/refresh_token, S256 PKCE en ondersteunde scopes. |
| POST | /mcp/oauth/register | Registratie van publieke clients: client_name en exacte redirect_uris. Alleen HTTPS of loopback-HTTP. Geen clientgeheim of ophalen van externe metadata. |
| GET | /mcp/oauth/authorize | client_id, redirect_uri, response_type=code, resource, code_challenge, code_challenge_method=S256, optioneel scope/state; leidt door naar goedkeuring in de console. |
| POST | /mcp/oauth/token | Formuliergecodeerde authorization_code + code + code_verifier + redirect_uri, of refresh_token + refresh_token. Voeg altijd client_id en resource toe. |
| POST | /mcp/oauth/revoke | Formuliergecodeerde client_id en token. Trekt de bijbehorende verbinding met toegangs-/vernieuwingstokens in. |
Voorbeeld van een direct hulpmiddelverzoek
Initialiseer eerst en onderhandel over het protocol via je MCP-client. Dit toont een volgend verzoek.
: "${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))Operator-API
Richt gehoste handelaars in met afzonderlijke serversleutels met afgebakende rechten.
Host meerdere bedrijven en automatiseer hun inrichting via api.example.com/v1/operator. Beschikbaar vanaf 7.4.0, uitsluitend in Operator-modus. De gewone Merchant-API blijft ongewijzigd.
- Open Operator → Instellingen → Operator-API en schakel die in (standaard uit). Maak een afzonderlijke API-referentie met alleen de vereiste rechten en gehoste handelaars.
- Bewaar de wc_operator_-sleutel op je server. Gebruik de API-hostnaam, niet de hostnaam van het Operator-paneel of een handelaarssleutel.
- Sla vóór elke Operator-POST een Idempotency-Key en de exacte requestbody duurzaam op. Lees na een onzeker resultaat het account terug; vervang de sleutel nooit alleen om opnieuw te proberen.
- Maak een handelaar met onboarding: direct en een wachtwoord, of onboarding: invitation zonder wachtwoord. Maak daarna projecten/winkels en geef een tot het project beperkte handelaarssleutel uit voor de afrekenintegratie.
| Bereik | Toegang |
|---|---|
| merchants.read / merchants.write | Gehoste handelaars opvragen/lezen en maken/bijwerken. |
| users.read / users.write / users.security | Gebruikers lezen/maken/bijwerken; afzonderlijk wachtwoorden wijzigen of sessies intrekken. Maakt nooit een operatorbeheerder. |
| invitations.read / invitations.write | Eenmalige uitnodigings-/herstellinks opvragen/lezen, maken, vervangen en intrekken. Nieuwe gebruikers vereisen ook users.write; herstel vereist ook users.security. |
| credits.read / credits.write / fees.write | Saldi/grootboek lezen; lokaal tegoed toekennen of corrigeren; toekomstige tarieven instellen. Niet-nul starttegoed vereist credits.write. |
| topups.read / topups.write | Afrekenverzoeken voor tegoed van gehoste handelaars lezen of maken. Geen API-actie kan er één als betaald markeren. |
| projects.read / projects.write / reports.read | Projecten, winkels, uiterlijk en betaalinstellingen van handelaars inrichten; facturen, walletsaldi en financiële rapporten lezen. |
| merchant_credentials.read / merchant_credentials.write | Gewone afgebakende handelaarssleutels beheren. Krachtig: die sleutels handelen na uitgifte onafhankelijk. |
| events.read / webhooks.write / audit.read / health.read | Levenscyclusgeschiedenis lezen; ondertekende levenscycluscallbacks instellen; audit/mogelijkheden/nodestatus lezen. |
Aansluiting, tegoed, rechten en veilig opnieuw proberen
| Onderwerp | Regel |
|---|---|
| API-referenties | Optionele vervaldatum en exacte IPv4-/IPv6-toelatingslijst; standaard 60 verzoeken/minuut, instelbaar van 1–600. Elk verzoek controleert de uitgevende beheerder en de huidige scopes. HTTP 429 bevat Retry-After. |
| Scheiding | Sleutels hebben alleen toegang tot hun toegewezen gehoste handelaars. Handelaars maken en rapporten voor de hele installatie bekijken vereisen toegang tot alle handelaars. Het eigen bedrijf van de operator is uitgesloten. |
| Eerste aanmelding | Direct aangemaakte accounts erkennen dat de host toegang heeft tot hun walletsleutels. require_password_change voegt een wachtwoordwijziging bij de eerste aanmelding toe. Een uitnodiging accepteren vereist expliciete erkenning van het sleutelbeheer, gevolgd door normaal aanmelden. Basic Auth en bestaande TOTP blijven van kracht. |
| Uitnodigingen | Links voor nieuwe gebruikers zijn 48 uur geldig; wachtwoordherstellinks één uur. Tokens werken één keer. Opnieuw uitgeven trekt de oude link in. Acceptatie door SMTP garandeert geen bezorging in de inbox; bekijk email_delivery. |
| Veilig opnieuw proberen | Elke Operator-POST vereist een sleutel van 16–128 tekens (letters, cijfers, -, _ of .). Dezelfde sleutel en exacte URL/body geven het opgeslagen resultaat terug. Andere bytes geven 409 terug. Geheimen/links worden bij herhaling weggelaten; vernieuw of geef ze zo nodig opnieuw uit via een nieuwe expliciete actie. |
| Onzekere resultaten | operator_request_in_progress betekent dat een actie loopt of werd onderbroken voordat het resultaatbewijs was opgeslagen. Bekijk de resource en audit; dien niet blind een nieuwe sleutel in. Voltooide resultaatbewijzen worden na 30 dagen compact opgeslagen; oude sleutels kunnen nog steeds niet opnieuw worden uitgevoerd. |
| Tegoed en kosten | Decimale tekenreeksen, maximaal zes decimalen. starting_credit is een eenmalige lokale toekenning. Aanpassingen vereisen een bedrag met teken, notitie en request_id, plus de HTTP-sleutel voor nieuwe pogingen. fee_bps=100 betekent 1%; wijzigingen gelden voor toekomstige facturen. Toekenningen vullen het eigen vooruitbetaalde saldo van de installatie niet aan. |
| Pauzeren | enabled=false schakelt een gehost account uit en trekt consolesessies in. payments_paused=true stopt nieuwe facturen. Bestaande betalingsmonitoring gaat door. Project-/winkelaanmaak en automatisering behouden het tegoedbeleid van de installatie. |
| Niet beschikbaar via de API | Geen walletgeheimen, ondertekening, verzenden, terugbetalingen, definitieve verwijdering, TOTP-reset, domeinwijzigingen of serverconfiguratie. Gewone factuurverzoeken blijven een handelaarssleutel en de Merchant-API gebruiken. |
Operator-levenscycluswebhooks
| Gebeurtenis | Gegevens |
|---|---|
| merchant.created / merchant.updated | merchant_id, enabled, payments_paused, fee_bps. |
| user.created / user.updated | merchant_id, user_id, enabled. De updategebeurtenis omvat wijzigingen van e-mailadres, ingeschakelde status en beheerdersrol. |
| invitation.accepted / password_reset.completed | merchant_id, user_id, invitation_id. |
| topup.settled / credit.balance_changed | merchant_id, ledger_id, kind, amount en balance. Lees bij afstemming de tegoedvaluta van de handelaar of de grootboekdetails. |
Operator-levenscyclusgebeurtenissen staan los van factuur-IPN/winkelwebhooks. Een abonnement hoort bij de Operator-API-referentie die het heeft gemaakt, met maximaal 10 eindpunten per sleutel. Alleen toekomstige overeenkomende gebeurtenissen worden in de wachtrij geplaatst; gebruik GET /events voor bewaarde geschiedenis.
De body bevat event_id, event_type, merchant_id, occurred_at en data. Verifieer Wholly-Signature op de exacte onbewerkte body met de eenmalig getoonde signing_secret van het eindpunt: HMAC-SHA256(secret, timestamp + '.' + raw_body), header t=...,v1=.... Hanteer een korte tijdstempeltolerantie.
Gebruik de algemene handtekeningverificatie van de SDK, niet de parser voor factuurmeldingen. Valideer daarna merchant_id en event_type, sla event_id binnen een transactie op en ontdubbel erop, en geef pas na duurzame acceptatie 2xx terug. Wholly-Event-Id moet overeenkomen met de ondertekende body. Behandel niet-ondertekende headers niet als bedrijfsgegevens.
Bezorging vindt minstens één keer plaats, kan buiten volgorde aankomen en wordt maximaal 8 keer geprobeerd. Lees huidige resources om af te stemmen; occurred_at is geen monotoon oplopende sequence. Bereik en instellingen voor ingeschakeld/verval worden vóór bezorging opnieuw gecontroleerd. Uitgeschakelde abonnementen pauzeren bestaand werk in de wachtrij, maar zetten tijdens uitschakeling geen nieuwe gebeurtenissen in de wachtrij.
Gebeurtenissen en bezorggeschiedenis worden 30 dagen bewaard. Het automatiseringsbeleid van de installatie kan bezorging pauzeren. GET /webhooks/{id}/deliveries toont het resultaat en de onwijzigbare payload; de publieke API bezorgt een verlopen record niet geforceerd.
{
"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
}
}Marketplace-API
Eén afrekenpagina met beschermde verkopersaandelen en gecontroleerde uitbetalingen.
Eén klantfactuur, exacte verkopersaandelen en gecontroleerde uitbetalingen in hetzelfde actief. Schakel per project in. Versie 8.0.0 ondersteunt Bitcoin-mainnet en ingestelde ondersteunde EVM-eigen munten / standaard ERC-20-tokens, niet alle ontvangstnetwerken.
- Schakel Marketplace in het project in, kies deelnemende winkels en houd uitbetalingen gepauzeerd tijdens de configuratie.
- Registreer verkopers en verifieer hun uitbetalingsadressen onafhankelijk. Nieuwe bestemmingen zijn in afwachting; goedkeuring vereist destinations.approve.
- Maak een afzonderlijke Marketplace-API-referentie onder Instellingen → API-toegang. Gewone Merchant-, Operator- en MCP-referenties kunnen geen Marketplace-geld besteden.
- Maak een factuur met 1–100 positieve toewijzingen als decimale tekenreeksen, waarvan de som exact gelijk is aan het factuurbedrag. Elke verkoper heeft een goedgekeurde bestemming nodig op een gemeenschappelijk ondersteund winkelnetwerk.
- Wacht op geverifieerde beschikbaarheid van toewijzingen. Bereid een uitbetaling voor, lees de onwijzigbare ontvangers en kostenlimieten en keur vervolgens de revisie en exacte plan_hash goed. Vraag de uitbetalingsstatus op of verifieer ondertekende gebeurtenissen.
| Onderwerp | Regel |
|---|---|
| Bewaring | Klantgeld komt eerst in wallets onder beheer van het project. De eigenaar van de marktplaats/server beheert die sleutels totdat verkopers zijn betaald. Dit is geen directe betaling van klant aan verkoper, escrow of aanmeldsysteem voor verkopers. |
| Drie verkopers | Een factuur van 300 USD met drie aandelen van 100 USD en 4% commissie wijst aan elke verkoper de tegenwaarde van 96 USD in de geoffreerde crypto toe en behoudt de tegenwaarde van 12 USD als brutocommissie. Het plan garandeert atomaire crypto-eenheden, geen toekomstige fiatwaarde. |
| Kosten | De bestaande verwerkingsvergoeding geldt één keer voor het oorspronkelijke voldane factuurbedrag/de factuurvaluta. Bij een ingesteld tarief van 1% is dat 3 USD aan vooruitbetaald tegoed, waardoor vóór blockchainkosten een commissie ter waarde van 9 USD overblijft. Uitbetalingen aan verkopers veroorzaken geen extra verkoopkosten voor klantverkopen. |
| Toewijzing | Toewijzing volgens de grootste rest bewaart elke atomaire eenheid. Commissie wordt naar beneden afgerond; het verkopersnetto is de rest. Afwijkende instellingen per toewijzing, factuur en verkoper en winkel-/projectstandaarden worden vastgelegd in een momentopname. Bij uitbetaling wordt geen nieuwe wisselkoers toegepast. |
| Beschermd geld | Gewone verzendingen, sweeps, beursstortingen en automatische tegoedopwaarderingen sluiten Marketplace-ontvangstadressen uit. Netwerkkosten en tokengas vereisen afzonderlijke vrij beschikbare eigen munten. Gecachte walletwaarden zijn indicatief; onafhankelijke actuele dekking wordt vóór ondertekening gecontroleerd. |
| Definitieve bevestiging | Een positieve blockchainondergrens en twee onafhankelijke compatibele providers zijn vereist voor bewijs van Marketplace-uitbetaling, ook als afrekenen nul bevestigingen of één scanner accepteert. Providerwachttijden stellen betalingsverificatie/uitbetaling uit, niet het maken van verder geldige facturen. |
| Uitzonderingen | Onderbetalingen die volgens de gewone afrekentolerantie worden geaccepteerd, worden vastgehouden en niet oververdeeld. Een bevoegde vrijgave kan een exact kleinere, volledig gedekte verdeling goedkeuren. Overbetaling alleen blokkeert de geoffreerde verkopersverdeling nooit bij BTC of ondersteunde EVM-eigen munten/ERC-20-methoden. Het overschot blijft afzonderlijk vastgehouden. Bitcoin stuurt beschermd wisselgeld terug naar het factuuradres; afzonderlijke projectmiddelen dekken kosten en eventuele aanvulling tot de dust-ondergrens. Gemengde methoden, late/onduidelijke/gereorganiseerde betalingen en ontbrekende dekking vereisen beoordeling. |
| Terugbetalingen | Bereid een volledige terugbetaling in hetzelfde actief voor van één ondubbelzinnige bevestigde ontvangstmethode en keur die daarna afzonderlijk als uitbetaling goed. Onbetaalde toewijzingen en commissie worden teruggedraaid. Zodra alle verkopers zijn betaald, moet je het primaire walletadres afzonderlijk financieren; er is geen terugvordering. Gedeeltelijke verkopersbatches en terugbetalingen met gemengde activa vereisen eerst afstemming. Terugbetalingen van deelbedragen en commissieopnames zijn niet beschikbaar in 8.0.0. |
| Nieuwe pogingen | Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen. |
| Revisies | Wijzigbare records vereisen hun huidige revision. Goedkeuren/hervatten vereist ook expected_plan_hash en confirm:true. Voorbereiding reserveert geld gedurende 15 minuten; goedkeuring geeft één uur. Verlopen niet-ondertekend werk wordt veilig vrijgegeven. Ondertekende/onzekere overschrijvingen behouden hun identiteiten en reserveringen. |
| Automatische uitbetalingen | Standaard uit. Beleid per actief autoriseert goedgekeurde bestemmingen, een positief minimum, limieten voor hoofdsom per uitbetaling/voortschrijdende 24 uur en voor kosten/gas in de eigen munt, interval en bevestigingen. Toestemming wijzigen/intrekken stopt niet-verzonden werk; waarneming gaat door. Limieten omvatten gereserveerde en onzekere plannen. Beleid dat wegens facturering is gepauzeerd, wordt eerlijk opnieuw ingepland. Een ongeldige factuur wordt vastgehouden voor beoordeling zonder andere geschikte factuurgroepen te blokkeren. |
| Pauzeren en herstellen | Een laag tegoed en veiligheidscontroles voor overschrijvingen blijven bestedingen pauzeren. Monitoring en grootboekafstemming gaan door. Hervatten beoordeelt hetzelfde bewaarde plan. Een canonieke EVM-revert die door twee onafhankelijke providers is bewezen, kan na expliciete goedkeuring binnen het resterende kostenbudget worden vervangen; oorspronkelijke hashes en kosten blijven geregistreerd. Onbekende resultaten of afwijkende tokenlevering blijven vastgehouden. Maak een back-up van de volledige database en sleutels; stem na herstel ingediende hashes af voordat je uitbetalingen toestaat. |
| Identificaties en paginering | Gebruik de project-UUID uit Projectinstellingen en de winkel-UUID uit Winkels → Basis → API-ID's. Verkopers-/uitbetalings-/activa-ID's worden door deze API teruggegeven. invoice_id is de publieke factuur-UUID. Gepagineerde resources geven data en pagination {page,per_page,total,pages} terug; standaard 1/25, maximaal 100 rijen. Exacte geldwaarden zijn tekenreeksen. |
| Bereik van API-referenties | Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps. |
Marketplace-rechten
marketplace.read · vendors.write · destinations.write · destinations.approve · invoices.write · policies.write · commissions.override · payouts.write · payouts.approve · webhooks.write · reconciliation.write
Toewijzingsstatussen
pending · held · available · reserved · paid · refunding · refunded · shortfall
Uitbetalingsstatussen
awaiting_approval · queued · funding_gas · sending · confirming · partially_paid · paid · needs_attention · cancelled · expired
Marketplace-gebeurtenissen
Afzonderlijk Marketplace-ondertekeningsgeheim, met dezelfde Wholly-handtekeningheaders en hetzelfde HMAC-verificatiealgoritme voor de onbewerkte body als factuurcallbacks. Verifieer tijdstempel/handtekening, ontdubbel op event_id en geef snel 2xx terug. Bezorging vindt minstens één keer plaats, met maximaal acht pogingen; via de geschiedenis kan dezelfde gebeurtenis opnieuw worden bezorgd. Wijzigingen aan een eindpunt annuleren oude niet-verzonden bezorgingen in plaats van klantgegevens om te leiden. Factuurvoldoening betekent niet dat verkopersuitbetaling is voltooid. Verstuur nooit geld uitsluitend omdat een externe callback dat opdraagt.
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"
}
]
}
}Betalingen voor meerdere verkopers instellen · Een Marketplace-factuur maken
Fouten & limieten
Verwerk validatie, quota en nieuwe pogingen voorspelbaar.
Controleer HTTP-status en Content-Type voordat je een antwoord verwerkt. Wacht bij een 429minstens de Retry-After duur voordat je opnieuw probeert.
| Limiet | Details |
|---|---|
| Verzoekfrequentie | Quotum per API-referentie: standaard 120 verzoeken per UTC-minuut, instelbaar van 1 tot 6000 onder Instellingen → API. Alle geauthenticeerde v1-lees- en schrijfacties, inclusief idempotente nieuwe pogingen en autorisatie-/validatiefouten na authenticatie, delen het budget over domeinen, projecten en processen. Ongeldige API-referenties, consoleroutes en publiek afrekenen verbruiken dit niet. |
| Headers voor aanvraaglimieten | Geauthenticeerde v1-antwoorden bevatten X-RateLimit-Limit, X-RateLimit-Remaining en X-RateLimit-Reset (Unix-seconden op de grens van de volgende UTC-minuut). Te veel verzoeken geven JSON 429 rate_limit_exceeded en Retry-After in gehele seconden terug. Wacht minstens zo lang en voeg willekeurige spreiding aan nieuwe pogingen toe. Vaste vensters staan pieken rond minuutgrenzen toe; dit is geen garantie voor verzoeken per seconde. |
| Handelaarsbody | Maximaal 32 KiB bij de applicatierouter. De randserver kan een te groot verzoek afwijzen voordat een JSON-foutomhulsel wordt gemaakt. |
| Factuurlijst | limit is standaard 50 en accepteert 1–100; offset accepteert 0–1,000,000. Een zoekterm is maximaal 100 tekens. Resultaten staan van nieuw naar oud en bevatten total/has_more-metadata. |
| Winkelmethoden | Maximaal 64 activakeuzes per winkel, genoeg voor alle 30 eigen blockchains plus de begrensde catalogus van geverifieerde tokens. Projectbeleid, scannermogelijkheden en een gereedstaande blockchainwallet met back-up blijven voorwaarden voor factuuraanmaak. |
| Tokendetectie | De kandidaatlimiet is standaard 50 en accepteert 1–100. Ontdekte resultaten zijn pas betaalactiva als verificatie op de blockchain slaagt. |
| Geregistreerde projecttokens | Maximaal 20 blijvende tokenactiva per project. Al geregistreerde activa kunnen worden hergebruikt zonder een extra plek te verbruiken. |
| Idempotentie | Vereist voor factuuraanmaak. 1–128 zichtbare ASCII-tekens zonder spaties; sleutels zijn uniek per winkel en herhaling moet de oorspronkelijke API-referentie en exacte onbewerkte body gebruiken. |
| Metadata | Alleen een JSON-object, maximaal 4,096 gecodeerde bytes en vijf nestingsniveaus. |
| Callbacks | Publieke HTTPS-URL tot 2,048 bytes. Bodies van meldingsverzoeken zijn begrensd op 256 KiB; bewaarde payloads van factuurgebeurtenissen zijn begrensd op 64 KiB met begrensde betalingsgeschiedenissen. |
| Afrekenbestanden | QR-SVG-antwoorden zijn private en no-store omdat een onderbetaling het exacte resterende bedrag wijzigt. PNG-logo's met revisie worden één jaar publiek gecacht en zijn onwijzigbaar. |
| API-randserver | Beheerde upstream-API-verzoeken hebben een leestime-out van 30 seconden. Ontwerp clients met expliciete time-outs die korter zijn dan hun taakbudget. |
| Fouten buiten JSON | Ongeldige UUID-/queryverwerking, verkeerde methoden en de lengtegrens van 32 KiB kunnen frameworktekst of lege antwoorden teruggeven. Onbekende /v1-paden geven momenteel 404-console-HTML terug; valideer status en Content-Type vóór verwerking. |
Foutreferentie
| HTTP | Foutcode | Betekenis |
|---|---|---|
| 400 | invalid_reconciliation_action | Een uitzonderingsstatus, reden, zoekterm of filter voor een geschiedenispagina is ongeldig. |
| 500 | reconciliation_unavailable | De uitzonderingswachtrij of het bewijs kon niet worden geladen. Probeer de leesactie opnieuw met oplopende wachttijd. |
| 402 | billing_required | Een geverifieerd gekoppeld tegoedaccount en actuele autorisatie zijn vereist voor elke nieuwe factuur. Onvoldoende vooruitbetaald tegoed blokkeert aanmaak of inkomende betalingen niet: IPN, webhooks en Sweep worden in plaats daarvan gepauzeerd, terwijl kosten blijven oplopen. Aanmaak blijft geblokkeerd bij geschorste accounts, verlopen/ongeldige factureringsverificatie, een onbereikbare tegoeddienst of een niet-toegestane fiatbasis van de factuur. Kosten gebruiken het oorspronkelijke fiatbedrag van de factuur, niet de ontvangen crypto, opslag, overbetaling of netwerkkosten. Dat bedrag en de onafhankelijke omrekening worden geregistreerd voordat de afrekenpagina wordt gemaakt. Bestaande monitoring en het ophalen van facturen gaan door tijdens storingen. Na opwaarderen worden meldingen in de wachtrij binnen hun normale payloadbewaartermijn hervat en ingeschakelde sweepregels hervat. Controleer Instellingen → Kosten en probeer mislukte aanmaak opnieuw met dezelfde Idempotency-Key. |
| 400 | invalid_json | Ongeldige JSON, een onbekend veld of een body die niet overeenkomt met het gedocumenteerde verzoek. |
| 400 | idempotency_key_required | Bij factuuraanmaak ontbreekt Idempotency-Key. |
| 400 | invalid_idempotency_key | De sleutel is leeg, langer dan 128 bytes, niet-ASCII, bevat witruimte of een stuurbyte. |
| 400 | invalid_payment_request | Een gevalideerd veld of geselecteerde actieve methode is mislukt. Lees error.message en error.details.payment_methods (PaymentMethodIssue[]) voor de exacte blokkade. SDK 2.4.0+ voegt veilige, bruikbare uitzonderingssamenvattingen en hulpmiddelen voor problemen toe; oudere PHP-SDK's bieden getApiMessage(). |
| 400 | invalid_invoice_status | De lijststatus valt buiten de zes gedocumenteerde factuurstatussen. |
| 400 | invalid_callback_url | De effectieve IPN-bestemming is afgewezen bij HTTPS-, publiek-adres-, DNS- of SSRF-validatie. |
| 400 | invalid_wallet_request | Invoer voor het voorbereiden van een wallet/adres is ongeldig. |
| 400 | invalid_token_asset | Tokenblockchain, kandidaatquery, CoinGecko-identiteit, catalogusmetadata of contract-/mintinvoer is ongeldig. |
| 401 | authentication_required | Bearertoken ontbreekt, is ongeldig gevormd, uitgeschakeld, vernieuwd of onbekend. |
| 403 | source_ip_denied | De IP-beperking van de API-referentie bevat het exacte publieke bronadres van het verzoek niet. |
| 403 | source_ip_not_allowed | De bron-IP-beperking van de hostnaam sluit deze client uit. Een beheerder kan toelatingslijsten van actieve hosts beheren onder Instellingen → Systeem; deze gelden naast de IP-beperkingen van API-referenties. |
| 503 | source_access_unavailable | Verificatie van hostnaamtoegang is tijdelijk niet beschikbaar. Probeer later opnieuw; bij fouten blijft toegang geblokkeerd. |
| 403 / 409 / 500 | merchant_api_access_denied | Autorisatie mislukt: rechten/projectbereik kunnen 403 geven, een uitgeschakeld project/winkel kan 409 geven en een fout in de autorisatiebackend kan 500 geven. Ontvangstwallets van operators zijn gereserveerd voor het Operator-paneel, niet voor handelaars-API-referenties of MCP, ook niet met een oudere expliciete projecttoestemming. |
| 403 | project_access_denied | Een transactionele hercontrole bij aanmaak stelde vast dat de API-referentie geen toegang meer heeft tot het project. |
| 404 | invoice_not_found | Er bestaat geen factuur met die publieke ID in het geautoriseerde project, of afrekenen kan die niet tonen. |
| 404 | payment_resource_not_found | Een project, winkel, actief of wallet die nodig is bij het voorbereiden van de factuur bestaat niet meer. |
| 404 | token_candidate_not_found | Het project is niet beschikbaar of de token staat niet meer in de huidige overeenkomende detectiecatalogus. |
| 409 | idempotency_conflict | De tot de winkel beperkte sleutel bestaat al en de API-referentie of de exacte onbewerkte verzoekbytes verschillen. |
| 409 | store_unavailable | Project/winkel is uitgeschakeld of niet beschikbaar. |
| 409 | no_ready_payment_methods | Geen winkelmethode is gereed. Lees error.message en error.details.payment_methods voor chain_slug, asset_ticker en reason_code. Walletback-up/-activering, geïnstalleerde adapter en prijsbepaling moeten geldig zijn. Vanaf 6.0.6 blokkeren scannerwachttijden, mislukte of verouderde gezondheidscontroles en een ontbrekend providerquorum de aanmaak niet. |
| 409 | payment_method_unavailable | Een geselecteerde methode werd onbeschikbaar tijdens de atomaire hercontrole bij aanmaak. |
| 409 | store_payment_method_not_selected | Er is een afwijkend winkelbevestigingsbeleid aangevraagd voor een actief dat momenteel niet door die winkel is geselecteerd. |
| 409 | wallet_unavailable | Een betaalwallet werd onbeschikbaar tijdens de atomaire hercontrole bij aanmaak. |
| 409 | ipn_secret_required | Er bestaat een effectieve IPN-URL, maar de winkel heeft geen IPN-ondertekeningsgeheim. |
| 409 | payment_resource_not_ready | Een vereist betaalactief of vereiste wallet is uitgeschakeld, heeft geen back-up, wacht op activeringsbewijs voor een gedeeld account, is uitgeput of is anderszins niet gereed. |
| 409 | account_activation_unverified | Activering van het XRP Ledger- of Stellar-account kon niet worden bewezen via het ingestelde aantal gezonde mainneteindpunten (standaard 2, optioneel 1); stort op het exacte account en probeer verificatie opnieuw. |
| 400 | invalid_monero_wallet_rpc | Het HTTPS-eindpunt, exacte primaire mainnetadres, label of de volledige Digest-/Basic-/headerauthenticatie-invoer is ongeldig. |
| 404 | monero_wallet_rpc_not_found | De projectspecifieke Monero-wallet-RPC-koppeling bestaat niet. |
| 409 | monero_wallet_rpc_not_ready | Het Monero-actief, quorum van twee daemons, onwijzigbare koppeling of expliciete verklaring over back-up/alleen inzage is niet gereed. |
| 409 | monero_wallet_rpc_unavailable | Factuuraanmaak vereist een actieve, geverifieerde en bevestigde Monero-wallet-RPC-koppeling voor het project met geldige serverinloggegevens. |
| 503 | lightning_unavailable | De enige gereedstaande methode van de winkel is Lightning en de wallet of prijsopgave kon niet worden geverifieerd. Probeer opnieuw met dezelfde idempotentiesleutel. Als er een andere gereedstaande blockchainmethode bestaat, wordt de niet-beschikbare Lightning-methode in plaats daarvan weggelaten. |
| 422 | monero_wallet_rpc_verification_failed | Verificatie van de exacte wallet, HTTPS-pinning, synchronisatie, mainnet-daemonquorum of bewijs van methodenweigering door de gateway is mislukt. |
| 503 | monero_wallet_rpc_failed | De externe wallet-RPC met alleen inzagerechten kon het factuursubadres niet veilig aanmaken en opnieuw uitlezen; er wordt geen uitwijkadres verzonnen. |
| 409 | token_chain_not_ready | Het eigen blockchainactief is uitgeschakeld, de detectiekoppeling is tijdens verificatie gewijzigd of het project heeft al het huidige maximum van 20 geregistreerde tokenactiva. |
| 503 | dex_price_unavailable | DEX-provider niet beschikbaar, bezet, begrensd, verouderd antwoord of ongeldige gegevens. Probeer na één minuut opnieuw; vaste prijsbepaling blijft beschikbaar. |
| 422 | invalid_dex_price | Ongeldige combinatie van prijsmodi of de geselecteerde pool kan geen kwalificerende prijs voor het exacte contract leveren. Kies een andere pool of vaste USD-prijsbepaling. |
| 422 | token_verification_failed | Elke geschikte node faalde bij verificatie van blockchainidentiteit, contractcode, decimalen, saldo-opvraging of mint. |
| 422 | invalid_store_confirmation_policy | De afwijkende winkelinstelling is niet beschikbaar voor deze finaliteitsmodus, valt buiten de teruggegeven blockchainspecifieke grenzen of vraagt om niet-ondersteunde acceptatie met nul bevestigingen. |
| 409 | invoice_not_payable | De afrekenfactuur heeft een eindstatus of de betalingsdeadline is verstreken. |
| 409 | invoice_payment_method_locked | Een geldige betaling heeft al een ander actief geselecteerd; ga verder met active_payment_method_id. |
| 409 | payment_method_not_payable | De geselecteerde methode is afgerond of accepteert geen extra betaling meer. |
| 422 | payment_qr_unavailable | Het betaalverzoek op de afrekenpagina is te groot om als SVG-QR-afbeelding te coderen. |
| 503 | payment_rates_unavailable | Voor geen enkele gereedstaande betaalmethode is een actuele betrouwbare prijsopgave beschikbaar. |
| 500 | authentication_unavailable | Bearerauthenticatie kon de opgeslagen API-referentie niet veilig lezen of valideren. |
| 429 | rate_limit_exceeded | Deze API-referentie heeft haar huidige UTC-minuutbudget opgebruikt. Wacht minstens Retry-After seconden; probeer factuuraanmaak opnieuw met dezelfde idempotentiesleutel. |
| 500 | database_error / internal_error | Tijdelijke serverfout; probeer veilig opnieuw met dezelfde idempotentiesleutel. |
API-overzicht
Kies een eindpunt voor de velden, voorbeelden en het antwoord.
Facturen
POSTFactuur maken/v1/projects/{project_id}/stores/{store_id}/invoicesGETFacturen opvragen/v1/projects/{project_id}/invoicesGETFactuur ophalen/v1/projects/{project_id}/invoices/{invoice_id}GETFactuurbetalingen opvragen/v1/projects/{project_id}/invoices/{invoice_id}/paymentsBetaalmethoden
GETBetaalactiva van project opvragen/v1/projects/{project_id}/payment-assetsPUTActivabeleid van project bijwerken/v1/projects/{project_id}/payment-assets/{asset_id}GETKandidaat-betaaltokens bekijken/v1/projects/{project_id}/payment-token-candidatesPOSTToken verifiëren en registreren/v1/projects/{project_id}/payment-token-assetsGETDEX-pools voor eigen token zoeken/v1/projects/{project_id}/payment-token-dex-poolsPOSTEigen token toevoegen of prijs wijzigen/v1/projects/{project_id}/payment-token-assets/customGETBetaalmethoden van winkel opvragen/v1/projects/{project_id}/stores/{store_id}/payment-assetsPUTBetaalmethoden van winkel vervangen/v1/projects/{project_id}/stores/{store_id}/payment-assetsPUTBevestigingsbeleid van winkel instellen/v1/projects/{project_id}/stores/{store_id}/payment-assets/{asset_id}/confirmation-policyWallets
GETProjectwallets en saldi opvragen/v1/projects/{project_id}/walletsAfstemming
GETBetalingsuitzonderingen opvragen/v1/projects/{project_id}/reconciliationGETAfstemmingsbewijs lezen/v1/projects/{project_id}/reconciliation/{invoice_id}Marketplace-API
GETMogelijkheden/v1/marketplace/capabilitiesGETMarketplace-rapport/v1/marketplace/overviewGETProjectinstellingen/v1/marketplace/settingsPOSTProjectinstellingen opslaan/v1/marketplace/settingsGETVerkopers opvragen/v1/marketplace/vendorsPOSTVerkoper maken/v1/marketplace/vendorsGETVerkoper ophalen/v1/marketplace/vendors/{vendor_id}POSTVerkoper bijwerken/v1/marketplace/vendors/{vendor_id}/updatePOSTVerkoper archiveren/v1/marketplace/vendors/{vendor_id}/archiveGETVerkopersbestemmingen/v1/marketplace/vendors/{vendor_id}/destinationsPOSTUitbetalingsbestemming toevoegen/v1/marketplace/vendors/{vendor_id}/destinationsPOSTBestemming goedkeuren/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/approvePOSTBestemming uitschakelen/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/disableGETVerkoperssaldi/v1/marketplace/vendors/{vendor_id}/balancesGETMarketplace-facturen/v1/marketplace/invoicesPOSTFactuur voor meerdere verkopers maken/v1/marketplace/invoicesGETFactuur en toewijzingen/v1/marketplace/invoices/{invoice_id}GETBetalingsbewijs van factuur/v1/marketplace/invoices/{invoice_id}/paymentsGETFactuurtoewijzingen/v1/marketplace/invoices/{invoice_id}/allocationsPOSTOnbetaalde factuur annuleren/v1/marketplace/invoices/{invoice_id}/cancelPOSTToewijzingen vasthouden/v1/marketplace/invoices/{invoice_id}/allocations/holdPOSTToewijzingen beoordelen en vrijgeven/v1/marketplace/invoices/{invoice_id}/allocations/releasePOSTOnbetaalde bestemming opnieuw koppelen/v1/marketplace/invoices/{invoice_id}/allocations/{allocation_id}/destinationPOSTVolledige terugbetaling voorbereiden/v1/marketplace/invoices/{invoice_id}/refundGETUitbetalingstoewijzingen zoeken/v1/marketplace/allocationsGETGrootboeksaldi van project/v1/marketplace/balancesGETOnwijzigbaar journaal/v1/marketplace/ledgerGETUitbetalingsgeschiedenis/v1/marketplace/payoutsPOSTToewijzingsplan vooraf bekijken/v1/marketplace/payouts/previewPOSTUitbetaling voorbereiden/v1/marketplace/payoutsGETUitbetalingsdetails/v1/marketplace/payouts/{payout_id}POSTGoedkeuren en verzenden/v1/marketplace/payouts/{payout_id}/approvePOSTUitbetaling beoordelen en hervatten/v1/marketplace/payouts/{payout_id}/resumePOSTNiet-ondertekend werk annuleren/v1/marketplace/payouts/{payout_id}/cancelGETAutomatisch uitbetalingsbeleid/v1/marketplace/policiesPOSTUitbetalingsbeleid autoriseren/v1/marketplace/policiesGETMarketplace-webhooks/v1/marketplace/webhooksPOSTMarketplace-webhook maken/v1/marketplace/webhooksPOSTMarketplace-webhook bijwerken/v1/marketplace/webhooks/{webhook_id}/updatePOSTMarketplace-webhook uitschakelen/v1/marketplace/webhooks/{webhook_id}/disableGETMarketplace-gebeurtenissen/v1/marketplace/eventsGETBewaarde gebeurtenis lezen/v1/marketplace/events/{event_id}GETMarketplace-bezorggeschiedenis/v1/marketplace/webhook-deliveriesGETBezorgdetails/v1/marketplace/webhook-deliveries/{delivery_id}POSTDezelfde gebeurtenis opnieuw bezorgen/v1/marketplace/webhook-deliveries/{delivery_id}/resendOperator-API
GETMogelijkheden/v1/operator/capabilitiesGETGezondheid/v1/operator/healthGETHandelaars opvragen/v1/operator/merchantsPOSTHandelaar maken/v1/operator/merchantsGETHandelaar ophalen/v1/operator/merchants/{merchant_id}POSTHandelaar bijwerken/v1/operator/merchants/{merchant_id}GETGebruikers opvragen/v1/operator/merchants/{merchant_id}/usersPOSTGebruiker maken/v1/operator/merchants/{merchant_id}/usersGETGebruiker ophalen/v1/operator/merchants/{merchant_id}/users/{user_id}POSTGebruiker bijwerken/v1/operator/merchants/{merchant_id}/users/{user_id}POSTGebruikerswachtwoord instellen/v1/operator/merchants/{merchant_id}/users/{user_id}/passwordPOSTGebruikerssessies intrekken/v1/operator/merchants/{merchant_id}/users/{user_id}/revoke-sessionsGETUitnodigingen opvragen/v1/operator/merchants/{merchant_id}/invitationsPOSTUitnodiging maken/v1/operator/merchants/{merchant_id}/invitationsGETUitnodiging ophalen/v1/operator/invitations/{invitation_id}POSTUitnodiging opnieuw versturen/v1/operator/invitations/{invitation_id}/resendPOSTUitnodiging intrekken/v1/operator/invitations/{invitation_id}/revokeGETTegoed ophalen/v1/operator/merchants/{merchant_id}/creditsGETTegoedgrootboek opvragen/v1/operator/merchants/{merchant_id}/credits/ledgerPOSTTegoed aanpassen/v1/operator/merchants/{merchant_id}/credits/adjustmentsGETOpwaarderingen opvragen/v1/operator/merchants/{merchant_id}/topupsPOSTOpwaardering maken/v1/operator/merchants/{merchant_id}/topupsGETOpwaardering ophalen/v1/operator/merchants/{merchant_id}/topups/{topup_id}GETRapporten/v1/operator/reportsGETAuditlog opvragen/v1/operator/auditGETGebeurtenissen opvragen/v1/operator/eventsGETWebhooks opvragen/v1/operator/webhooksPOSTWebhook maken/v1/operator/webhooksPOSTWebhook bijwerken/v1/operator/webhooks/{webhook_id}POSTWebhookgeheim vernieuwen/v1/operator/webhooks/{webhook_id}/rotateGETWebhookbezorgingen opvragen/v1/operator/webhooks/{webhook_id}/deliveriesGETProjecten opvragen/v1/operator/merchants/{merchant_id}/projectsPOSTProject maken/v1/operator/merchants/{merchant_id}/projectsGETProject ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}POSTProject bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}GETWinkels opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesPOSTWinkel maken/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesGETWinkel ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}POSTWinkel bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}GETWinkeluiterlijk ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearancePOSTWinkeluiterlijk bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceGETBetaalactiva van winkel opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsPOSTBetaalactiva van winkel bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsGETWinkelwebhooks opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksPOSTWinkelwebhook maken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksPOSTWinkelwebhook bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooks/{webhook_id}GETFacturen opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoicesGETFactuur ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoices/{invoice_id}GETWallets opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/walletsGETWalletadressen opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/wallets/{wallet_id}/addressesGETHandelaars-API-referenties opvragen/v1/operator/merchants/{merchant_id}/api-credentialsPOSTHandelaars-API-referentie maken/v1/operator/merchants/{merchant_id}/api-credentialsPOSTHandelaars-API-referentie bijwerken/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}POSTHandelaars-API-referentie vernieuwen/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/rotatePOSTHandelaars-API-referentie intrekken/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/revokePOSTUitnodigingstoken controleren/v1/onboarding/invitations/checkPOSTUitnodiging of wachtwoordherstel accepteren/v1/onboarding/invitations/acceptAfrekenen
GETAfrekenbasis/GETGehoste afrekenpagina/invoice/{invoice_id}GETFactuur met gegevens die veilig op de afrekenpagina kunnen worden getoond/checkout-api/invoices/{invoice_id}GETVoorbeeld van winkelafrekenpagina/invoice/preview/{project_id}GETGegevens voor afrekenvoorbeeld/checkout-api/previews/{project_id}GETAfbeelding voor winkelafrekenpagina/checkout-api/invoices/{invoice_id}/appearance-images/{kind}/{revision}/image.pngGETAfbeelding voor winkelvoorbeeld/checkout-api/previews/{project_id}/stores/{store_id}/appearance-images/{kind}/{revision}/image.pngGETVoorbeeldlogo met revisie/checkout-api/previews/{project_id}/logo/{revision}/image.pngGETAfbeelding van betalings-QR-code/checkout-api/invoices/{invoice_id}/payment-methods/{intent_id}/qr.svgGETAfrekenlogo met revisie/checkout-api/invoices/{invoice_id}/logo/{revision}/image.pngDienst
GETAPI-servicedetectie/GETServicestatus/healthzGETMogelijkheden/v1/operator/capabilitiesAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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
}Antwoordvelden
Gebruiksopmerkingen
- Vereist health.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETGezondheid/v1/operator/healthAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"version": "7.4.0",
"nodes": []
}Antwoordvelden
Gebruiksopmerkingen
- Vereist health.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETHandelaars opvragen/v1/operator/merchantsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchants.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTHandelaar maken/v1/operator/merchantsLezen + schrijven
Maak een gehoste handelaar en eerste beheerder atomair aan, rechtstreeks met een wachtwoord of via uitnodiging.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Verzoek
: "${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))Requestbody
onboardingdirect | invitationvereistdirect vereist password en verstuurt geen uitnodigingsmail. invitation laat password weg.
passwordstring · direct only12–128 tekens (maximaal 512 UTF-8-bytes); wordt nooit teruggegeven of gemaild. Gebruik require_password_change voor tijdelijke wachtwoorden.
require_password_changebooleanoptioneelVereist een nieuw wachtwoord bij de eerste aanmelding. Elk rechtstreeks aangemaakt account moet het beheer van gehoste wallets erkennen.
currencyfiat codeoptioneelValuta van het vooruitbetaalde account; standaard de regionale valuta en kan daarna niet worden gewijzigd.
fee_bpsintegeroptioneel0–10000; 100 betekent 1%. Gebruikt bij weglaten de operatorstandaard. Vereist fees.write.
starting_creditdecimal stringoptioneelExacte eenmalige lokale toekenning. Niet-nul vereist credits.write. Vult het installatiesaldo van de operator niet aan.
send_invitation_emailbooleanoptioneelAlleen uitnodiging. Vereist ingestelde SMTP; het antwoord onderscheidt acceptatie door de relay van accountaanmaak.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"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
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchants.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Globale handelaarstoegang vereist. Expliciete tariefafwijkingen vereisen ook fees.write; niet-nul starting_credit vereist credits.write. Aansluiting via uitnodiging vereist ook invitations.write. Geen automatische aanmelding, geen omzeiling van Basic Auth, geen achteraf toegekend tegoed bij opnieuw proberen.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETHandelaar ophalen/v1/operator/merchants/{merchant_id}Alleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchants.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTHandelaar bijwerken/v1/operator/merchants/{merchant_id}Lezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
namefieldsoptioneelUitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.Details
Uitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.
enabledfieldsoptioneelUitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.Details
Uitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.
payments_pausedfieldsoptioneelUitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.Details
Uitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.
fee_bpsfieldsoptioneelUitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.Details
Uitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.
external_idfieldsoptioneelUitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.Details
Uitschakelen trekt sessies in. payments_paused blokkeert nieuwe facturen, niet het scannen van bestaande betalingen. Tariefwijzigingen vereisen fees.write en gelden voor toekomstige facturen; accountvaluta kan niet veranderen.
Antwoord 200 application/json
Voorbeeldantwoord
{
"id": "11111111-1111-4111-8111-111111111111",
"name": "Example shop",
"currency": "EUR",
"balance": "10",
"fee_bps": 300,
"enabled": true,
"payments_paused": false
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchants.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETGebruikers opvragen/v1/operator/merchants/{merchant_id}/usersAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist users.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTGebruiker maken/v1/operator/merchants/{merchant_id}/usersLezen + schrijven
Voeg een handelaarsbeheerder toe of een gebruiker met toegang tot geselecteerde projecten.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
require_password_changesame as merchant creationUitnodigingen maken vereist daarnaast invitations.write.
send_invitation_emailsame as merchant creationUitnodigingen maken vereist daarnaast invitations.write.
access_leveladmin | projectsoptioneeladmin is alleen de beheerder van deze handelaar, nooit de installatie-/operatorbeheerder.
project_ids[]UUID[]Alleen projecten van de handelaar. Verplichte selectie voor projectbeperkte toegang; nooit over handelaarsgrenzen heen.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
userobject
user_idstringaccess_linkJSON | nullmerchant_idstringGebruiksopmerkingen
- Vereist users.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETGebruiker ophalen/v1/operator/merchants/{merchant_id}/users/{user_id}Alleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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
}Antwoordvelden
Gebruiksopmerkingen
- Vereist users.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTGebruiker bijwerken/v1/operator/merchants/{merchant_id}/users/{user_id}Lezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Requestbody
emailfieldsoptioneelWerkt aangeleverde velden bij; bescherming van de laatste beheerder blijft gelden. Wachtwoorden hebben een afzonderlijke users.security-actie.
display_namefieldsoptioneelWerkt aangeleverde velden bij; bescherming van de laatste beheerder blijft gelden. Wachtwoorden hebben een afzonderlijke users.security-actie.
enabledfieldsoptioneelWerkt aangeleverde velden bij; bescherming van de laatste beheerder blijft gelden. Wachtwoorden hebben een afzonderlijke users.security-actie.
access_levelfieldsoptioneelWerkt aangeleverde velden bij; bescherming van de laatste beheerder blijft gelden. Wachtwoorden hebben een afzonderlijke users.security-actie.
project_idsfieldsoptioneelWerkt aangeleverde velden bij; bescherming van de laatste beheerder blijft gelden. Wachtwoorden hebben een afzonderlijke users.security-actie.
default_timezonefieldsoptioneelWerkt aangeleverde velden bij; bescherming van de laatste beheerder blijft gelden. Wachtwoorden hebben een afzonderlijke users.security-actie.
Antwoord 200 application/json
Voorbeeldantwoord
{
"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
}Antwoordvelden
Gebruiksopmerkingen
- Vereist users.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTGebruikerswachtwoord instellen/v1/operator/merchants/{merchant_id}/users/{user_id}/passwordLezen + schrijven
Stel een wachtwoord voor een gehost account in en trek sessies in. Bestaande TOTP blijft behouden.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"user_id": "11111111-1111-4111-8111-111111111111",
"sessions_revoked": true,
"totp_preserved": true
}Antwoordvelden
Gebruiksopmerkingen
- Vereist users.security; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTGebruikerssessies intrekken/v1/operator/merchants/{merchant_id}/users/{user_id}/revoke-sessionsLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"user_id": "11111111-1111-4111-8111-111111111111",
"sessions_revoked": true,
"totp_preserved": true
}Antwoordvelden
Gebruiksopmerkingen
- Vereist users.security; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETUitnodigingen opvragen/v1/operator/merchants/{merchant_id}/invitationsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist invitations.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTUitnodiging maken/v1/operator/merchants/{merchant_id}/invitationsLezen + schrijven
Maak of vervang een eenmalige uitnodigings- of wachtwoordherstellink.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
user_idUUID, booleanGeef een eenmalige link voor een bestaand account uit of vervang die. Geactiveerde gebruikers ontvangen een herstellink voor één uur en vereisen users.security.
send_emailUUID, booleanGeef een eenmalige link voor een bestaand account uit of vervang die. Geactiveerde gebruikers ontvangen een herstellink voor één uur en vereisen users.security.
new user fieldsalternative to user_idGebruik email, display_name, access_level en project_ids om een uitgenodigde gebruiker te maken; vereist users.write.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist invitations.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETUitnodiging ophalen/v1/operator/invitations/{invitation_id}Alleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
invitation_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist invitations.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTUitnodiging opnieuw versturen/v1/operator/invitations/{invitation_id}/resendLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
invitation_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
send_emailbooleanoptioneelVervangt het vorige token en voegt nooit tegoed toe. Geeft een nieuw gegenereerde link één keer terug. Een al geactiveerd account vereist users.security.
Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist invitations.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTUitnodiging intrekken/v1/operator/invitations/{invitation_id}/revokeLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
invitation_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"revoked": true,
"invitation_id": "44444444-4444-4444-8444-444444444444"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist invitations.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETTegoed ophalen/v1/operator/merchants/{merchant_id}/creditsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist credits.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETTegoedgrootboek opvragen/v1/operator/merchants/{merchant_id}/credits/ledgerAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
qoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist credits.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTTegoed aanpassen/v1/operator/merchants/{merchant_id}/credits/adjustmentsLezen + schrijven
Voeg een toekenning of correctie met reden toe aan het vooruitbetaalde grootboek van deze handelaar.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
amountsigned decimal stringvereistPositieve toekenning of negatieve correctie, maximaal zes decimalen in de tegoedvaluta van de handelaar. Geen blockchainoverschrijving.
Antwoord 200 application/json
Voorbeeldantwoord
{
"balance": "25"
}Antwoordvelden
balancestringGebruiksopmerkingen
- Vereist credits.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETOpwaarderingen opvragen/v1/operator/merchants/{merchant_id}/topupsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist topups.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTOpwaardering maken/v1/operator/merchants/{merchant_id}/topupsLezen + schrijven
Maak een afrekenpagina voor vooruitbetaald tegoed; markeer deze nooit handmatig als betaald.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
amountdecimal stringvereistMinstens één eenheid van de tegoedvaluta van de handelaar. Vereist een gereedstaande Operator-ontvangstwinkel.
request_idUUIDvereistBewaar bij nieuwe pogingen. Geeft de bestaande factuur terug als die al is gemaakt. Tegoed wordt pas bijgeschreven na waargenomen voldoening.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist topups.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETOpwaardering ophalen/v1/operator/merchants/{merchant_id}/topups/{topup_id}Alleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist topups.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETRapporten/v1/operator/reportsAlleen-lezen
Lees het financiële Operator-overzicht. Vereist toegang tot alle gehoste handelaars.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Queryparameters
periodoptioneelFinanciële filters. period is standaard last30; gebruik custom met start/end in YYYY-MM-DD. Alleen API-referenties voor alle handelaars.
startoptioneelFinanciële filters. period is standaard last30; gebruik custom met start/end in YYYY-MM-DD. Alleen API-referenties voor alle handelaars.
endoptioneelFinanciële filters. period is standaard last30; gebruik custom met start/end in YYYY-MM-DD. Alleen API-referenties voor alle handelaars.
currencyoptioneelFinanciële filters. period is standaard last30; gebruik custom met start/end in YYYY-MM-DD. Alleen API-referenties voor alle handelaars.
merchant_idoptioneelFinanciële filters. period is standaard last30; gebruik custom met start/end in YYYY-MM-DD. Alleen API-referenties voor alle handelaars.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist reports.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Rijen, kosten en aantallen van het eigen bedrijf worden uitgesloten voordat totalen worden berekend. Een merchant_id-filter voor het eigen bedrijf geeft 404 terug. Rapportage gebruikt de tijdzone van de installatie.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETAuditlog opvragen/v1/operator/auditAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Queryparameters
merchant_idoptioneelFilter op toegestane handelaar, exact gebeurtenistype (events) of actietekst (audit). Gebeurtenissen worden 30 dagen bewaard.
searchoptioneelFilter op toegestane handelaar, exact gebeurtenistype (events) of actietekst (audit). Gebeurtenissen worden 30 dagen bewaard.
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist audit.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETGebeurtenissen opvragen/v1/operator/eventsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Queryparameters
merchant_idoptioneelFilter op toegestane handelaar, exact gebeurtenistype (events) of actietekst (audit). Gebeurtenissen worden 30 dagen bewaard.
event_typeoptioneelFilter op toegestane handelaar, exact gebeurtenistype (events) of actietekst (audit). Gebeurtenissen worden 30 dagen bewaard.
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist events.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETWebhooks opvragen/v1/operator/webhooksAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist events.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWebhook maken/v1/operator/webhooksLezen + schrijven
Abonneer je op toekomstige Operator-levenscyclusgebeurtenissen. Geen betalingswebhook van een winkel.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Verzoek
: "${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))Requestbody
urlpublic HTTPS URLvereistGeen inloggegevens, private IP-adressen of omleidingen. DNS/IP wordt bij bezorging opnieuw gecontroleerd.
events[]string[]vereistKies levenscyclusgebeurtenissen uit de Operator-handleiding, geen factuurcallbacks.
merchant_ids[]UUID[]optioneelLeeg betekent alle handelaars die door deze API-referentie zijn toegestaan. Actuele bereikbeperkingen worden opnieuw gecontroleerd.
enabledbooleanoptioneelGepauzeerde eindpunten bewaren bezorgingen in de wachtrij; opnieuw inschakelen hervat geldig bewaard werk.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"id": "11111111-1111-4111-8111-111111111111",
"signing_secret": "wco_whsec_EXAMPLE_ONLY_SAVE_ONCE"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist webhooks.write + events.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWebhook bijwerken/v1/operator/webhooks/{webhook_id}Lezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
webhook_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
urlpublic HTTPS URLvereistGeen inloggegevens, private IP-adressen of omleidingen. DNS/IP wordt bij bezorging opnieuw gecontroleerd.
events[]string[]vereistKies levenscyclusgebeurtenissen uit de Operator-handleiding, geen factuurcallbacks.
merchant_ids[]UUID[]optioneelLeeg betekent alle handelaars die door deze API-referentie zijn toegestaan. Actuele bereikbeperkingen worden opnieuw gecontroleerd.
enabledbooleanoptioneelGepauzeerde eindpunten bewaren bezorgingen in de wachtrij; opnieuw inschakelen hervat geldig bewaard werk.
Antwoord 200 application/json
Voorbeeldantwoord
{
"id": "44444444-4444-4444-8444-444444444444",
"signing_secret": null
}Antwoordvelden
Gebruiksopmerkingen
- Vereist webhooks.write + events.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWebhookgeheim vernieuwen/v1/operator/webhooks/{webhook_id}/rotateLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
webhook_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"id": "11111111-1111-4111-8111-111111111111",
"signing_secret": "wco_whsec_EXAMPLE_ONLY_SAVE_ONCE"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist webhooks.write + events.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETWebhookbezorgingen opvragen/v1/operator/webhooks/{webhook_id}/deliveriesAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
webhook_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist events.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETProjecten opvragen/v1/operator/merchants/{merchant_id}/projectsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTProject maken/v1/operator/merchants/{merchant_id}/projectsLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
namestringsvereistNaam en unieke stabiele projectidentificatie. Maakt lokale wallets via de bestaande projectinitialisatie en verstuurt nooit geld.
slugstringsvereistNaam en unieke stabiele projectidentificatie. Maakt lokale wallets via de bestaande projectinitialisatie en verstuurt nooit geld.
enabledoptioneelenabled is standaard true; aanbevolen is om gepauzeerd aan te maken en eerst een winkel in te stellen.
reporting_timezoneoptioneelenabled is standaard true; aanbevolen is om gepauzeerd aan te maken en eerst een winkel in te stellen.
checkout_titleoptioneelenabled is standaard true; aanbevolen is om gepauzeerd aan te maken en eerst een winkel in te stellen.
checkout_descriptionoptioneelenabled is standaard true; aanbevolen is om gepauzeerd aan te maken en eerst een winkel in te stellen.
checkout_themeoptioneelenabled is standaard true; aanbevolen is om gepauzeerd aan te maken en eerst een winkel in te stellen.
checkout_accent_coloroptioneelenabled is standaard true; aanbevolen is om gepauzeerd aan te maken en eerst een winkel in te stellen.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"id": "33333333-3333-4333-8333-333333333333",
"slug": "example-shop",
"name": "Example shop",
"enabled": false,
"reporting_currency": "EUR",
"reporting_timezone": "Europe/Berlin",
"stores": []
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETProject ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}Alleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"id": "33333333-3333-4333-8333-333333333333",
"slug": "example-shop",
"name": "Example shop",
"enabled": false,
"reporting_currency": "EUR",
"reporting_timezone": "Europe/Berlin",
"stores": []
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTProject bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}Lezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Requestbody
nameoptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
enabledoptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
reporting_currencyoptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
reporting_timezoneoptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
checkout_titleoptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
checkout_descriptionoptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
checkout_themeoptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
checkout_accent_coloroptioneelGedeeltelijke update. Identificatie en eigendom door de handelaar kunnen niet veranderen.
Antwoord 200 application/json
Voorbeeldantwoord
{
"id": "33333333-3333-4333-8333-333333333333",
"slug": "example-shop",
"name": "Example shop",
"enabled": false,
"reporting_currency": "EUR",
"reporting_timezone": "Europe/Berlin",
"stores": []
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETWinkels opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWinkel maken/v1/operator/merchants/{merchant_id}/projects/{project_id}/storesLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Requestbody
default_currencyoptioneelGebruik decimale tekenreeksen voor percentages. Nieuwe winkels nemen het uiterlijk van de standaardwinkel van het project over.
invoice_expiry_minutesoptioneelGebruik decimale tekenreeksen voor percentages. Nieuwe winkels nemen het uiterlijk van de standaardwinkel van het project over.
exchange_rate_spread_percentoptioneelGebruik decimale tekenreeksen voor percentages. Nieuwe winkels nemen het uiterlijk van de standaardwinkel van het project over.
underpayment_tolerance_percentoptioneelGebruik decimale tekenreeksen voor percentages. Nieuwe winkels nemen het uiterlijk van de standaardwinkel van het project over.
enabledoptioneelStel geaccepteerde activa in met payment-assets; facturen met nulbedrag staan standaard uit.
is_defaultoptioneelStel geaccepteerde activa in met payment-assets; facturen met nulbedrag staan standaard uit.
allow_zero_amount_invoicesoptioneelStel geaccepteerde activa in met payment-assets; facturen met nulbedrag staan standaard uit.
allow_underpaymentsoptioneelStel geaccepteerde activa in met payment-assets; facturen met nulbedrag staan standaard uit.
allow_overpaymentsoptioneelStel geaccepteerde activa in met payment-assets; facturen met nulbedrag staan standaard uit.
allowed_chain_slugsoptioneelStel geaccepteerde activa in met payment-assets; facturen met nulbedrag staan standaard uit.
ipn_enabledoptioneelIPN- en terugkeer-URL's volgen bestaande URL-validatie. Geen willekeurige HTML/JavaScript.
default_ipn_urloptioneelIPN- en terugkeer-URL's volgen bestaande URL-validatie. Geen willekeurige HTML/JavaScript.
default_redirect_urloptioneelIPN- en terugkeer-URL's volgen bestaande URL-validatie. Geen willekeurige HTML/JavaScript.
default_cancel_urloptioneelIPN- en terugkeer-URL's volgen bestaande URL-validatie. Geen willekeurige HTML/JavaScript.
redirect_automaticallyoptioneelIPN- en terugkeer-URL's volgen bestaande URL-validatie. Geen willekeurige HTML/JavaScript.
checkout_languageoptioneelGebruik een ondersteunde taal en actieve roldomeinen; stel toegestane oorsprongen voor inbedden expliciet in.
embed_enabledoptioneelGebruik een ondersteunde taal en actieve roldomeinen; stel toegestane oorsprongen voor inbedden expliciet in.
allowed_embed_originsoptioneelGebruik een ondersteunde taal en actieve roldomeinen; stel toegestane oorsprongen voor inbedden expliciet in.
domainsoptioneelGebruik een ondersteunde taal en actieve roldomeinen; stel toegestane oorsprongen voor inbedden expliciet in.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"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
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETWinkel ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}Alleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWinkel bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}Lezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"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
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETWinkeluiterlijk ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"revision": 1,
"settings": {
"inherit_default_store": true
},
"effective": {
"title": "Pay securely"
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWinkeluiterlijk bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/checkout-appearanceLezen + schrijven
Sla een gevalideerd winkelontwerp met revisiebescherming op.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
revisionintegervereistLees eerst de huidige revisie met GET. Een verouderde revisie wordt geweigerd zonder de wijzigingen van een andere bewerker te overschrijven.
settingsobjectvereist
Gevalideerd afrekenuiterlijk, inclusief inherit_default_store, huisstijl, intro/outro, lettergroottes en zichtbaarheid. Geen willekeurige HTML/JavaScript. Afbeeldingsbytes uploaden kan alleen via de console.Details
Gevalideerd afrekenuiterlijk, inclusief inherit_default_store, huisstijl, intro/outro, lettergroottes en zichtbaarheid. Geen willekeurige HTML/JavaScript. Afbeeldingsbytes uploaden kan alleen via de console.
Antwoord 200 application/json
Voorbeeldantwoord
{
"settings": {
"inherit_default_store": false,
"title": "Pay securely",
"theme": "light"
},
"revision": 2
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETBetaalactiva van winkel opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": []
}Antwoordvelden
data[]arrayGebruiksopmerkingen
- Vereist projects.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTBetaalactiva van winkel bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/payment-assetsLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
assets[]object[]vereist
Volledige vervanging van blockchainmethoden: asset_id-UUID en display_order. [] wist geaccepteerde blockchainactiva. Alleen geverifieerde projectactiva; configureert Lightning niet.Details
Volledige vervanging van blockchainmethoden: asset_id-UUID en display_order. [] wist geaccepteerde blockchainactiva. Alleen geverifieerde projectactiva; configureert Lightning niet.
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": []
}Antwoordvelden
data[]arrayGebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETWinkelwebhooks opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWinkelwebhook maken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooksLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
namestrings / arrayvereistPublieke HTTPS-ontvanger en factuurgebeurtenisnamen uit de IPN- en webhookdocumentatie.
urlstrings / arrayvereistPublieke HTTPS-ontvanger en factuurgebeurtenisnamen uit de IPN- en webhookdocumentatie.
event_types[]strings / arrayvereistPublieke HTTPS-ontvanger en factuurgebeurtenisnamen uit de IPN- en webhookdocumentatie.
enabledbooleansoptioneelAanmaken geeft het ondertekeningsgeheim één keer terug. Dit zijn betalingscallbacks van winkels, geen Operator-levenscyclusgebeurtenissen.
automatic_redeliverybooleansoptioneelAanmaken geeft het ondertekeningsgeheim één keer terug. Dit zijn betalingscallbacks van winkels, geen Operator-levenscyclusgebeurtenissen.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"signing_secret": "EXAMPLE_ONLY_SAVE_ONCE",
"endpoint": {
"id": "44444444-4444-4444-8444-444444444444",
"name": "Orders",
"enabled": true
},
"secret_visible_once": true
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTWinkelwebhook bijwerken/v1/operator/merchants/{merchant_id}/projects/{project_id}/stores/{store_id}/webhooks/{webhook_id}Lezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
store_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
webhook_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
namestrings / arrayvereistPublieke HTTPS-ontvanger en factuurgebeurtenisnamen uit de IPN- en webhookdocumentatie.
urlstrings / arrayvereistPublieke HTTPS-ontvanger en factuurgebeurtenisnamen uit de IPN- en webhookdocumentatie.
event_types[]strings / arrayvereistPublieke HTTPS-ontvanger en factuurgebeurtenisnamen uit de IPN- en webhookdocumentatie.
enabledbooleansoptioneelAanmaken geeft het ondertekeningsgeheim één keer terug. Dit zijn betalingscallbacks van winkels, geen Operator-levenscyclusgebeurtenissen.
automatic_redeliverybooleansoptioneelAanmaken geeft het ondertekeningsgeheim één keer terug. Dit zijn betalingscallbacks van winkels, geen Operator-levenscyclusgebeurtenissen.
Antwoord 200 application/json
Voorbeeldantwoord
{
"id": "44444444-4444-4444-8444-444444444444",
"name": "Orders",
"enabled": true
}Antwoordvelden
Gebruiksopmerkingen
- Vereist projects.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETFacturen opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoicesAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
Queryparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"limit": 25,
"offset": 0,
"total": 0,
"has_more": false
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist reports.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETFactuur ophalen/v1/operator/merchants/{merchant_id}/projects/{project_id}/invoices/{invoice_id}Alleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
invoice_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"invoice_id": "44444444-4444-4444-8444-444444444444",
"project_id": "33333333-3333-4333-8333-333333333333",
"amount": "25",
"currency": "EUR",
"status": "new",
"metadata": {},
"payment_intents": []
}Antwoordvelden
Gebruiksopmerkingen
- Vereist reports.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
- invoice_id is de publieke factuur-ID die bij aanmaak en in callbacks wordt teruggegeven, niet de interne id.
Fouten
GETWallets opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/walletsAlleen-lezen
Lees gecachte publieke walletsaldi, nooit private sleutels of herstelzinnen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist reports.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Saldi zijn gecachte waarnemingen met actualiteitsvelden, geen garantie van een besteedbaar saldo. Verzenden en sleutelexport zijn niet beschikbaar via deze API.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETWalletadressen opvragen/v1/operator/merchants/{merchant_id}/projects/{project_id}/wallets/{wallet_id}/addressesAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
project_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
wallet_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
limitoptioneelLimiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.Details
Limiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.
beforeoptioneelLimiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.Details
Limiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.
searchoptioneelLimiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.Details
Limiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.
has_balanceoptioneelLimiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.Details
Limiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.
hide_small_balancesoptioneelLimiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.Details
Limiet 1–50, standaard 25. Geef voor de volgende pagina next_cursor mee als before. Laat before weg voor pagina 1. has_balance=false en hide_small_balances=false nemen lege/kleine saldi mee.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist reports.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETHandelaars-API-referenties opvragen/v1/operator/merchants/{merchant_id}/api-credentialsAlleen-lezen
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Queryparameters
pageoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
searchoptioneelPaginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.Details
Paginanummering vanaf 1, 25 items per pagina. Zoeken wordt ondersteund voor handelaars, gebruikers, projecten, winkels, wallets, API-referenties en webhooks; oorspronkelijke gebeurtenislijsten gebruiken hun specifieke filters.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"page": 1,
"page_size": 25,
"total": 0
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchant_credentials.read; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTHandelaars-API-referentie maken/v1/operator/merchants/{merchant_id}/api-credentialsLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
merchant_idUUIDvereistCanonieke resource-UUID in kleine letters; moet binnen het handelaarsbereik van de API-referentie vallen.
Verzoek
: "${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))Requestbody
access_levelread_only | read_writeoptioneelLezen/schrijven schakelt het bestaande handelaars-API-contract in.
project_ids[]UUID[]Alleen projecten van de geselecteerde handelaar; een lege lijst volgt het bestaande beleid voor alle handelaarsprojecten.
enabledoptioneelBestaande instellingen voor handelaarssleutels. Geheim wordt slechts één keer teruggegeven; vereist merchant_credentials.write.
ip_restriction_enabledoptioneelBestaande instellingen voor handelaarssleutels. Geheim wordt slechts één keer teruggegeven; vereist merchant_credentials.write.
allowed_ips[]optioneelBestaande instellingen voor handelaarssleutels. Geheim wordt slechts één keer teruggegeven; vereist merchant_credentials.write.
requests_per_minuteoptioneelBestaande instellingen voor handelaarssleutels. Geheim wordt slechts één keer teruggegeven; vereist merchant_credentials.write.
Antwoord 201 or 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchant_credentials.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTHandelaars-API-referentie bijwerken/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}Lezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Requestbody
namefieldsvereistVerstuur de volledige huidige configuratie van de API-referentie met wijzigingen. project_ids is standaard []; requests_per_minute is standaard het handelaars-API-quotum.
access_levelfieldsvereistVerstuur de volledige huidige configuratie van de API-referentie met wijzigingen. project_ids is standaard []; requests_per_minute is standaard het handelaars-API-quotum.
enabledfieldsvereistVerstuur de volledige huidige configuratie van de API-referentie met wijzigingen. project_ids is standaard []; requests_per_minute is standaard het handelaars-API-quotum.
ip_restriction_enabledfieldsvereistVerstuur de volledige huidige configuratie van de API-referentie met wijzigingen. project_ids is standaard []; requests_per_minute is standaard het handelaars-API-quotum.
allowed_ips[]fieldsvereistVerstuur de volledige huidige configuratie van de API-referentie met wijzigingen. project_ids is standaard []; requests_per_minute is standaard het handelaars-API-quotum.
project_ids[]arrayAntwoord 200 application/json
Voorbeeldantwoord
{
"id": "22222222-2222-4222-8222-222222222222",
"name": "Checkout",
"access_level": "read_only",
"project_ids": [
"33333333-3333-4333-8333-333333333333"
],
"enabled": true
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchant_credentials.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTHandelaars-API-referentie vernieuwen/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/rotateLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}Antwoordvelden
Gebruiksopmerkingen
- Vereist merchant_credentials.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTHandelaars-API-referentie intrekken/v1/operator/merchants/{merchant_id}/api-credentials/{credential_id}/revokeLezen + schrijven
Beheer of bekijk de genoemde resource van een gehoste handelaar met een afzonderlijke Operator-API-referentie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_OPERATOR_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; duurzaam opgeslagen voor deze actie |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"revoked": true
}Antwoordvelden
revokedbooleanGebruiksopmerkingen
- Vereist merchant_credentials.write; alleen toegestane gehoste handelaars. Operator-sleutels hebben geen toegang tot de werkruimte van het eigen bedrijf van de eigenaar.
- Sla vóór verzenden een unieke Idempotency-Key en de exacte body duurzaam op. Nieuwe pogingen herhalen nooit een vastgelegde actie. Geheime velden worden bij herhaling weggelaten; als een antwoord met een geheim verloren is gegaan, bekijk dan de gemaakte resource en vernieuw/geef het expliciet opnieuw uit. Een 409 operator_request_in_progress kan duiden op een onderbroken verzoek met onbekend resultaat: bekijk resource/audit; probeer niet blind opnieuw met een nieuwe sleutel.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTUitnodigingstoken controleren/v1/onboarding/invitations/checkPubliek
Aansluiting uitsluitend met token. Accepteert geen Operator-sleutel en meldt niet automatisch aan. Consoleaanmelding vereist nog steeds Basic Auth van de site en bestaande TOTP.
Authenticatie & headers
Publiek
Verzoek
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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"kind": "invitation",
"email": "admin@example.test",
"merchant_name": "Example shop"
}Antwoordvelden
Gebruiksopmerkingen
- Uitnodiging voor 48 uur; wachtwoordherstellink voor één uur. Eenmalige gehashte tokens. Opnieuw uitgeven trekt de eerdere link in. Acceptatie behoudt TOTP en trekt oude sessies in.
- Geen automatische nieuwe pogingen. Controleer bij een time-out tijdens acceptatie de linkstatus en probeer in te loggen; neem niet aan dat het mislukt is. Aanvraaglimiet op basis van waargenomen bron-IP. De ontvanger moet zelf het sleutelbeheer erkennen.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
POSTUitnodiging of wachtwoordherstel accepteren/v1/onboarding/invitations/acceptPubliek
Aansluiting uitsluitend met token. Accepteert geen Operator-sleutel en meldt niet automatisch aan. Consoleaanmelding vereist nog steeds Basic Auth van de site en bestaande TOTP.
Authenticatie & headers
Publiek
Verzoek
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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"password_set": true
}Antwoordvelden
password_setbooleanGebruiksopmerkingen
- Uitnodiging voor 48 uur; wachtwoordherstellink voor één uur. Eenmalige gehashte tokens. Opnieuw uitgeven trekt de eerdere link in. Acceptatie behoudt TOTP en trekt oude sessies in.
- Geen automatische nieuwe pogingen. Controleer bij een time-out tijdens acceptatie de linkstatus en probeer in te loggen; neem niet aan dat het mislukt is. Aanvraaglimiet op basis van waargenomen bron-IP. De ontvanger moet zelf het sleutelbeheer erkennen.
- Antwoordvoorbeelden tonen geselecteerde velden. Beschouw aanvullende antwoordvelden als uitbreidingen.
Fouten
GETMogelijkheden/v1/marketplace/capabilitiesAlleen-lezen
Deelnemende winkels, ingestelde activa, ondersteunde uitbetalingsroutes, eigen munt voor kosten en redenen voor gereedheid. Tijdelijke scannerbeschikbaarheid vergroot de toegestane activaverzameling niet.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETMarketplace-rapport/v1/marketplace/overviewAlleen-lezen
Filter store_id, asset_id, from en to (inclusief YYYY-MM-DD, UTC; standaard de laatste 30 dagen; maximaal tien jaar). Exacte accountsaldi op de einddatum en wijzigingen in de periode. Geen geschatte fiatinkomsten. Een winkelfilter sluit projectbrede kosten zonder factuur uit.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETProjectinstellingen/v1/marketplace/settingsAlleen-lezen
Geeft enabled, payouts_paused, commission_percent, revision en deelnemende winkels terug.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTProjectinstellingen opslaan/v1/marketplace/settingsLezen + schrijven
Vervang de selectie van deelnemende winkels. revision 0 initialiseert instellingen; latere wijzigingen vereisen de teruggegeven revision. Commissie is een decimaal percentage, 0–100 met maximaal twee decimalen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | policies.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist policies.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETVerkopers opvragen/v1/marketplace/vendorsAlleen-lezen
Gepagineerde verkopers. Zoek met q op naam, externe ID of e-mail; status active, suspended of archived.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTVerkoper maken/v1/marketplace/vendorsLezen + schrijven
Naam vereist (160 tekens); external_id optioneel en uniek binnen het project (128); email optioneel (254); description maximaal 2000. commission_percent null neemt de winkelinstelling over. Een afwijking anders dan null vereist ook commissions.override. Verkopers zijn geen gehoste handelaarsaccounts.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | vendors.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist vendors.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETVerkoper ophalen/v1/marketplace/vendors/{vendor_id}Alleen-lezen
Geef één verkoper, revisie en afwijkende commissie terug.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTVerkoper bijwerken/v1/marketplace/vendors/{vendor_id}/updateLezen + schrijven
Werk verkoperdetails bij; status active of suspended. commission_percent wijzigen of verwijderen vereist ook commissions.override; ongewijzigde waarden vereisen alleen vendors.write. Een gearchiveerde verkoper herstellen vereist ook reconciliation.write. Financiële wijzigingen via de console vereisen herauthenticatie van het account. Bestaande toewijzingen behouden hun oorspronkelijke commissie en bestemmingen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | vendors.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist vendors.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTVerkoper archiveren/v1/marketplace/vendors/{vendor_id}/archiveLezen + schrijven
Archiveer pas nadat onbetaalde en openstaande factuurverplichtingen zijn opgelost; anders volgt 409 vendor_has_obligations. Geschiedenis blijft bewaard. Gebruik tijdelijk de status suspended of herstel een oude gearchiveerde verkoper via de updateroute en reconciliation.write.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | vendors.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist vendors.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETVerkopersbestemmingen/v1/marketplace/vendors/{vendor_id}/destinationsAlleen-lezen
Bestemmingen met versies en statussen pending/approved/disabled. Goedkeuring bewijst geen eigendom.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTUitbetalingsbestemming toevoegen/v1/marketplace/vendors/{vendor_id}/destinationsLezen + schrijven
Registreer een geldig mainnet-BTC-adres of ondersteund EVM-adres, in afwachting van goedkeuring. Adressen van het project, verkeerde netwerken en nuladressen op EVM worden afgewezen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | destinations.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist destinations.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTBestemming goedkeuren/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/approveLezen + schrijven
Verifieer eigendom eerst onafhankelijk. Schakel eerst een bestaande goedgekeurde bestemming voor deze verkoper/dit netwerk uit; oude momentopnamen worden niet omgeleid.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | destinations.approve |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist destinations.approve. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTBestemming uitschakelen/v1/marketplace/vendors/{vendor_id}/destinations/{destination_id}/disableLezen + schrijven
Stop nieuw/niet-verzonden werk met deze versie. Een ondertekende transactie kan niet worden ingetrokken.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | destinations.approve |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist destinations.approve. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETVerkoperssaldi/v1/marketplace/vendors/{vendor_id}/balancesAlleen-lezen
Exacte bewaarde grootboekbedragen, gegroepeerd op onwijzigbare activa-identiteit en accounttype; geen live besteedbare walletsaldi.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETMarketplace-facturen/v1/marketplace/invoicesAlleen-lezen
Gepagineerde facturen; q zoekt op bestelling, e-mail, omschrijving, metadata en factuur-UUID. Filter op store_id, vendor_id en Marketplace-status. Gewone facturen zijn uitgesloten.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTFactuur voor meerdere verkopers maken/v1/marketplace/invoicesLezen + schrijven
Hergebruik normale InvoiceCreateInput-velden, plus store_id en allocations. Elke verkoper komt één keer voor, 1–100 positieve aandelen, som exact gelijk aan amount. Optionele commission_percent per factuur/toewijzing vereist commissions.override en herauthenticatie in de console voor sessieverzoeken. Geeft data.invoice_id en links.checkout terug. Zonder compatibele gemeenschappelijke methode volgt een gedetailleerde fout; er wordt niet teruggevallen op een onverenigbaar actief.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | invoices.write |
Verzoek
: "${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))Requestbody
amountstringvereistGewone decimale tekenreeks zonder teken; geen teken of exponent, maximaal 48 cijfers vóór en 30 na de komma. Moet standaard positief zijn. Een winkel kan facturen met nulbedrag toestaan onder Winkels → Factuur; nultotalen worden voldaan zonder geld te ontvangen, adressen toe te wijzen of verwerkingskosten.Details
Gewone decimale tekenreeks zonder teken; geen teken of exponent, maximaal 48 cijfers vóór en 30 na de komma. Moet standaard positief zijn. Een winkel kan facturen met nulbedrag toestaan onder Winkels → Factuur; nultotalen worden voldaan zonder geld te ontvangen, adressen toe te wijzen of verwerkingskosten.
currencystring | nulloptioneelOndersteunde fiatvaluta met drie letters, genormaliseerd naar hoofdletters. Weggelaten of null neemt de factuurvaluta van de winkel over. Aanmaak vereist ook een onafhankelijk beschikbare omrekenkoers voor facturering.Details
Ondersteunde fiatvaluta met drie letters, genormaliseerd naar hoofdletters. Weggelaten of null neemt de factuurvaluta van de winkel over. Aanmaak vereist ook een onafhankelijk beschikbare omrekenkoers voor facturering.
payment_methods[]object[] | nulloptioneel
Selecteer voor deze factuur methoden die in de winkel zijn ingeschakeld. Merchant 5.4.0+: negeer onbekende/inactieve/niet-geaccepteerde keuzes; als niets overeenkomt, gebruik de winkelstandaarden. Weggelaten/null gebruikt ook de winkelstandaarden; [] is ongeldig. Schakelt nooit een methode in en wijzigt geen winkelinstellingen. Zie het selectieschema hieronder.Details
Selecteer voor deze factuur methoden die in de winkel zijn ingeschakeld. Merchant 5.4.0+: negeer onbekende/inactieve/niet-geaccepteerde keuzes; als niets overeenkomt, gebruik de winkelstandaarden. Weggelaten/null gebruikt ook de winkelstandaarden; [] is ongeldig. Schakelt nooit een methode in en wijzigt geen winkelinstellingen. Zie het selectieschema hieronder.
chain_slugstringvereistKopieer chain_slug in Project → Winkels → Betaalmethoden of lees deze uit GET /v1/projects/{project_id}/stores/{store_id}/payment-assets, zoals ethereum, base of bitcoin. Een blockchain-/betaalroutepaar mag maar één keer voorkomen.Details
Kopieer chain_slug in Project → Winkels → Betaalmethoden of lees deze uit GET /v1/projects/{project_id}/stores/{store_id}/payment-assets, zoals ethereum, base of bitcoin. Een blockchain-/betaalroutepaar mag maar één keer voorkomen.
asset_ids[]UUID[] | nulloptioneelasset.id-UUID's van blockchainactiva, geen contractadressen of factuur-betaalmethode-ID's. Gebruik dit OF asset_tickers. Laat beide selectoren weg voor alle actieve geaccepteerde activa op deze blockchain. [] en dubbele/nul-ID's zijn ongeldig. Negeer op 5.4.0+ ID's die op deze blockchain in deze winkel niet actief/geaccepteerd zijn; een volledig niet-overeenkomende selectie gebruikt winkelstandaarden.Details
asset.id-UUID's van blockchainactiva, geen contractadressen of factuur-betaalmethode-ID's. Gebruik dit OF asset_tickers. Laat beide selectoren weg voor alle actieve geaccepteerde activa op deze blockchain. [] en dubbele/nul-ID's zijn ongeldig. Negeer op 5.4.0+ ID's die op deze blockchain in deze winkel niet actief/geaccepteerd zijn; een volledig niet-overeenkomende selectie gebruikt winkelstandaarden.
asset_tickers[]string[] | nulloptioneelMerchant 5.3.0+. Symbolen zoals BTC, USDC of PEPE, beperkt tot chain_slug en deze winkel. 1–64 unieke tickersymbolen; witruimte aan uiteinden verwijderd/hoofdletterongevoelig, 1–40 ASCII-letters/cijfers/punt/underscore/koppelteken. Gebruik dit OF asset_ids. Negeer op 5.4.0+ onbekende/inactieve/niet-geaccepteerde tickersymbolen. Dubbelzinnige geaccepteerde symbolen blijven een fout geven: gebruik asset_ids. Actieve geselecteerde methoden hebben geldige wallets en prijsbepaling nodig; tijdelijke storingen van blockchainscanners blokkeren aanmaak vanaf 6.0.6 niet. Lightning accepteert optioneel alleen BTC.Details
Merchant 5.3.0+. Symbolen zoals BTC, USDC of PEPE, beperkt tot chain_slug en deze winkel. 1–64 unieke tickersymbolen; witruimte aan uiteinden verwijderd/hoofdletterongevoelig, 1–40 ASCII-letters/cijfers/punt/underscore/koppelteken. Gebruik dit OF asset_ids. Negeer op 5.4.0+ onbekende/inactieve/niet-geaccepteerde tickersymbolen. Dubbelzinnige geaccepteerde symbolen blijven een fout geven: gebruik asset_ids. Actieve geselecteerde methoden hebben geldige wallets en prijsbepaling nodig; tijdelijke storingen van blockchainscanners blokkeren aanmaak vanaf 6.0.6 niet. Lightning accepteert optioneel alleen BTC.
payment_railonchain | lightningoptioneelStandaard onchain. Gebruik om Bitcoin Lightning te kiezen {chain_slug: bitcoin, payment_rail: lightning} zonder asset_ids; asset_tickers mag optioneel [BTC] zijn. Bitcoin op de blockchain omvat Lightning niet. De Lightning-verbinding van de winkel moet al ingeschakeld en gereed zijn.Details
Standaard onchain. Gebruik om Bitcoin Lightning te kiezen {chain_slug: bitcoin, payment_rail: lightning} zonder asset_ids; asset_tickers mag optioneel [BTC] zijn. Bitcoin op de blockchain omvat Lightning niet. De Lightning-verbinding van de winkel moet al ingeschakeld en gereed zijn.
order_idstring | nulloptioneelBestelreferentie van de handelaar, 1–128 tekens na verwijderen van witruimte aan de uiteinden; stuurtekens worden afgewezen.
emailstring | nulloptioneelE-mailadres van de klant, alleen voor de handelaar, genormaliseerd naar een praktisch ASCII-adres van maximaal 254 tekens. Weggelaten of null slaat geen e-mailadres op.
descriptionstring | nulloptioneelOmschrijving voor de klant, 1–500 tekens; regeleinden en tabs zijn toegestaan.
expires_in_secondsinteger | nulloptioneelGeldigheidsduur van de factuurprijsopgave van 300 tot en met 86,400 seconden; weggelaten of null neemt het winkelbeleid over.
exchange_rate_spread_percentdecimal string | nulloptioneelPrijsopslag van 0 tot en met 100, met maximaal twee decimalen. Weggelaten of null neemt de winkelstandaard over; "0" schakelt deze uit voor deze factuur. Wordt vóór afronding naar boven toegepast en daarna vastgezet. Verandert het fiatbedrag van de factuur of de basis voor de verwerkingsvergoeding niet.Details
Prijsopslag van 0 tot en met 100, met maximaal twee decimalen. Weggelaten of null neemt de winkelstandaard over; "0" schakelt deze uit voor deze factuur. Wordt vóór afronding naar boven toegepast en daarna vastgezet. Verandert het fiatbedrag van de factuur of de basis voor de verwerkingsvergoeding niet.
underpayment_tolerance_percentdecimal string | nulloptioneelGeaccepteerd tekort van 0 tot en met 99.99 met maximaal twee decimalen. Weggelaten of null neemt de winkelstandaard over.
ipn_urlstring | nulloptioneelPublieke HTTPS-callback, maximaal 2,048 bytes en zonder inloggegevens of fragment. Overschrijft de winkelstandaard; null/weggelaten neemt die over.
redirect_urlstring | nulloptioneelHTTPS-succes-URL die na voldoening wordt gebruikt, maximaal 2,048 bytes en zonder ingebedde inloggegevens. Weggelaten of null neemt de winkelstandaard over en kan die niet wissen.
cancel_urlstring | nulloptioneelHTTPS-terugkeer-URL die wordt gebruikt als afrekenen zonder succesvolle betaling eindigt. Weggelaten of null neemt de winkelstandaard over en kan die niet wissen.
redirect_automaticallyboolean | nulloptioneelWeggelaten of null neemt het winkelbeleid over. true vereist een effectieve redirect_url.
languagestring | nulloptioneelKlanttaal: en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja. pt betekent Braziliaans Portugees en zh betekent vereenvoudigd Chinees. Ondersteunde regionale tags zoals de-DE worden genormaliseerd naar de vermelde taal. Weggelaten of null neemt de winkeltaal over. De consoletaal staat hier los van.Details
Klanttaal: en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja. pt betekent Braziliaans Portugees en zh betekent vereenvoudigd Chinees. Ondersteunde regionale tags zoals de-DE worden genormaliseerd naar de vermelde taal. Weggelaten of null neemt de winkeltaal over. De consoletaal staat hier los van.
checkout_appearanceobject | nulloptioneel
Gedeeltelijke presentatie-instellingen voor deze factuur. Weggelaten/null volgt het huidige winkelontwerp. Een object, inclusief {}, zet het berekende ontwerp en de afbeeldingen bij aanmaak vast. Zie het afwijkingsschema hieronder; geen financiële instellingen, HTML, CSS, JavaScript of externe afbeeldings-URL's.Details
Gedeeltelijke presentatie-instellingen voor deze factuur. Weggelaten/null volgt het huidige winkelontwerp. Een object, inclusief {}, zet het berekende ontwerp en de afbeeldingen bij aanmaak vast. Zie het afwijkingsschema hieronder; geen financiële instellingen, HTML, CSS, JavaScript of externe afbeeldings-URL's.
inherit_default_storebooleanoptioneeltrue kiest het ontwerp van de standaardwinkel van het project als basis; gebruik anders het effectieve ontwerp van de doelwinkel. Afwijkingen worden daarna toegepast en onafhankelijk opgeslagen; de uiteindelijke factuurvlag is false.Details
true kiest het ontwerp van de standaardwinkel van het project als basis; gebruik anders het effectieve ontwerp van de doelwinkel. Afwijkingen worden daarna toegepast en onafhankelijk opgeslagen; de uiteindelijke factuurvlag is false.
introstringoptioneelPlatte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.Details
Platte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.
outrostringoptioneelPlatte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.Details
Platte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.
intro_font_sizeintegeroptioneelPixels: 12, 14, 16, 18, 20 of 24. Standaard 16 tenzij anders overgenomen.
outro_font_sizeintegeroptioneelPixels: 12, 14, 16, 18, 20 of 24. Standaard 16 tenzij anders overgenomen.
accent_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
background_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
card_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
button_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
imagesobjectoptioneel
Sleutels logo_light, logo_dark, favicon. Een weggelaten sleutel behoudt de basisafbeelding; null verwijdert die. Een object {store_id: UUID, kind?: logo_light|logo_dark|favicon} hergebruikt de effectieve geüploade afbeelding van die winkel in HETZELFDE project. kind is standaard de doelsleutel. Upload eerst onder Winkel → Afrekenen; kopieer de Store-API-ID uit Basis → API-ID's. Ontbrekende afbeeldingen of ID's uit andere projecten geven 400 terug. Geen externe URL's of afbeeldingsgegevens toegestaan.Details
Sleutels logo_light, logo_dark, favicon. Een weggelaten sleutel behoudt de basisafbeelding; null verwijdert die. Een object {store_id: UUID, kind?: logo_light|logo_dark|favicon} hergebruikt de effectieve geüploade afbeelding van die winkel in HETZELFDE project. kind is standaard de doelsleutel. Upload eerst onder Winkel → Afrekenen; kopieer de Store-API-ID uit Basis → API-ID's. Ontbrekende afbeeldingen of ID's uit andere projecten geven 400 terug. Geen externe URL's of afbeeldingsgegevens toegestaan.
show_order_idbooleanoptioneelToon bestel-ID-details en een platte-tekstomschrijving onder de titel. details_expanded opent bestel-ID-details standaard. Alleen weergave, geen afscherming van gegevens.
show_descriptionbooleanoptioneelToon bestel-ID-details en een platte-tekstomschrijving onder de titel. details_expanded opent bestel-ID-details standaard. Alleen weergave, geen afscherming van gegevens.
details_expandedbooleanoptioneelToon bestel-ID-details en een platte-tekstomschrijving onder de titel. details_expanded opent bestel-ID-details standaard. Alleen weergave, geen afscherming van gegevens.
show_project_namebooleanoptioneelMerchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.Details
Merchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.
show_store_namebooleanoptioneelMerchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.Details
Merchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.
featured_chains[]string[]optioneelGeordende blockchain-slugs, maximaal 60 unieke waarden (kleine letters, cijfers, koppeltekens; maximaal 64 tekens). [] wist. Alleen beschikbare factuurmethoden worden opnieuw geordend.Details
Geordende blockchain-slugs, maximaal 60 unieke waarden (kleine letters, cijfers, koppeltekens; maximaal 64 tekens). [] wist. Alleen beschikbare factuurmethoden worden opnieuw geordend.
featured_asset_ids[]UUID[]optioneelMaximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.Details
Maximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.
default_asset_idUUID|nulloptioneelMaximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.Details
Maximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.
messagesobjectoptioneel
Taalobjecten met sleutels en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja, met gewone tekenreeksen waiting, confirming, paid, underpaid, expired (elk 500 tekens). Alleen aangeleverde talen/statussen veranderen; {} wist alle berichten, {en:{}} wist Engels en een lege statustekenreeks wist die status. Engels is de terugvaltaal. Vervangt de werkelijke status niet.Details
Taalobjecten met sleutels en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja, met gewone tekenreeksen waiting, confirming, paid, underpaid, expired (elk 500 tekens). Alleen aangeleverde talen/statussen veranderen; {} wist alle berichten, {en:{}} wist Engels en een lege statustekenreeks wist die status. Engels is de terugvaltaal. Vervangt de werkelijke status niet.
enobjectoptioneel
deobjectoptioneel
esobjectoptioneel
pt-BRobjectoptioneel
itobjectoptioneel
ruobjectoptioneel
zh-CNobjectoptioneel
frobjectoptioneel
koobjectoptioneel
support_urlstringoptioneelHTTPS-URL's tot 2,048 tekens, zonder inloggegevens. Leeg wist. Links openen in een nieuw venster.
terms_urlstringoptioneelHTTPS-URL's tot 2,048 tekens, zonder inloggegevens. Leeg wist. Links openen in een nieuw venster.
privacy_urlstringoptioneelHTTPS-URL's tot 2,048 tekens, zonder inloggegevens. Leeg wist. Links openen in een nieuw venster.
return_button_textstringoptioneelLabel tot 60 tekens. Gebruik redirect_url/cancel_url/redirect_automatically/language op het hoogste niveau voor factuurgedrag.
show_return_buttonbooleanoptioneelToon de handmatige knop Terug naar handelaar/annuleren op de afrekenpagina, inclusief eindstatussen. Laat weg om het winkeluiterlijk over te nemen (standaard true); false verbergt de knop. Annuleert geen factuur, verbergt geen URL's in JSON en schakelt automatische succesomleidingen niet uit. Stel zo nodig redirect_automatically op het hoogste niveau afzonderlijk in op false. Vereist merchant 8.1.4 of nieuwer.Details
Toon de handmatige knop Terug naar handelaar/annuleren op de afrekenpagina, inclusief eindstatussen. Laat weg om het winkeluiterlijk over te nemen (standaard true); false verbergt de knop. Annuleert geen factuur, verbergt geen URL's in JSON en schakelt automatische succesomleidingen niet uit. Stel zo nodig redirect_automatically op het hoogste niveau afzonderlijk in op false. Vereist merchant 8.1.4 of nieuwer.
metadataobject | nulloptioneel
JSON-object alleen voor de handelaar; weggelaten of null wordt {}, maximaal 4,096 gecodeerde bytes en vijf nestingsniveaus. firstname, lastname, street, street2, zip, city, country, countryiso2, company en vatid worden gevalideerd, genormaliseerd en overgenomen in samenvattingsvelden van de klant.Details
JSON-object alleen voor de handelaar; weggelaten of null wordt {}, maximaal 4,096 gecodeerde bytes en vijf nestingsniveaus. firstname, lastname, street, street2, zip, city, country, countryiso2, company en vatid worden gevalideerd, genormaliseerd en overgenomen in samenvattingsvelden van de klant.
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"}]Details
[{"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"}]
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {
"invoice_id": "YOUR_INVOICE_ID",
"status": "new",
"marketplace": {
"state": "pending",
"allocations": []
}
},
"links": {
"checkout": "https://pay.example.com/invoice/YOUR_INVOICE_ID"
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist invoices.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETFactuur en toewijzingen/v1/marketplace/invoices/{invoice_id}Alleen-lezen
Normale factuurdetails plus Marketplace-status, revision, hold_reason, vastgezette toewijzingen, beleidsmomentopname, de laatste 200 betalingen en laatste 100 gerelateerde uitbetalingen met afkapmarkeringen. Publiek afrekenen toont geen verkopersgegevens.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETBetalingsbewijs van factuur/v1/marketplace/invoices/{invoice_id}/paymentsAlleen-lezen
Normaal betalingsbewijs met page/per_page. Waarnemingen zijn geen verkopersuitbetalingen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETFactuurtoewijzingen/v1/marketplace/invoices/{invoice_id}/allocationsAlleen-lezen
Onwijzigbare momentopnamen van aandeel/commissie/bestemming en exacte bruto-, commissie- en netto-atoomwaarden na kwalificerende voldoening.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTOnbetaalde factuur annuleren/v1/marketplace/invoices/{invoice_id}/cancelLezen + schrijven
Alleen een onbetaalde factuur met status new of expired. Late ontvangsten worden vastgehouden voor beoordeling. Revision is de Marketplace-factuurrevisie.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | invoices.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist invoices.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTToewijzingen vasthouden/v1/marketplace/invoices/{invoice_id}/allocations/holdLezen + schrijven
Houd niet-ondertekende toewijzingen vast zonder verplichtingen te wissen. Ondertekende of onzekere uitbetalingen blijven gevolgd worden.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | reconciliation.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist reconciliation.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTToewijzingen beoordelen en vrijgeven/v1/marketplace/invoices/{invoice_id}/allocations/releaseLezen + schrijven
Controleer dekking/finaliteit opnieuw. Optioneel approved_amount_atomic accepteert expliciet een kleinere, volledig gedekte verdeling voordat toewijzingen worden vastgezet; verzint nooit ontvangen geld.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | reconciliation.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist reconciliation.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTOnbetaalde bestemming opnieuw koppelen/v1/marketplace/invoices/{invoice_id}/allocations/{allocation_id}/destinationLezen + schrijven
Toewijzingsrevisie vereist. Alleen niet-gereserveerd/niet-ondertekend werk en een afzonderlijk goedgekeurde versie voor dezelfde verkoper op het oorspronkelijke netwerk. Geaudit; ondertekend werk kan niet veranderen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | reconciliation.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist reconciliation.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTVolledige terugbetaling voorbereiden/v1/marketplace/invoices/{invoice_id}/refundLezen + schrijven
Bereid een afzonderlijk goed te keuren volledige terugbetaling van het ontvangen bedrag in hetzelfde actief voor. Reserveer vóór verkopersuitbetaling de onbetaalde middelen en draai commissie bij bevestiging terug. Gebruik na alle verkopersuitbetalingen afzonderlijke vrije middelen van het primaire adres. Leid het terugbetalingsadres van de klant nooit af van de afzender.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | reconciliation.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist reconciliation.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETUitbetalingstoewijzingen zoeken/v1/marketplace/allocationsAlleen-lezen
Gepagineerde kandidaten; filter op status (available enz.), asset_id, vendor_id, store_id en q (verkoper/bestelling/factuur).
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETGrootboeksaldi van project/v1/marketplace/balancesAlleen-lezen
Exacte gegroepeerde activa-/accounttotalen inclusief vastgehouden, beschikbaar, gereserveerd, betaald, commissie, terugbetalingen en netwerkkosten. De externe tegenrekening is uitgesloten.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETOnwijzigbaar journaal/v1/marketplace/ledgerAlleen-lezen
Gepagineerde boekingen waaraan alleen kan worden toegevoegd; filters q voor referentie/account, asset_id en vendor_id. Bedragen gebruiken atomaire tekenreeksen; geen boeking kan worden bewerkt of handmatig als betaald gemarkeerd.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETUitbetalingsgeschiedenis/v1/marketplace/payoutsAlleen-lezen
Gepagineerde bovenliggende records; filter op state, asset_id, vendor_id of q voor ID/symbool. Paid betekent onafhankelijke bevestiging, niet alleen uitzending.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTToewijzingsplan vooraf bekijken/v1/marketplace/payouts/previewLezen + schrijven
Boekhoudplan met alleen-lezen toegang, geen reservering of bestedingsbevoegdheid. Maximale kosten zijn een gebruikerslimiet, geen schatting van werkelijke kosten. Voorbereiding voert later actuele controles uit.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | payouts.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist payouts.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTUitbetaling voorbereiden/v1/marketplace/payoutsLezen + schrijven
Reserveer 1–100 beschikbare toewijzings-ID's in één actief/wallet. BTC vereist alle onbetaalde aandelen van elke geselecteerde factuur in één batch met meerdere outputs. Budgetten zijn atomaire tekenreeksen in de eigen munt voor kosten. Maakt een awaiting_approval-plan en zendt niets uit.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | payouts.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"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": []
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist payouts.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETUitbetalingsdetails/v1/marketplace/payouts/{payout_id}Alleen-lezen
Onwijzigbaar plan/hash, revision, vervaldatum, ontvangeritems, bewaarde onderliggende pogingen, voortgang, exacte kosten en explorerlinks. Nooit private sleutels of ondertekende bytes.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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": []
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTGoedkeuren en verzenden/v1/marketplace/payouts/{payout_id}/approveLezen + schrijven
Geef binnen de geldigheidsduur expliciet toestemming voor het exacte bewaarde plan. Zet begrensde gasfinanciering en verkoperstransacties op de achtergrond in de wachtrij.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | payouts.approve |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist payouts.approve. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTUitbetaling beoordelen en hervatten/v1/marketplace/payouts/{payout_id}/resumeLezen + schrijven
Alleen needs_attention. Hergebruik het bewaarde plan/hash; bevestigde ontvangers krijgen nooit opnieuw geld. Twee onafhankelijke providers moeten een canonieke, voldoende bevestigde EVM-revert bewijzen voordat een mislukte onderliggende transactie kan worden vervangen. Eerdere kosten blijven het goedgekeurde budget verbruiken en alle hashes blijven in de geschiedenis. Onbekende/gedeeltelijke tokenlevering geeft payout_recovery_unverified terug; reserveringen blijven vastgehouden.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | payouts.approve |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist payouts.approve. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTNiet-ondertekend werk annuleren/v1/marketplace/payouts/{payout_id}/cancelLezen + schrijven
Geef alleen reserveringen vrij waarvan vaststaat dat ze niet ondertekend/ingediend zijn. Bevestigde ontvangers en audit blijven behouden. Ondertekend/onzeker werk kan niet worden geannuleerd. Een expliciet herstelde, bewezen revert blokkeert het annuleren van resterend niet-ondertekend werk niet langer.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | payouts.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist payouts.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETAutomatisch uitbetalingsbeleid/v1/marketplace/policiesAlleen-lezen
Lees beleid per actief, revision, next_attempt_at, last_checked_at en een veilige last_error wanneer voorbereiding of autorisatie aandacht nodig heeft.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": []
}Antwoordvelden
data[]arrayGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTUitbetalingsbeleid autoriseren/v1/marketplace/policiesLezen + schrijven
Exacte atomaire tekenreeksen; minimum <= transfer <= dagelijkse hoofdsom, kosten-/gaslimieten <= hun dagbudgetten. interval_seconds 60–604800; minimum_confirmations 1–100000 afhankelijk van de blockchainondergrens. Revision 0 maakt aan. Ingeschakeld beleid kan zonder extra klikken verzenden; houd false totdat het is beoordeeld.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | policies.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist policies.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETMarketplace-webhooks/v1/marketplace/webhooksAlleen-lezen
Maximaal 20 eindpunten plus ondersteunde event_types. Geeft nooit versleutelde of onversleutelde ondertekeningsgeheimen terug.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
]
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTMarketplace-webhook maken/v1/marketplace/webhooksLezen + schrijven
Alleen publieke HTTPS, geen inloggegevens, private bestemmingen of omleidingen. Geeft signing_secret één keer terug per bewaard idempotent aanmaakantwoord; bewaar veilig. Staat los van het IPN-geheim van de winkel.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | webhooks.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist webhooks.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTMarketplace-webhook bijwerken/v1/marketplace/webhooks/{webhook_id}/updateLezen + schrijven
Wijzigingen annuleren oude niet-verzonden bezorgingen. Het geheim blijft ongewijzigd; oude onwijzigbare payloads worden nooit omgeleid naar een nieuwe URL.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | webhooks.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist webhooks.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTMarketplace-webhook uitschakelen/v1/marketplace/webhooks/{webhook_id}/disableLezen + schrijven
Stop nieuwe bezorgingen; bewaarde gebeurtenisgeschiedenis blijft bestaan.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | webhooks.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist webhooks.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETMarketplace-gebeurtenissen/v1/marketplace/eventsAlleen-lezen
Gepagineerde onwijzigbare gebeurtenisreferenties. q zoekt op type/referentie; status filtert event_type.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETBewaarde gebeurtenis lezen/v1/marketplace/events/{event_id}Alleen-lezen
Geeft de onwijzigbare oorspronkelijke gebeurtenispayload terug, geen reconstructie op basis van huidige saldi.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}
]
}
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETMarketplace-bezorggeschiedenis/v1/marketplace/webhook-deliveriesAlleen-lezen
Gepagineerde bezorgingen, gebeurtenistype, pogingen en laatste resultaat. Filter status pending/sending/succeeded/failed/cancelled; q voor gebeurtenistype.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"pages": 1
}
}Antwoordvelden
Gebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETBezorgdetails/v1/marketplace/webhook-deliveries/{delivery_id}Alleen-lezen
Oorspronkelijke URL, bewaarde payload, HTTP-resultaat en veilige foutmelding; geen ondertekeningsgeheim.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | marketplace.read |
Queryparameters
pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
per_pageoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
qoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
statusoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
store_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
vendor_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
asset_idoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
fromoptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
tooptioneelGebruik alleen filters die voor deze resource zijn gedocumenteerd. Gepagineerde lijsten bevatten standaard 25 en maximaal 100 rijen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist marketplace.read. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
POSTDezelfde gebeurtenis opnieuw bezorgen/v1/marketplace/webhook-deliveries/{delivery_id}/resendLezen + schrijven
Alleen voltooide bezorgingen en het ongewijzigde actieve eindpunt; maximaal 20 handmatige nieuwe pogingen. Hergebruikt event_id. Een mislukte melding geeft nooit toestemming voor een tweede betaling.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MARKETPLACE_API_TOKEN |
| Idempotency-Key | vereist | 16–128 letters, cijfers, -, _ of .; sla duurzaam op bij dit exacte verzoek |
| Parameter | Type / locatie | Regel |
|---|---|---|
| permission | credential scope | webhooks.write |
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"data": {}
}Antwoordvelden
dataobjectGebruiksopmerkingen
- Vereist webhooks.write. Antwoordvoorbeelden tonen geselecteerde velden; gebruik GET op de resource voor het volledige bewaarde bewijs.
- Elke POST vereist een duurzaam opgeslagen Idempotency-Key van 16–128 tekens (letters, cijfers, -, _ of .). Hergebruik na een time-out dezelfde sleutel en JSON-instructies. Andere instructies geven 409 terug. Voltooide antwoorden worden 30 dagen bewaard; oude sleutels worden blijvend gemarkeerd als niet herbruikbaar. Wijzig een sleutel nooit alleen om een onzeker resultaat te omzeilen.
- Sleutels hebben projectlijsten, optionele beperkingen voor factuurwinkels, een vervaldatum, IP-toelatingslijst en een quotum van 1–600/minuut (standaard 60). HTTP 429 bevat Retry-After. Sleutels die tot winkels zijn beperkt, kunnen geen verkopers, projectsaldi, grootboek, uitbetalingen of instellingen zien. Bewaar bestedingsreferenties uitsluitend op vertrouwde servers, nooit in browsers of uitgeleverde mobiele apps.
Fouten
GETBetalingsuitzonderingen opvragen/v1/projects/{project_id}/reconciliationAlleen-lezen
Eén gepagineerde beoordelingswachtrij voor onderbetaalde, overbetaalde, late, gereorganiseerde of onduidelijke betalingen, mislukte bezorgingen en uitgeschakelde/verlopen methoden. Door een operator afgehandelde gevallen worden bij nieuw bewijs heropend.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
Padparameters
Queryparameters
reasonstringunderpaid, overpaid, late, reorged, ambiguous, delivery_failed, disabled_method of expired_method.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{"data":[],"pagination":{"page":1,"per_page":25,"total":0,"has_more":false},"counts":{"open":0,"resolved":0}}Antwoordvelden
data[]object[]altijd
Meest recent bijgewerkte gevallen eerst. Gebruik invoice_id, niet de interne id, in handelaarsdetail-URL's.
idUUIDaltijdInterne record-ID / factuur-UUID voor de klant. invoice_id komt overeen met callbackpayloads.
invoice_idUUIDaltijdInterne record-ID / factuur-UUID voor de klant. invoice_id komt overeen met callbackpayloads.
paginationobjectaltijd
page (1–40001), per_page (25), total overeenkomende rijen, has_more.
Gebruiksopmerkingen
- Alleen-lezen, projectgebonden en vallend onder het quotum van de API-referentie. Financiële beslissingen en terugbetalingen blijven uitsluitend via de console beschikbaar.
- Rijen bevatten id (interne UUID), invoice_id (publieke UUID, gelijk aan callbacks), winkelinformatie, oorspronkelijk fiatbedrag/valuta, invoice_status, gevalstatus, redenen, revision en updated_at. Gebruik invoice_id in het handelaarsdetaileindpunt.
- Automatische detectie volgt het oorspronkelijke monitoringsvenster van de factuur; Opnieuw scannen verlengt de waarneming met één uur zonder afrekenen in te schakelen. Methoden na voldoening of annulering blijven binnen dat venster gevolgd worden.
Fouten
GETAfstemmingsbewijs lezen/v1/projects/{project_id}/reconciliation/{invoice_id}Alleen-lezen
Geeft factuur, geval, exacte methodetotalen en beschikbare terugbetalingsbedragen, waargenomen transacties, bezorggeschiedenis, handelaarsbeslissingen en gekoppelde terugbetalingsoverdrachten terug. Toont nooit ondertekeningssleutels of callbackgeheimen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
Padparameters
Queryparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{"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":[]}Antwoordvelden
invoiceobjectaltijd
Volledige handelaarsfactuur: samenvattingsvelden, private metadata en payment_intents. Niet verpakt in data.
invoice_idUUIDaltijdPublieke factuur-UUID die door handelaarsdetail- en afrekenpaden wordt gebruikt.
emailstring | nullaltijdE-mailadres van de klant, alleen voor de handelaar. Wordt nooit door publiek afrekenen teruggegeven.
customer_namestring | nullaltijdAfgeleide weergavenaam uit private metadata firstname, lastname en company.
customer_addressstring | nullaltijdAfgeleid handelaarsadres op één regel uit private metadata company, street, street2, zip, city, country, countryiso2 en vatid.
exchange_rate_spread_percentdecimal stringaltijdVastgezette prijsopslag: de afwijking bij aanmaak of de winkelstandaard bij weglaten. Toegepast vóór afronding naar boven; verandert nooit op deze factuur.
underpayment_tolerance_percentdecimal stringaltijdOnwijzigbaar geaccepteerd tekortpercentage, vastgelegd bij het maken van de factuur.
amount_statusamount statusaltijdnone, partial, paid of overpaid. Een expliciet toegestane factuur met nulbedrag wordt voldaan met none en zonder betaalmethoden.
winning_payment_intent_idUUID | nullaltijdBetaalmethode die de factuur heeft afgehandeld, wanneer geselecteerd.
monitoring_expires_atRFC 3339 timestampaltijdLaatste ingestelde grens voor controle op late betalingen over alle betaalmethoden.
ipn_urlstring | nullaltijdEffectieve IPN-bestemming per factuur. Alleen handelaarsantwoord; weggelaten uit publiek afrekenen.
cancel_urlstring | nullaltijdEffectieve terugkeer-URL die wordt gebruikt als afrekenen zonder succesvolle betaling eindigt.
metadataobjectaltijdHandelaarsmetadata. Wordt nooit door publiek afrekenen teruggegeven. Betaalhulpmiddelen in de console voegen payment_tool-herkomst toe (id, kind, title, pricing, requested_amount, request_id); dit bewijst geen betaling. Authenticeer callbacks en handel invoice.settled één keer per invoice_id af.Details
Handelaarsmetadata. Wordt nooit door publiek afrekenen teruggegeven. Betaalhulpmiddelen in de console voegen payment_tool-herkomst toe (id, kind, title, pricing, requested_amount, request_id); dit bewijst geen betaling. Authenticeer callbacks en handel invoice.settled één keer per invoice_id af.
payment_intents[]object[]altijd
Geoffreerde betaalmethoden en monitoringsstatus.
idUUIDaltijdIdentificatie van de betalingsintentie; ook gebruikt als intent_id voor de afreken-QR-code.
payment_railonchain | lightningaltijdFactuurtransport. Bitcoin op de blockchain en Lightning kunnen asset_id delen; gebruik de intentie-id plus dit veld, niet alleen het symbool. Dit verschilt van de scanner-payment_rail in de activacatalogus.Details
Factuurtransport. Bitcoin op de blockchain en Lightning kunnen asset_id delen; gebruik de intentie-id plus dit veld, niet alleen het symbool. Dit verschilt van de scanner-payment_rail in de activacatalogus.
bolt11string | nullaltijdLightning-betaalverzoek, anders null. Betaal dit verzoek met een Lightning-wallet; stuur nooit blockchainmiddelen naar de betalingshash.
asset_decimalsintegeraltijdPrecisie in atomaire eenheden. Lightning BTC gebruikt 11 (millisatoshi's), niet de 8 van Bitcoin op de blockchain. Prijsopgaven zijn hele satoshi's; ontvangsten behouden millisatoshiprecisie.
quote_ratedecimal stringaltijdEenheden van het actief per één eenheid factuurvaluta, inclusief de vastgezette opslag. Bijvoorbeeld 1.02 USDC per USD. Niet de omgekeerde koers.
quote_detailsobject | nullaltijdVastgezette herkomst van de prijsopgave: reference_rate vóór opslag, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at en asset_fetched_at. Null bij oudere facturen; er worden geen historische waarden verzonnen.Details
Vastgezette herkomst van de prijsopgave: reference_rate vóór opslag, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at en asset_fetched_at. Null bij oudere facturen; er worden geen historische waarden verzonnen.
expected_amountdecimal stringaltijdExact vastgezet te betalen activabedrag na opslag en afronding naar boven. Vanaf 4.1.1 worden herkende geverifieerde fiatstablecoins (zoals USDC, USDT, DAI, USDS, EURC) naar boven afgerond op maximaal twee decimalen; 1.321 wordt 1.33, nooit 1.32. Dit is het verwachte bedrag, ook bij nultolerantie. Andere activa behouden adaptieve precisie. Bestaande facturen worden nooit opnieuw geprijsd.Details
Exact vastgezet te betalen activabedrag na opslag en afronding naar boven. Vanaf 4.1.1 worden herkende geverifieerde fiatstablecoins (zoals USDC, USDT, DAI, USDS, EURC) naar boven afgerond op maximaal twee decimalen; 1.321 wordt 1.33, nooit 1.32. Dit is het verwachte bedrag, ook bij nultolerantie. Andere activa behouden adaptieve precisie. Bestaande facturen worden nooit opnieuw geprijsd.
minimum_payment_amountdecimal stringaltijdKleinste bedrag dat na toepassing van de factuurtolerantie als betaald wordt geaccepteerd.
minimum_payment_amount_atomicinteger stringaltijdExacte geaccepteerde drempel in de kleinste eenheid van het actief.
destination_addressstringaltijdOntvangstadres op de blockchain of de betalingshash van 64 tekens voor Lightning. Gebruik bolt11 om via Lightning te betalen; de hash is geen Bitcoin-adres.
destination_tagstring | nullaltijdVereiste publieke betalingsreferentie waar de betaalroute die gebruikt: XRP-bestemmingstag, Stellar-memo-ID of TON-factuurcommentaar. Null voor routes met unieke adressen.
monitoring_expires_atRFC 3339 timestampaltijdEindgrens voor controle op late betalingen voor deze methode.
last_chain_heightinteger | nullaltijdLaatste betrouwbare hoogte die door de monitor is waargenomen.
fully_paid_attimestamp | nullaltijdTijdstip waarop het geaccepteerde minimumbedrag voor het eerst werd bereikt.
caseobject | nullaltijd
Huidig geval met status, redenen, revision en tijdstempels; null als er geen uitzondering bestaat. Intern bewijs is uitgesloten.
methods[]object[]altijdid, 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 en spending_supported. Atomaire bedragen zijn tekenreeksen.Details
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 en spending_supported. Atomaire bedragen zijn tekenreeksen.
history[]object[]altijdNieuwste 25 beslissingen voor deze pagina: id, action, note, actor, result, created_at.
history_paginationobjectaltijd
page, per_page (25), total. Alleen beslissingsgeschiedenis wordt per pagina gepagineerd.
refunds[]object[]altijdNieuwste 100 terugbetalingen: id, payment_intent_id, amount_atomic, destination, status, request, treasury_intent_id, transfer_status, created_at en transactions (id/status). Terugbetalingen indienen kan alleen via de console.Details
Nieuwste 100 terugbetalingen: id, payment_intent_id, amount_atomic, destination, status, request, treasury_intent_id, transfer_status, created_at en transactions (id/status). Terugbetalingen indienen kan alleen via de console.
observations[]object[]altijdNieuwste 100: payment_intent_id, transaction_id, event_index, amount, status, confirmations, observed_at, symbol, chain en disabled_at_detection. explorer_name/explorer_url worden opgenomen waar ondersteund.Details
Nieuwste 100: payment_intent_id, transaction_id, event_index, amount, status, confirmations, observed_at, symbol, chain en disabled_at_detection. explorer_name/explorer_url worden opgenomen waar ondersteund.
deliveries[]object[]altijdNieuwste 50: id, kind, status, attempts, response_status, error, next_attempt_at, event_type en created_at. Geen callbackgeheimen.
Gebruiksopmerkingen
- case is null als de factuur geen uitzondering heeft veroorzaakt. De recentste 100 waarnemingen en 50 bezorgingen worden teruggegeven; beslissingsgeschiedenis is gepagineerd.
- refundable_atomic vereist minstens één netwerkbevestiging, sluit bestaande terugbetalingsreserveringen uit en is geen belofte van besteedbare walletmiddelen. Een actuele prijsopgave valideert bovendien walletgereedheid, bronsaldi en kosten.
- Een uitgezonden terugbetaling betekent dat deze is ingediend bij een blockchain-eindpunt, niet dat ontvangst door de klant onafhankelijk is bevestigd. Kosten komen erbij en fiatverwerkingskosten worden niet automatisch gecrediteerd door een terugbetaling uit te voeren.
- Consoleprojectmenu → Aandacht nodig biedt annuleren, accepteren, afwijzen, heropenen, beoordelen, notities, Opnieuw scannen, opnieuw bezorgen en terugbetalingen op ondersteunde blockchains. Beslissingen gebruiken CSRF-beveiligde sessies, een unieke request_id, de huidige gevalrevisie, een verplichte notitie en expliciete bevestiging; bearertokens kunnen die wijzigingen niet uitvoeren.
Fouten
GETAPI-servicedetectie/Publiek
Antwoord van de beheerde API-hostproxy dat de rol van publieke v1-API bevestigt. Dit antwoord wordt door de beheerde proxy gemaakt, niet door de Axum-router van de handelaarssoftware.
Authenticatie & headers
Publiek
Verzoek
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))Antwoord 200 application/json
Voorbeeldantwoord
{
"service": "Wholly Crypto API",
"status": "ready",
"version": "v1"
}Antwoordvelden
Gebruiksopmerkingen
- Er is geen bearertoken nodig.
- Alleen de beheerde API-hostnaam garandeert dit exacte antwoord op het hoofdpad.
Fouten
GETServicestatus/healthzPubliek
Controleert de bereikbaarheid van de applicatie en een databaseping van twee seconden. Gebruik voor monitoring, niet als vervanging voor factuurstatus.
Authenticatie & headers
Publiek
Verzoek
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))Antwoord 200 healthy; 503 database unavailable
Voorbeeldantwoord
{
"status": "ok",
"database": "ok",
"version": "0.1.0"
}Antwoordvelden
Gebruiksopmerkingen
- Er is geen bearertoken nodig.
- De version-waarde is de versie van het draaiende pakket, niet de versie in het API-pad.
Fouten
GETBetaalactiva van project opvragen/v1/projects/{project_id}/payment-assetsAlleen-lezen
Toont eigen munten en geverifieerde tokens met projectbeleid, blockchainwalletgereedheid en geïnstalleerde scanner-/saldomogelijkheden. scanner_ready controleert de gebouwde adapter, niet het actuele eindpuntquorum. Vanaf 6.0.6 behoudt aanmaak ingestelde methoden tijdens scanneruitval. Ontvangstverificatie vereist nog steeds de ingestelde drempel van gezonde providers met exact de juiste rol (standaard 2, optioneel 1).
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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" }] }
}
]
}Antwoordvelden
data[]object[]
assetobjectaltijd
Blijvend geregistreerde eigen munt of geverifieerd tokenactief.
idUUIDaltijdBlijvende identificatie van een betaalactief, gebruikt door project- en winkelbeleidsroutes.
asset_kindnative | tokenaltijdOf voldoening de blockchainvaluta of een geverifieerd contract/mint gebruikt.
payment_railstringaltijdRuntime-betaalroute: utxo, evm-native, solana-native, account-native, privacy-native of token-transfer.
contract_addressstring | nullaltijdCanoniek ERC-20-contract of SPL-mint voor tokens; null voor eigen munten.
coingecko_idstring | nullaltijdDetectie-/prijsidentiteit. Null voor eigen contracten; leid nooit een marktprijs af van hun tickersymbool. Alleen CoinGecko-metadata maakt een token nooit selecteerbaar.
custom_tokenbooleanaltijdEigen contract dat op de blockchain is geverifieerd, met projectspecifieke vaste USD-prijs of prijsbepaling via een geselecteerde DEX-pool.
token_standarderc20 | spl-token | nullaltijdGeverifieerde runtime-tokenstandaard; null voor eigen munten.
metadata_verified_attimestamp | nullaltijdVerificatietijd op de blockchain van metadata voor geregistreerde tokens.
payment_supportedbooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
scanner_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
balance_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
default_finality_modeconfirmations | finalizedaltijdStandaardfinaliteitsmodel dat nieuw projectbeleid overneemt.
policyobject | nullaltijd
Activerings-/finaliteitsbeleid van het project, of null als niet ingesteld. Bevat custom_price_mode (fixed/dex), custom_price_usd (vaste decimale tekenreeks of null), custom_dex_pair (geselecteerde pool of null) en custom_dex (dex_id, quote_symbol, huidige price_usd of null, liquidity_usd, fetched_at, last_error). Eigen prijsbepaling wordt gedeeld door winkels in dit project.Details
Activerings-/finaliteitsbeleid van het project, of null als niet ingesteld. Bevat custom_price_mode (fixed/dex), custom_price_usd (vaste decimale tekenreeks of null), custom_dex_pair (geselecteerde pool of null) en custom_dex (dex_id, quote_symbol, huidige price_usd of null, liquidity_usd, fetched_at, last_error). Eigen prijsbepaling wordt gedeeld door winkels in dit project.
enabledbooleanvereistSchakelt het actief voor het project in of uit. De eigen blockchain moet vóór elke token worden ingeschakeld.
finality_modeconfirmations | finalizedvereistFinaliteitsbeleid dat door de betaalroute van het actief wordt ondersteund. finalized vereist required_confirmations=1.
required_confirmationsintegervereistBitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.Details
Bitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.
walletobject | nullaltijd
Projectwallet van de blockchain met eigen sleutelbeheer. Tokens delen de wallet van de eigen munt van hun blockchain.
public_keystring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
primary_addressstring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
backup_confirmed_attimestamp | nullaltijdNiet-null nadat de operator de herstelback-up heeft bevestigd.
activation_requiredbooleanaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
activation_verified_attimestamp|nullaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
receive_readinessobject | null5.5.0+
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.Details
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
monero_wallet_rpcMoneroWalletRpcBinding | nullaltijdGeschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.Details
Geschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.
last_secret_revealed_attimestamp|nullaltijdAuditmetadata over het tonen van geheimen aan de consolekant.
balances[]object[]altijd
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.Details
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.
project_enabledbooleanaltijdOf dit actief momenteel is ingeschakeld volgens het activabeleid van het project.
active_store_countintegeraltijdAantal ingeschakelde winkels dat dit actief momenteel selecteert. Dit is een weergave van acceptatie; alleen-lezen saldoregistratie blijft onafhankelijk.
active_store_ids[]UUID[]altijdIngeschakelde winkels in dit project die het actief momenteel accepteren. Dit maakt exact lokaal filteren op winkel mogelijk zonder extra API-verzoek.
tracking_activebooleanaltijdOf deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.Details
Of deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.
balancedecimal string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
balance_atomicinteger string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
statuspending | refreshing | fresh | stale | erroraltijdGecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.Details
Gecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.
balance_statuspending | refreshing | fresh | stale | error | unknownaltijdSamengevoegde cache-actualiteit; unknown is een defensieve terugval en geen van deze statussen bewijst factuurvoldoening.
balance_checked_attimestamp | nullaltijdOudste relevante succesvolle saldocontrole die in het totaal is vertegenwoordigd.
recent_payments[]object[]altijd
Maximaal drie nieuwste geldige waarnemingen met status detected, confirming of final die aan precies deze wallet zijn toegewezen.
amountdecimal stringaltijdExact waargenomen activabedrag zonder omzetting naar drijvendekommagetallen.
statusdetected | confirming | finalaltijdHuidige geldige waarnemingsstatus. Gereorganiseerde, vervangen en ongeldige waarnemingen worden uitgesloten.
observed_atRFC 3339 timestampaltijdTijdstip waarop Wholly Crypto de betaling voor het eerst waarnam.
wallet_readinessreadiness enumaltijdunsupported, 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 of ready.Details
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 of ready.
receive_readinessobject | null5.5.0+
Gedeelde beoordeling van de ontvangstconfiguratie van het project. Omvat wallet- en onafhankelijke scannerprovidercontroles, los van saldoactualiteit en gas voor verzenden. Null als geen projectbeleid bestaat. Factuurvaluta/koersen worden bij factuuraanmaak gecontroleerd.Details
Gedeelde beoordeling van de ontvangstconfiguratie van het project. Omvat wallet- en onafhankelijke scannerprovidercontroles, los van saldoactualiteit en gas voor verzenden. Null als geen projectbeleid bestaat. Factuurvaluta/koersen worden bij factuuraanmaak gecontroleerd.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
Gebruiksopmerkingen
- Een token kan wereldwijd vermeld staan maar niet selecteerbaar blijven wanneer scanner_ready of payment_supported false is.
- De operatormogelijkhedenmatrix vereist ook de exacte eindpuntrol van de scanner; een gezond eindpunt met een onverenigbare API telt niet mee.
- Tokens delen de projectwallet van hun eigen blockchain; ze maken geen andere herstelzin.
- Ingesloten walletsamenvattingen tonen alleen gereedheid en houden saldi leeg; gebruik GET /v1/projects/{project_id}/wallets voor verrijkte saldi.
Fouten
PUTActivabeleid van project bijwerken/v1/projects/{project_id}/payment-assets/{asset_id}Lezen + schrijven
Maakt of vervangt het projectbeleid voor één blijvend actief en geeft de vernieuwde projectactivalijst terug. Een eigen blockchain uitschakelen maakt de eigen munt en tokens onbeschikbaar voor nieuwe facturen, maar behoudt tokenbeleid, wallets en winkelselecties zodat ze later kunnen worden hervat.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | vereist | application/json |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Requestbody
enabledbooleanvereistSchakelt het actief voor het project in of uit. De eigen blockchain moet vóór elke token worden ingeschakeld.
finality_modeconfirmations | finalizedvereistFinaliteitsbeleid dat door de betaalroute van het actief wordt ondersteund. finalized vereist required_confirmations=1.
required_confirmationsintegervereistBitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.Details
Bitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.
Antwoord 200 application/json
Voorbeeldantwoord
{
"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" }
]
}Antwoordvelden
data[]object[]
assetobjectaltijd
Blijvend geregistreerde eigen munt of geverifieerd tokenactief.
idUUIDaltijdBlijvende identificatie van een betaalactief, gebruikt door project- en winkelbeleidsroutes.
asset_kindnative | tokenaltijdOf voldoening de blockchainvaluta of een geverifieerd contract/mint gebruikt.
payment_railstringaltijdRuntime-betaalroute: utxo, evm-native, solana-native, account-native, privacy-native of token-transfer.
contract_addressstring | nullaltijdCanoniek ERC-20-contract of SPL-mint voor tokens; null voor eigen munten.
coingecko_idstring | nullaltijdDetectie-/prijsidentiteit. Null voor eigen contracten; leid nooit een marktprijs af van hun tickersymbool. Alleen CoinGecko-metadata maakt een token nooit selecteerbaar.
custom_tokenbooleanaltijdEigen contract dat op de blockchain is geverifieerd, met projectspecifieke vaste USD-prijs of prijsbepaling via een geselecteerde DEX-pool.
token_standarderc20 | spl-token | nullaltijdGeverifieerde runtime-tokenstandaard; null voor eigen munten.
metadata_verified_attimestamp | nullaltijdVerificatietijd op de blockchain van metadata voor geregistreerde tokens.
payment_supportedbooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
scanner_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
balance_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
default_finality_modeconfirmations | finalizedaltijdStandaardfinaliteitsmodel dat nieuw projectbeleid overneemt.
policyobject | nullaltijd
Activerings-/finaliteitsbeleid van het project, of null als niet ingesteld. Bevat custom_price_mode (fixed/dex), custom_price_usd (vaste decimale tekenreeks of null), custom_dex_pair (geselecteerde pool of null) en custom_dex (dex_id, quote_symbol, huidige price_usd of null, liquidity_usd, fetched_at, last_error). Eigen prijsbepaling wordt gedeeld door winkels in dit project.Details
Activerings-/finaliteitsbeleid van het project, of null als niet ingesteld. Bevat custom_price_mode (fixed/dex), custom_price_usd (vaste decimale tekenreeks of null), custom_dex_pair (geselecteerde pool of null) en custom_dex (dex_id, quote_symbol, huidige price_usd of null, liquidity_usd, fetched_at, last_error). Eigen prijsbepaling wordt gedeeld door winkels in dit project.
enabledbooleanvereistSchakelt het actief voor het project in of uit. De eigen blockchain moet vóór elke token worden ingeschakeld.
finality_modeconfirmations | finalizedvereistFinaliteitsbeleid dat door de betaalroute van het actief wordt ondersteund. finalized vereist required_confirmations=1.
required_confirmationsintegervereistBitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.Details
Bitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.
walletobject | nullaltijd
Projectwallet van de blockchain met eigen sleutelbeheer. Tokens delen de wallet van de eigen munt van hun blockchain.
public_keystring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
primary_addressstring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
backup_confirmed_attimestamp | nullaltijdNiet-null nadat de operator de herstelback-up heeft bevestigd.
activation_requiredbooleanaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
activation_verified_attimestamp|nullaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
receive_readinessobject | null5.5.0+
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.Details
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
monero_wallet_rpcMoneroWalletRpcBinding | nullaltijdGeschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.Details
Geschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.
last_secret_revealed_attimestamp|nullaltijdAuditmetadata over het tonen van geheimen aan de consolekant.
balances[]object[]altijd
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.Details
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.
project_enabledbooleanaltijdOf dit actief momenteel is ingeschakeld volgens het activabeleid van het project.
active_store_countintegeraltijdAantal ingeschakelde winkels dat dit actief momenteel selecteert. Dit is een weergave van acceptatie; alleen-lezen saldoregistratie blijft onafhankelijk.
active_store_ids[]UUID[]altijdIngeschakelde winkels in dit project die het actief momenteel accepteren. Dit maakt exact lokaal filteren op winkel mogelijk zonder extra API-verzoek.
tracking_activebooleanaltijdOf deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.Details
Of deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.
balancedecimal string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
balance_atomicinteger string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
statuspending | refreshing | fresh | stale | erroraltijdGecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.Details
Gecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.
balance_statuspending | refreshing | fresh | stale | error | unknownaltijdSamengevoegde cache-actualiteit; unknown is een defensieve terugval en geen van deze statussen bewijst factuurvoldoening.
balance_checked_attimestamp | nullaltijdOudste relevante succesvolle saldocontrole die in het totaal is vertegenwoordigd.
recent_payments[]object[]altijd
Maximaal drie nieuwste geldige waarnemingen met status detected, confirming of final die aan precies deze wallet zijn toegewezen.
amountdecimal stringaltijdExact waargenomen activabedrag zonder omzetting naar drijvendekommagetallen.
statusdetected | confirming | finalaltijdHuidige geldige waarnemingsstatus. Gereorganiseerde, vervangen en ongeldige waarnemingen worden uitgesloten.
observed_atRFC 3339 timestampaltijdTijdstip waarop Wholly Crypto de betaling voor het eerst waarnam.
wallet_readinessreadiness enumaltijdunsupported, 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 of ready.Details
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 of ready.
receive_readinessobject | null5.5.0+
Gedeelde beoordeling van de ontvangstconfiguratie van het project. Omvat wallet- en onafhankelijke scannerprovidercontroles, los van saldoactualiteit en gas voor verzenden. Null als geen projectbeleid bestaat. Factuurvaluta/koersen worden bij factuuraanmaak gecontroleerd.Details
Gedeelde beoordeling van de ontvangstconfiguratie van het project. Omvat wallet- en onafhankelijke scannerprovidercontroles, los van saldoactualiteit en gas voor verzenden. Null als geen projectbeleid bestaat. Factuurvaluta/koersen worden bij factuuraanmaak gecontroleerd.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
Gebruiksopmerkingen
- De body vervangt het volledige beleid en wijst onbekende velden af.
- Inschakelen op projectniveau selecteert het actief niet vanzelf voor een winkel.
Fouten
GETKandidaat-betaaltokens bekijken/v1/projects/{project_id}/payment-token-candidatesAlleen-lezen
Doorzoekt lokaal gecachte CoinGecko-contractkoppelingen alleen op blockchains waarvoor de tokenfactuurscanner en saldo-adapter zijn geïmplementeerd. Resultaten zijn detectiekandidaten, geen vertrouwde betaalactiva.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | aanbevolen | application/json |
Padparameters
Queryparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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
}
]
}Antwoordvelden
data[]object[]
coingecko_idstringaltijdCoinGecko-detectie-identiteit die door het registratieverzoek wordt gebruikt.
contract_addressstringaltijdGekoppeld contract of mint; wordt vóór registratie op de blockchain geverifieerd.
token_standarderc20 | spl-tokenaltijdTokenstandaard die door de geselecteerde blockchainadapter wordt ondersteund.
scanner_readybooleanaltijdAlleen true voor kandidaten op een tokenroute die door deze build is geïmplementeerd.
Gebruiksopmerkingen
- Ondersteunde tokenadapters: ERC-20 op Ethereum, Base, BNB Chain, HyperEVM, Avalanche, Polygon, Arbitrum en Optimism; SPL op Solana.
- Niet-ondersteunde catalogusblockchains worden afgewezen en niet als selecteerbaar getoond.
- CoinGecko-rang, pictogram en prijs zijn indicatieve detectiegegevens.
Fouten
POSTToken verifiëren en registreren/v1/projects/{project_id}/payment-token-assetsLezen + schrijven
Neemt één huidige kandidaat pas in het blijvende betaalregister op nadat ingestelde nodes blockchainidentiteit, contract-/mintidentiteit, decimalen en een bruikbare saldo-opvraging hebben geverifieerd. Registratie vertrouwt nooit uitsluitend op CoinGecko-metadata en elk project is beperkt tot 20 geregistreerde tokenactiva.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | vereist | application/json |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Requestbody
chain_slugstringvereistethereum, base, bnb-chain, hyperliquid, avalanche, polygon, arbitrum, optimism of solana.
coingecko_idstringvereistExacte kandidaatidentiteit teruggegeven door tokenzoeken. Behoud underscores of koppeltekens aan het begin, zoals _ of -6. Leid deze ID niet af van de tokennaam of het tickersymbool.Details
Exacte kandidaatidentiteit teruggegeven door tokenzoeken. Behoud underscores of koppeltekens aan het begin, zoals _ of -6. Leid deze ID niet af van de tokennaam of het tickersymbool.
Antwoord 201 application/json
Voorbeeldantwoord
{
"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"
}
}Antwoordvelden
dataobject
Gebruiksopmerkingen
- Schakel het eigen projectactief van de blockchain in voordat je de tokens ervan registreert.
- Een project kan maximaal 20 tokenactiva registreren; een nieuwe kandidaat boven die grens geeft token_chain_not_ready (409) terug. Hergebruik van een al geregistreerd actief verbruikt geen extra plek.
- Nodeverificatie kan langer duren dan het lezen van de catalogus; gebruik een expliciete clienttime-out.
- Selecteer na registratie het actief voor elke winkel die het moet aanbieden.
Fouten
GETDEX-pools voor eigen token zoeken/v1/projects/{project_id}/payment-token-dex-poolsAlleen-lezen
Vind via DEX Screener maximaal 12 geschikte pools op basis van exacte blockchain en basistokencontract, gesorteerd op liquiditeit. Dit registreert of activeert geen token.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
Padparameters
Queryparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{"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"}]}Antwoordvelden
data[]object[]
pair_addressstringaltijdExacte poolidentificatie, beurs-ID (bijv. uniswap/pancakeswap) en gekoppeld tickersymbool alleen voor weergave.
dex_idstringaltijdExacte poolidentificatie, beurs-ID (bijv. uniswap/pancakeswap) en gekoppeld tickersymbool alleen voor weergave.
quote_symbolstringaltijdExacte poolidentificatie, beurs-ID (bijv. uniswap/pancakeswap) en gekoppeld tickersymbool alleen voor weergave.
price_usddecimal stringaltijdUSD-prijs van de gevraagde basistoken en totale poolliquiditeit. Minstens $10,000 liquiditeit en een transactie in het afgelopen uur zijn vereist.
liquidity_usddecimal stringaltijdUSD-prijs van de gevraagde basistoken en totale poolliquiditeit. Minstens $10,000 liquiditeit en een transactie in het afgelopen uur zijn vereist.
fetched_atRFC 3339 timestampaltijdWanneer de server de providerwaarneming ophaalde, niet het tijdstip van een blockchaintransactie.
Gebruiksopmerkingen
- Een lege data-array betekent dat geen kwalificerende pool is gevonden. Alleen pools waarin het exact gevraagde contract de basistoken is worden teruggegeven; USD-prijzen aan de quote-kant worden nooit aangenomen.
- Een DEX-vermelding is geen beveiligingsaudit. Minimale liquiditeit en recente activiteit verminderen onbruikbare prijsopgaven, maar voorkomen geen marktmanipulatie.
- Uniswap, PancakeSwap en andere geïndexeerde DEX'en worden ondersteund waar de bestaande blockchainscanner tokens ondersteunt. API-toegang blijft projectgebonden en begrensd. Provideraanroepen worden ook achtereenvolgens uitgevoerd en begrensd.
Fouten
POSTEigen token toevoegen of prijs wijzigen/v1/projects/{project_id}/payment-token-assets/customLezen + schrijven
Verifieert een eigen contract via ingestelde blockchainnodes en registreert het zonder CoinGecko-vermelding te vereisen. De vaste USD-prijs of geselecteerde automatische DEX-pool hoort bij dit project, niet bij het tickersymbool of andere projecten. Dezelfde identiteit herhalen werkt de projectprijs bij zonder bestaand ingeschakeld/uitgeschakeld beleid te veranderen.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | vereist | application/json |
Padparameters
Verzoek
: "${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))Requestbody
chain_slugstringvereistethereum, base, bnb-chain, hyperliquid, avalanche, polygon, arbitrum, optimism of solana. Vast voor dit contract.
contract_addressstringvereistERC-20-contract (0x plus 40 hexadecimale tekens) of een klassieke SPL-mint. Nodes verifiëren netwerkidentiteit en exacte decimalen; decimalen en RPC-URL's van de aanroeper worden afgewezen.Details
ERC-20-contract (0x plus 40 hexadecimale tekens) of een klassieke SPL-mint. Nodes verifiëren netwerkidentiteit en exacte decimalen; decimalen en RPC-URL's van de aanroeper worden afgewezen.
namestringvereistWeergavenaam (1–80 tekens) en tickersymbool (1–16 letters/cijfers/punten/underscores/koppeltekens, eerste teken alfanumeriek). Bestaande identiteiten kunnen via dit eindpunt niet worden hernoemd.Details
Weergavenaam (1–80 tekens) en tickersymbool (1–16 letters/cijfers/punten/underscores/koppeltekens, eerste teken alfanumeriek). Bestaande identiteiten kunnen via dit eindpunt niet worden hernoemd.
symbolstringvereistWeergavenaam (1–80 tekens) en tickersymbool (1–16 letters/cijfers/punten/underscores/koppeltekens, eerste teken alfanumeriek). Bestaande identiteiten kunnen via dit eindpunt niet worden hernoemd.Details
Weergavenaam (1–80 tekens) en tickersymbool (1–16 letters/cijfers/punten/underscores/koppeltekens, eerste teken alfanumeriek). Bestaande identiteiten kunnen via dit eindpunt niet worden hernoemd.
price_modefixed | dexoptioneelStandaard fixed voor achterwaartse compatibiliteit. DEX gebruikt een specifieke pool die voor de exacte blockchain en het exacte contract is gevonden.
price_usddecimal stringfixed-modusVaste USD-waarde van ÉÉN token, positief, maximaal 30 decimalen, maximum 1000000000000000000000000. Geen exponent of floats. Weglaten in dex-modus.
dex_pair_addressstringdex-modusPooladres uit payment-token-dex-pools. Vereist in dex-modus; weglaten in fixed-modus. De server controleert poolidentiteit, prijs, liquiditeit en activiteit bij elke opslag opnieuw.Details
Pooladres uit payment-token-dex-pools. Vereist in dex-modus; weglaten in fixed-modus. De server controleert poolidentiteit, prijs, liquiditeit en activiteit bij elke opslag opnieuw.
Antwoord 200 application/json
Voorbeeldantwoord
{"data":{"asset_id":"44444444-4444-4444-8444-444444444444"}}Antwoordvelden
Gebruiksopmerkingen
- Selecteer na registratie asset_id in het payment-assets-eindpunt van de winkel; alleen registreren schakelt nooit een winkelmethode in.
- Eigen en catalogustokens delen de projectlimiet van 20 tokens. Hetzelfde contract op verschillende blockchains is een ander betaalactief.
- Bestaande cataloguscontracten geven 409 terug: gebruik catalogusregistratie om automatische marktkoersen te behouden. Een eigen tickersymbool leent nooit de prijs van een gelijknamige token.
- Vaste prijzen zijn schattingen van de operator. Automatische DEX-prijzen zijn spotwaarnemingen uit de geselecteerde pool via DEX Screener, geen orakel dat tegen manipulatie bestand is. Winkelopslag en afronding naar boven blijven gelden, met actuele fiatkoersen. Reeds uitgegeven prijsopgaven blijven ongewijzigd.
- Zoek voor DEX-modus eerst een pool en verstuur daarna price_mode: dex en dex_pair_address, zonder price_usd. Een gedeelde achtergrondtaak vernieuwt geselecteerde pools elke minuut. Mislukte controles of prijzen ouder dan vijf minuten verwijderen deze token uit nieuwe prijsopgaven; er is geen stille terugval naar een vaste prijs of tickersymbool.
- Alleen standaard ERC-20- en klassieke SPL-tokens worden geaccepteerd. Token-2022/extensies en blockchains met alleen eigen munten worden afgewezen. Technische verificatie is geen beveiligingsaudit van uitgever/contract; tokens met overdrachtskosten, herbasering of zwarte lijsten kunnen onverenigbaar gedrag vertonen.
- Gebruik een clienttime-out van minstens 60 seconden. Verificatie is begrensd en kan uitwijknodes proberen. Ongeldige invoer geeft 400 terug; mislukte blockchain-/contractcontroles 422; identiteitsconflicten of limieten 409.
Fouten
GETBetaalmethoden van winkel opvragen/v1/projects/{project_id}/stores/{store_id}/payment-assetsAlleen-lezen
Toont blockchainactiva in data en afzonderlijke Lightning-gereedheid in lightning. Blockchainmethoden vereisen gereedstaande blockchainwallets. Lightning gebruikt de geverifieerde externe ontvangstverbinding die in de winkel is geselecteerd, onafhankelijk van de Bitcoin-wallet op de blockchain.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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 }
}Antwoordvelden
data[]object[]
assetobjectaltijd
Voor het project zichtbare eigen munt of geverifieerd tokenactief.
idUUIDaltijdBlijvende identificatie van een betaalactief, gebruikt door project- en winkelbeleidsroutes.
asset_kindnative | tokenaltijdOf voldoening de blockchainvaluta of een geverifieerd contract/mint gebruikt.
payment_railstringaltijdRuntime-betaalroute: utxo, evm-native, solana-native, account-native, privacy-native of token-transfer.
contract_addressstring | nullaltijdCanoniek ERC-20-contract of SPL-mint voor tokens; null voor eigen munten.
coingecko_idstring | nullaltijdDetectie-/prijsidentiteit. Null voor eigen contracten; leid nooit een marktprijs af van hun tickersymbool. Alleen CoinGecko-metadata maakt een token nooit selecteerbaar.
custom_tokenbooleanaltijdEigen contract dat op de blockchain is geverifieerd, met projectspecifieke vaste USD-prijs of prijsbepaling via een geselecteerde DEX-pool.
token_standarderc20 | spl-token | nullaltijdGeverifieerde runtime-tokenstandaard; null voor eigen munten.
metadata_verified_attimestamp | nullaltijdVerificatietijd op de blockchain van metadata voor geregistreerde tokens.
payment_supportedbooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
scanner_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
balance_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
default_finality_modeconfirmations | finalizedaltijdStandaardfinaliteitsmodel dat nieuw projectbeleid overneemt.
project_policyobject | nullaltijd
Bovenliggend projectbeleid.
enabledbooleanvereistSchakelt het actief voor het project in of uit. De eigen blockchain moet vóór elke token worden ingeschakeld.
finality_modeconfirmations | finalizedvereistFinaliteitsbeleid dat door de betaalroute van het actief wordt ondersteund. finalized vereist required_confirmations=1.
required_confirmationsintegervereistBitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.Details
Bitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.
selectedbooleanaltijdOf deze methode deel uitmaakt van de opgeslagen gewenste winkelconfiguratie. Ze wordt aangeboden wanneer projectbeleid, wallet, geïnstalleerde adapter en prijsbepaling geldig zijn. Tijdelijke scannerstoringen verwijderen haar niet uit nieuwe facturen.Details
Of deze methode deel uitmaakt van de opgeslagen gewenste winkelconfiguratie. Ze wordt aangeboden wanneer projectbeleid, wallet, geïnstalleerde adapter en prijsbepaling geldig zijn. Tijdelijke scannerstoringen verwijderen haar niet uit nieuwe facturen.
confirmation_policyobject | nullaltijd
Effectief winkelbeleid voor een in het project ingesteld actief. Null als geen projectbeleid bestaat.
finality_modeconfirmations | finalizedaltijdOf voldoening een instelbaar aantal blokken of netwerkfinaliteit gebruikt.
project_required_confirmationsintegeraltijdHuidige projectstandaard voor toekomstige facturen wanneer geen winkelafwijking is ingesteld.
override_required_confirmationsinteger | nullaltijdWinkelspecifiek aantal of null om de projectstandaard over te nemen.
effective_required_confirmationsintegeraltijdAantal dat nieuwe facturen voor deze winkel en dit actief vastleggen.
editablebooleanaltijdFalse voor netwerken met finalized waarvan het finaliteitsbeleid niet kan worden overschreven.
minimum_required_confirmationsintegeraltijdInclusieve blockchainspecifieke ondergrens; 0 wordt alleen aangeboden op routes die acceptatie bij detectie ondersteunen.
walletobject | nullaltijd
Blockchainwallet gedeeld door eigen munten en tokenactiva.
public_keystring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
primary_addressstring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
backup_confirmed_attimestamp | nullaltijdNiet-null nadat de operator de herstelback-up heeft bevestigd.
activation_requiredbooleanaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
activation_verified_attimestamp|nullaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
receive_readinessobject | null5.5.0+
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.Details
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
monero_wallet_rpcMoneroWalletRpcBinding | nullaltijdGeschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.Details
Geschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.
last_secret_revealed_attimestamp|nullaltijdAuditmetadata over het tonen van geheimen aan de consolekant.
balances[]object[]altijd
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.Details
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.
project_enabledbooleanaltijdOf dit actief momenteel is ingeschakeld volgens het activabeleid van het project.
active_store_countintegeraltijdAantal ingeschakelde winkels dat dit actief momenteel selecteert. Dit is een weergave van acceptatie; alleen-lezen saldoregistratie blijft onafhankelijk.
active_store_ids[]UUID[]altijdIngeschakelde winkels in dit project die het actief momenteel accepteren. Dit maakt exact lokaal filteren op winkel mogelijk zonder extra API-verzoek.
tracking_activebooleanaltijdOf deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.Details
Of deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.
balancedecimal string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
balance_atomicinteger string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
statuspending | refreshing | fresh | stale | erroraltijdGecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.Details
Gecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.
balance_statuspending | refreshing | fresh | stale | error | unknownaltijdSamengevoegde cache-actualiteit; unknown is een defensieve terugval en geen van deze statussen bewijst factuurvoldoening.
balance_checked_attimestamp | nullaltijdOudste relevante succesvolle saldocontrole die in het totaal is vertegenwoordigd.
recent_payments[]object[]altijd
Maximaal drie nieuwste geldige waarnemingen met status detected, confirming of final die aan precies deze wallet zijn toegewezen.
amountdecimal stringaltijdExact waargenomen activabedrag zonder omzetting naar drijvendekommagetallen.
statusdetected | confirming | finalaltijdHuidige geldige waarnemingsstatus. Gereorganiseerde, vervangen en ongeldige waarnemingen worden uitgesloten.
observed_atRFC 3339 timestampaltijdTijdstip waarop Wholly Crypto de betaling voor het eerst waarnam.
wallet_readinessreadiness enumaltijdAlleen wallet-/beleidsstatus; gebruik receive_readiness voor scannervereisten.
receive_readinessobject | null5.5.0+
Gedeelde ontvangstconfiguratie plus winkelacceptatie. Gebruikt gecachte waarnemingen; geen reservering of garantie. Aanmaak controleert vereisten en de werkelijke factuurwisselkoers opnieuw.Details
Gedeelde ontvangstconfiguratie plus winkelacceptatie. Gebruikt gecachte waarnemingen; geen reservering of garantie. Aanmaak controleert vereisten en de werkelijke factuurwisselkoers opnieuw.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
Gebruiksopmerkingen
- selected is blockchainconfiguratie; wallet_readiness bepaalt de actuele geschiktheid.
- Het antwoordveld lightning bevat payment_rail: lightning, symbol: BTC, asset_decimals: 11, enabled en ready. Het bevat nooit node-inloggegevens. Configureer deze methode in de winkelconsole; de assets-array bijwerken verandert Lightning niet.
- confirmation_policy geldt alleen voor blockchainmethoden. Lightning wordt zonder blokbevestigingen voldaan en vereist het volledige BOLT11-bedrag, zonder tolerantie voor deelbetalingen.
- Methoden voor eigen munten en tokens op één blockchain gebruiken dezelfde factuurbestemming voor die blockchainwallet.
- Ingesloten walletsamenvattingen tonen alleen gereedheid en houden saldi leeg; gebruik de afzonderlijke route voor projectwallets voor actuele waarden.
Fouten
PUTBetaalmethoden van winkel vervangen/v1/projects/{project_id}/stores/{store_id}/payment-assetsLezen + schrijven
Vervangt atomair de volledige geordende selectie van activa van de winkel en geeft de vernieuwde lijst terug. Weggelaten activa worden gedeselecteerd.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | vereist | application/json |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"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" }
]
}Antwoordvelden
data[]object[]
assetobjectaltijd
Voor het project zichtbare eigen munt of geverifieerd tokenactief.
idUUIDaltijdBlijvende identificatie van een betaalactief, gebruikt door project- en winkelbeleidsroutes.
asset_kindnative | tokenaltijdOf voldoening de blockchainvaluta of een geverifieerd contract/mint gebruikt.
payment_railstringaltijdRuntime-betaalroute: utxo, evm-native, solana-native, account-native, privacy-native of token-transfer.
contract_addressstring | nullaltijdCanoniek ERC-20-contract of SPL-mint voor tokens; null voor eigen munten.
coingecko_idstring | nullaltijdDetectie-/prijsidentiteit. Null voor eigen contracten; leid nooit een marktprijs af van hun tickersymbool. Alleen CoinGecko-metadata maakt een token nooit selecteerbaar.
custom_tokenbooleanaltijdEigen contract dat op de blockchain is geverifieerd, met projectspecifieke vaste USD-prijs of prijsbepaling via een geselecteerde DEX-pool.
token_standarderc20 | spl-token | nullaltijdGeverifieerde runtime-tokenstandaard; null voor eigen munten.
metadata_verified_attimestamp | nullaltijdVerificatietijd op de blockchain van metadata voor geregistreerde tokens.
payment_supportedbooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
scanner_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
balance_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
default_finality_modeconfirmations | finalizedaltijdStandaardfinaliteitsmodel dat nieuw projectbeleid overneemt.
project_policyobject | nullaltijd
Bovenliggend projectbeleid.
enabledbooleanvereistSchakelt het actief voor het project in of uit. De eigen blockchain moet vóór elke token worden ingeschakeld.
finality_modeconfirmations | finalizedvereistFinaliteitsbeleid dat door de betaalroute van het actief wordt ondersteund. finalized vereist required_confirmations=1.
required_confirmationsintegervereistBitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.Details
Bitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.
selectedbooleanaltijdOf deze methode deel uitmaakt van de opgeslagen gewenste winkelconfiguratie. Ze wordt aangeboden wanneer projectbeleid, wallet, geïnstalleerde adapter en prijsbepaling geldig zijn. Tijdelijke scannerstoringen verwijderen haar niet uit nieuwe facturen.Details
Of deze methode deel uitmaakt van de opgeslagen gewenste winkelconfiguratie. Ze wordt aangeboden wanneer projectbeleid, wallet, geïnstalleerde adapter en prijsbepaling geldig zijn. Tijdelijke scannerstoringen verwijderen haar niet uit nieuwe facturen.
confirmation_policyobject | nullaltijd
Effectief winkelbeleid voor een in het project ingesteld actief. Null als geen projectbeleid bestaat.
finality_modeconfirmations | finalizedaltijdOf voldoening een instelbaar aantal blokken of netwerkfinaliteit gebruikt.
project_required_confirmationsintegeraltijdHuidige projectstandaard voor toekomstige facturen wanneer geen winkelafwijking is ingesteld.
override_required_confirmationsinteger | nullaltijdWinkelspecifiek aantal of null om de projectstandaard over te nemen.
effective_required_confirmationsintegeraltijdAantal dat nieuwe facturen voor deze winkel en dit actief vastleggen.
editablebooleanaltijdFalse voor netwerken met finalized waarvan het finaliteitsbeleid niet kan worden overschreven.
minimum_required_confirmationsintegeraltijdInclusieve blockchainspecifieke ondergrens; 0 wordt alleen aangeboden op routes die acceptatie bij detectie ondersteunen.
walletobject | nullaltijd
Blockchainwallet gedeeld door eigen munten en tokenactiva.
public_keystring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
primary_addressstring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
backup_confirmed_attimestamp | nullaltijdNiet-null nadat de operator de herstelback-up heeft bevestigd.
activation_requiredbooleanaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
activation_verified_attimestamp|nullaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
receive_readinessobject | null5.5.0+
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.Details
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
monero_wallet_rpcMoneroWalletRpcBinding | nullaltijdGeschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.Details
Geschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.
last_secret_revealed_attimestamp|nullaltijdAuditmetadata over het tonen van geheimen aan de consolekant.
balances[]object[]altijd
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.Details
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.
project_enabledbooleanaltijdOf dit actief momenteel is ingeschakeld volgens het activabeleid van het project.
active_store_countintegeraltijdAantal ingeschakelde winkels dat dit actief momenteel selecteert. Dit is een weergave van acceptatie; alleen-lezen saldoregistratie blijft onafhankelijk.
active_store_ids[]UUID[]altijdIngeschakelde winkels in dit project die het actief momenteel accepteren. Dit maakt exact lokaal filteren op winkel mogelijk zonder extra API-verzoek.
tracking_activebooleanaltijdOf deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.Details
Of deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.
balancedecimal string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
balance_atomicinteger string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
statuspending | refreshing | fresh | stale | erroraltijdGecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.Details
Gecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.
balance_statuspending | refreshing | fresh | stale | error | unknownaltijdSamengevoegde cache-actualiteit; unknown is een defensieve terugval en geen van deze statussen bewijst factuurvoldoening.
balance_checked_attimestamp | nullaltijdOudste relevante succesvolle saldocontrole die in het totaal is vertegenwoordigd.
recent_payments[]object[]altijd
Maximaal drie nieuwste geldige waarnemingen met status detected, confirming of final die aan precies deze wallet zijn toegewezen.
amountdecimal stringaltijdExact waargenomen activabedrag zonder omzetting naar drijvendekommagetallen.
statusdetected | confirming | finalaltijdHuidige geldige waarnemingsstatus. Gereorganiseerde, vervangen en ongeldige waarnemingen worden uitgesloten.
observed_atRFC 3339 timestampaltijdTijdstip waarop Wholly Crypto de betaling voor het eerst waarnam.
wallet_readinessreadiness enumaltijdAlleen wallet-/beleidsstatus; gebruik receive_readiness voor scannervereisten.
receive_readinessobject | null5.5.0+
Gedeelde ontvangstconfiguratie plus winkelacceptatie. Gebruikt gecachte waarnemingen; geen reservering of garantie. Aanmaak controleert vereisten en de werkelijke factuurwisselkoers opnieuw.Details
Gedeelde ontvangstconfiguratie plus winkelacceptatie. Gebruikt gecachte waarnemingen; geen reservering of garantie. Aanmaak controleert vereisten en de werkelijke factuurwisselkoers opnieuw.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
Gebruiksopmerkingen
- De array accepteert maximaal 64 unieke activa en weergavevolgordes.
- Selecties zijn opgeslagen gewenste configuratie en kunnen worden voorbereid voordat een walletback-up is gemaakt of terwijl een blockchain is gepauzeerd. Factuuraanmaak biedt nog steeds alleen methoden waarvan projectbeleid, beleid voor de eigen bovenliggende munt, wallet en runtimecontroles gereed zijn.
- Verstuur een lege assets-array om geen betaalmethoden in te stellen.
Fouten
PUTBevestigingsbeleid van winkel instellen/v1/projects/{project_id}/stores/{store_id}/payment-assets/{asset_id}/confirmation-policyLezen + schrijven
Stelt één winkelspecifieke afwijking voor bevestigingen in of wist die en geeft de vernieuwde betaalmethodenlijst van de winkel terug. Het actief moet al voor de winkel zijn geselecteerd. Configuratie blijft beschikbaar terwijl project, winkel, blockchain of wallet gepauzeerd is.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Content-Type | vereist | application/json |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Requestbody
Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}
]
}Antwoordvelden
data[]object[]
assetobjectaltijd
Voor het project zichtbare eigen munt of geverifieerd tokenactief.
idUUIDaltijdBlijvende identificatie van een betaalactief, gebruikt door project- en winkelbeleidsroutes.
asset_kindnative | tokenaltijdOf voldoening de blockchainvaluta of een geverifieerd contract/mint gebruikt.
payment_railstringaltijdRuntime-betaalroute: utxo, evm-native, solana-native, account-native, privacy-native of token-transfer.
contract_addressstring | nullaltijdCanoniek ERC-20-contract of SPL-mint voor tokens; null voor eigen munten.
coingecko_idstring | nullaltijdDetectie-/prijsidentiteit. Null voor eigen contracten; leid nooit een marktprijs af van hun tickersymbool. Alleen CoinGecko-metadata maakt een token nooit selecteerbaar.
custom_tokenbooleanaltijdEigen contract dat op de blockchain is geverifieerd, met projectspecifieke vaste USD-prijs of prijsbepaling via een geselecteerde DEX-pool.
token_standarderc20 | spl-token | nullaltijdGeverifieerde runtime-tokenstandaard; null voor eigen munten.
metadata_verified_attimestamp | nullaltijdVerificatietijd op de blockchain van metadata voor geregistreerde tokens.
payment_supportedbooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
scanner_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
balance_readybooleanaltijdRegistercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.Details
Registercontroles bij bouwen. scanner_ready betekent dat de betalingsscanner-runtime is geïnstalleerd; betalingsbevestiging vereist het ingestelde aantal gezonde providers met exact de juiste rol (standaard 2, optioneel 1); tijdelijke scannerbeschikbaarheid blokkeert factuuraanmaak vanaf 6.0.6 niet. balance_ready is alleen true voor geïmplementeerde saldo-adapters.
default_finality_modeconfirmations | finalizedaltijdStandaardfinaliteitsmodel dat nieuw projectbeleid overneemt.
project_policyobject | nullaltijd
Bovenliggend projectbeleid.
enabledbooleanvereistSchakelt het actief voor het project in of uit. De eigen blockchain moet vóór elke token worden ingeschakeld.
finality_modeconfirmations | finalizedvereistFinaliteitsbeleid dat door de betaalroute van het actief wordt ondersteund. finalized vereist required_confirmations=1.
required_confirmationsintegervereistBitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.Details
Bitcoin- en EVM-routes accepteren nul; andere bevestigingsroutes vereisen minstens één, routes met alleen finalized vereisen precies één, en EVM-routes zijn begrensd op 0–48 zodat elke overschrijving binnen het transactieherhaalvenster blijft.
selectedbooleanaltijdOf deze methode deel uitmaakt van de opgeslagen gewenste winkelconfiguratie. Ze wordt aangeboden wanneer projectbeleid, wallet, geïnstalleerde adapter en prijsbepaling geldig zijn. Tijdelijke scannerstoringen verwijderen haar niet uit nieuwe facturen.Details
Of deze methode deel uitmaakt van de opgeslagen gewenste winkelconfiguratie. Ze wordt aangeboden wanneer projectbeleid, wallet, geïnstalleerde adapter en prijsbepaling geldig zijn. Tijdelijke scannerstoringen verwijderen haar niet uit nieuwe facturen.
confirmation_policyobject | nullaltijd
Effectief winkelbeleid voor een in het project ingesteld actief. Null als geen projectbeleid bestaat.
finality_modeconfirmations | finalizedaltijdOf voldoening een instelbaar aantal blokken of netwerkfinaliteit gebruikt.
project_required_confirmationsintegeraltijdHuidige projectstandaard voor toekomstige facturen wanneer geen winkelafwijking is ingesteld.
override_required_confirmationsinteger | nullaltijdWinkelspecifiek aantal of null om de projectstandaard over te nemen.
effective_required_confirmationsintegeraltijdAantal dat nieuwe facturen voor deze winkel en dit actief vastleggen.
editablebooleanaltijdFalse voor netwerken met finalized waarvan het finaliteitsbeleid niet kan worden overschreven.
minimum_required_confirmationsintegeraltijdInclusieve blockchainspecifieke ondergrens; 0 wordt alleen aangeboden op routes die acceptatie bij detectie ondersteunen.
walletobject | nullaltijd
Blockchainwallet gedeeld door eigen munten en tokenactiva.
public_keystring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
primary_addressstring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
backup_confirmed_attimestamp | nullaltijdNiet-null nadat de operator de herstelback-up heeft bevestigd.
activation_requiredbooleanaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
activation_verified_attimestamp|nullaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
receive_readinessobject | null5.5.0+
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.Details
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
monero_wallet_rpcMoneroWalletRpcBinding | nullaltijdGeschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.Details
Geschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.
last_secret_revealed_attimestamp|nullaltijdAuditmetadata over het tonen van geheimen aan de consolekant.
balances[]object[]altijd
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.Details
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.
project_enabledbooleanaltijdOf dit actief momenteel is ingeschakeld volgens het activabeleid van het project.
active_store_countintegeraltijdAantal ingeschakelde winkels dat dit actief momenteel selecteert. Dit is een weergave van acceptatie; alleen-lezen saldoregistratie blijft onafhankelijk.
active_store_ids[]UUID[]altijdIngeschakelde winkels in dit project die het actief momenteel accepteren. Dit maakt exact lokaal filteren op winkel mogelijk zonder extra API-verzoek.
tracking_activebooleanaltijdOf deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.Details
Of deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.
balancedecimal string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
balance_atomicinteger string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
statuspending | refreshing | fresh | stale | erroraltijdGecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.Details
Gecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.
balance_statuspending | refreshing | fresh | stale | error | unknownaltijdSamengevoegde cache-actualiteit; unknown is een defensieve terugval en geen van deze statussen bewijst factuurvoldoening.
balance_checked_attimestamp | nullaltijdOudste relevante succesvolle saldocontrole die in het totaal is vertegenwoordigd.
recent_payments[]object[]altijd
Maximaal drie nieuwste geldige waarnemingen met status detected, confirming of final die aan precies deze wallet zijn toegewezen.
amountdecimal stringaltijdExact waargenomen activabedrag zonder omzetting naar drijvendekommagetallen.
statusdetected | confirming | finalaltijdHuidige geldige waarnemingsstatus. Gereorganiseerde, vervangen en ongeldige waarnemingen worden uitgesloten.
observed_atRFC 3339 timestampaltijdTijdstip waarop Wholly Crypto de betaling voor het eerst waarnam.
wallet_readinessreadiness enumaltijdAlleen wallet-/beleidsstatus; gebruik receive_readiness voor scannervereisten.
receive_readinessobject | null5.5.0+
Gedeelde ontvangstconfiguratie plus winkelacceptatie. Gebruikt gecachte waarnemingen; geen reservering of garantie. Aanmaak controleert vereisten en de werkelijke factuurwisselkoers opnieuw.Details
Gedeelde ontvangstconfiguratie plus winkelacceptatie. Gebruikt gecachte waarnemingen; geen reservering of garantie. Aanmaak controleert vereisten en de werkelijke factuurwisselkoers opnieuw.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
Gebruiksopmerkingen
- Gebruik {"strategy":"inherit"} om de winkelafwijking te verwijderen en voor toekomstige facturen de huidige projectstandaard te volgen.
- Netwerken met finalized geven editable false terug en gebruiken Netwerkfinaliteit; ze accepteren geen afwijkend aantal blokken.
- Een waarde van 0 betekent accepteren bij detectie zonder netwerkbevestiging en zonder bescherming tegen reorganisaties. Dit wordt alleen geaccepteerd waar minimum_required_confirmations 0 is.
- Beleidswijzigingen gelden alleen voor nieuwe facturen. Bestaande facturen behouden de momentopname van het project-/winkelbevestigingsbeleid die bij aanmaak is vastgelegd.
- Updates gebeuren voor één actief tegelijk; voer gelijktijdige wijzigingen voor hetzelfde winkelactief achtereenvolgens uit en gebruik het vernieuwde antwoord als huidige status.
Fouten
GETProjectwallets en saldi opvragen/v1/projects/{project_id}/walletsAlleen-lezen
Geeft publieke walletmetadata terug plus elk geregistreerd actief met saldo-ondersteuning op exact de blockchain en het netwerk van de wallet. Alle 30 eigen blockchainroutes worden ondersteund; geverifieerde ERC-20- en SPL-activa worden ook gevolgd. Activa verschijnen onmiddellijk, ook vóór de eerste scan of wanneer ze niet voor betalingen worden geaccepteerd. project_enabled meldt betaalacceptatie; tracking_active meldt onafhankelijk de geschiktheid voor alleen-lezen vernieuwing. Monero vereist de aan het project gekoppelde externe wallet-RPC met alleen inzagerechten. Saldi scannen in de console geeft voorrang aan begrensde leesacties met voortgang/fouten per actief; alleen volledige cycli werken actuele totalen bij. Factuurvoldoening blijft bepaald door monitoring op transactieniveau en bevestigingsbeleid, niet door deze gecachte saldi.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}
]
}Antwoordvelden
data[]object[]
public_keystring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
primary_addressstring | nullaltijdPublieke walletidentiteit; er wordt geen herstelzin of private sleutel getoond.
backup_confirmed_attimestamp | nullaltijdNiet-null nadat de operator de herstelback-up heeft bevestigd.
activation_requiredbooleanaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
activation_verified_attimestamp|nullaltijdGedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.Details
Gedeelde XRP- en Stellar-accounts blijven niet beschikbaar totdat de operator het getoonde adres financiert en de ingestelde scannerproviders dat exacte account verifiëren. Het blijvende bewijs verloopt niet; actuele scannergezondheid wordt afzonderlijk gecontroleerd voor betalingsverificatie, niet voor factuuraanmaak.
receive_readinessobject | null5.5.0+
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.Details
Opgenomen in walletlijsten: ontvangstconfiguratie van het project en vereisten voor de blockchainscanner. Staat los van saldi, tokengas en verzendgereedheid. Andere walletantwoorden kunnen dit null laten.
readybooleanaltijdOntvangstconfiguratiecontroles slagen. Beschrijft geen bestedingsgereedheid, gas, saldovernieuwing of gegarandeerde toekomstige prijsopgave.
invoice_creatableboolean6.0.6+De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.Details
De configuratie staat een factuurmethode toe ondanks tijdelijke scannerwaarschuwingen. Valutaprijsbepaling wordt bij aanmaak gecontroleerd. Dit is geen betalingsverificatie: ready kan false zijn terwijl invoice_creatable true is. Ontbrekende wallets, uitgeschakeld beleid en niet-ondersteunde adapters blijven veilig weigeren.
checked_attimestampaltijdBeoordelingstijd. Een lijst opvragen maakt geen netwerkverzoek en wijst geen adres toe.
issues[]object[]altijd
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.Details
Leeg indien gereed; anders een ontvangstwaarschuwing of configuratieblokkade. Controleer invoice_creatable om tijdelijke scannerwaarschuwingen van factuurconfiguratiefouten te onderscheiden.
chain_slugstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_idUUIDindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
asset_tickerstringindien bekendIdentificeert de betrokken blockchain en het actief. Lightning kan asset_id weglaten.
reason_codestringaltijdscanner_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 of asset_not_accepted.Details
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 of asset_not_accepted.
messagestringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
actionstringindien beschikbaarUitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.Details
Uitleg voor de handelaar en actie-identificatie: chain_connections, wallets, rates, payment_methods, project_settings of store_settings. Geen inloggegevens of private provider-URL's.
required_endpoint_rolestring | nullop de blockchainVoorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.Details
Voorkeursrol van de scanner-API (verouderd veld). Gebruik accepted_endpoint_roles voor de volledige compatibiliteitslijst. Een gezonde node alleen bewijst geen ondersteuning voor betalingsgeschiedenis.
accepted_endpoint_roles[]string[] | nullop de blockchainCompatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.Details
Compatibele API-dialecten, geen bewijs van eindpuntgeschiedenis of capaciteit. Ruwe node-rpc ondersteunt BTC/BCH/LTC/DOGE/DASH en transparante ZEC (volledig gedecodeerde blokken, 1–48 bevestigingen), definitief bevestigde eigen TRX, eigen ALGO via algod, XTZ via Octez, definitief bevestigde Asset Hub DOT via SCALE-metadata en eigen XLM via Stellar RPC met factuurmemo-ID. Gesnoeide of onvolledige geschiedenis voldoet niet. Deze ruwe adapters voegen geen tokenroutes toe. Geïndexeerde API's blijven alternatieven; zie de tabel met betaalroutes hieronder. Gemengde ruwe/geïndexeerde bronnen verifiëren begrensde vensters onafhankelijk; de standaard blijft twee onafhankelijke providers, geen aliassen van één operator. Alleen nodehoogte, ORDnet-blockchaininformatie en een EVM-relay voor een niet-EVM-route zijn geen ontvangstbewijzen. Monero vereist nog steeds een aan het project gekoppelde wallet-RPC met alleen inzagerechten.
healthy_endpointsintegerop de blockchainGezonde overeenkomende eindpunten, niet het aantal onafhankelijke providers.
usable_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
required_independent_providersintegerop de blockchainBruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.Details
Bruikbare verificatieplaatsen, begrensd op twee. required_independent_providers is de blockchaininstelling: standaard 2, of 1 na expliciete keuze door een beheerder. In de modus met twee providers zijn verschillende providersleutels EN hosts vereist. Uitgeschakelde, verouderde (ouder dan tien minuten) of afkoelende bronnen vullen geen plaats. Lightning gebruikt eigen verbindingsregels.
last_checked_attimestamp | nullop de blockchainLaatste gezondheidscontrole van een overeenkomend eindpunt, los van de beoordelingstijd.
monero_wallet_rpcMoneroWalletRpcBinding | nullaltijdGeschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.Details
Geschoonde externe wallet-RPC-koppelingsstatus met alleen inzagerechten voor Monero. Bevat eindpunt, authenticatiemodus, primair account-0-adres, technische bewijsvlaggen/-hoogtes en tijdstempels van operatorverklaringen; inloggegevens, walletsleutels en walletbestanden worden nooit geserialiseerd.
last_secret_revealed_attimestamp|nullaltijdAuditmetadata over het tonen van geheimen aan de consolekant.
balances[]object[]altijd
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.Details
Gecachte saldi voor elk van de 30 eigen blockchainroutes, plus geverifieerde ERC-20- en SPL-activa. Voor Monero is een ingestelde externe wallet-RPC met alleen inzagerechten vereist.
project_enabledbooleanaltijdOf dit actief momenteel is ingeschakeld volgens het activabeleid van het project.
active_store_countintegeraltijdAantal ingeschakelde winkels dat dit actief momenteel selecteert. Dit is een weergave van acceptatie; alleen-lezen saldoregistratie blijft onafhankelijk.
active_store_ids[]UUID[]altijdIngeschakelde winkels in dit project die het actief momenteel accepteren. Dit maakt exact lokaal filteren op winkel mogelijk zonder extra API-verzoek.
tracking_activebooleanaltijdOf deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.Details
Of deze leesbare wallet en het geregistreerde actief op dezelfde blockchain in aanmerking komen voor saldovernieuwing op de achtergrond. Schakelaars voor project- en betaalmethodeacceptatie pauzeren alleen-lezen registratie niet.
balancedecimal string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
balance_atomicinteger string|nullaltijdExact weergegeven en atomair saldo over het primaire walletadres en uitgegeven factuuradressen. Null zolang geen volledige waarde beschikbaar is.
statuspending | refreshing | fresh | stale | erroraltijdGecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.Details
Gecachte scanstatus. refreshing kan een voltooid saldo behouden: gebruik checked_at voor de ouderdom. Pending betekent dat er geen voltooide momentopname is. Geen van deze statussen bewijst dat een overschrijving openstaat of een factuur is voldaan.
balance_statuspending | refreshing | fresh | stale | error | unknownaltijdSamengevoegde cache-actualiteit; unknown is een defensieve terugval en geen van deze statussen bewijst factuurvoldoening.
balance_checked_attimestamp | nullaltijdOudste relevante succesvolle saldocontrole die in het totaal is vertegenwoordigd.
recent_payments[]object[]altijd
Maximaal drie nieuwste geldige waarnemingen met status detected, confirming of final die aan precies deze wallet zijn toegewezen.
amountdecimal stringaltijdExact waargenomen activabedrag zonder omzetting naar drijvendekommagetallen.
statusdetected | confirming | finalaltijdHuidige geldige waarnemingsstatus. Gereorganiseerde, vervangen en ongeldige waarnemingen worden uitgesloten.
observed_atRFC 3339 timestampaltijdTijdstip waarop Wholly Crypto de betaling voor het eerst waarnam.
Gebruiksopmerkingen
- Deze bearerroute geeft nooit een herstelzin, private sleutel, versleuteld geheim of bestedingsmethode terug.
- Een nieuw geregistreerd actief op dezelfde blockchain wordt vóór de eerste voltooide scan teruggegeven met null-saldi en status pending; nooit met een verzonnen nul.
- Een project, wallet voor betaalacceptatie, eigen betaalroute of afzonderlijk actief uitschakelen stopt alleen-lezen saldoregistratie niet: actieve en uitgeschakelde wallets met een primair adres blijven elk geregistreerd ondersteund actief op dezelfde blockchain vernieuwen. Wallets met status pending of error worden niet gescand.
- project_enabled meldt alleen het acceptatiebeleid voor activa van het project en kan false zijn terwijl tracking_active true blijft.
- balance en balance_atomic zijn exacte tekenreeksen; price_usd, value_usd en total_value_usd zijn indicatief en kunnen null zijn. Een actuele saldostatus garandeert geen actuele marktprijs.
- Waardering gebruikt bij voorkeur CoinGecko-prijzen tot twee uur oud. Eigen munten en geverifieerde canonieke USDC/USDT kunnen terugvallen op ingeschakelde Kraken-/Binance-USD-koersen tot vijf minuten oud, met de primaire provider eerst. Geen aangenomen dollarkoppeling of prijsbepaling van eigen tokens alleen op tickersymbool; vaste/DEX-projectprijzen blijven afzonderlijk. Factuurprijsopgaven blijven ongewijzigd.
- Pending heeft geen volledige momentopname. Refreshing behoudt het laatste voltooide bedrag en checked_at; het betekent niet dat een blockchainoverschrijving openstaat. Stale/error-bedragen kunnen ook oudere waarden behouden. Behandel een onbeschikbare cache nooit als nul of als een ontbrekende betaling. Routinematige EVM-/Solana-vernieuwingen hergebruiken recent gecontroleerde lege adressen tot 30 minuten tussen audits, terwijl gefinancierde, nieuwe en gewijzigde adressen opnieuw worden gecontroleerd. Expliciet Saldi scannen in de console vraagt een volledige scan aan.
- recent_payments is begrensd op drie waarnemingen per wallet en sluit ongeldig verklaarde geschiedenis uit.
Fouten
POSTFactuur maken/v1/projects/{project_id}/stores/{store_id}/invoicesLezen + schrijven
Maakt atomair een factuur met walletbestemmingen, actuele exacte prijsopgaven, auditgeschiedenis en meldingsuitboxrecords. Identieke onbewerkte bodybytes herhalen met dezelfde API-referentie en Idempotency-Key geeft de oorspronkelijke factuur terug.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Idempotency-Key | vereist | Unieke 1–128 zichtbare ASCII-tekens zonder witruimte. |
| Content-Type | aanbevolen | application/json. De huidige handler voor de onbewerkte body verwerkt JSON zonder het mediatype af te dwingen. |
| Accept | aanbevolen | application/json |
Padparameters
project_idUUIDvereistKopieer de Project-API-ID uit Project → Instellingen → API-ID's. Moet aan de API-referentie zijn toegewezen; een leesbare projectidentificatie wordt niet geaccepteerd.
store_idUUIDvereistKopieer de Store-API-ID uit Project → Winkels → selecteer een winkel → Basis → API-ID's. Vereist ook voor de standaardwinkel; moet ingeschakeld zijn en bij project_id horen.
Verzoek
: "${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))Requestbody
amountstringvereistGewone decimale tekenreeks zonder teken; geen teken of exponent, maximaal 48 cijfers vóór en 30 na de komma. Moet standaard positief zijn. Een winkel kan facturen met nulbedrag toestaan onder Winkels → Factuur; nultotalen worden voldaan zonder geld te ontvangen, adressen toe te wijzen of verwerkingskosten.Details
Gewone decimale tekenreeks zonder teken; geen teken of exponent, maximaal 48 cijfers vóór en 30 na de komma. Moet standaard positief zijn. Een winkel kan facturen met nulbedrag toestaan onder Winkels → Factuur; nultotalen worden voldaan zonder geld te ontvangen, adressen toe te wijzen of verwerkingskosten.
currencystring | nulloptioneelOndersteunde fiatvaluta met drie letters, genormaliseerd naar hoofdletters. Weggelaten of null neemt de factuurvaluta van de winkel over. Aanmaak vereist ook een onafhankelijk beschikbare omrekenkoers voor facturering.Details
Ondersteunde fiatvaluta met drie letters, genormaliseerd naar hoofdletters. Weggelaten of null neemt de factuurvaluta van de winkel over. Aanmaak vereist ook een onafhankelijk beschikbare omrekenkoers voor facturering.
payment_methods[]object[] | nulloptioneel
Selecteer voor deze factuur methoden die in de winkel zijn ingeschakeld. Merchant 5.4.0+: negeer onbekende/inactieve/niet-geaccepteerde keuzes; als niets overeenkomt, gebruik de winkelstandaarden. Weggelaten/null gebruikt ook de winkelstandaarden; [] is ongeldig. Schakelt nooit een methode in en wijzigt geen winkelinstellingen. Zie het selectieschema hieronder.Details
Selecteer voor deze factuur methoden die in de winkel zijn ingeschakeld. Merchant 5.4.0+: negeer onbekende/inactieve/niet-geaccepteerde keuzes; als niets overeenkomt, gebruik de winkelstandaarden. Weggelaten/null gebruikt ook de winkelstandaarden; [] is ongeldig. Schakelt nooit een methode in en wijzigt geen winkelinstellingen. Zie het selectieschema hieronder.
chain_slugstringvereistKopieer chain_slug in Project → Winkels → Betaalmethoden of lees deze uit GET /v1/projects/{project_id}/stores/{store_id}/payment-assets, zoals ethereum, base of bitcoin. Een blockchain-/betaalroutepaar mag maar één keer voorkomen.Details
Kopieer chain_slug in Project → Winkels → Betaalmethoden of lees deze uit GET /v1/projects/{project_id}/stores/{store_id}/payment-assets, zoals ethereum, base of bitcoin. Een blockchain-/betaalroutepaar mag maar één keer voorkomen.
asset_ids[]UUID[] | nulloptioneelasset.id-UUID's van blockchainactiva, geen contractadressen of factuur-betaalmethode-ID's. Gebruik dit OF asset_tickers. Laat beide selectoren weg voor alle actieve geaccepteerde activa op deze blockchain. [] en dubbele/nul-ID's zijn ongeldig. Negeer op 5.4.0+ ID's die op deze blockchain in deze winkel niet actief/geaccepteerd zijn; een volledig niet-overeenkomende selectie gebruikt winkelstandaarden.Details
asset.id-UUID's van blockchainactiva, geen contractadressen of factuur-betaalmethode-ID's. Gebruik dit OF asset_tickers. Laat beide selectoren weg voor alle actieve geaccepteerde activa op deze blockchain. [] en dubbele/nul-ID's zijn ongeldig. Negeer op 5.4.0+ ID's die op deze blockchain in deze winkel niet actief/geaccepteerd zijn; een volledig niet-overeenkomende selectie gebruikt winkelstandaarden.
asset_tickers[]string[] | nulloptioneelMerchant 5.3.0+. Symbolen zoals BTC, USDC of PEPE, beperkt tot chain_slug en deze winkel. 1–64 unieke tickersymbolen; witruimte aan uiteinden verwijderd/hoofdletterongevoelig, 1–40 ASCII-letters/cijfers/punt/underscore/koppelteken. Gebruik dit OF asset_ids. Negeer op 5.4.0+ onbekende/inactieve/niet-geaccepteerde tickersymbolen. Dubbelzinnige geaccepteerde symbolen blijven een fout geven: gebruik asset_ids. Actieve geselecteerde methoden hebben geldige wallets en prijsbepaling nodig; tijdelijke storingen van blockchainscanners blokkeren aanmaak vanaf 6.0.6 niet. Lightning accepteert optioneel alleen BTC.Details
Merchant 5.3.0+. Symbolen zoals BTC, USDC of PEPE, beperkt tot chain_slug en deze winkel. 1–64 unieke tickersymbolen; witruimte aan uiteinden verwijderd/hoofdletterongevoelig, 1–40 ASCII-letters/cijfers/punt/underscore/koppelteken. Gebruik dit OF asset_ids. Negeer op 5.4.0+ onbekende/inactieve/niet-geaccepteerde tickersymbolen. Dubbelzinnige geaccepteerde symbolen blijven een fout geven: gebruik asset_ids. Actieve geselecteerde methoden hebben geldige wallets en prijsbepaling nodig; tijdelijke storingen van blockchainscanners blokkeren aanmaak vanaf 6.0.6 niet. Lightning accepteert optioneel alleen BTC.
payment_railonchain | lightningoptioneelStandaard onchain. Gebruik om Bitcoin Lightning te kiezen {chain_slug: bitcoin, payment_rail: lightning} zonder asset_ids; asset_tickers mag optioneel [BTC] zijn. Bitcoin op de blockchain omvat Lightning niet. De Lightning-verbinding van de winkel moet al ingeschakeld en gereed zijn.Details
Standaard onchain. Gebruik om Bitcoin Lightning te kiezen {chain_slug: bitcoin, payment_rail: lightning} zonder asset_ids; asset_tickers mag optioneel [BTC] zijn. Bitcoin op de blockchain omvat Lightning niet. De Lightning-verbinding van de winkel moet al ingeschakeld en gereed zijn.
order_idstring | nulloptioneelBestelreferentie van de handelaar, 1–128 tekens na verwijderen van witruimte aan de uiteinden; stuurtekens worden afgewezen.
emailstring | nulloptioneelE-mailadres van de klant, alleen voor de handelaar, genormaliseerd naar een praktisch ASCII-adres van maximaal 254 tekens. Weggelaten of null slaat geen e-mailadres op.
descriptionstring | nulloptioneelOmschrijving voor de klant, 1–500 tekens; regeleinden en tabs zijn toegestaan.
expires_in_secondsinteger | nulloptioneelGeldigheidsduur van de factuurprijsopgave van 300 tot en met 86,400 seconden; weggelaten of null neemt het winkelbeleid over.
exchange_rate_spread_percentdecimal string | nulloptioneelPrijsopslag van 0 tot en met 100, met maximaal twee decimalen. Weggelaten of null neemt de winkelstandaard over; "0" schakelt deze uit voor deze factuur. Wordt vóór afronding naar boven toegepast en daarna vastgezet. Verandert het fiatbedrag van de factuur of de basis voor de verwerkingsvergoeding niet.Details
Prijsopslag van 0 tot en met 100, met maximaal twee decimalen. Weggelaten of null neemt de winkelstandaard over; "0" schakelt deze uit voor deze factuur. Wordt vóór afronding naar boven toegepast en daarna vastgezet. Verandert het fiatbedrag van de factuur of de basis voor de verwerkingsvergoeding niet.
underpayment_tolerance_percentdecimal string | nulloptioneelGeaccepteerd tekort van 0 tot en met 99.99 met maximaal twee decimalen. Weggelaten of null neemt de winkelstandaard over.
ipn_urlstring | nulloptioneelPublieke HTTPS-callback, maximaal 2,048 bytes en zonder inloggegevens of fragment. Overschrijft de winkelstandaard; null/weggelaten neemt die over.
redirect_urlstring | nulloptioneelHTTPS-succes-URL die na voldoening wordt gebruikt, maximaal 2,048 bytes en zonder ingebedde inloggegevens. Weggelaten of null neemt de winkelstandaard over en kan die niet wissen.
cancel_urlstring | nulloptioneelHTTPS-terugkeer-URL die wordt gebruikt als afrekenen zonder succesvolle betaling eindigt. Weggelaten of null neemt de winkelstandaard over en kan die niet wissen.
redirect_automaticallyboolean | nulloptioneelWeggelaten of null neemt het winkelbeleid over. true vereist een effectieve redirect_url.
languagestring | nulloptioneelKlanttaal: en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja. pt betekent Braziliaans Portugees en zh betekent vereenvoudigd Chinees. Ondersteunde regionale tags zoals de-DE worden genormaliseerd naar de vermelde taal. Weggelaten of null neemt de winkeltaal over. De consoletaal staat hier los van.Details
Klanttaal: en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja. pt betekent Braziliaans Portugees en zh betekent vereenvoudigd Chinees. Ondersteunde regionale tags zoals de-DE worden genormaliseerd naar de vermelde taal. Weggelaten of null neemt de winkeltaal over. De consoletaal staat hier los van.
checkout_appearanceobject | nulloptioneel
Gedeeltelijke presentatie-instellingen voor deze factuur. Weggelaten/null volgt het huidige winkelontwerp. Een object, inclusief {}, zet het berekende ontwerp en de afbeeldingen bij aanmaak vast. Zie het afwijkingsschema hieronder; geen financiële instellingen, HTML, CSS, JavaScript of externe afbeeldings-URL's.Details
Gedeeltelijke presentatie-instellingen voor deze factuur. Weggelaten/null volgt het huidige winkelontwerp. Een object, inclusief {}, zet het berekende ontwerp en de afbeeldingen bij aanmaak vast. Zie het afwijkingsschema hieronder; geen financiële instellingen, HTML, CSS, JavaScript of externe afbeeldings-URL's.
inherit_default_storebooleanoptioneeltrue kiest het ontwerp van de standaardwinkel van het project als basis; gebruik anders het effectieve ontwerp van de doelwinkel. Afwijkingen worden daarna toegepast en onafhankelijk opgeslagen; de uiteindelijke factuurvlag is false.Details
true kiest het ontwerp van de standaardwinkel van het project als basis; gebruik anders het effectieve ontwerp van de doelwinkel. Afwijkingen worden daarna toegepast en onafhankelijk opgeslagen; de uiteindelijke factuurvlag is false.
introstringoptioneelPlatte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.Details
Platte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.
outrostringoptioneelPlatte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.Details
Platte tekst, elk maximaal 2,000 tekens. Intro verschijnt bovenaan, Outro onderaan in elke status. Regeleinden blijven behouden; veilige tekst-URL's worden links. Een lege tekenreeks wist. Het oudere customer_message wordt als alias voor intro geaccepteerd; verstuur niet beide.
intro_font_sizeintegeroptioneelPixels: 12, 14, 16, 18, 20 of 24. Standaard 16 tenzij anders overgenomen.
outro_font_sizeintegeroptioneelPixels: 12, 14, 16, 18, 20 of 24. Standaard 16 tenzij anders overgenomen.
accent_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
background_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
card_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
button_colorstringoptioneel#RRGGBB. Achtergrond, kaart en knop mogen leeg zijn voor automatische kleuren. Tekstcontrast is automatisch.
imagesobjectoptioneel
Sleutels logo_light, logo_dark, favicon. Een weggelaten sleutel behoudt de basisafbeelding; null verwijdert die. Een object {store_id: UUID, kind?: logo_light|logo_dark|favicon} hergebruikt de effectieve geüploade afbeelding van die winkel in HETZELFDE project. kind is standaard de doelsleutel. Upload eerst onder Winkel → Afrekenen; kopieer de Store-API-ID uit Basis → API-ID's. Ontbrekende afbeeldingen of ID's uit andere projecten geven 400 terug. Geen externe URL's of afbeeldingsgegevens toegestaan.Details
Sleutels logo_light, logo_dark, favicon. Een weggelaten sleutel behoudt de basisafbeelding; null verwijdert die. Een object {store_id: UUID, kind?: logo_light|logo_dark|favicon} hergebruikt de effectieve geüploade afbeelding van die winkel in HETZELFDE project. kind is standaard de doelsleutel. Upload eerst onder Winkel → Afrekenen; kopieer de Store-API-ID uit Basis → API-ID's. Ontbrekende afbeeldingen of ID's uit andere projecten geven 400 terug. Geen externe URL's of afbeeldingsgegevens toegestaan.
show_order_idbooleanoptioneelToon bestel-ID-details en een platte-tekstomschrijving onder de titel. details_expanded opent bestel-ID-details standaard. Alleen weergave, geen afscherming van gegevens.
show_descriptionbooleanoptioneelToon bestel-ID-details en een platte-tekstomschrijving onder de titel. details_expanded opent bestel-ID-details standaard. Alleen weergave, geen afscherming van gegevens.
details_expandedbooleanoptioneelToon bestel-ID-details en een platte-tekstomschrijving onder de titel. details_expanded opent bestel-ID-details standaard. Alleen weergave, geen afscherming van gegevens.
show_project_namebooleanoptioneelMerchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.Details
Merchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.
show_store_namebooleanoptioneelMerchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.Details
Merchant 5.6.0+: toon of verberg elke naam in de kop van de klantafrekenpagina. Beide zijn standaard true. Ook beschikbaar onder Winkel → Afrekenen; overgenomen en vastgelegd per factuur zoals andere uiterlijkinstellingen. Alleen weergave, geen afscherming van gegevens.
featured_chains[]string[]optioneelGeordende blockchain-slugs, maximaal 60 unieke waarden (kleine letters, cijfers, koppeltekens; maximaal 64 tekens). [] wist. Alleen beschikbare factuurmethoden worden opnieuw geordend.Details
Geordende blockchain-slugs, maximaal 60 unieke waarden (kleine letters, cijfers, koppeltekens; maximaal 64 tekens). [] wist. Alleen beschikbare factuurmethoden worden opnieuw geordend.
featured_asset_ids[]UUID[]optioneelMaximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.Details
Maximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.
default_asset_idUUID|nulloptioneelMaximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.Details
Maximaal 100 unieke geordende activa-ID's; [] wist. Het standaardactief mag null zijn. ID's komen uit payment-assets, niet uit betalingsintenties. Deze schakelen nooit methoden in; ontvangen betalingen en geldige klantvoorkeuren hebben voorrang.
messagesobjectoptioneel
Taalobjecten met sleutels en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja, met gewone tekenreeksen waiting, confirming, paid, underpaid, expired (elk 500 tekens). Alleen aangeleverde talen/statussen veranderen; {} wist alle berichten, {en:{}} wist Engels en een lege statustekenreeks wist die status. Engels is de terugvaltaal. Vervangt de werkelijke status niet.Details
Taalobjecten met sleutels en, de, es, pt-BR, it, ru, zh-CN, fr, ko of ja, met gewone tekenreeksen waiting, confirming, paid, underpaid, expired (elk 500 tekens). Alleen aangeleverde talen/statussen veranderen; {} wist alle berichten, {en:{}} wist Engels en een lege statustekenreeks wist die status. Engels is de terugvaltaal. Vervangt de werkelijke status niet.
enobjectoptioneel
deobjectoptioneel
esobjectoptioneel
pt-BRobjectoptioneel
itobjectoptioneel
ruobjectoptioneel
zh-CNobjectoptioneel
frobjectoptioneel
koobjectoptioneel
support_urlstringoptioneelHTTPS-URL's tot 2,048 tekens, zonder inloggegevens. Leeg wist. Links openen in een nieuw venster.
terms_urlstringoptioneelHTTPS-URL's tot 2,048 tekens, zonder inloggegevens. Leeg wist. Links openen in een nieuw venster.
privacy_urlstringoptioneelHTTPS-URL's tot 2,048 tekens, zonder inloggegevens. Leeg wist. Links openen in een nieuw venster.
return_button_textstringoptioneelLabel tot 60 tekens. Gebruik redirect_url/cancel_url/redirect_automatically/language op het hoogste niveau voor factuurgedrag.
show_return_buttonbooleanoptioneelToon de handmatige knop Terug naar handelaar/annuleren op de afrekenpagina, inclusief eindstatussen. Laat weg om het winkeluiterlijk over te nemen (standaard true); false verbergt de knop. Annuleert geen factuur, verbergt geen URL's in JSON en schakelt automatische succesomleidingen niet uit. Stel zo nodig redirect_automatically op het hoogste niveau afzonderlijk in op false. Vereist merchant 8.1.4 of nieuwer.Details
Toon de handmatige knop Terug naar handelaar/annuleren op de afrekenpagina, inclusief eindstatussen. Laat weg om het winkeluiterlijk over te nemen (standaard true); false verbergt de knop. Annuleert geen factuur, verbergt geen URL's in JSON en schakelt automatische succesomleidingen niet uit. Stel zo nodig redirect_automatically op het hoogste niveau afzonderlijk in op false. Vereist merchant 8.1.4 of nieuwer.
metadataobject | nulloptioneel
JSON-object alleen voor de handelaar; weggelaten of null wordt {}, maximaal 4,096 gecodeerde bytes en vijf nestingsniveaus. firstname, lastname, street, street2, zip, city, country, countryiso2, company en vatid worden gevalideerd, genormaliseerd en overgenomen in samenvattingsvelden van de klant.Details
JSON-object alleen voor de handelaar; weggelaten of null wordt {}, maximaal 4,096 gecodeerde bytes en vijf nestingsniveaus. firstname, lastname, street, street2, zip, city, country, countryiso2, company en vatid worden gevalideerd, genormaliseerd en overgenomen in samenvattingsvelden van de klant.
Antwoord 201 new invoice; 200 exact idempotent replay
Voorbeeldantwoord
{
"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"
}
}Antwoordvelden
dataobject
invoice_idUUIDaltijdPublieke factuur-UUID die door handelaarsdetail- en afrekenpaden wordt gebruikt.
emailstring | nullaltijdE-mailadres van de klant, alleen voor de handelaar. Wordt nooit door publiek afrekenen teruggegeven.
customer_namestring | nullaltijdAfgeleide weergavenaam uit private metadata firstname, lastname en company.
customer_addressstring | nullaltijdAfgeleid handelaarsadres op één regel uit private metadata company, street, street2, zip, city, country, countryiso2 en vatid.
exchange_rate_spread_percentdecimal stringaltijdVastgezette prijsopslag: de afwijking bij aanmaak of de winkelstandaard bij weglaten. Toegepast vóór afronding naar boven; verandert nooit op deze factuur.
underpayment_tolerance_percentdecimal stringaltijdOnwijzigbaar geaccepteerd tekortpercentage, vastgelegd bij het maken van de factuur.
amount_statusamount statusaltijdnone, partial, paid of overpaid. Een expliciet toegestane factuur met nulbedrag wordt voldaan met none en zonder betaalmethoden.
winning_payment_intent_idUUID | nullaltijdBetaalmethode die de factuur heeft afgehandeld, wanneer geselecteerd.
monitoring_expires_atRFC 3339 timestampaltijdLaatste ingestelde grens voor controle op late betalingen over alle betaalmethoden.
ipn_urlstring | nullaltijdEffectieve IPN-bestemming per factuur. Alleen handelaarsantwoord; weggelaten uit publiek afrekenen.
cancel_urlstring | nullaltijdEffectieve terugkeer-URL die wordt gebruikt als afrekenen zonder succesvolle betaling eindigt.
metadataobjectaltijd
Handelaarsmetadata. Wordt nooit door publiek afrekenen teruggegeven. Betaalhulpmiddelen in de console voegen payment_tool-herkomst toe (id, kind, title, pricing, requested_amount, request_id); dit bewijst geen betaling. Authenticeer callbacks en handel invoice.settled één keer per invoice_id af.Details
Handelaarsmetadata. Wordt nooit door publiek afrekenen teruggegeven. Betaalhulpmiddelen in de console voegen payment_tool-herkomst toe (id, kind, title, pricing, requested_amount, request_id); dit bewijst geen betaling. Authenticeer callbacks en handel invoice.settled één keer per invoice_id af.
payment_intents[]object[]altijd
Geoffreerde betaalmethoden en monitoringsstatus.
idUUIDaltijdIdentificatie van de betalingsintentie; ook gebruikt als intent_id voor de afreken-QR-code.
payment_railonchain | lightningaltijdFactuurtransport. Bitcoin op de blockchain en Lightning kunnen asset_id delen; gebruik de intentie-id plus dit veld, niet alleen het symbool. Dit verschilt van de scanner-payment_rail in de activacatalogus.Details
Factuurtransport. Bitcoin op de blockchain en Lightning kunnen asset_id delen; gebruik de intentie-id plus dit veld, niet alleen het symbool. Dit verschilt van de scanner-payment_rail in de activacatalogus.
bolt11string | nullaltijdLightning-betaalverzoek, anders null. Betaal dit verzoek met een Lightning-wallet; stuur nooit blockchainmiddelen naar de betalingshash.
asset_decimalsintegeraltijdPrecisie in atomaire eenheden. Lightning BTC gebruikt 11 (millisatoshi's), niet de 8 van Bitcoin op de blockchain. Prijsopgaven zijn hele satoshi's; ontvangsten behouden millisatoshiprecisie.
quote_ratedecimal stringaltijdEenheden van het actief per één eenheid factuurvaluta, inclusief de vastgezette opslag. Bijvoorbeeld 1.02 USDC per USD. Niet de omgekeerde koers.
quote_detailsobject | nullaltijdVastgezette herkomst van de prijsopgave: reference_rate vóór opslag, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at en asset_fetched_at. Null bij oudere facturen; er worden geen historische waarden verzonnen.Details
Vastgezette herkomst van de prijsopgave: reference_rate vóór opslag, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at en asset_fetched_at. Null bij oudere facturen; er worden geen historische waarden verzonnen.
expected_amountdecimal stringaltijdExact vastgezet te betalen activabedrag na opslag en afronding naar boven. Vanaf 4.1.1 worden herkende geverifieerde fiatstablecoins (zoals USDC, USDT, DAI, USDS, EURC) naar boven afgerond op maximaal twee decimalen; 1.321 wordt 1.33, nooit 1.32. Dit is het verwachte bedrag, ook bij nultolerantie. Andere activa behouden adaptieve precisie. Bestaande facturen worden nooit opnieuw geprijsd.Details
Exact vastgezet te betalen activabedrag na opslag en afronding naar boven. Vanaf 4.1.1 worden herkende geverifieerde fiatstablecoins (zoals USDC, USDT, DAI, USDS, EURC) naar boven afgerond op maximaal twee decimalen; 1.321 wordt 1.33, nooit 1.32. Dit is het verwachte bedrag, ook bij nultolerantie. Andere activa behouden adaptieve precisie. Bestaande facturen worden nooit opnieuw geprijsd.
minimum_payment_amountdecimal stringaltijdKleinste bedrag dat na toepassing van de factuurtolerantie als betaald wordt geaccepteerd.
minimum_payment_amount_atomicinteger stringaltijdExacte geaccepteerde drempel in de kleinste eenheid van het actief.
destination_addressstringaltijdOntvangstadres op de blockchain of de betalingshash van 64 tekens voor Lightning. Gebruik bolt11 om via Lightning te betalen; de hash is geen Bitcoin-adres.
destination_tagstring | nullaltijdVereiste publieke betalingsreferentie waar de betaalroute die gebruikt: XRP-bestemmingstag, Stellar-memo-ID of TON-factuurcommentaar. Null voor routes met unieke adressen.
monitoring_expires_atRFC 3339 timestampaltijdEindgrens voor controle op late betalingen voor deze methode.
last_chain_heightinteger | nullaltijdLaatste betrouwbare hoogte die door de monitor is waargenomen.
fully_paid_attimestamp | nullaltijdTijdstip waarop het geaccepteerde minimumbedrag voor het eerst werd bereikt.
Gebruiksopmerkingen
- payment_methods filtert ingeschakelde winkelmethoden alleen voor deze factuur. Weggelaten/null behoudt alle winkelmethoden; [] is ongeldig. Je vindt de kleine chain_slug-aanduiding en getoonde tickersymbolen onder Project → Winkels → Betaalmethoden. De API-lijst payment-assets levert chain_slug, asset.symbol en asset.id. Gebruik {chain_slug: ethereum, asset_tickers: [USDC, USDT]} voor geaccepteerde Ethereum-tokens; BTC en PEPE werken hetzelfde op hun geselecteerde blockchains. Tickersymbolen zijn hoofdletterongevoelig, beperkt tot de blockchain en worden alleen binnen de winkel opgezocht. Twee geaccepteerde contracten met hetzelfde tickersymbool geven 400 terug in plaats van er één te kiezen, ook als één niet gereed is; gebruik in dat geval asset_ids. Eigen munten, catalogustokens en eigen tokens volgen dezelfde regels. Elke blockchain/betaalroute mag één keer voorkomen; maximaal 64 uiteindelijke methoden. Merchant 5.4.0+: onbekende, uitgeschakelde, verkeerde-blockchain- of niet-geaccepteerde keuzes worden genegeerd. Als de volledige selectie geen actieve geaccepteerde overeenkomsten heeft, gelden de winkelstandaarden; anders worden alleen overeenkomende keuzes gebruikt. Een vermelding met alleen de blockchain omvat elk actief geaccepteerd blockchainactief. Actieve geselecteerde methoden hebben geldige wallets, geïnstalleerde scanneradapters en betrouwbare koersen nodig. Vanaf 6.0.6 blokkeren onbeschikbare scanners, wachttijden en nog niet uitgevoerde/verouderde gezondheidscontroles de factuuraanmaak niet en verwijderen ze geen ingestelde blockchainmethoden. Detectie probeert automatisch opnieuw; voldoening vereist nog steeds providerquorum en bevestigingen. Bewaak receive_readiness en houd providers beschikbaar: een factuur kan ongeverifieerd blijven totdat scanners herstellen. Toewijzing van Monero-subadressen en aanmaak van Lightning-BOLT11 vereisen nog steeds hun externe wallet-/nodeservice. Fouten geven error.message plus error.details.payment_methods terug met chain_slug, asset_ticker, reason_code en, voor scannerdiagnostiek, required_endpoint_role, healthy_endpoints en required_independent_providers. TRON accepteert geïndexeerde geschiedenis of ondersteunde ruwe API's voor definitief bevestigde blokken van de eigen munt; basisgezondheid alleen bewijst geen scannercompatibiliteit. Prijsfouten identificeren het actief/de valuta. Niets schakelt een niet-geaccepteerd actief in of wijzigt winkelbeleid. Op merchantversies vóór 5.4.0 mislukken onbekende/inactieve expliciete keuzes in plaats daarvan. Bestaande factuurmethoden worden nooit uitgebreid wanneer winkelinstellingen veranderen. Lightning moet afzonderlijk worden geselecteerd. Herhalingen behouden de oorspronkelijke methoden en selecties wijzigen met dezelfde Idempotency-Key geeft 409 terug.
- checkout_appearance ondersteunt elke hierboven vermelde presentatie-instelling. Weggelaten velden nemen waarden over, arrays vervangen en geneste berichtvelden worden samengevoegd; een leeg berichtobject wist dat bereik. Het berekende ontwerp en de afbeeldingen worden voor deze factuur opgeslagen zonder de winkel te bewerken. Lees appearance uit de publieke afreken-JSON om het resultaat te bekijken. Het volledige verzoek is beperkt tot 32 KiB en de uiteindelijke instellingen tot 20 KiB.
- checkout_appearance wijzigen met dezelfde Idempotency-Key geeft 409 terug; probeer opnieuw met identieke onbewerkte bytes. Uiterlijk verandert geen bedragen, koersen, geaccepteerde activa, bevestigingseisen, werkelijke status of inbedrechten. Geen HTML, CSS, scripts of ophalen van externe afbeeldingen.
- exchange_rate_spread_percent overschrijft de winkelstandaard voor deze factuur: laat weg of verstuur null om over te nemen, of verstuur "0" om uit te schakelen. Bestaande factuurprijsopgaven veranderen nooit.
- Opslag wordt vóór afronding naar boven toegepast. Kosten blijven gebaseerd op het oorspronkelijke fiatbedrag van de factuur, exclusief de opslag.
- Verstuur altijd het teruggegeven expected_amount of expected_amount_atomic. Afronding gebeurt naar boven, begrensd door activaprecisie, 0.1% van het bedrag en één kleine fiatvaluta-eenheid.
- Nieuwe pogingen moeten dezelfde API-referentie, Idempotency-Key en exacte bodybytes behouden. Opslag wijzigen met dezelfde sleutel geeft 409 idempotency_conflict terug.
- Een exacte herhaling wordt gecontroleerd vóór een nieuwe prijsopgave, callback-DNS of adresvoorbereiding. Bereik van de API-referentie en project-/winkelautorisatie worden nog steeds bij elk verzoek gecontroleerd.
- Een effectieve ipn_url vereist het IPN-ondertekeningsgeheim van de winkel. Onbekende bodyvelden worden afgewezen.
Fouten
GETFacturen opvragen/v1/projects/{project_id}/invoicesAlleen-lezen
Geeft een compacte pagina met factuursamenvattingen binnen het bereik terug, nieuwste eerst, inclusief e-mail alleen voor de handelaar en klantvelden afgeleid van herkende metadata. Zoek-, status- en winkelfilters worden op de server toegepast; het antwoord bevat total en has_more voor voorspelbare paginering.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | aanbevolen | application/json |
Padparameters
Queryparameters
searchstringOptioneel hoofdletterongevoelig voorvoegsel van factuur-id, bestel-id of e-mail; exacte factuur-UUID; of deeltekst in omschrijving en herkende klantvelden. Alle metadatasleutels en tekstuele, numerieke en booleaanse waarden (inclusief geneste objecten/arrays) ondersteunen ook geïndexeerd zoeken op woordvoorvoegsels: elk zoekwoord moet overeenkomen, leestekens gelden als scheidingstekens. Witruimte aan uiteinden verwijderd, maximaal 100 tekens, geen stuurtekens. Metadatamatches voegen geen ruwe metadata toe aan lijstantwoorden; gebruik factuurdetails om die te lezen.Details
Optioneel hoofdletterongevoelig voorvoegsel van factuur-id, bestel-id of e-mail; exacte factuur-UUID; of deeltekst in omschrijving en herkende klantvelden. Alle metadatasleutels en tekstuele, numerieke en booleaanse waarden (inclusief geneste objecten/arrays) ondersteunen ook geïndexeerd zoeken op woordvoorvoegsels: elk zoekwoord moet overeenkomen, leestekens gelden als scheidingstekens. Witruimte aan uiteinden verwijderd, maximaal 100 tekens, geen stuurtekens. Metadatamatches voegen geen ruwe metadata toe aan lijstantwoorden; gebruik factuurdetails om die te lezen.
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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
}
}Antwoordvelden
data[]object[]
invoice_idUUIDaltijdPublieke factuur-UUID die door handelaarsdetail- en afrekenpaden wordt gebruikt.
emailstring | nullaltijdE-mailadres van de klant, alleen voor de handelaar. Wordt nooit door publiek afrekenen teruggegeven.
customer_namestring | nullaltijdAfgeleide weergavenaam uit private metadata firstname, lastname en company.
customer_addressstring | nullaltijdAfgeleid handelaarsadres op één regel uit private metadata company, street, street2, zip, city, country, countryiso2 en vatid.
exchange_rate_spread_percentdecimal stringaltijdVastgezette prijsopslag: de afwijking bij aanmaak of de winkelstandaard bij weglaten. Toegepast vóór afronding naar boven; verandert nooit op deze factuur.
underpayment_tolerance_percentdecimal stringaltijdOnwijzigbaar geaccepteerd tekortpercentage, vastgelegd bij het maken van de factuur.
amount_statusamount statusaltijdnone, partial, paid of overpaid. Een expliciet toegestane factuur met nulbedrag wordt voldaan met none en zonder betaalmethoden.
winning_payment_intent_idUUID | nullaltijdBetaalmethode die de factuur heeft afgehandeld, wanneer geselecteerd.
monitoring_expires_atRFC 3339 timestampaltijdLaatste ingestelde grens voor controle op late betalingen over alle betaalmethoden.
paginationobject
totalintegeraltijdTotaal aantal rijen dat overeenkomt met project-, winkel-, status- en zoekfilters in de paginamomentopname.
Gebruiksopmerkingen
- Gesorteerd op created_at aflopend, daarna interne id aflopend.
- Lijstitems zijn InvoiceSummary-objecten; email, customer_name en customer_address zijn alleen voor de handelaar. Vraag details op voor ruwe metadata en betalingsintenties.
- Stel voor de volgende pagina offset in op pagination.offset + pagination.limit, alleen als has_more true is.
- Aantal en pagina worden uit één repeatable-read-databasemomentopname gelezen; gelijktijdige schrijfacties verschijnen bij een later verzoek.
Fouten
GETFactuur ophalen/v1/projects/{project_id}/invoices/{invoice_id}Alleen-lezen
Geeft volledige handelaarsfactuurdetails en de huidige actieve afreken-URL terug. Gebruik deze route voor periodiek opvragen en afstemming.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | aanbevolen | application/json |
Padparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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"
}
}Antwoordvelden
dataobject
invoice_idUUIDaltijdPublieke factuur-UUID die door handelaarsdetail- en afrekenpaden wordt gebruikt.
emailstring | nullaltijdE-mailadres van de klant, alleen voor de handelaar. Wordt nooit door publiek afrekenen teruggegeven.
customer_namestring | nullaltijdAfgeleide weergavenaam uit private metadata firstname, lastname en company.
customer_addressstring | nullaltijdAfgeleid handelaarsadres op één regel uit private metadata company, street, street2, zip, city, country, countryiso2 en vatid.
exchange_rate_spread_percentdecimal stringaltijdVastgezette prijsopslag: de afwijking bij aanmaak of de winkelstandaard bij weglaten. Toegepast vóór afronding naar boven; verandert nooit op deze factuur.
underpayment_tolerance_percentdecimal stringaltijdOnwijzigbaar geaccepteerd tekortpercentage, vastgelegd bij het maken van de factuur.
amount_statusamount statusaltijdnone, partial, paid of overpaid. Een expliciet toegestane factuur met nulbedrag wordt voldaan met none en zonder betaalmethoden.
winning_payment_intent_idUUID | nullaltijdBetaalmethode die de factuur heeft afgehandeld, wanneer geselecteerd.
monitoring_expires_atRFC 3339 timestampaltijdLaatste ingestelde grens voor controle op late betalingen over alle betaalmethoden.
ipn_urlstring | nullaltijdEffectieve IPN-bestemming per factuur. Alleen handelaarsantwoord; weggelaten uit publiek afrekenen.
cancel_urlstring | nullaltijdEffectieve terugkeer-URL die wordt gebruikt als afrekenen zonder succesvolle betaling eindigt.
metadataobjectaltijd
Handelaarsmetadata. Wordt nooit door publiek afrekenen teruggegeven. Betaalhulpmiddelen in de console voegen payment_tool-herkomst toe (id, kind, title, pricing, requested_amount, request_id); dit bewijst geen betaling. Authenticeer callbacks en handel invoice.settled één keer per invoice_id af.Details
Handelaarsmetadata. Wordt nooit door publiek afrekenen teruggegeven. Betaalhulpmiddelen in de console voegen payment_tool-herkomst toe (id, kind, title, pricing, requested_amount, request_id); dit bewijst geen betaling. Authenticeer callbacks en handel invoice.settled één keer per invoice_id af.
payment_intents[]object[]altijd
Geoffreerde betaalmethoden en monitoringsstatus.
idUUIDaltijdIdentificatie van de betalingsintentie; ook gebruikt als intent_id voor de afreken-QR-code.
payment_railonchain | lightningaltijdFactuurtransport. Bitcoin op de blockchain en Lightning kunnen asset_id delen; gebruik de intentie-id plus dit veld, niet alleen het symbool. Dit verschilt van de scanner-payment_rail in de activacatalogus.Details
Factuurtransport. Bitcoin op de blockchain en Lightning kunnen asset_id delen; gebruik de intentie-id plus dit veld, niet alleen het symbool. Dit verschilt van de scanner-payment_rail in de activacatalogus.
bolt11string | nullaltijdLightning-betaalverzoek, anders null. Betaal dit verzoek met een Lightning-wallet; stuur nooit blockchainmiddelen naar de betalingshash.
asset_decimalsintegeraltijdPrecisie in atomaire eenheden. Lightning BTC gebruikt 11 (millisatoshi's), niet de 8 van Bitcoin op de blockchain. Prijsopgaven zijn hele satoshi's; ontvangsten behouden millisatoshiprecisie.
quote_ratedecimal stringaltijdEenheden van het actief per één eenheid factuurvaluta, inclusief de vastgezette opslag. Bijvoorbeeld 1.02 USDC per USD. Niet de omgekeerde koers.
quote_detailsobject | nullaltijdVastgezette herkomst van de prijsopgave: reference_rate vóór opslag, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at en asset_fetched_at. Null bij oudere facturen; er worden geen historische waarden verzonnen.Details
Vastgezette herkomst van de prijsopgave: reference_rate vóór opslag, unrounded_payment_amount, rounding_adjustment, pricing_provider, asset_provider, pricing_fetched_at en asset_fetched_at. Null bij oudere facturen; er worden geen historische waarden verzonnen.
expected_amountdecimal stringaltijdExact vastgezet te betalen activabedrag na opslag en afronding naar boven. Vanaf 4.1.1 worden herkende geverifieerde fiatstablecoins (zoals USDC, USDT, DAI, USDS, EURC) naar boven afgerond op maximaal twee decimalen; 1.321 wordt 1.33, nooit 1.32. Dit is het verwachte bedrag, ook bij nultolerantie. Andere activa behouden adaptieve precisie. Bestaande facturen worden nooit opnieuw geprijsd.Details
Exact vastgezet te betalen activabedrag na opslag en afronding naar boven. Vanaf 4.1.1 worden herkende geverifieerde fiatstablecoins (zoals USDC, USDT, DAI, USDS, EURC) naar boven afgerond op maximaal twee decimalen; 1.321 wordt 1.33, nooit 1.32. Dit is het verwachte bedrag, ook bij nultolerantie. Andere activa behouden adaptieve precisie. Bestaande facturen worden nooit opnieuw geprijsd.
minimum_payment_amountdecimal stringaltijdKleinste bedrag dat na toepassing van de factuurtolerantie als betaald wordt geaccepteerd.
minimum_payment_amount_atomicinteger stringaltijdExacte geaccepteerde drempel in de kleinste eenheid van het actief.
destination_addressstringaltijdOntvangstadres op de blockchain of de betalingshash van 64 tekens voor Lightning. Gebruik bolt11 om via Lightning te betalen; de hash is geen Bitcoin-adres.
destination_tagstring | nullaltijdVereiste publieke betalingsreferentie waar de betaalroute die gebruikt: XRP-bestemmingstag, Stellar-memo-ID of TON-factuurcommentaar. Null voor routes met unieke adressen.
monitoring_expires_atRFC 3339 timestampaltijdEindgrens voor controle op late betalingen voor deze methode.
last_chain_heightinteger | nullaltijdLaatste betrouwbare hoogte die door de monitor is waargenomen.
fully_paid_attimestamp | nullaltijdTijdstip waarop het geaccepteerde minimumbedrag voor het eerst werd bereikt.
Gebruiksopmerkingen
- Een zoekactie binnen een beperkt bereik geeft bewust invoice_not_found terug wanneer de publieke ID niet in het geautoriseerde project staat.
- links.checkout gebruikt Winkel → Basis → Winkeldomeinen: de actieve betaalhostnaam van deze winkel, daarna de keuze van de standaardwinkel en dan de primaire systeemhost. Vervallen/concept-hosts of hosts voor de verkeerde service worden genegeerd. Dit geldt ook voor aanmaak- en MCP-antwoorden; links worden bij het antwoorden bepaald, ook bij idempotente herhalingen. Ondertekende callbacklinks worden bij het maken van de gebeurtenis vastgezet en niet bij nieuwe pogingen herschreven. Deze voorkeuren genereren alleen links; ze leiden geen verkeer om en veranderen geen IP-beperkingen.
Fouten
GETFactuurbetalingen opvragen/v1/projects/{project_id}/invoices/{invoice_id}/paymentsAlleen-lezen
Volledige actuele overschrijvingsgeschiedenis, inclusief ongeldig verklaarde waarnemingen. Gebruik dit wanneer een callback payments_truncated aangeeft. Dit is de huidige toestand, geen reconstructie van een oudere gebeurtenis.
Authenticatie & headers
| Header | Aanwezigheid | Regel |
|---|---|---|
| Authorization | vereist | Bearer YOUR_MERCHANT_API_TOKEN |
| Accept | aanbevolen | application/json |
Padparameters
Queryparameters
Verzoek
: "${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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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}
}Antwoordvelden
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_urlstringGebruiksopmerkingen
- Een waarneming is een tokenlog, UTXO-output of andere overschrijving op een betaalroute, niet noodzakelijk een unieke transactiehash. Ontdubbel op payment_id; transaction_id plus event_index identificeert de blockchainoverschrijving.
- status is detected, confirming, final, reorged, replaced of invalid. Alleen waarnemingen met counts_towards_received dragen bij aan ontvangen bedragen. Tel bedragen van verschillende activa nooit bij elkaar op.
- Lightning-records gebruiken payment_hash met null voor transaction_id, confirmations en explorerlinks; BTC-precisie is 11 (millisatoshi's). Er worden geen preimages, BOLT11 of walletgeheimen getoond.
- Gesorteerd op observed_at aflopend, daarna payment_id aflopend. Aantal en pagina gebruiken één repeatable-read-momentopname; latere pagina's kunnen wijzigen wanneer betalingen binnenkomen. Ontdubbel op payment_id wanneer je een actieve factuur pagineert.
- Bestaande alleen-lezen projecttoegang, IP-beperkingen en aanvraaglimieten per API-referentie gelden. Volg nooit een callbacklink met je token tenzij de oorsprong overeenkomt met je ingestelde API-host.
Fouten
GETAfrekenbasis/Publiek
Hoofdpad van de beheerde afrekenhost dat de afrekenapplicatie levert zonder een factuur te selecteren. Klantintegraties horen normaal links.checkout te gebruiken.
Authenticatie & headers
Publiek
Verzoek
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())Antwoord 200 text/html
Voorbeeldantwoord
<!doctype html>
<!-- Hosted Wholly Crypto checkout shell -->Gebruiksopmerkingen
- Er is geen bearertoken nodig.
- De beheerde afrekenproxy staat GET/HEAD toe en wijst andere methoden af.
Fouten
GETGehoste afrekenpagina/invoice/{invoice_id}Publiek
HTML-afrekenpagina voor klanten. De pagina haalt veilige afreken-JSON op bij dezelfde afrekenhost. Inbedden wordt geweigerd tenzij de winkel dit inschakelt en expliciet de HTTPS-oorsprong van de bovenliggende pagina toestaat.
Authenticatie & headers
Publiek
Padparameters
Verzoek
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())Antwoord 200 text/html
Voorbeeldantwoord
<!doctype html>
<!-- Hosted Wholly Crypto checkout application -->Gebruiksopmerkingen
- Er wordt geen bearertoken geaccepteerd of vereist.
- De HTML-basis geeft zelf 200 terug, ook als een factuur ontbreekt; het afreken-JSON-verzoek ontvangt dan invoice_not_found.
- Het antwoord is no-store, noindex en heeft een factuurspecifieke frame-ancestors-CSP.
- Een uitgeschakeld project/winkel of een onbekende factuur toont geen afrekengegevens.
Fouten
GETFactuur met gegevens die veilig op de afrekenpagina kunnen worden getoond/checkout-api/invoices/{invoice_id}Publiek
Geeft alleen velden terug die nodig zijn om afrekenen weer te geven. Laat bewust interne ID's, klant-e-mail en afgeleide adresvelden, IPN-URL, handelaarsmetadata, wallet-ID's, afleidingspaden en monitordiagnostiek weg.
Authenticatie & headers
Publiek
Padparameters
Verzoek
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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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": []
}
]
}
}Antwoordvelden
dataobject
exchange_rate_spread_percentdecimal stringaltijdEffectieve prijsopslag vastgezet bij aanmaak, inclusief een afwijking per factuur.
amount_statusamount statusaltijdnone, partial, paid of overpaid. Een expliciet toegestane factuur met nulbedrag wordt voldaan met none en zonder betaalmethoden.
active_payment_method_idUUID | nullaltijdDe vermelde betaalmethode die geld heeft ontvangen. Afrekenen blijft op deze methode zodat een onderbetaling niet met een onverenigbaar actief wordt voortgezet.
payment_method_lockedbooleanaltijdTrue nadat een geldige betaling active_payment_method_id selecteert.
server_timeRFC 3339 timestampaltijdServerklok vastgelegd voor dit antwoord; gebruik die met expires_at om klokafwijkingen van het klantapparaat te vermijden.
expires_in_secondsintegeraltijdHele resterende seconden bij server_time, naar boven afgerond en begrensd op nul.
payment_openbooleanaltijdAlleen true zolang een factuur met status new of processing vóór de deadline is en minstens één betaalbare methode met een resterend bedrag heeft.
cancel_urlstring | nullaltijdTerugkeerbestemming voor de klant bij verlaten zonder succesvolle voldoening.
projectobjectaltijd
name, checkout_title, checkout_description, theme, accent_color en logo_url.
appearanceobjectaltijd
Effectieve presentatie: vastgezette factuurafwijking indien aangeleverd, anders het huidige winkelontwerp. Wijzigt nooit financiële velden of veiligheidswaarschuwingen.
inherit_default_storebooleanaltijdTrue wanneer de standaardwinkel van het project dit uiterlijk levert. False voor onafhankelijke winkels en vastgezette factuurafwijkingen.
invoice_overridebooleanaltijdTrue wanneer checkout_appearance bij factuuraanmaak is aangeleverd. Weggelaten/null houdt dit false.
titlestringaltijdGewone handelaarskop, bovenbericht en onderbericht. intro vervangt customer_message; oude opgeslagen tekst blijft behouden. Interpreteer dit nooit als opmaakcode.
introstringaltijdGewone handelaarskop, bovenbericht en onderbericht. intro vervangt customer_message; oude opgeslagen tekst blijft behouden. Interpreteer dit nooit als opmaakcode.
outrostringaltijdGewone handelaarskop, bovenbericht en onderbericht. intro vervangt customer_message; oude opgeslagen tekst blijft behouden. Interpreteer dit nooit als opmaakcode.
customer_messagestringaltijdVerouderde compatibiliteitsalias van intro. Gebruik intro voor nieuwe integraties.
accent_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
background_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
card_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
button_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
logo_sizestringaltijdsmall, medium of large; left of center. Afbeeldingen worden passend weergegeven, niet bijgesneden.
logo_alignmentstringaltijdsmall, medium of large; left of center. Afbeeldingen worden passend weergegeven, niet bijgesneden.
imagesobjectaltijdOptionele URL's voor logo_light, logo_dark en favicon: afgebakende genormaliseerde PNG-afbeeldingen van dezelfde oorsprong.
show_order_idbooleanaltijdZichtbaarheid van bestel-ID, omschrijving onder de titel en aanvankelijke uitklapstatus van bestel-ID. Het bedrag blijft zichtbaar; dit regelt weergave, geen afscherming van gegevens.
show_descriptionbooleanaltijdZichtbaarheid van bestel-ID, omschrijving onder de titel en aanvankelijke uitklapstatus van bestel-ID. Het bedrag blijft zichtbaar; dit regelt weergave, geen afscherming van gegevens.
details_expandedbooleanaltijdZichtbaarheid van bestel-ID, omschrijving onder de titel en aanvankelijke uitklapstatus van bestel-ID. Het bedrag blijft zichtbaar; dit regelt weergave, geen afscherming van gegevens.
show_project_namebooleanaltijdMerchant 5.6.0+: zichtbaarheid van namen in de kop. Beide zijn standaard true. Project-/winkelidentiteit blijft beschikbaar in JSON.
show_store_namebooleanaltijdMerchant 5.6.0+: zichtbaarheid van namen in de kop. Beide zijn standaard true. Project-/winkelidentiteit blijft beschikbaar in JSON.
featured_chains[]arrayaltijdGeordende voorkeuren, alleen toegepast op methoden die al in de factuur aanwezig zijn. Ontbrekende of uitgeschakelde methoden worden genegeerd.
featured_asset_ids[]arrayaltijdGeordende voorkeuren, alleen toegepast op methoden die al in de factuur aanwezig zijn. Ontbrekende of uitgeschakelde methoden worden genegeerd.
default_asset_idUUID | nullaltijdVoorgestelde eerste methode. Een geldige onthouden klantvoorkeur of een methode die al geld ontvangt heeft voorrang.
messagesobjectaltijd
Platte tekst voor en, de, es, pt-BR, it, ru, zh-CN, fr, ko en ja, met sleutels waiting, confirming, paid, underpaid en expired. Engelse terugval voor ontbrekende handelaarsberichten. Aanvullend; vervangt nooit de werkelijke status. Door de handelaar geschreven inhoud wordt niet automatisch vertaald.Details
Platte tekst voor en, de, es, pt-BR, it, ru, zh-CN, fr, ko en ja, met sleutels waiting, confirming, paid, underpaid en expired. Engelse terugval voor ontbrekende handelaarsberichten. Aanvullend; vervangt nooit de werkelijke status. Door de handelaar geschreven inhoud wordt niet automatisch vertaald.
support_emailstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
support_urlstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
terms_urlstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
privacy_urlstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
return_button_textstringaltijdAlleen een optioneel label. Succes-/annuleringsbestemmingen en omleidingsbeleid horen nog steeds bij de factuur.
show_return_buttonbooleanaltijdZichtbaarheid van de handmatige terugkeer-/annuleerknop; standaard true. Geldt voor actieve en eindstatussen, niet voor automatische succesomleidingen. Beschikbaar vanaf merchant 8.1.4.
payment_methods[]object[]altijd
Betaalmethoden die veilig op de afrekenpagina kunnen worden getoond.
payment_railonchain | lightningaltijdLightning blijft een Bitcoin-methode, afzonderlijk van BTC op de blockchain. Identificeer de keuze met intentie-id en betaalroute, niet alleen asset_id.
bolt11string | nullaltijdOndertekend Lightning-verzoek; null voor blockchainmethoden. Betaal nooit nadat payable false wordt.
payment_hashstring | nullaltijdLightning-betalingshash voor afstemming, geen ontvangstadres. Null voor blockchainmethoden.
asset_idUUIDaltijdActiva-UUID gebruikt door uiterlijkvoorkeuren; verschilt van de betalingsintentie-id van deze factuur.
caip_network_idstringaltijdCanonieke netwerkidentiteit om de geselecteerde blockchain ondubbelzinnig te bepalen.
caip_asset_idstring | nullaltijdCanonieke exacte activa-identiteit, inclusief een geverifieerd tokencontract of mint indien van toepassing.
asset_icon_urlstring | nullaltijdLokaal gecacht activapictogram van dezelfde oorsprong, of null als geen geverifieerde CoinGecko-koppeling bestaat.
contract_addressstring | nullaltijdCanoniek ERC-20-contract of SPL-mint voor tokens; null voor eigen valuta.
asset_decimalsintegeraltijdPrecisie in atomaire eenheden: 11 voor Lightning BTC-millisatoshi's, 8 voor BTC-satoshi's op de blockchain.
payablebooleanaltijdAlleen true wanneer precies deze methode momenteel betaling kan accepteren; false voor inactieve methoden nadat een ander actief geld ontvangt.
expected_amountdecimalaltijdVolledige vastgezette prijsopgave in weergave-eenheden en werkelijke blockchaineenheden. Herkende fiatstablecoins gebruiken maximaal twee decimalen voor prijsopgaven, altijd naar boven afgerond na opslag; andere activa gebruiken adaptieve precisie. Werkelijke tokendecimalen, ontvangen geld en restbedragen van deelbetalingen blijven exact. Gebruik teruggegeven bedragen ongewijzigd.Details
Volledige vastgezette prijsopgave in weergave-eenheden en werkelijke blockchaineenheden. Herkende fiatstablecoins gebruiken maximaal twee decimalen voor prijsopgaven, altijd naar boven afgerond na opslag; andere activa gebruiken adaptieve precisie. Werkelijke tokendecimalen, ontvangen geld en restbedragen van deelbetalingen blijven exact. Gebruik teruggegeven bedragen ongewijzigd.
expected_amount_atomicinteger stringaltijdVolledige vastgezette prijsopgave in weergave-eenheden en werkelijke blockchaineenheden. Herkende fiatstablecoins gebruiken maximaal twee decimalen voor prijsopgaven, altijd naar boven afgerond na opslag; andere activa gebruiken adaptieve precisie. Werkelijke tokendecimalen, ontvangen geld en restbedragen van deelbetalingen blijven exact. Gebruik teruggegeven bedragen ongewijzigd.Details
Volledige vastgezette prijsopgave in weergave-eenheden en werkelijke blockchaineenheden. Herkende fiatstablecoins gebruiken maximaal twee decimalen voor prijsopgaven, altijd naar boven afgerond na opslag; andere activa gebruiken adaptieve precisie. Werkelijke tokendecimalen, ontvangen geld en restbedragen van deelbetalingen blijven exact. Gebruik teruggegeven bedragen ongewijzigd.
minimum_payment_amountdecimalaltijdGeaccepteerde voldaan-drempel na toepassing van onderbetalingstolerantie.
minimum_payment_amount_atomicinteger stringaltijdGeaccepteerde voldaan-drempel na toepassing van onderbetalingstolerantie.
remaining_amountdecimal stringaltijdExact weergegeven bedrag dat nog nodig is om de geaccepteerde drempel te bereiken, begrensd op nul.
remaining_amount_atomicinteger stringaltijdTekort tot de geaccepteerde drempel in atomaire eenheden. Dit is niet het gevraagde betaalbedrag: tolerantie beïnvloedt alleen acceptatie.
destination_addressstringaltijdBlockchainbestemming en optionele referentie. Voor Lightning is dit de betalingshash zonder tag; betaal in plaats daarvan bolt11/payment_uri.
destination_tagstring|nullaltijdBlockchainbestemming en optionele referentie. Voor Lightning is dit de betalingshash zonder tag; betaal in plaats daarvan bolt11/payment_uri.
payment_uristring | nullaltijdBlockchainspecifiek verzoek: ERC-681, Solana Pay, native URI of lightning:<bolt11>. Verzoeken met bedrag gebruiken het volledige verwachte bedrag minus ontvangen geld, nooit de tolerantiedrempel. Null wanneer payable false is, ook nadat een toegestaan tekort is geaccepteerd. De Lightning-QR-code codeert het volledige Lightning-verzoek, niet de betalingshash.Details
Blockchainspecifiek verzoek: ERC-681, Solana Pay, native URI of lightning:<bolt11>. Verzoeken met bedrag gebruiken het volledige verwachte bedrag minus ontvangen geld, nooit de tolerantiedrempel. Null wanneer payable false is, ook nadat een toegestaan tekort is geaccepteerd. De Lightning-QR-code codeert het volledige Lightning-verzoek, niet de betalingshash.
qr_urlpath | nullaltijdSVG-QR-pad van dezelfde oorsprong met revisie op basis van sequence en exact restbedrag, of null wanneer payable false is. De SVG is no-store.
address_explorer_namestring|nullaltijdGevalideerde mainnet-explorer als uitwijkmogelijkheid waar ondersteund.
address_explorer_urlstring|nullaltijdGevalideerde mainnet-explorer als uitwijkmogelijkheid waar ondersteund.
transaction_countintegeraltijdTotaal aantal afzonderlijke publieke geldige transacties waargenomen voor deze methode.
transactions_truncatedbooleanaltijdTrue wanneer transaction_count groter is dan de teruggegeven lijst met recente transacties.
transactions[]object[]altijd
Maximaal de 10 recentste publieke geldige transacties. Exacte ontvangen totalen blijven onafhankelijk van deze weergavelimiet.
Gebruiksopmerkingen
- Er is geen bearertoken nodig.
- Cache-Control is no-store en zoekindexering is uitgeschakeld.
- Behandel invoice_id als toegangsgegevens voor de klant; publiceer die niet onnodig.
- asset_icon_url is een lokaal bestand van dezelfde oorsprong; de klantafrekenpagina hoeft nooit CoinGecko te benaderen om het weer te geven.
- Als destination_tag niet null is, toon en kopieer die naast het adres: het is een vereiste XRP-bestemmingstag, Stellar-memo-ID of TON-factuurcommentaar en moet exact worden meegestuurd.
- Voor geverifieerde tokens is asset_kind token, identificeert contract_address het exacte ERC-20-contract of de SPL-mint, identificeert token_standard de betaalroute en bevat payment_uri die tokenidentiteit.
Fouten
GETVoorbeeld van winkelafrekenpagina/invoice/preview/{project_id}Publiek
Toont het opgeslagen winkeluiterlijk met een voorbeeldbedrag en echte metadata van geaccepteerde activa. Wissel tussen voorbeelden waiting, confirming, paid, underpaid en expired zonder betalingen te maken.
Authenticatie & headers
Publiek
Padparameters
project_idUUIDvereistProject-UUID die door de geauthenticeerde console in de voorbeeldlink is gekopieerd.
Queryparameters
Verzoek
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())Antwoord 200 text/html
Voorbeeldantwoord
<!doctype html>
<!-- Hosted branding preview; no invoice is created -->Gebruiksopmerkingen
- Het voorbeeld is alleen voor huisstijl en mag nooit als betaalverzoek naar een klant worden gestuurd.
- Geen ontvangstadres, betaalbare QR-code, walletactie, omleiding of betalingsopvraging. Voorbeelden veranderen de werkelijke factuurstatus niet.
- Het antwoord is no-store, noindex en kan niet worden ingebed.
Fouten
GETGegevens voor afrekenvoorbeeld/checkout-api/previews/{project_id}Publiek
Geeft effectief winkeluiterlijk en veilige metadata van geaccepteerde activa terug. payment_methods blijft leeg; preview_methods bevat geen betaaladressen, prijsopgaven of private walletgegevens.
Authenticatie & headers
Publiek
Padparameters
Queryparameters
store_idUUID,optioneelMoet bij dit project horen; niet-overeenkomende ID's geven 404 terug. Onbekende queryvelden worden afgewezen.
Verzoek
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))Antwoord 200 application/json
Voorbeeldantwoord
{
"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": []
}
}Antwoordvelden
dataobject
previewbooleaninvoice_idstringamountstringcurrencystringprojectobject
appearanceobject
inherit_default_storebooleanaltijdTrue wanneer de standaardwinkel van het project dit uiterlijk levert. False voor onafhankelijke winkels en vastgezette factuurafwijkingen.
invoice_overridebooleanaltijdTrue wanneer checkout_appearance bij factuuraanmaak is aangeleverd. Weggelaten/null houdt dit false.
titlestringaltijdGewone handelaarskop, bovenbericht en onderbericht. intro vervangt customer_message; oude opgeslagen tekst blijft behouden. Interpreteer dit nooit als opmaakcode.
introstringaltijdGewone handelaarskop, bovenbericht en onderbericht. intro vervangt customer_message; oude opgeslagen tekst blijft behouden. Interpreteer dit nooit als opmaakcode.
outrostringaltijdGewone handelaarskop, bovenbericht en onderbericht. intro vervangt customer_message; oude opgeslagen tekst blijft behouden. Interpreteer dit nooit als opmaakcode.
customer_messagestringaltijdVerouderde compatibiliteitsalias van intro. Gebruik intro voor nieuwe integraties.
accent_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
background_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
card_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
button_colorstringaltijdStrikte #RRGGBB-kleuren. Optionele kleuren zijn leeg voor automatische waarden; voorgrondcontrast wordt berekend.
logo_sizestringaltijdsmall, medium of large; left of center. Afbeeldingen worden passend weergegeven, niet bijgesneden.
logo_alignmentstringaltijdsmall, medium of large; left of center. Afbeeldingen worden passend weergegeven, niet bijgesneden.
imagesobjectaltijdOptionele URL's voor logo_light, logo_dark en favicon: afgebakende genormaliseerde PNG-afbeeldingen van dezelfde oorsprong.
show_order_idbooleanaltijdZichtbaarheid van bestel-ID, omschrijving onder de titel en aanvankelijke uitklapstatus van bestel-ID. Het bedrag blijft zichtbaar; dit regelt weergave, geen afscherming van gegevens.
show_descriptionbooleanaltijdZichtbaarheid van bestel-ID, omschrijving onder de titel en aanvankelijke uitklapstatus van bestel-ID. Het bedrag blijft zichtbaar; dit regelt weergave, geen afscherming van gegevens.
details_expandedbooleanaltijdZichtbaarheid van bestel-ID, omschrijving onder de titel en aanvankelijke uitklapstatus van bestel-ID. Het bedrag blijft zichtbaar; dit regelt weergave, geen afscherming van gegevens.
show_project_namebooleanaltijdMerchant 5.6.0+: zichtbaarheid van namen in de kop. Beide zijn standaard true. Project-/winkelidentiteit blijft beschikbaar in JSON.
show_store_namebooleanaltijdMerchant 5.6.0+: zichtbaarheid van namen in de kop. Beide zijn standaard true. Project-/winkelidentiteit blijft beschikbaar in JSON.
featured_chains[]arrayaltijdGeordende voorkeuren, alleen toegepast op methoden die al in de factuur aanwezig zijn. Ontbrekende of uitgeschakelde methoden worden genegeerd.
featured_asset_ids[]arrayaltijdGeordende voorkeuren, alleen toegepast op methoden die al in de factuur aanwezig zijn. Ontbrekende of uitgeschakelde methoden worden genegeerd.
default_asset_idUUID | nullaltijdVoorgestelde eerste methode. Een geldige onthouden klantvoorkeur of een methode die al geld ontvangt heeft voorrang.
messagesobjectaltijd
Platte tekst voor en, de, es, pt-BR, it, ru, zh-CN, fr, ko en ja, met sleutels waiting, confirming, paid, underpaid en expired. Engelse terugval voor ontbrekende handelaarsberichten. Aanvullend; vervangt nooit de werkelijke status. Door de handelaar geschreven inhoud wordt niet automatisch vertaald.Details
Platte tekst voor en, de, es, pt-BR, it, ru, zh-CN, fr, ko en ja, met sleutels waiting, confirming, paid, underpaid en expired. Engelse terugval voor ontbrekende handelaarsberichten. Aanvullend; vervangt nooit de werkelijke status. Door de handelaar geschreven inhoud wordt niet automatisch vertaald.
support_emailstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
support_urlstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
terms_urlstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
privacy_urlstringaltijdOptionele contact- en HTTPS-links, zonder URL-inloggegevens. Externe links openen in een nieuw venster.
return_button_textstringaltijdAlleen een optioneel label. Succes-/annuleringsbestemmingen en omleidingsbeleid horen nog steeds bij de factuur.
show_return_buttonbooleanaltijdZichtbaarheid van de handmatige terugkeer-/annuleerknop; standaard true. Geldt voor actieve en eindstatussen, niet voor automatische succesomleidingen. Beschikbaar vanaf merchant 8.1.4.
preview_methods[]arraypayment_methods[]arrayGebruiksopmerkingen
- Er wordt geen bearertoken geaccepteerd of vereist.
- Er worden geen factuur, bestemming, wallet, transactie, IPN, webhook of handelaarsmetadata teruggegeven.
- Gebruik de geauthenticeerde console om de juiste voorbeeldlink op het betaaldomein te krijgen.
Fouten
GETAfbeelding voor winkelafrekenpagina/checkout-api/invoices/{invoice_id}/appearance-images/{kind}/{revision}/image.pngPubliek
Geeft een genormaliseerd winkellogo of favicon terug dat bij deze factuur hoort. Gebruik appearance.images-URL's uit de afrekengegevens.
Authenticatie & headers
Publiek
Padparameters
Verzoek
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())Antwoord 200 image/png
Voorbeeldantwoord
(binary PNG response)Gebruiksopmerkingen
- Gebruik appearance.images uit afreken-JSON. Vastgezette factuurafbeeldingen blijven werken nadat de bronwinkel een upload vervangt of verwijdert. Expliciet verwijderde revisies, revisies voor de verkeerde factuur of soort en onbekende revisies geven 404 terug; een momentopname valt nooit terug op een huidige winkelafbeelding.
- Zonder factuurafwijking wordt de huidige effectieve winkelafbeelding gebruikt en geven vervangen/verwijderde revisies 404 terug. Alleen PNG, nosniff en private caching.
- Winkelafbeeldingsuploads accepteren begrensde PNG, JPEG of WebP in de geauthenticeerde console; nooit SVG, HTML of externe afbeeldings-URL's.
Fouten
GETAfbeelding voor winkelvoorbeeld/checkout-api/previews/{project_id}/stores/{store_id}/appearance-images/{kind}/{revision}/image.pngPubliek
Geeft alleen een genormaliseerde voorbeeldafbeelding terug voor het overeenkomende project, de winkel, soort en huidige revisie.
Authenticatie & headers
Publiek
Padparameters
Verzoek
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())Antwoord 200 image/png
Voorbeeldantwoord
(binary PNG response)Gebruiksopmerkingen
- Gebruik appearance.images uit voorbeeldgegevens. Onbekende of niet-overeenkomende ID's geven 404 terug. Er wordt geen wallet- of betalingsinformatie getoond.
Fouten
GETVoorbeeldlogo met revisie/checkout-api/previews/{project_id}/logo/{revision}/image.pngPubliek
Geeft het genormaliseerde projectlogo alleen terug wanneer project en cacheveilige logorevisie overeenkomen. Gebruik project.logo_url uit voorbeeldgegevens in plaats van deze URL zelf samen te stellen.
Authenticatie & headers
Publiek
Padparameters
Verzoek
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())Antwoord 200 image/png
Voorbeeldantwoord
(binary PNG response)Gebruiksopmerkingen
- Onbekende projecten en verouderde logorevisies geven invoice_not_found terug zonder te onthullen welk onderdeel ontbrak.
- De succesvol opgehaalde afbeelding met revisie is onwijzigbaar en mag worden gecacht.
Fouten
GETAfbeelding van betalings-QR-code/checkout-api/invoices/{invoice_id}/payment-methods/{intent_id}/qr.svgPubliek
Genereert een SVG-QR-code van 512×512 voor de exacte blockchainspecifieke betaalpayload van een factuur-betaalmethode.
Authenticatie & headers
Publiek
Padparameters
Verzoek
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())Antwoord 200 image/svg+xml
Voorbeeldantwoord
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">…</svg>Gebruiksopmerkingen
- Er is geen bearertoken nodig.
- Gebruik de qr_url met revisie op basis van sequence en restbedrag die afreken-JSON teruggeeft; de SVG is private en no-store.
- Na een deelbetaling vraagt deze het exacte resterende bedrag en blijft vastgezet op dat actief.
- Geeft 409 terug na verloop, voltooiing of wanneer een andere methode actief is; geeft payment_qr_unavailable (422) terug als het verzoek te groot is om te coderen.
Fouten
GETAfrekenlogo met revisie/checkout-api/invoices/{invoice_id}/logo/{revision}/image.pngPubliek
Geeft het genormaliseerde projectafrekenlogo alleen terug wanneer factuur en huidige logorevisie overeenkomen. Gebruik bij voorkeur project.logo_url uit afreken-JSON in plaats van deze route zelf samen te stellen.
Authenticatie & headers
Publiek
Padparameters
Verzoek
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())Antwoord 200 image/png
Voorbeeldantwoord
(binary PNG response)Gebruiksopmerkingen
- Er is geen bearertoken nodig.
- Publieke cacheduur is één jaar met immutable omdat de revisie de inhoudstoestand adresseert.
- Onbekende/niet-overeenkomende revisies geven invoice_not_found terug.
Fouten
Referentie voor Wholly Crypto 8.3.2. Open voor je geïnstalleerde versie Instellingen → API-toegang → Documentatie in je console. Releases bekijken.