{"info":{"_postman_id":"70ea23c2-964d-4373-a1c3-0d28c1c0ff71","name":"Orbt Wholesale API v2","description":"<html><head></head><body><h1 id=\"orbt-wholesale-api-v2\">Orbt Wholesale API (v2)</h1>\n<p>The Orbt Wholesale API lets you buy digital gift cards and vouchers programmatically, paid from your prepaid Orbt wallets. You get the live catalog with your pricing, place orders, track them and collect the delivered cards, codes and PINs.</p>\n<p>Only <strong>instantly delivered (realtime) products</strong> are sold through the API. Products delivered later by a supplier stay available in the Orbt portal.</p>\n<h2 id=\"environments\">Environments</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Environment</th>\n<th>Base URL</th>\n<th>Use it for</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>UAT</td>\n<td><code>https://api-partner-uat.orbt.com</code></td>\n<td>Integration and testing. Separate credentials and wallets.</td>\n</tr>\n<tr>\n<td>PROD</td>\n<td><code>https://api-partner.orbt.com</code></td>\n<td>Live orders. Real funds are debited and real cards are issued.</td>\n</tr>\n</tbody>\n</table>\n</div><p>All endpoints below sit under <code>{{baseUrl}}/api/wholesale/v2</code>. UAT and PROD use different credentials; keys from one do not work on the other.</p>\n<h2 id=\"before-you-start\">Before you start</h2>\n<p>Your Orbt account manager sets up your API access per environment and gives you:</p>\n<ul>\n<li><p><strong>API key</strong> (<code>x-api-key</code>)</p>\n</li>\n<li><p><strong>Client ID</strong> (<code>x-client-id</code>)</p>\n</li>\n<li><p><strong>HMAC secret</strong>, used to sign requests. It is never sent over the wire.</p>\n</li>\n<li><p><strong>IP allow-list</strong>: send us the public egress IPs your servers call from. Calls from other IPs are rejected.</p>\n</li>\n<li><p><strong>Permissions</strong> on the key: <code>accounts:read</code>, <code>products:read</code>, <code>orders:read</code>, <code>orders:write</code>.</p>\n</li>\n</ul>\n<p>Call the API from your backend only. Never put the API key or HMAC secret in a browser or mobile app.</p>\n<h2 id=\"quick-start\">Quick start</h2>\n<img src=\"https://mintlify.s3.us-west-1.amazonaws.com/orbt/images/01-integration-flow.png\" alt=\"Integration%20Flow\">\n\n<ol>\n<li><p><strong>Check funds</strong>: <code>GET /accounts/balance</code> returns your wallets and their balances.</p>\n</li>\n<li><p><strong>Load the catalog</strong>: <code>GET /products</code> returns everything you can buy, with your pricing.</p>\n</li>\n<li><p><strong>Lock an FX rate</strong> (only when paying from a wallet in another currency): <code>GET /products/{productId}?currency=EUR</code> returns the amount you will pay and an <code>fxQuoteId</code>.</p>\n</li>\n<li><p><strong>Place the order</strong>: <code>POST /orders</code> with your own <code>orderReference</code>. The wallet is debited and the order starts as <code>PENDING</code>.</p>\n</li>\n<li><p><strong>Track it</strong>: poll <code>GET /orders/{orderReference}</code> until it is <code>FULFILLED</code> or <code>FAILED</code>.</p>\n</li>\n<li><p><strong>Collect the cards</strong>: <code>GET /orders/{orderReference}/fulfillments</code> returns codes, PINs and a hosted gift card link.</p>\n</li>\n</ol>\n<h3 id=\"using-this-collection-in-postman\">Using this collection in Postman</h3>\n<ol>\n<li><p>Click <strong>Run in Postman</strong> (or import the collection) and import the <strong>Orbt UAT</strong> environment.</p>\n</li>\n<li><p>Fill in <code>apiKey</code>, <code>clientId</code>, <code>hmacSecret</code> and <code>walletId</code> in the environment.</p>\n</li>\n<li><p>Send the requests top to bottom. The collection signs every request for you and remembers <code>productId</code>, <code>fxQuoteId</code> and <code>orderReference</code> between calls.</p>\n</li>\n</ol>\n<h2 id=\"authentication-and-request-signing\">Authentication and request signing</h2>\n<p>Every request carries five headers:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>x-api-key</code></td>\n<td>Your API key</td>\n</tr>\n<tr>\n<td><code>x-client-id</code></td>\n<td>Your client ID</td>\n</tr>\n<tr>\n<td><code>x-timestamp</code></td>\n<td>Current time in UTC, ISO 8601, e.g. <code>2026-10-26T11:20:00.000Z</code></td>\n</tr>\n<tr>\n<td><code>x-body-hash</code></td>\n<td>Base64 of the SHA-256 hash of the raw request body. For requests without a body (all GETs), hash the empty string.</td>\n</tr>\n<tr>\n<td><code>x-signature</code></td>\n<td>Base64 of HMAC-SHA256 over the string to sign, keyed with your HMAC secret</td>\n</tr>\n</tbody>\n</table>\n</div><img src=\"https://mintlify.s3.us-west-1.amazonaws.com/orbt/images/02-request-signing.png\">\n\n<p>The string to sign is four values joined by a newline (<code>\\n</code>), with no trailing newline:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>METHOD\nTIMESTAMP\nCLIENT_ID\nBODY_HASH\n\n</code></pre><p>Rules that trip people up:</p>\n<ul>\n<li><p><code>METHOD</code> is upper case: <code>GET</code>, <code>POST</code>.</p>\n</li>\n<li><p>Hash the <strong>exact bytes you send</strong>. Serialize the JSON once, hash that string and send that same string. Re-serializing after hashing changes whitespace or key order and breaks the signature.</p>\n</li>\n<li><p>The HMAC secret is used as a plain UTF-8 string key. Do not Base64-decode it.</p>\n</li>\n<li><p>Generate a fresh timestamp for every request and keep your server clock in sync (NTP).</p>\n</li>\n<li><p>The empty-body hash is always <code>47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=</code>.</p>\n</li>\n</ul>\n<p><strong>Node.js</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">const crypto = require('crypto');\nfunction orbtHeaders(method, body, { apiKey, clientId, hmacSecret }) {\n  const raw = body ? JSON.stringify(body) : '';\n  const timestamp = new Date().toISOString();\n  const bodyHash = crypto.createHash('sha256').update(raw, 'utf8').digest('base64');\n  const stringToSign = [method.toUpperCase(), timestamp, clientId, bodyHash].join('\\n');\n  const signature = crypto.createHmac('sha256', hmacSecret).update(stringToSign, 'utf8').digest('base64');\n  return {\n    raw, // send exactly this string as the request body\n    headers: {\n      'Content-Type': 'application/json',\n      'x-api-key': apiKey,\n      'x-client-id': clientId,\n      'x-timestamp': timestamp,\n      'x-body-hash': bodyHash,\n      'x-signature': signature,\n    },\n  };\n}\n\n</code></pre>\n<p><strong>Python</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-python\">import base64, datetime, hashlib, hmac, json\ndef orbt_headers(method, body, api_key, client_id, hmac_secret):\n    raw = json.dumps(body, separators=(\",\", \":\")) if body is not None else \"\"\n    timestamp = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec=\"milliseconds\").replace(\"+00:00\", \"Z\")\n    body_hash = base64.b64encode(hashlib.sha256(raw.encode(\"utf-8\")).digest()).decode()\n    string_to_sign = \"\\n\".join([method.upper(), timestamp, client_id, body_hash])\n    signature = base64.b64encode(\n        hmac.new(hmac_secret.encode(\"utf-8\"), string_to_sign.encode(\"utf-8\"), hashlib.sha256).digest()\n    ).decode()\n    headers = {\n        \"Content-Type\": \"application/json\",\n        \"x-api-key\": api_key,\n        \"x-client-id\": client_id,\n        \"x-timestamp\": timestamp,\n        \"x-body-hash\": body_hash,\n        \"x-signature\": signature,\n    }\n    return raw, headers  # send raw as the body (data=raw), not json=body\n\n</code></pre>\n<p><strong>Java</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-java\">import javax.crypto.Mac;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.nio.charset.StandardCharsets;\nimport java.security.MessageDigest;\nimport java.time.Instant;\nimport java.time.temporal.ChronoUnit;\nimport java.util.Base64;\nimport java.util.Map;\npublic final class OrbtSigner {\n    public static Map&lt;String, String&gt; headers(String method, String rawBody,\n                                              String apiKey, String clientId, String hmacSecret) throws Exception {\n        String body = rawBody == null ? \"\" : rawBody; // send exactly this string\n        String timestamp = Instant.now().truncatedTo(ChronoUnit.MILLIS).toString();\n        byte[] hash = MessageDigest.getInstance(\"SHA-256\").digest(body.getBytes(StandardCharsets.UTF_8));\n        String bodyHash = Base64.getEncoder().encodeToString(hash);\n        String stringToSign = String.join(\"\\n\", method.toUpperCase(), timestamp, clientId, bodyHash);\n        Mac mac = Mac.getInstance(\"HmacSHA256\");\n        mac.init(new SecretKeySpec(hmacSecret.getBytes(StandardCharsets.UTF_8), \"HmacSHA256\"));\n        String signature = Base64.getEncoder().encodeToString(mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)));\n        return Map.of(\n            \"Content-Type\", \"application/json\",\n            \"x-api-key\", apiKey,\n            \"x-client-id\", clientId,\n            \"x-timestamp\", timestamp,\n            \"x-body-hash\", bodyHash,\n            \"x-signature\", signature);\n    }\n}\n\n</code></pre>\n<h2 id=\"pricing\">Pricing</h2>\n<p>Every product carries a <code>pricing</code> object that tells you what you pay against the face value:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>adjustmentType</code></th>\n<th><code>unit</code></th>\n<th>Example</th>\n<th>You pay for a USD 100 card</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>DISCOUNT</code></td>\n<td><code>PERCENTAGE</code></td>\n<td><code>value: 3.0</code></td>\n<td>USD 97.00</td>\n</tr>\n<tr>\n<td><code>FEE</code></td>\n<td><code>PERCENTAGE</code></td>\n<td><code>value: 10.0</code></td>\n<td>USD 110.00</td>\n</tr>\n<tr>\n<td><code>FEE</code></td>\n<td><code>AMOUNT</code></td>\n<td><code>value: 1.0</code></td>\n<td>USD 101.00</td>\n</tr>\n<tr>\n<td><code>NONE</code></td>\n<td><code>null</code></td>\n<td><code>value: null</code></td>\n<td>USD 100.00</td>\n</tr>\n</tbody>\n</table>\n</div><p>Products are either <code>FIXED</code> (one <code>amount</code>, the face value) or <code>VARIABLE</code> (any amount between <code>minAmount</code> and <code>maxAmount</code>, sent as <code>amount</code> on the order item).</p>\n<h2 id=\"wallets-and-currencies\">Wallets and currencies</h2>\n<p>You can hold one wallet per currency. Each order is paid from the wallet you pass as <code>walletId</code>.</p>\n<p>When the product currency differs from the wallet currency, Orbt converts at the current rate when the order is placed. The rate used comes back on each item as <code>fxRate</code>, with the amount charged as <code>walletAmount</code>.</p>\n<p>To know the exact amount before you buy, get a quote first and send its <code>fxQuoteId</code> with the order. The order is placed only if that rate is still quoted; otherwise you get <code>409 FX_QUOTE_CHANGED</code> and <strong>nothing is charged</strong>. One quote covers one currency pair, so an order that converts several currencies into the wallet currency cannot use a single <code>fxQuoteId</code>.</p>\n<img src=\"https://mintlify.s3.us-west-1.amazonaws.com/orbt/images/04-fx-quote-flow.png\">\n\n<h2 id=\"orders-idempotency-and-status\">Orders, idempotency and status</h2>\n<img src=\"https://mintlify.s3.us-west-1.amazonaws.com/orbt/images/03-order-placement-lifecycle.png\">\n\n<p><strong><code>orderReference</code></strong> <strong>is your idempotency key.</strong> Use your own unique ID (max 90 characters) for every new order.</p>\n<ul>\n<li><p>Sending the same order again with the same <code>orderReference</code> returns the order already placed. Nothing is charged twice, so retrying after a timeout or network error is safe.</p>\n</li>\n<li><p>Sending a <strong>different</strong> order under a reference you already used returns <code>409 ORDER_REFERENCE_IN_USE</code>.</p>\n</li>\n</ul>\n<p><strong>Order status</strong> (from <code>GET /orders/{orderReference}</code>):</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>status</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>PENDING</code></td>\n<td>Paid and being fulfilled by the supplier.</td>\n</tr>\n<tr>\n<td><code>FULFILLED</code></td>\n<td>Cards are ready in <code>/fulfillments</code>.</td>\n</tr>\n<tr>\n<td><code>FAILED</code></td>\n<td>The order could not be fulfilled. <code>paid</code> is <code>false</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The create order response reports the new order with <code>status: Open</code> and <code>fulfillmentStatus: PENDING</code>. Treat it as <code>PENDING</code> and use Get order for tracking.</p>\n<p>Each item also has its own <code>fulfillmentStatus</code> and <code>fulfilledQuantity</code>. Compare <code>fulfilledQuantity</code> with <code>quantity</code> to see how many cards of that item were delivered.</p>\n<p><strong>Polling.</strong> Poll Get order every 2 to 5 seconds at first, then back off. Stop on <code>FULFILLED</code> or <code>FAILED</code>.</p>\n<h2 id=\"pagination\">Pagination</h2>\n<p>Two styles are supported:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Style</th>\n<th>Parameters</th>\n<th>Response <code>meta.pagination</code></th>\n<th>Used by</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Page</td>\n<td><code>page</code> (from 0), <code>pageSize</code> (1 to 100)</td>\n<td><code>type: page</code>, <code>page</code>, <code>size</code>, <code>totalPages</code>, <code>totalElements</code></td>\n<td>List products</td>\n</tr>\n<tr>\n<td>Cursor</td>\n<td><code>limit</code> (1 to 100), <code>cursor</code></td>\n<td><code>type: cursor</code>, <code>nextCursor</code>, <code>hasMore</code></td>\n<td>List products, List orders</td>\n</tr>\n</tbody>\n</table>\n</div><p>For cursor paging, omit <code>cursor</code> on the first call, then pass the previous response's <code>nextCursor</code> until <code>hasMore</code> is <code>false</code>.</p>\n<h2 id=\"errors\">Errors</h2>\n<p>Errors return a non-2xx status and an <code>error</code> code you can branch on. Most errors look like this:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_FUNDS\",\n    \"message\": \"Not enough prepaid funds for currencyId=4\"\n  }\n}\n\n</code></pre>\n<p>Some validation and not-found errors return a flat body with <code>code</code>, <code>message</code>, <code>retryable</code> and, for field validation, <code>fieldErrors</code>. Branch on <code>code</code> in both cases.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP</th>\n<th><code>code</code></th>\n<th>What to do</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>VALIDATION_ERROR</code> / <code>VALIDATION_FAILED</code></td>\n<td>Fix the request. See <code>message</code> or <code>fieldErrors</code>.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>FX_QUOTE_AMBIGUOUS</code></td>\n<td>The order converts more than one currency; drop <code>fxQuoteId</code> or split the order.</td>\n</tr>\n<tr>\n<td>403</td>\n<td></td>\n<td>Credentials, signature, timestamp or source IP rejected. Check your headers and IP allow-list.</td>\n</tr>\n<tr>\n<td>404</td>\n<td><code>PRODUCT_ERROR</code></td>\n<td>Product not found or not available to you.</td>\n</tr>\n<tr>\n<td>404</td>\n<td><code>ACCOUNT_ERROR</code></td>\n<td>You have no wallet in the requested currency.</td>\n</tr>\n<tr>\n<td>404</td>\n<td><code>ORDER_NOT_FOUND</code></td>\n<td>No order with that reference on your account.</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>ORDER_REFERENCE_IN_USE</code></td>\n<td>Reference already used for a different order. Send a new one.</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>FX_QUOTE_CHANGED</code></td>\n<td>The quoted rate is no longer valid. Nothing was charged. Get a new quote.</td>\n</tr>\n<tr>\n<td>422</td>\n<td><code>PRODUCT_ERROR</code></td>\n<td>A product cannot be ordered through the API (not realtime).</td>\n</tr>\n<tr>\n<td>422</td>\n<td><code>INSUFFICIENT_FUNDS</code></td>\n<td>Top up the wallet, then retry.</td>\n</tr>\n<tr>\n<td>502</td>\n<td><code>FULFILLMENT_UNAVAILABLE</code></td>\n<td>Cards are temporarily unavailable. Retry later; the order is not affected.</td>\n</tr>\n<tr>\n<td>5xx</td>\n<td></td>\n<td>Retry with backoff. For orders, retry with the <strong>same</strong> <code>orderReference</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"support\">Support</h2>\n<p>Questions or access requests: contact your Orbt account manager, or send an email to <a href=\"https://mailto:support@orbt.com\">support@orbt.com</a></p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Orbt Wholesale API (v2)","slug":"orbt-wholesale-api-v2"}],"owner":"38333563","collectionId":"70ea23c2-964d-4373-a1c3-0d28c1c0ff71","publishedId":"2sBYHUULuT","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-10-26T14:03:55.000Z"},"item":[{"name":"Account","item":[{"name":"Get account balances","id":"f67d1cf0-265f-4a1b-b867-d56885d804f0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/accounts/balance","description":"<p>Returns your account name, payment type and every wallet you hold, one per currency.</p>\n<p>Use <code>walletId</code> from this response when placing orders. <code>funds</code> is the balance available to spend.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data.name</code></td>\n<td>string</td>\n<td>Your account name</td>\n</tr>\n<tr>\n<td><code>data.paymentType</code></td>\n<td>string</td>\n<td>How your account is funded, e.g. <code>Funds On Account</code> (prepaid)</td>\n</tr>\n<tr>\n<td><code>data.fundsList[].walletId</code></td>\n<td>integer</td>\n<td>Wallet ID to pass on orders</td>\n</tr>\n<tr>\n<td><code>data.fundsList[].funds</code></td>\n<td>number</td>\n<td>Available balance</td>\n</tr>\n<tr>\n<td><code>data.fundsList[].currency</code></td>\n<td>string</td>\n<td>ISO 4217 currency code</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","wholesale","v2","accounts","balance"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"b112dfb5-2af4-4776-aa2e-0c9c5b70da31","name":"200 Balances","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/accounts/balance"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"name\": \"Acme Rewards LLC\",\n    \"paymentType\": \"Funds On Account\",\n    \"fundsList\": [\n      {\n        \"walletId\": 38,\n        \"funds\": 60816.8,\n        \"currency\": \"USD\"\n      },\n      {\n        \"walletId\": 72,\n        \"funds\": 600000.0,\n        \"currency\": \"EUR\"\n      }\n    ]\n  }\n}"}],"_postman_id":"f67d1cf0-265f-4a1b-b867-d56885d804f0"}],"id":"d21f8140-1690-44ec-b214-49bf9a9887cb","description":"<p>Your wallets and balances. Requires the <code>accounts:read</code> permission.</p>\n","_postman_id":"d21f8140-1690-44ec-b214-49bf9a9887cb"},{"name":"Products","item":[{"name":"List products (page)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const products = pm.response.json().data || [];","if (products.length) pm.collectionVariables.set('productId', String(products[0].productId));"],"id":"b055ecc7-258d-4af6-910f-01c0a9e3acd5"}}],"id":"9eac617c-8339-49ae-a09d-ab43edd61859","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/products?page=0&pageSize=20","description":"<p>Returns the products you can buy, paged by number.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>integer</td>\n<td>ID to use on orders</td>\n</tr>\n<tr>\n<td><code>brand</code></td>\n<td>string</td>\n<td>Brand name</td>\n</tr>\n<tr>\n<td><code>logoUrl</code></td>\n<td>string</td>\n<td>Brand logo</td>\n</tr>\n<tr>\n<td><code>currency</code></td>\n<td>string</td>\n<td>Face value currency, ISO 4217</td>\n</tr>\n<tr>\n<td><code>denominationType</code></td>\n<td>string</td>\n<td><code>FIXED</code> or <code>VARIABLE</code></td>\n</tr>\n<tr>\n<td><code>amount</code></td>\n<td>number</td>\n<td>Face value, <code>FIXED</code> only</td>\n</tr>\n<tr>\n<td><code>minAmount</code>, <code>maxAmount</code></td>\n<td>number</td>\n<td>Allowed face value range, <code>VARIABLE</code> only</td>\n</tr>\n<tr>\n<td><code>pricing.adjustmentType</code></td>\n<td>string</td>\n<td><code>DISCOUNT</code>, <code>FEE</code> or <code>NONE</code></td>\n</tr>\n<tr>\n<td><code>pricing.value</code></td>\n<td>number</td>\n<td>Size of the adjustment</td>\n</tr>\n<tr>\n<td><code>pricing.unit</code></td>\n<td>string</td>\n<td><code>PERCENTAGE</code> or <code>AMOUNT</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>See <strong>Pricing</strong> in the introduction for how to compute what you pay.</p>\n","urlObject":{"path":["api","wholesale","v2","products"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Page number, starting at 0.</p>\n","type":"text/plain"},"key":"page","value":"0"},{"description":{"content":"<p>Items per page, 1 to 100.</p>\n","type":"text/plain"},"key":"pageSize","value":"20"}],"variable":[]}},"response":[{"id":"f00c918b-7882-4f38-a396-65fdaf97da95","name":"200 Products","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/products?page=0&pageSize=6","host":["{{baseUrl}}"],"path":["api","wholesale","v2","products"],"query":[{"key":"page","value":"0"},{"key":"pageSize","value":"6"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"productId\": 1399,\n      \"brand\": \"Apple\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/81432783-fa51-4e17-8de7-b1013bb37c3a\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"FIXED\",\n      \"amount\": 10,\n      \"pricing\": {\n        \"adjustmentType\": \"DISCOUNT\",\n        \"value\": 1.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    },\n    {\n      \"productId\": 1441,\n      \"brand\": \"Amazon.com\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/6a3e113b-17f2-4c3e-9ff8-9449a1e8ef83\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"VARIABLE\",\n      \"minAmount\": 1.0,\n      \"maxAmount\": 2000.0,\n      \"pricing\": {\n        \"adjustmentType\": \"DISCOUNT\",\n        \"value\": 10.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    },\n    {\n      \"productId\": 1437,\n      \"brand\": \"DoorDash\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/2389a970-0c59-4552-bca9-8de467ff8a1e\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"VARIABLE\",\n      \"minAmount\": 15.0,\n      \"maxAmount\": 200.0,\n      \"pricing\": {\n        \"adjustmentType\": \"FEE\",\n        \"value\": 10.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    },\n    {\n      \"productId\": 1460,\n      \"brand\": \"CVS Pharmacy®\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/44bf9f99-9c76-4e20-a621-e4ede9a1d5c9\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"VARIABLE\",\n      \"minAmount\": 25.0,\n      \"maxAmount\": 500.0,\n      \"pricing\": {\n        \"adjustmentType\": \"FEE\",\n        \"value\": 1.0,\n        \"unit\": \"AMOUNT\"\n      }\n    },\n    {\n      \"productId\": 1461,\n      \"brand\": \"Sephora\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/c7a5b7f0-901d-4e76-97e4-04814c217fbf\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"VARIABLE\",\n      \"minAmount\": 5.0,\n      \"maxAmount\": 250.0,\n      \"pricing\": {\n        \"adjustmentType\": \"NONE\",\n        \"value\": null,\n        \"unit\": null\n      }\n    },\n    {\n      \"productId\": 1566,\n      \"brand\": \"Noon KSA\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/03aa7462-bddf-4edf-b254-ee5cac4856ae\",\n      \"currency\": \"SAR\",\n      \"denominationType\": \"FIXED\",\n      \"amount\": 5,\n      \"pricing\": {\n        \"adjustmentType\": \"DISCOUNT\",\n        \"value\": 10.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"type\": \"page\",\n      \"page\": 0,\n      \"size\": 6,\n      \"totalPages\": 14,\n      \"totalElements\": 84\n    }\n  }\n}"},{"id":"24b73fb6-ce70-4992-b936-546556e5e182","name":"400 Validation error","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/products?page=0&pageSize=101","host":["{{baseUrl}}"],"path":["api","wholesale","v2","products"],"query":[{"key":"page","value":"0"},{"key":"pageSize","value":"101"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": \"2026-10-26T11:20:00.000Z\",\n  \"status\": 400,\n  \"error\": \"Bad Request\",\n  \"code\": \"VALIDATION_FAILED\",\n  \"message\": \"The request contains invalid fields\",\n  \"path\": \"/api/wholesale/v2/products\",\n  \"retryable\": false,\n  \"fieldErrors\": [\n    {\n      \"field\": \"pageSize\",\n      \"message\": \"must be less than or equal to 100\"\n    }\n  ]\n}"}],"_postman_id":"9eac617c-8339-49ae-a09d-ab43edd61859"},{"name":"List products (cursor)","id":"5f829b26-8eaa-40fa-a91b-0acb44172e08","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/products?limit=20","description":"<p>Same catalog, paged by cursor. Send <code>limit</code>, then pass the previous page's <code>nextCursor</code> as <code>cursor</code> until <code>hasMore</code> is <code>false</code>. The cursor is a product ID.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>integer</td>\n<td>ID to use on orders</td>\n</tr>\n<tr>\n<td><code>brand</code></td>\n<td>string</td>\n<td>Brand name</td>\n</tr>\n<tr>\n<td><code>logoUrl</code></td>\n<td>string</td>\n<td>Brand logo</td>\n</tr>\n<tr>\n<td><code>currency</code></td>\n<td>string</td>\n<td>Face value currency, ISO 4217</td>\n</tr>\n<tr>\n<td><code>denominationType</code></td>\n<td>string</td>\n<td><code>FIXED</code> or <code>VARIABLE</code></td>\n</tr>\n<tr>\n<td><code>amount</code></td>\n<td>number</td>\n<td>Face value, <code>FIXED</code> only</td>\n</tr>\n<tr>\n<td><code>minAmount</code>, <code>maxAmount</code></td>\n<td>number</td>\n<td>Allowed face value range, <code>VARIABLE</code> only</td>\n</tr>\n<tr>\n<td><code>pricing.adjustmentType</code></td>\n<td>string</td>\n<td><code>DISCOUNT</code>, <code>FEE</code> or <code>NONE</code></td>\n</tr>\n<tr>\n<td><code>pricing.value</code></td>\n<td>number</td>\n<td>Size of the adjustment</td>\n</tr>\n<tr>\n<td><code>pricing.unit</code></td>\n<td>string</td>\n<td><code>PERCENTAGE</code> or <code>AMOUNT</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>See <strong>Pricing</strong> in the introduction for how to compute what you pay.</p>\n","urlObject":{"path":["api","wholesale","v2","products"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Items per page, 1 to 100.</p>\n","type":"text/plain"},"key":"limit","value":"20"},{"disabled":true,"description":{"content":"<p><code>nextCursor</code> from the previous page. Omit on the first call.</p>\n","type":"text/plain"},"key":"cursor","value":""}],"variable":[]}},"response":[{"id":"50ef7c82-e410-4f3f-964d-60d5c0aa3985","name":"200 Products page","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/products?limit=3","host":["{{baseUrl}}"],"path":["api","wholesale","v2","products"],"query":[{"key":"limit","value":"3"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"productId\": 1399,\n      \"brand\": \"Apple\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/81432783-fa51-4e17-8de7-b1013bb37c3a\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"FIXED\",\n      \"amount\": 10,\n      \"pricing\": {\n        \"adjustmentType\": \"DISCOUNT\",\n        \"value\": 1.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    },\n    {\n      \"productId\": 1400,\n      \"brand\": \"Apple\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/81432783-fa51-4e17-8de7-b1013bb37c3a\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"FIXED\",\n      \"amount\": 15,\n      \"pricing\": {\n        \"adjustmentType\": \"DISCOUNT\",\n        \"value\": 1.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    },\n    {\n      \"productId\": 1402,\n      \"brand\": \"Apple\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/81432783-fa51-4e17-8de7-b1013bb37c3a\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"FIXED\",\n      \"amount\": 20,\n      \"pricing\": {\n        \"adjustmentType\": \"DISCOUNT\",\n        \"value\": 1.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"type\": \"cursor\",\n      \"nextCursor\": \"1402\",\n      \"hasMore\": true\n    }\n  }\n}"},{"id":"fab62e36-ab06-4ff0-b316-09ece1c413a7","name":"400 Invalid cursor","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/products?limit=20&cursor=abc","host":["{{baseUrl}}"],"path":["api","wholesale","v2","products"],"query":[{"key":"limit","value":"20"},{"key":"cursor","value":"abc"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"VALIDATION_ERROR\",\n    \"message\": \"cursor must be a product id\"\n  }\n}"}],"_postman_id":"5f829b26-8eaa-40fa-a91b-0acb44172e08"},{"name":"Get product quote","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const payable = (pm.response.json().data || {}).payable;","if (payable) pm.collectionVariables.set('fxQuoteId', payable.fxQuoteId || '');"],"id":"ef5b2c10-dcc9-48db-8be6-38bedeed78f9"}}],"id":"8e97b522-855d-430b-9ab1-b4cb574ca782","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/products/1399?currency=EUR","description":"<p>Returns one product and what you pay for it from a wallet in <code>currency</code>.</p>\n<p>When <code>currency</code> differs from the product currency, <code>payable</code> includes the FX rate and an <code>fxQuoteId</code>. Send that <code>fxQuoteId</code> with the order to be charged at exactly this rate (see <strong>Create order at a quoted FX rate</strong>).</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data.product</code></td>\n<td>object</td>\n<td>The product, same fields as List products</td>\n</tr>\n<tr>\n<td><code>data.payable.currency</code></td>\n<td>string</td>\n<td>Currency you pay in</td>\n</tr>\n<tr>\n<td><code>data.payable.amount</code></td>\n<td>number</td>\n<td>Amount you pay, pricing and FX applied</td>\n</tr>\n<tr>\n<td><code>data.payable.fxRate</code></td>\n<td>number</td>\n<td>Product currency to wallet currency rate</td>\n</tr>\n<tr>\n<td><code>data.payable.fxQuoteId</code></td>\n<td>string</td>\n<td>Quote to lock this rate on an order</td>\n</tr>\n<tr>\n<td><code>data.payable.fxQuoteExpiresAt</code></td>\n<td>string</td>\n<td>When the quote stops being valid, UTC</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","wholesale","v2","products","1399"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>ISO 4217 code of the wallet you will pay from. Defaults to the product's currency.</p>\n","type":"text/plain"},"key":"currency","value":"EUR"}],"variable":[]}},"response":[{"id":"6e481408-3d38-499e-b58f-99f6bbf1c512","name":"200 Quote in EUR","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/products/1399?currency=EUR","host":["{{baseUrl}}"],"path":["api","wholesale","v2","products","1399"],"query":[{"key":"currency","value":"EUR","description":"ISO 4217 code of the wallet you will pay from. Defaults to the product's currency."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"product\": {\n      \"productId\": 1399,\n      \"brand\": \"Apple\",\n      \"logoUrl\": \"https://d8m55j0z6fyki.cloudfront.net/81432783-fa51-4e17-8de7-b1013bb37c3a\",\n      \"currency\": \"USD\",\n      \"denominationType\": \"FIXED\",\n      \"amount\": 10,\n      \"pricing\": {\n        \"adjustmentType\": \"DISCOUNT\",\n        \"value\": 1.0,\n        \"unit\": \"PERCENTAGE\"\n      }\n    },\n    \"payable\": {\n      \"currency\": \"EUR\",\n      \"amount\": 8.58,\n      \"fxRate\": 0.866639,\n      \"fxQuoteId\": \"01KZBMSQ0PKK4Z2QA5A5RZZ49E\",\n      \"fxQuoteExpiresAt\": \"2026-10-26T12:00:00Z\"\n    }\n  }\n}"},{"id":"52d7b042-5afb-45e9-a80a-5a73715b76f8","name":"404 Product not found","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/products/9999?currency=EUR","host":["{{baseUrl}}"],"path":["api","wholesale","v2","products","9999"],"query":[{"key":"currency","value":"EUR","description":"ISO 4217 code of the wallet you will pay from. Defaults to the product's currency."}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"PRODUCT_ERROR\",\n    \"message\": \"Product not found\"\n  }\n}"},{"id":"e9f85756-74d7-4d37-a7fa-a3cdd93f5eab","name":"404 No wallet in currency","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/products/1399?currency=GBP","host":["{{baseUrl}}"],"path":["api","wholesale","v2","products","1399"],"query":[{"key":"currency","value":"GBP"}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"ACCOUNT_ERROR\",\n    \"message\": \"No wallet found for currency GBP\"\n  }\n}"}],"_postman_id":"8e97b522-855d-430b-9ab1-b4cb574ca782"}],"id":"b9c46be4-9b6b-4676-afd7-d06475a64472","description":"<p>The catalog you can buy through the API, with your pricing. Only instantly delivered (realtime) products are listed. Requires the <code>products:read</code> permission.</p>\n","_postman_id":"b9c46be4-9b6b-4676-afd7-d06475a64472"},{"name":"Orders","item":[{"name":"Create order","id":"d5a1ec22-fb00-4004-b77b-f7b23879778d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"api-179302849067\",\n  \"walletId\": \"{{walletId}}\",\n  \"items\": [\n    { \"productId\": 1399, \"quantity\": 1, \"amount\": 25 }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders","description":"<p>Places one order, paid from <code>walletId</code> at current rates. The wallet is debited when the order is accepted, and the order starts as <code>PENDING</code>.</p>\n<p><code>orderReference</code> is your idempotency key: sending the same order again returns the order already placed and charges nothing. A different order under the same reference returns <code>409 ORDER_REFERENCE_IN_USE</code>.</p>\n<p>Leave out <code>amount</code> for <code>FIXED</code> products. In this collection the reference is generated on every send and remembered for the requests that follow.</p>\n<p><strong>Request body</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>orderReference</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Your unique ID for the order, max 90 characters. Also the idempotency key.</td>\n</tr>\n<tr>\n<td><code>walletId</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Wallet to pay from, from Get account balances</td>\n</tr>\n<tr>\n<td><code>fxQuoteId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Lock the rate from Get product quote</td>\n</tr>\n<tr>\n<td><code>items[].productId</code></td>\n<td>integer</td>\n<td>yes</td>\n<td>Product to buy</td>\n</tr>\n<tr>\n<td><code>items[].quantity</code></td>\n<td>integer</td>\n<td>yes</td>\n<td>Number of cards</td>\n</tr>\n<tr>\n<td><code>items[].amount</code></td>\n<td>number</td>\n<td><code>VARIABLE</code> only</td>\n<td>Face value per card, within <code>minAmount</code> and <code>maxAmount</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Response</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data.id</code></td>\n<td>string</td>\n<td>Your <code>orderReference</code></td>\n</tr>\n<tr>\n<td><code>data.status</code></td>\n<td>string</td>\n<td>Order status</td>\n</tr>\n<tr>\n<td><code>data.paid</code></td>\n<td>boolean</td>\n<td>Whether the wallet was charged</td>\n</tr>\n<tr>\n<td><code>data.walletCurrency</code></td>\n<td>string</td>\n<td>Currency of the wallet charged</td>\n</tr>\n<tr>\n<td><code>data.walletTotal</code></td>\n<td>number</td>\n<td>Total charged to the wallet</td>\n</tr>\n<tr>\n<td><code>data.createdAt</code></td>\n<td>string</td>\n<td>Creation time, UTC</td>\n</tr>\n<tr>\n<td><code>data.items[].amount</code>, <code>currency</code></td>\n<td>number, string</td>\n<td>Face value per card</td>\n</tr>\n<tr>\n<td><code>data.items[].walletAmount</code></td>\n<td>number</td>\n<td>Charged to the wallet for this item</td>\n</tr>\n<tr>\n<td><code>data.items[].fxRate</code></td>\n<td>number</td>\n<td>Rate applied, <code>1</code> when no conversion</td>\n</tr>\n<tr>\n<td><code>data.items[].fulfillmentStatus</code></td>\n<td>string</td>\n<td>Item status</td>\n</tr>\n<tr>\n<td><code>data.items[].fulfilledQuantity</code></td>\n<td>integer</td>\n<td>Cards delivered so far</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","wholesale","v2","orders"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"04cae0b9-efd6-476b-8e9a-36f20eef90d2","name":"200 Order placed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"items\": [\n    {\n      \"productId\": 1441,\n      \"quantity\": 1,\n      \"amount\": 25\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"id\": \"acme-po-2026-10-26-0001\",\n    \"status\": \"Open\",\n    \"fulfillmentStatus\": \"PENDING\",\n    \"paid\": true,\n    \"walletCurrency\": \"EUR\",\n    \"walletTotal\": 19.5,\n    \"createdAt\": \"2026-10-26T11:20:01Z\",\n    \"items\": [\n      {\n        \"id\": \"713\",\n        \"productId\": 1441,\n        \"brandId\": 1185,\n        \"quantity\": 1,\n        \"amount\": 25,\n        \"currency\": \"USD\",\n        \"walletAmount\": 19.5,\n        \"fxRate\": 0.866639,\n        \"fulfillmentStatus\": \"PENDING\",\n        \"fulfilledQuantity\": 0\n      }\n    ]\n  }\n}"},{"id":"9bb845ec-ffd6-464c-8515-5e6324ba1458","name":"400 Validation error","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"items\": []\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"VALIDATION_ERROR\",\n    \"message\": \"must not be empty\"\n  }\n}"},{"id":"8ee19a68-7cd1-4070-b9e9-a1646f650e55","name":"422 Product not orderable","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"items\": [\n    {\n      \"productId\": 1567,\n      \"quantity\": 1,\n      \"amount\": 50\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"PRODUCT_ERROR\",\n    \"message\": \"Product 1567 is delivered by a supplier later and can't be ordered through the API\"\n  }\n}"},{"id":"5d38aa4a-6837-4fab-9ddd-91190342cfd7","name":"422 Insufficient funds","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"items\": [\n    {\n      \"productId\": 1441,\n      \"quantity\": 1,\n      \"amount\": 25\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_FUNDS\",\n    \"message\": \"Not enough prepaid funds for currencyId=4\"\n  }\n}"}],"_postman_id":"d5a1ec22-fb00-4004-b77b-f7b23879778d"},{"name":"Create order at a quoted FX rate","id":"1ef4d0a1-d9eb-4123-a2db-2ea917d204fe","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"api-1793028490396\",\n  \"walletId\": \"{{walletId}}\",\n  \"fxQuoteId\": \"\",\n  \"items\": [\n    { \"productId\": 1399, \"quantity\": 1, \"amount\": 25 }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders","description":"<p>Same as Create order, with the <code>fxQuoteId</code> from Get product quote. The order is placed only if that rate is still quoted for the order's currency pair. Otherwise you get <code>409 FX_QUOTE_CHANGED</code> and nothing is charged: get a new quote and send the order again.</p>\n<p>One quote covers one currency pair. An order that converts more than one currency into the wallet currency returns <code>400 FX_QUOTE_AMBIGUOUS</code>. <code>fxQuoteId</code> is ignored when every item is already in the wallet currency.</p>\n","urlObject":{"path":["api","wholesale","v2","orders"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"6b978c17-4f26-4c15-9923-bbff452ad3d5","name":"200 Order placed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"fxQuoteId\": \"01KZBMSQ0PKK4Z2QA5A5RZZ49E\",\n  \"items\": [\n    {\n      \"productId\": 1441,\n      \"quantity\": 1,\n      \"amount\": 25\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"id\": \"acme-po-2026-10-26-0001\",\n    \"status\": \"Open\",\n    \"fulfillmentStatus\": \"PENDING\",\n    \"paid\": true,\n    \"walletCurrency\": \"EUR\",\n    \"walletTotal\": 19.5,\n    \"createdAt\": \"2026-10-26T11:20:01Z\",\n    \"items\": [\n      {\n        \"id\": \"713\",\n        \"productId\": 1441,\n        \"brandId\": 1185,\n        \"quantity\": 1,\n        \"amount\": 25,\n        \"currency\": \"USD\",\n        \"walletAmount\": 19.5,\n        \"fxRate\": 0.866639,\n        \"fulfillmentStatus\": \"PENDING\",\n        \"fulfilledQuantity\": 0\n      }\n    ]\n  }\n}"},{"id":"228e3ba2-ca2c-420b-b9cf-61aca81cd4fd","name":"409 FX quote changed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"fxQuoteId\": \"01KZBMSQ0PKK4Z2QA5A5RZZ49E\",\n  \"items\": [\n    {\n      \"productId\": 1441,\n      \"quantity\": 1,\n      \"amount\": 25\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"FX_QUOTE_CHANGED\",\n    \"message\": \"The USD->EUR rate changed since FX quote 01KZBMSQ0PKK4Z2QA5A5RZZ49E; get a new product quote\"\n  }\n}"},{"id":"684b751b-26c8-43a3-8b32-845fc3e8219d","name":"400 FX quote ambiguous","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"fxQuoteId\": \"01KZBMSQ0PKK4Z2QA5A5RZZ49E\",\n  \"items\": [\n    {\n      \"productId\": 1441,\n      \"quantity\": 1,\n      \"amount\": 25\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"FX_QUOTE_AMBIGUOUS\",\n    \"message\": \"fxQuoteId covers one currency pair; the order converts GBP, USD into EUR\"\n  }\n}"}],"_postman_id":"1ef4d0a1-d9eb-4123-a2db-2ea917d204fe"},{"name":"Retry an order (same reference)","id":"1c803618-d648-47a0-82a5-5f28e06007d3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"\",\n  \"walletId\": \"{{walletId}}\",\n  \"items\": [\n    { \"productId\": 1399, \"quantity\": 1, \"amount\": 25 }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders","description":"<p>Shows idempotency. Sends the last order again with the same <code>orderReference</code>: you get the existing order back and nothing is charged. Change an item and send it again to see <code>409 ORDER_REFERENCE_IN_USE</code>.</p>\n<p>Use this pattern in production whenever a create order call times out or fails with a 5xx: retry with the same reference, never a new one.</p>\n","urlObject":{"path":["api","wholesale","v2","orders"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"d8e54048-cded-4146-b5dd-b005be4fb1f9","name":"200 Existing order returned","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"items\": [\n    {\n      \"productId\": 1441,\n      \"quantity\": 1,\n      \"amount\": 25\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"id\": \"acme-po-2026-10-26-0001\",\n    \"status\": \"Open\",\n    \"fulfillmentStatus\": \"PENDING\",\n    \"paid\": true,\n    \"walletCurrency\": \"EUR\",\n    \"walletTotal\": 19.5,\n    \"createdAt\": \"2026-10-26T11:20:01Z\",\n    \"items\": [\n      {\n        \"id\": \"713\",\n        \"productId\": 1441,\n        \"brandId\": 1185,\n        \"quantity\": 1,\n        \"amount\": 25,\n        \"currency\": \"USD\",\n        \"walletAmount\": 19.5,\n        \"fxRate\": 0.866639,\n        \"fulfillmentStatus\": \"PENDING\",\n        \"fulfilledQuantity\": 0\n      }\n    ]\n  }\n}"},{"id":"56054065-55da-45f3-bab0-8dccd218c50b","name":"409 Reference in use","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"body":{"mode":"raw","raw":"{\n  \"orderReference\": \"acme-po-2026-10-26-0001\",\n  \"walletId\": \"72\",\n  \"items\": [\n    {\n      \"productId\": 1441,\n      \"quantity\": 2,\n      \"amount\": 25\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/api/wholesale/v2/orders"},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"ORDER_REFERENCE_IN_USE\",\n    \"message\": \"orderReference acme-po-2026-10-26-0001 was already used for a different order; send a new one\"\n  }\n}"}],"_postman_id":"1c803618-d648-47a0-82a5-5f28e06007d3"},{"name":"List orders","id":"8a55cc17-c3e9-46a4-91fe-0f164e661442","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/orders?limit=20","description":"<p>All your orders, newest first, including those placed in the Orbt portal. Paged by cursor: <code>limit</code> 1 to 100, then pass <code>nextCursor</code> as <code>cursor</code>.</p>\n<p>Filter by creation time with <code>from</code> and <code>to</code> (UTC, ISO 8601).</p>\n","urlObject":{"path":["api","wholesale","v2","orders"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Items per page, 1 to 100.</p>\n","type":"text/plain"},"key":"limit","value":"20"},{"disabled":true,"description":{"content":"<p><code>nextCursor</code> from the previous page.</p>\n","type":"text/plain"},"key":"cursor","value":""},{"disabled":true,"description":{"content":"<p>Created at or after, UTC, ISO 8601.</p>\n","type":"text/plain"},"key":"from","value":"2026-10-01T00:00:00Z"},{"disabled":true,"description":{"content":"<p>Created at or before, UTC, ISO 8601.</p>\n","type":"text/plain"},"key":"to","value":"2026-10-31T23:59:59Z"}],"variable":[]}},"response":[{"id":"c2f33aa8-73ee-47c3-8beb-f19de2b39db4","name":"200 Orders","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":{"raw":"{{baseUrl}}/api/wholesale/v2/orders?limit=20","host":["{{baseUrl}}"],"path":["api","wholesale","v2","orders"],"query":[{"key":"limit","value":"20"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"acme-po-2026-10-26-0001\",\n      \"status\": \"FULFILLED\",\n      \"paid\": true,\n      \"walletCurrency\": \"EUR\",\n      \"walletTotal\": 19.5,\n      \"createdAt\": \"2026-10-26T11:20:01Z\"\n    },\n    {\n      \"id\": \"acme-po-2026-10-25-0007\",\n      \"status\": \"FULFILLED\",\n      \"paid\": true,\n      \"walletCurrency\": \"USD\",\n      \"walletTotal\": 97.0,\n      \"createdAt\": \"2026-10-25T10:31:17Z\"\n    },\n    {\n      \"id\": \"acme-po-2026-10-25-0006\",\n      \"status\": \"FAILED\",\n      \"paid\": false,\n      \"walletCurrency\": \"USD\",\n      \"walletTotal\": 10.9,\n      \"createdAt\": \"2026-10-25T09:54:32Z\"\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"type\": \"cursor\",\n      \"hasMore\": false\n    }\n  }\n}"}],"_postman_id":"8a55cc17-c3e9-46a4-91fe-0f164e661442"},{"name":"Get order","id":"b529d24f-324b-49cc-8574-cbfafa4e2607","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/","description":"<p>One order by your <code>orderReference</code>. Poll this until <code>status</code> is <code>FULFILLED</code> or <code>FAILED</code>.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>status</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>PENDING</code></td>\n<td>Paid and being fulfilled</td>\n</tr>\n<tr>\n<td><code>FULFILLED</code></td>\n<td>Cards ready in <code>/fulfillments</code></td>\n</tr>\n<tr>\n<td><code>FAILED</code></td>\n<td>Not fulfilled, <code>paid</code> is <code>false</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","wholesale","v2","orders",""],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"5d03d7ac-673e-4818-93a4-7d4272e0ed32","name":"200 Pending","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-po-2026-10-26-0001"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"id\": \"acme-po-2026-10-26-0001\",\n    \"status\": \"PENDING\",\n    \"paid\": true,\n    \"walletCurrency\": \"EUR\",\n    \"walletTotal\": 19.5,\n    \"createdAt\": \"2026-10-26T11:20:01Z\"\n  }\n}"},{"id":"1d8c78da-e87d-43d9-929f-3808445a7085","name":"200 Fulfilled","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-po-2026-10-26-0001"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"id\": \"acme-po-2026-10-26-0001\",\n    \"status\": \"FULFILLED\",\n    \"paid\": true,\n    \"walletCurrency\": \"EUR\",\n    \"walletTotal\": 19.5,\n    \"createdAt\": \"2026-10-26T11:20:01Z\"\n  }\n}"},{"id":"15f936f9-ad48-41ab-954c-b3303c211858","name":"200 Failed (e.g. out of stock)","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-po-2026-10-25-0006"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"id\": \"acme-po-2026-10-25-0006\",\n    \"status\": \"FAILED\",\n    \"paid\": false,\n    \"walletCurrency\": \"USD\",\n    \"walletTotal\": 10.9,\n    \"createdAt\": \"2026-10-25T09:54:32Z\"\n  }\n}"},{"id":"dcab6dc0-b63d-4d07-bca7-b9ff300bf07e","name":"404 Order not found","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-unknown-ref"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": \"2026-10-26T11:20:00.000Z\",\n  \"status\": 404,\n  \"error\": \"Not Found\",\n  \"code\": \"ORDER_NOT_FOUND\",\n  \"message\": \"Order acme-unknown-ref was not found\",\n  \"path\": \"/api/wholesale/v2/orders/acme-unknown-ref\",\n  \"retryable\": false\n}"}],"_postman_id":"b529d24f-324b-49cc-8574-cbfafa4e2607"},{"name":"Get order items","id":"34a4964a-c92a-4983-8600-f0bc47e320d2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/orders//items","description":"<p>The line items of an order with per-item pricing, FX and fulfillment progress.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>items[].id</code></td>\n<td>string</td>\n<td>Item ID</td>\n</tr>\n<tr>\n<td><code>items[].productId</code>, <code>brandId</code></td>\n<td>integer</td>\n<td>Product and brand</td>\n</tr>\n<tr>\n<td><code>items[].quantity</code></td>\n<td>integer</td>\n<td>Cards ordered</td>\n</tr>\n<tr>\n<td><code>items[].amount</code>, <code>currency</code></td>\n<td>number, string</td>\n<td>Face value per card</td>\n</tr>\n<tr>\n<td><code>items[].walletAmount</code></td>\n<td>number</td>\n<td>Charged to the wallet for this item</td>\n</tr>\n<tr>\n<td><code>items[].fxRate</code></td>\n<td>number</td>\n<td>Rate applied</td>\n</tr>\n<tr>\n<td><code>items[].fulfillmentStatus</code></td>\n<td>string</td>\n<td><code>PENDING</code>, <code>FULFILLED</code> or <code>FAILED</code></td>\n</tr>\n<tr>\n<td><code>items[].fulfilledQuantity</code></td>\n<td>integer</td>\n<td>Cards delivered so far</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","wholesale","v2","orders","","items"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"120d7066-9ca7-4c1d-a3d4-29c9516b82e1","name":"200 Items","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-po-2026-10-26-0001/items"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"orderReference\": \"acme-po-2026-10-26-0001\",\n    \"items\": [\n      {\n        \"id\": \"713\",\n        \"productId\": 1441,\n        \"brandId\": 1185,\n        \"quantity\": 1,\n        \"amount\": 25,\n        \"currency\": \"USD\",\n        \"walletAmount\": 19.5,\n        \"fxRate\": 0.866639,\n        \"fulfillmentStatus\": \"FULFILLED\",\n        \"fulfilledQuantity\": 1\n      }\n    ]\n  }\n}"},{"id":"2a92d188-422b-440b-97c1-30a715e8b424","name":"404 Order not found","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-unknown-ref/items"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": \"2026-10-26T11:20:00.000Z\",\n  \"status\": 404,\n  \"error\": \"Not Found\",\n  \"code\": \"ORDER_NOT_FOUND\",\n  \"message\": \"Order acme-unknown-ref was not found\",\n  \"path\": \"/api/wholesale/v2/orders/acme-unknown-ref/items\",\n  \"retryable\": false\n}"}],"_postman_id":"34a4964a-c92a-4983-8600-f0bc47e320d2"}],"id":"09ab7eca-6e65-4024-953e-a6e0b1089fb6","description":"<p>Place and track orders. Placing requires <code>orders:write</code>; reading requires <code>orders:read</code>.</p>\n","_postman_id":"09ab7eca-6e65-4024-953e-a6e0b1089fb6"},{"name":"Fulfillments","item":[{"name":"Get order fulfillments","id":"0bd03f33-bdd4-4ae2-afd7-090d6826877f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}","description":"<p>Your API key.</p>\n"},{"key":"x-client-id","value":"{{clientId}}","description":"<p>Your client ID.</p>\n"},{"key":"x-timestamp","value":"{{x-timestamp}}","description":"<p>Request time, UTC, ISO 8601. Set by the collection pre-request script.</p>\n"},{"key":"x-body-hash","value":"{{x-body-hash}}","description":"<p>Base64 SHA-256 of the raw body. Set by the collection pre-request script.</p>\n"},{"key":"x-signature","value":"{{x-signature}}","description":"<p>Base64 HMAC-SHA256 signature. Set by the collection pre-request script.</p>\n"}],"url":"{{baseUrl}}/api/wholesale/v2/orders//fulfillments","description":"<p>The delivered cards of an order. While the order is <code>PENDING</code> the list is empty, so call this once Get order returns <code>FULFILLED</code>.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fulfillments[].id</code></td>\n<td>string</td>\n<td>Card ID</td>\n</tr>\n<tr>\n<td><code>fulfillments[].productId</code></td>\n<td>integer</td>\n<td>Product</td>\n</tr>\n<tr>\n<td><code>fulfillments[].brand</code>, <code>productName</code></td>\n<td>string</td>\n<td>Brand and product name</td>\n</tr>\n<tr>\n<td><code>fulfillments[].faceValue</code>, <code>currency</code></td>\n<td>number, string</td>\n<td>Card value</td>\n</tr>\n<tr>\n<td><code>fulfillments[].code</code></td>\n<td>string</td>\n<td>Card code or number</td>\n</tr>\n<tr>\n<td><code>fulfillments[].pin</code></td>\n<td>string</td>\n<td>PIN, when the brand uses one</td>\n</tr>\n<tr>\n<td><code>fulfillments[].giftCardUrl</code></td>\n<td>string</td>\n<td>Hosted page showing the card, ready to share with the recipient</td>\n</tr>\n<tr>\n<td><code>fulfillments[].giftCardUrlExpiry</code></td>\n<td>string</td>\n<td>When <code>giftCardUrl</code> stops working</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>502 FULFILLMENT_UNAVAILABLE</code> means the cards cannot be read right now. The order itself is fine: retry later.</p>\n","urlObject":{"path":["api","wholesale","v2","orders","","fulfillments"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"6195ab97-1ca7-47d5-b488-697bc44e255a","name":"200 Cards","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-po-2026-10-26-0001/fulfillments"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"orderReference\": \"acme-po-2026-10-26-0001\",\n    \"fulfillments\": [\n      {\n        \"id\": \"5477\",\n        \"productId\": 1441,\n        \"brand\": \"Amazon.com\",\n        \"productName\": \"Amazon.com eGift Card\",\n        \"faceValue\": 25.0,\n        \"currency\": \"USD\",\n        \"code\": \"AQ7K-EXAMPLE-CODE\",\n        \"pin\": \"EXAMPLE-PIN\",\n        \"giftCardUrl\": \"https://fulfillment.orbt.com/EXAMPLE-TOKEN\",\n        \"giftCardUrlExpiry\": \"2027-04-26T11:20:05\"\n      }\n    ]\n  }\n}"},{"id":"1d665660-0fc3-48d1-aa68-c9f2d0659fc8","name":"200 Still pending","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-po-2026-10-26-0001/fulfillments"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": []\n}"},{"id":"39da4e52-e310-43d1-90ef-8009e9951de4","name":"404 Order not found","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-unknown-ref/fulfillments"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": \"2026-10-26T11:20:00.000Z\",\n  \"status\": 404,\n  \"error\": \"Not Found\",\n  \"code\": \"ORDER_NOT_FOUND\",\n  \"message\": \"Order acme-unknown-ref was not found\",\n  \"path\": \"/api/wholesale/v2/orders/acme-unknown-ref/fulfillments\",\n  \"retryable\": false\n}"},{"id":"0607347b-4794-4f53-874f-2b2fed50e5a2","name":"502 Fulfillment unavailable","originalRequest":{"method":"GET","header":[{"key":"x-api-key","value":"{{apiKey}}"},{"key":"x-client-id","value":"{{clientId}}"},{"key":"x-timestamp","value":"{{x-timestamp}}"},{"key":"x-body-hash","value":"{{x-body-hash}}"},{"key":"x-signature","value":"{{x-signature}}"}],"url":"{{baseUrl}}/api/wholesale/v2/orders/acme-po-2026-10-26-0001/fulfillments"},"status":"Bad Gateway","code":502,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": {\n    \"code\": \"FULFILLMENT_UNAVAILABLE\",\n    \"message\": \"The order's cards are temporarily unavailable; try again later\"\n  }\n}"}],"_postman_id":"0bd03f33-bdd4-4ae2-afd7-090d6826877f"}],"id":"f8ecc646-8c61-4b19-98ea-c4ddfd876eb8","description":"<p>Collect the delivered cards. Requires the <code>orders:read</code> permission.</p>\n<p>Card codes and PINs are sensitive: store them encrypted and only show them to the intended recipient.</p>\n","_postman_id":"f8ecc646-8c61-4b19-98ea-c4ddfd876eb8"}],"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Orbt request signing. Runs before every request in this collection.","// Reads apiKey, clientId and hmacSecret from the active environment.","(() => {","const cryptoJs = require('crypto-js');","","const apiKey = pm.variables.get('apiKey');","const clientId = pm.variables.get('clientId');","const hmacSecret = pm.variables.get('hmacSecret');","if (!apiKey || !clientId || !hmacSecret) {","  throw new Error('Select the Orbt UAT or PROD environment and fill in apiKey, clientId and hmacSecret.');","}","","// Resolve {{variables}} in the body first, so the hash covers the exact bytes that are sent.","let body = '';","if (pm.request.body && pm.request.body.mode === 'raw' && pm.request.body.raw) {","  body = pm.variables.replaceIn(pm.request.body.raw);","  pm.request.body.update({ mode: 'raw', raw: body, options: { raw: { language: 'json' } } });","  // Remember the orderReference so Get order, items and fulfillments can reuse it.","  try {","    const parsed = JSON.parse(body);","    if (parsed && parsed.orderReference) pm.collectionVariables.set('orderReference', parsed.orderReference);","  } catch (e) { /* not JSON, nothing to remember */ }","}","","const method = pm.request.method.toUpperCase();","const timestamp = new Date().toISOString();","const bodyHash = cryptoJs.SHA256(body).toString(cryptoJs.enc.Base64);","const stringToSign = [method, timestamp, clientId, bodyHash].join('\\n');","const signature = cryptoJs.HmacSHA256(stringToSign, hmacSecret).toString(cryptoJs.enc.Base64);","","pm.variables.set('x-timestamp', timestamp);","pm.variables.set('x-body-hash', bodyHash);","pm.variables.set('x-signature', signature);","})();"],"id":"952a28a1-7b48-4417-88fa-cd1bcfe4f2be"}}],"variable":[{"key":"productId","value":"1399","description":"Set by List products (page)."},{"key":"fxQuoteId","value":"","description":"Set by Get product quote."},{"key":"orderReference","value":"","description":"Set by the last Create order."}]}