{"info":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","description":"<html><head></head><body><p>A server-to-server API so you can resell mouroam's catalog — SMM engagement, ready-made social/email accounts, VPN access, travel phone-number eSIMs, and mobile proxies — on your own storefront, without your customers ever seeing which upstream provider sits behind it.</p>\n<p><strong>This documentation is public and free to read.</strong> Every endpoint, field, and example below was pulled directly from the live implementation, not written from memory — you do not need an account to browse it. You DO need your own live API key to actually call anything (see \"Getting a key\" below); every request in this collection inherits Bearer auth from a blank <code>api_key</code> collection variable, so nothing here can leak or spend a real key.</p>\n<h2 id=\"getting-a-key\">Getting a key</h2>\n<ol>\n<li>Sign up for a mouroam account and fund your wallet to at least the reseller balance minimum shown on <code>/dashboard/account</code> (a pre-filter, not the real gate).</li>\n<li>From <code>/dashboard/account</code>, submit a \"Request API access\" application — an optional note about your use case helps the review.</li>\n<li>A mouroam admin reviews and manually approves or denies the request. Balance alone never auto-approves.</li>\n<li>On approval, your key is minted and revealed <strong>exactly once</strong>, the next time you visit your own dashboard. Copy it immediately — it's a raw secret (<code>sk_live_...</code>) and cannot be shown again. There is currently no self-service rotation; contact support if you lose it or need it revoked and reissued.</li>\n<li>Set the <code>api_key</code> variable in this collection (Variables tab, top right) to that value and you're live.</li>\n</ol>\n<h2 id=\"the-four-step-contract\">The four-step contract</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET  /catalog?kind=...        → browse what you can resell\nPOST /quotes                  → lock in a real, server-computed price (valid 10 minutes)\nPOST /orders                  → place the order against that quote\nGET  /orders/{id}             → poll for status, or configure a webhook (see below)\nGET  /orders/{id}/delivery    → fetch credentials/activation info once ready\n</code></pre><p>Nothing you send is ever trusted as a price. The server recomputes it at both quote time and order time, and refuses to charge more than the quote you approved — if the live price moved in between, the order lands <code>failed</code> with <code>error_code: \"price_changed\"</code> instead of silently overcharging you. Get a fresh quote and retry with a new <code>external_order_id</code>.</p>\n<p>Two endpoints round out the API without being part of this core flow: <code>GET /balance</code> (your account's current spendable balance) and, for a fulfilled <code>smm</code> order, <code>GET</code>/<code>POST /orders/{id}/refill</code> (see \"Refills\" below). <code>/smm/orders</code> and <code>/smm/orders/{id}</code> are also available as plain aliases for <code>/orders</code> and <code>/orders/{id}</code>, if you prefer a kind-scoped path — identical behavior, no separate rate limit.</p>\n<h2 id=\"auth\">Auth</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer sk_live_your_own_key_here\nContent-Type: application/json   (POST only)\n</code></pre><p>A key resolves to exactly one mouroam account and spends that account's wallet balance through the same debit path the mouroam dashboard itself uses — it grants no other access. An unknown key and a revoked key are indistinguishable: both return <code>401 unauthorized</code>, so a caller can never probe which part of a credential was wrong. A revoked key does not affect your account's underlying access approval — contact support for a replacement key rather than reapplying.</p>\n<h2 id=\"product-kinds\">Product kinds</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>kind</code></th>\n<th>what it is</th>\n<th><code>quantity</code> means</th>\n<th>needs <code>link</code>?</th>\n<th>has <code>GET /orders/{id}/delivery</code>?</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>smm</code></td>\n<td>Social engagement (followers/likes/views/comments/traffic/SEO) across Instagram, TikTok, YouTube, Twitter/X, Facebook, Telegram</td>\n<td>a real unit count (or set automatically from <code>comments.length</code> for a Custom Comments product)</td>\n<td>yes — a public profile/post URL, tracking params stripped server-side</td>\n<td>no — status lives entirely on the order (<code>link</code>, <code>start_count</code>, <code>remains</code>, <code>refillable</code>)</td>\n</tr>\n<tr>\n<td><code>social_account</code></td>\n<td>A ready-made social account (login credentials)</td>\n<td>number of accounts, 1+, capped by live stock</td>\n<td>no</td>\n<td>yes — <code>accounts[].fields</code></td>\n</tr>\n<tr>\n<td><code>email_account</code></td>\n<td>A ready-made email account (Gmail/Outlook/Yahoo/Protonmail)</td>\n<td>number of accounts, 1+, capped by live stock</td>\n<td>no</td>\n<td>yes — <code>accounts[].fields</code></td>\n</tr>\n<tr>\n<td><code>vpn</code></td>\n<td>A VPNClient app account, 7 or 30 day access</td>\n<td>always <code>1</code></td>\n<td>no</td>\n<td>yes — <code>username</code>/<code>password</code>/<code>app</code></td>\n</tr>\n<tr>\n<td><code>esim</code></td>\n<td>A real phone-number eSIM (voice + SMS + data; travel/calling use only)</td>\n<td>always <code>1</code></td>\n<td>no</td>\n<td>yes — <code>activation_code</code>/<code>lpa_string</code>/<code>iccid</code>/<code>phone_number</code></td>\n</tr>\n<tr>\n<td><code>esim_topup</code></td>\n<td>A data/voice/SMS top-up for an eSIM you already bought through this API</td>\n<td>always <code>1</code></td>\n<td>no</td>\n<td>no — it extends the existing eSIM in place; check the order snapshot instead</td>\n</tr>\n<tr>\n<td><code>mobile_proxy</code></td>\n<td>A fixed-term mobile proxy (real carrier 5G IP, SOCKS5 + HTTP, unlimited data for the term)</td>\n<td>always <code>1</code></td>\n<td>no</td>\n<td>yes — a single opaque <code>credential</code> string</td>\n</tr>\n</tbody>\n</table>\n</div><p>There is no <code>order</code> (disposable OTP numbers) or <code>rental</code> kind — both are permanently disabled and won't be added without a separate explicit decision.</p>\n<p><code>esim_topup</code> has one extra catalog requirement: pass <code>&amp;esim_id=&lt;your already-purchased eSIM's id&gt;</code> on <code>GET /catalog</code> — that eSIM must already be <code>active</code> (fully provisioned) before it has any top-up options.</p>\n<p>A <code>smm</code> catalog product (and a placed <code>smm</code> order) also carries <code>refill_mode</code> (<code>\"api\"</code>/<code>\"manual\"</code>/<code>\"none\"</code>) and, when applicable, <code>refill_window_days</code> — see \"Refills\" below.</p>\n<h2 id=\"response-envelope\">Response envelope</h2>\n<p>Every response is one of:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"success\": true, \"data\": { ... } }\n{ \"success\": false, \"error\": \"human-readable message\", \"code\": \"machine_readable_code\" }\n</code></pre>\n<p><code>X-Request-Id</code> is set on every response — include it when reporting an issue. A <code>429</code> always sets <code>Retry-After: 300</code>.</p>\n<h2 id=\"rate-limits\">Rate limits</h2>\n<ul>\n<li><strong>Order-placing calls</strong> (<code>POST /orders</code>, <code>POST /orders/{id}/refill</code>): 30 per 5 minutes.</li>\n<li><strong>Read calls</strong> (catalog, quotes, order status/list, delivery, balance, <code>GET /orders/{id}/refill</code>): 120 per 5 minutes.</li>\n<li>Both buckets are keyed by <strong>account</strong>, not by individual key — if you ever hold more than one active key, they share the same two buckets.</li>\n<li>A broad backstop (600 requests / 5 minutes, keyed by IP) is checked <em>before</em> your key is even validated, so spamming invalid/missing keys still costs rate-limit budget.</li>\n</ul>\n<h2 id=\"idempotency\">Idempotency</h2>\n<p><code>external_order_id</code> (yours, 1–128 characters) is what makes retrying safe: resubmitting the exact same <code>external_order_id</code> always returns the exact same order — it is never placed twice. If that id was already used with a <code>quote_id</code> resolving to <em>different</em> order parameters, the request is refused as <code>409 idempotency_conflict</code> rather than silently substituted. On a genuinely unknown outcome (<code>503 temporarily_unavailable</code>, a network error on your end) always retry with the <em>same</em> <code>external_order_id</code> — never mint a new one just because a call failed; a new id there risks a real double order.</p>\n<h2 id=\"order-status-values\">Order status values</h2>\n<p><code>queued</code>, <code>processing</code>, <code>pending</code>, <code>purchasing</code>, <code>in_progress</code>, <code>partial</code>, <code>active</code>, <code>completed</code>, <code>delivered</code>, <code>canceled</code>, <code>refunded</code>, <code>failed</code>, <code>review_required</code>.</p>\n<p><code>review_required</code> means the order needs a human on our side before it can move — but it covers <strong>two genuinely different situations</strong>, so always branch on the order's <code>error_code</code>, never on the status alone:</p>\n<ul>\n<li><code>error_code: \"confirmation_pending\"</code> — the last purchase attempt got an unclear response from the upstream supplier (a timeout, a 5xx). We genuinely don't know whether it went through, so it's never auto-refunded and never silently retried on top of a possibly-real charge. <strong>This one does not resolve on its own on any fixed schedule</strong> — it requires a human to confirm the real outcome. If it sits for more than a few hours, contact support with the order id rather than waiting indefinitely.</li>\n<li><code>error_code: \"delivery_overdue\"</code> or <code>\"delivery_stalled\"</code> (<code>smm</code> only) — the purchase itself was confirmed fine; it's <em>delivery</em> that is late, or has stopped advancing. These carry a 24-hour internal review target. <code>delivery_stalled</code> can clear <strong>by itself</strong> if the supplier resumes delivering, in which case the order simply returns to its normal status (<code>in_progress</code> etc.) with no action from you — treat it as \"watch\", not \"escalate immediately\".</li>\n</ul>\n<p>An integration that checks <code>error_code === \"confirmation_pending\"</code> to detect the review state will silently miss the two delivery reasons. Match on the <code>review_required</code> status, then read <code>error_code</code> for the reason.</p>\n<p><code>refunded_usd_cents</code> / <code>net_price_usd_cents</code> are always present on an order and reflect any partial or full refund recorded so far — trust these over <code>status</code> alone for your own accounting (an SMM order that under-delivers can be <em>partially</em> refunded while still showing <code>in_progress</code>).</p>\n<p>A freshly placed order (<code>POST /orders</code> returning <code>202</code>) starts with almost nothing filled in — just <code>id</code>, <code>external_order_id</code>, <code>kind</code>, <code>product_id</code>, <code>status: \"queued\"</code>, <code>version: 0</code>, and timestamps. <code>quantity</code>/<code>price_usd_cents</code>/etc. only appear once the first status snapshot lands, moments later — poll <code>GET /orders/{id}</code> or wait for the webhook rather than assuming those fields exist on the immediate response.</p>\n<h2 id=\"refills\">Refills</h2>\n<p>A routed <code>smm</code> order (followers/likes/views/subscribers) that drops after delivery can request a refill through <code>GET</code>/<code>POST /orders/{id}/refill</code> (see the \"Refills\" folder). Whether a refill is possible at all, and how it gets fulfilled, is driven entirely by that product's <code>refill_mode</code> — already visible on the catalog entry before you ever order, and on the order itself afterward:</p>\n<ul>\n<li><code>\"none\"</code> — this supplier tier carries no refill guarantee. The endpoint always returns <code>409 refill_unavailable</code>.</li>\n<li><code>\"api\"</code> — the supplier's own refill endpoint is called directly the moment you <code>POST</code>. <code>status</code> reflects its real, polled outcome: <code>submitting</code> → <code>pending</code> → <code>completed</code>/<code>rejected</code>.</li>\n<li><code>\"manual\"</code> — this supplier only offers a refill guarantee outside any automatable API. A <code>POST</code> queues a <code>manual_review</code> request for a human on our side to verify against the real supplier record and honor it — not auto-resolved, but not ignored either.</li>\n</ul>\n<p><code>refill_window_days</code> is how many days after the order's <code>completed_at</code> a refill can still be requested at all. At most one active refill request per order at a time, and at most one submission every 24 hours per order — hitting either limit returns <code>409 refill_unavailable</code>, same as requesting one outside the window or on an order that never actually fulfilled with a supplier.</p>\n<h2 id=\"errors-worth-handling-specifically\">Errors worth handling specifically</h2>\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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>invalid_request</code></td>\n<td>A field was missing, the wrong type, or too long/short — see <code>error</code> for which one.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>invalid_product_kind</code></td>\n<td>The <code>kind</code> query param isn't one of the seven supported kinds.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>invalid_link</code></td>\n<td><code>link</code> isn't a public <code>http(s)</code> URL, or embeds credentials.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>invalid_comments</code></td>\n<td><code>comments</code> is required/forbidden for this product, or has 0 or &gt;1000 entries.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>invalid_quantity</code></td>\n<td>Quantity is outside the product's current bounds, or isn't <code>1</code> for a one-at-a-time product.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>no_credentials</code></td>\n<td>You called delivery on a kind that has nothing to deliver (<code>smm</code>, <code>esim_topup</code>) — use order status instead.</td>\n</tr>\n<tr>\n<td>401</td>\n<td><code>unauthorized</code></td>\n<td>Missing, invalid, or revoked API key.</td>\n</tr>\n<tr>\n<td>404</td>\n<td><code>not_found</code></td>\n<td>The product, quote, or order id doesn't exist (or isn't yours).</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>idempotency_conflict</code></td>\n<td>Your <code>external_order_id</code> was already used with different order parameters. Use a new id.</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>quote_expired</code></td>\n<td>The quote is more than 10 minutes old. Get a fresh one and place the order again.</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>product_unavailable</code></td>\n<td>The product's live availability/bounds changed between quote and order. Refresh the catalog and re-quote.</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>esim_not_ready</code></td>\n<td>You tried to quote/browse top-ups for an eSIM that isn't fully provisioned yet.</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>refill_unavailable</code></td>\n<td>This order can't currently request a refill — it isn't a fulfilled <code>smm</code> order, it's outside its <code>refill_window_days</code>, or one was already requested in the last 24 hours. See \"Refills\" above.</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>delivery_pending</code></td>\n<td>The order exists but isn't ready to deliver yet. Poll order status first.</td>\n</tr>\n<tr>\n<td>413</td>\n<td><code>body_too_large</code></td>\n<td>Request body over 64KB.</td>\n</tr>\n<tr>\n<td>415</td>\n<td><code>unsupported_media_type</code></td>\n<td>Missing/wrong <code>Content-Type</code> on a <code>POST</code> — must be <code>application/json</code>.</td>\n</tr>\n<tr>\n<td>429</td>\n<td><code>rate_limited</code></td>\n<td>Back off; <code>Retry-After</code> is set to <code>300</code>.</td>\n</tr>\n<tr>\n<td>503</td>\n<td><code>temporarily_unavailable</code></td>\n<td>Always safe to retry with the exact same request (same <code>external_order_id</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p>Separately, an <strong>order itself</strong> can carry its own <code>error_code</code> once it lands <code>failed</code> or <code>review_required</code> — a field on the order object, not an HTTP status:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>error_code</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>insufficient_balance</code></td>\n<td>The mouroam account behind your key was out of funds at purchase time. Top it up and retry with a <strong>new</strong> <code>external_order_id</code>.</td>\n</tr>\n<tr>\n<td><code>price_changed</code></td>\n<td>The live price moved past your quote's approved price between quote and purchase. Get a fresh quote and retry with a new <code>external_order_id</code>.</td>\n</tr>\n<tr>\n<td><code>product_unavailable</code></td>\n<td>The product became unavailable/out of bounds at the exact moment of purchase. Refresh the catalog and re-quote.</td>\n</tr>\n<tr>\n<td><code>confirmation_pending</code></td>\n<td>On a <code>review_required</code> order — the purchase attempt's outcome is still being confirmed by a human. Keep polling; do not retry.</td>\n</tr>\n<tr>\n<td><code>delivery_overdue</code></td>\n<td>On a <code>review_required</code> <code>smm</code> order — the purchase was confirmed, but delivery has passed its expected window. Under review with a 24-hour target. Do not retry.</td>\n</tr>\n<tr>\n<td><code>delivery_stalled</code></td>\n<td>On a <code>review_required</code> <code>smm</code> order — the purchase was confirmed, but delivery has stopped advancing. Can clear by itself if the supplier resumes, returning the order to its normal status. Do not retry.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"webhooks\">Webhooks</h2>\n<p>There is currently no self-service API to register your own webhook — contact mouroam with your endpoint URL and an admin wires it up against your account (per account, not per key, so rotating a key never silently breaks delivery).</p>\n<p>On any change to an order's public snapshot, mouroam <code>POST</code>s to your URL:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST &lt;your webhook_url&gt;\nContent-Type: application/json\nX-Webhook-Id: &lt;event id&gt;\nX-Webhook-Timestamp: &lt;unix seconds&gt;\nX-Webhook-Signature: v1=&lt;hex hmac&gt;\nX-Webhook-Event: order.updated\n</code></pre><pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"event-uuid\",\n  \"event\": \"order.updated\",\n  \"created_at\": \"2026-09-16T15:12:03.000Z\",\n  \"version\": 3,\n  \"data\": {\n    \"status\": \"completed\",\n    \"currency\": \"USD\",\n    \"quantity\": 500,\n    \"price_usd_cents\": 2495,\n    \"refunded_usd_cents\": 0,\n    \"net_price_usd_cents\": 2495,\n    \"id\": \"order-uuid\",\n    \"external_order_id\": \"your-own-order-id\"\n  }\n}\n</code></pre>\n<p><strong>Important:</strong> <code>data</code> is the raw internal status snapshot plus <code>id</code>/<code>external_order_id</code> merged in — it is <em>not</em> byte-identical to <code>GET /orders/{id}</code>. It does <strong>not</strong> include <code>kind</code>, <code>product_id</code>, <code>created_at</code>, or <code>updated_at</code> (those are added only by the <code>GET /orders/{id}</code> response). It also never includes refill state — refills are tracked separately via <code>GET /orders/{id}/refill</code> and do not trigger an <code>order.updated</code> webhook of their own. If your handler needs those, call <code>GET /orders/{id}</code> on receipt rather than assuming the webhook body has everything.</p>\n<p>Verify the signature yourself before trusting a callback:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>expected = HMAC_SHA256(your_webhook_secret, \"&lt;X-Webhook-Timestamp&gt;.\" + &lt;raw request body bytes&gt;)\nvalid = hex(expected) === the part of X-Webhook-Signature after \"v1=\"\n</code></pre><p>Your endpoint must be a public HTTPS URL on port 443, no embedded credentials, no fragment, and DNS resolving only to public (non-private, non-loopback, non-link-local) addresses — anything else is rejected at configuration time. Delivery retries on failure with exponential backoff starting at 1 minute and doubling each attempt, capped at 24 hours between attempts, for several days; a <code>2xx</code> response stops retries. <strong>Make your handler idempotent on <code>(order id, version)</code></strong> — a retried delivery and your own poll can both land. If your endpoint is down for an extended stretch, <code>GET /orders/{id}</code> still works — this API never depends on a webhook actually arriving.</p>\n<h2 id=\"support\">Support</h2>\n<p>Questions, a webhook URL to register, or a lost/exposed key that needs revoking and reissuing: contact mouroam support through the usual channel linked from your dashboard. Include the <code>X-Request-Id</code> from any failing response you're asking about.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"15852868","collectionId":"c2d77dde-b214-4f18-8f97-a3ad93190472","publishedId":"2sBYB1MTVS","public":true,"customColor":{"top-bar":"#FFFFFF","highlight":"#0D9488","right-sidebar":"#FFFFFF"},"publishDate":"2026-09-16T17:24:23.000Z"},"item":[{"name":"Catalog","item":[{"name":"List product kinds","id":"55575d66-01eb-4477-a009-060f9563faa9","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/catalog","description":"<p>Returns the sellable product kinds and the currency every price is denominated in. Cheap to call — not paginated, no query params.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \\\"product_kinds\\\": [\\\"smm\\\", \\\"social_account\\\", \\\"email_account\\\", \\\"vpn\\\", \\\"esim\\\", \\\"esim_topup\\\"], \\\"currency\\\": \\\"USD\\\" }\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["catalog"],"host":["https://mouroam.com/api/v1"],"query":[],"variable":[]}},"response":[{"id":"1c0605f5-4a6f-5335-7be6-b0b324bfd10e","name":"Success","originalRequest":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/catalog","description":"Returns the sellable product kinds and the currency every price is denominated in. Cheap to call — not paginated, no query params.\n\n```json\n{ \\\"product_kinds\\\": [\\\"smm\\\", \\\"social_account\\\", \\\"email_account\\\", \\\"vpn\\\", \\\"esim\\\", \\\"esim_topup\\\"], \\\"currency\\\": \\\"USD\\\" }\n```"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"product_kinds\":[\"smm\",\"social_account\",\"email_account\",\"vpn\",\"esim\",\"esim_topup\"],\"currency\":\"USD\"}}"}],"_postman_id":"55575d66-01eb-4477-a009-060f9563faa9"},{"name":"Get catalog for a product kind","id":"8c8faf80-507a-44f5-b1e1-bdb19d3a288a","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","description":"<p>Returns up to 100 products per page for the given <code>kind</code>. <code>platform</code> (smm/social_account/email_account only) and <code>offset</code> are optional; <code>esim_id</code> is <strong>required</strong> when <code>kind=esim_topup</code>.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"products\": [ { \"id\": \"uuid\", \"kind\": \"...\", \"currency\": \"USD\", ... } ],\n  \"total\": 42,\n  \"next_offset\": 100\n}\n</code></pre>\n<p><code>next_offset</code> is <code>null</code> on the last page, never omitted — check for <code>null</code>, not falsy/undefined. Every <code>id</code> is a stable <code>reseller_products.id</code>; pass it straight into <code>POST /quotes</code> as <code>product_id</code>. <strong>The fields inside each product object are different for every <code>kind</code></strong> — see the eight example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each, including a routed <code>smm</code> type's <code>refill_mode</code>/<code>refill_window_days</code>/<code>price_quantity</code> fields. <code>from_price_usd_cents</code>/<code>unit_price_usd_cents</code> are indicative only for pricing display; always call <code>POST /quotes</code> for the real, chargeable price before showing a final price to your own customer.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["catalog"],"host":["https://mouroam.com/api/v1"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}],"variable":[]}},"response":[{"id":"b08ba7b5-976e-a778-042f-de997d3cc352","name":"smm — routed type (Instagram Followers)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \\\"products\\\": [ { \\\"id\\\": \\\"uuid\\\", \\\"kind\\\": \\\"...\\\", \\\"currency\\\": \\\"USD\\\", ... } ],\n  \\\"total\\\": 42,\n  \\\"next_offset\\\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the six example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"kind\":\"smm\",\"currency\":\"USD\",\"name\":\"Instagram Followers\",\"platform\":\"instagram\",\"service_type\":\"followers\",\"order_kind\":\"default\",\"min_quantity\":200,\"max_quantity\":50000,\"from_price_usd_cents\":499,\"price_quantity\":200,\"refillable\":true,\"refill_mode\":\"api\",\"refill_window_days\":30}],\"total\":1,\"next_offset\":null}}"},{"id":"9cd3eb5b-c250-d4ee-dcff-b97e1894b537","name":"smm — package type (SEO)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \\\"products\\\": [ { \\\"id\\\": \\\"uuid\\\", \\\"kind\\\": \\\"...\\\", \\\"currency\\\": \\\"USD\\\", ... } ],\n  \\\"total\\\": 42,\n  \\\"next_offset\\\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the six example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\",\"kind\":\"smm\",\"currency\":\"USD\",\"name\":\"Website SEO Audit — High PR Backlinks\",\"platform\":\"seo\",\"service_type\":\"backlinks\",\"order_kind\":\"package\",\"min_quantity\":1,\"max_quantity\":1,\"from_price_usd_cents\":62495,\"price_quantity\":1,\"refillable\":false,\"speed\":\"Standard\"}],\"total\":1,\"next_offset\":null}}"},{"id":"f1fb287a-8d7d-1a97-0726-01a0f039a0f3","name":"social_account","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \\\"products\\\": [ { \\\"id\\\": \\\"uuid\\\", \\\"kind\\\": \\\"...\\\", \\\"currency\\\": \\\"USD\\\", ... } ],\n  \\\"total\\\": 42,\n  \\\"next_offset\\\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the six example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"c3d4e5f6-7a8b-4c9d-0e1f-2a3b4c5d6e7f\",\"kind\":\"social_account\",\"currency\":\"USD\",\"name\":\"Instagram — Aged 2019, Email Verified\",\"platform\":\"instagram\",\"region\":\"US\",\"highlights\":[\"Email verified\",\"2FA available\"],\"included_items\":[\"Login\",\"Password\",\"Email\",\"Email password\"],\"min_quantity\":1,\"max_quantity\":5,\"stock\":12,\"unit_price_usd_cents\":350}],\"total\":1,\"next_offset\":null}}"},{"id":"a16fd4ad-c2b1-6031-5410-88faea044966","name":"email_account","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \\\"products\\\": [ { \\\"id\\\": \\\"uuid\\\", \\\"kind\\\": \\\"...\\\", \\\"currency\\\": \\\"USD\\\", ... } ],\n  \\\"total\\\": 42,\n  \\\"next_offset\\\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the six example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"d4e5f6a7-8b9c-4d0e-1f2a-3b4c5d6e7f8a\",\"kind\":\"email_account\",\"currency\":\"USD\",\"name\":\"Gmail — Aged 2020, Recovery Email Set\",\"platform\":\"gmail\",\"region\":\"US\",\"highlights\":[\"Recovery email set\",\"No phone verification needed\"],\"included_items\":[\"Email\",\"Password\",\"Recovery email\",\"Recovery email password\"],\"min_quantity\":1,\"max_quantity\":10,\"stock\":34,\"unit_price_usd_cents\":225}],\"total\":1,\"next_offset\":null}}"},{"id":"3ff14bc6-9517-2e11-94ce-2c143c2070af","name":"vpn","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \\\"products\\\": [ { \\\"id\\\": \\\"uuid\\\", \\\"kind\\\": \\\"...\\\", \\\"currency\\\": \\\"USD\\\", ... } ],\n  \\\"total\\\": 42,\n  \\\"next_offset\\\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the six example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"e5f6a7b8-9c0d-4e1f-2a3b-4c5d6e7f8a9b\",\"kind\":\"vpn\",\"currency\":\"USD\",\"name\":\"30-day VPN\",\"duration_days\":30,\"devices\":1,\"min_quantity\":1,\"max_quantity\":1,\"unit_price_usd_cents\":899}],\"total\":2,\"next_offset\":null}}"},{"id":"8236059c-0859-2749-ccb7-3530ffde3ed2","name":"esim","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \\\"products\\\": [ { \\\"id\\\": \\\"uuid\\\", \\\"kind\\\": \\\"...\\\", \\\"currency\\\": \\\"USD\\\", ... } ],\n  \\\"total\\\": 42,\n  \\\"next_offset\\\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the six example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"f6a7b8c9-0d1e-4f2a-3b4c-5d6e7f8a9b0c\",\"kind\":\"esim\",\"currency\":\"USD\",\"name\":\"Global 5GB / 30 days\",\"data_gb\":5,\"duration_days\":30,\"voice_minutes\":60,\"sms_count\":20,\"coverage_countries\":157,\"topup_supported\":true,\"non_refundable\":true,\"min_quantity\":1,\"max_quantity\":1,\"unit_price_usd_cents\":4473}],\"total\":6,\"next_offset\":null}}"},{"id":"7a4c1474-2c88-0c69-bff4-c434201c12e5","name":"esim_topup (requires &esim_id=...)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \\\"products\\\": [ { \\\"id\\\": \\\"uuid\\\", \\\"kind\\\": \\\"...\\\", \\\"currency\\\": \\\"USD\\\", ... } ],\n  \\\"total\\\": 42,\n  \\\"next_offset\\\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the six example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"a7b8c9d0-1e2f-4a3b-4c5d-6e7f8a9b0c1d\",\"kind\":\"esim_topup\",\"currency\":\"USD\",\"name\":\"+2GB / 30 days\",\"esim_id\":\"9d8c7b6a-5e4f-3d2c-1b0a-9f8e7d6c5b4a\",\"data_gb\":2,\"duration_days\":30,\"voice_minutes\":0,\"sms_count\":0,\"min_quantity\":1,\"max_quantity\":1,\"unit_price_usd_cents\":1299}],\"total\":3,\"next_offset\":null}}"},{"id":"8fd728c6-0b18-c284-7f27-e72f5fe85f38","name":"mobile_proxy","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/catalog?kind=smm&platform=instagram&offset=0&esim_id=","host":["https://mouroam.com/api/v1"],"path":["catalog"],"query":[{"key":"kind","value":"smm"},{"key":"platform","value":"instagram"},{"key":"offset","value":"0"},{"key":"esim_id","value":""}]},"description":"Returns up to 100 products per page for the given `kind`. `platform` (smm/social_account/email_account only) and `offset` are optional; `esim_id` is **required** when `kind=esim_topup`.\n\n```json\n{\n  \"products\": [ { \"id\": \"uuid\", \"kind\": \"...\", \"currency\": \"USD\", ... } ],\n  \"total\": 42,\n  \"next_offset\": 100\n}\n```\n\n`next_offset` is `null` on the last page, never omitted — check for `null`, not falsy/undefined. Every `id` is a stable `reseller_products.id`; pass it straight into `POST /quotes` as `product_id`. **The fields inside each product object are different for every `kind`** — see the eight example responses on this request (switch between them in the Examples dropdown) for the exact real shape of each, including a routed `smm` type's `refill_mode`/`refill_window_days`/`price_quantity` fields. `from_price_usd_cents`/`unit_price_usd_cents` are indicative only for pricing display; always call `POST /quotes` for the real, chargeable price before showing a final price to your own customer."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"products\":[{\"id\":\"e5f6a7b8-9c0d-4e1f-8a2b-3c4d5e6f7a8b\",\"kind\":\"mobile_proxy\",\"currency\":\"USD\",\"name\":\"USA Mobile Proxy - Verizon 5G | 7 Days\",\"duration_days\":7,\"min_quantity\":1,\"max_quantity\":1,\"unit_price_usd_cents\":7000}],\"total\":1,\"next_offset\":null}}"}],"_postman_id":"8c8faf80-507a-44f5-b1e1-bdb19d3a288a"}],"id":"7868f9cc-43e8-4c60-a76a-98d6b0667f5a","description":"<p>Browse what you can resell. Read-only, no side effects — counts against the 120/5min read rate limit. Field shapes genuinely differ per <code>kind</code> (see each request's own description and examples below) — there is no single universal product shape across the catalog.</p>\n","_postman_id":"7868f9cc-43e8-4c60-a76a-98d6b0667f5a","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}}},{"name":"Quotes","item":[{"name":"Create a quote","id":"83a364cd-ab5c-42e8-ac3e-7e1290bc611e","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"product_id\": \"uuid\",\n  \"quantity\": 500,\n  \"link\": \"https://instagram.com/some_public_profile\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/quotes","description":"<p>Quotes a real price for one product + quantity (+ link, for <code>smm</code>). <code>link</code> is <strong>required</strong> for <code>smm</code> — any public <code>http</code>/<code>https</code> URL; known tracking params (Instagram <code>stkn</code>/<code>igsh</code>, TikTok <code>_t</code>/<code>_r</code>, YouTube <code>si</code>, X <code>s</code>/<code>t</code>, Facebook <code>fbclid</code>/<code>mibextid</code>, etc.) are stripped server-side automatically. <code>comments</code> (an array of 1–1000 strings) <strong>replaces</strong> <code>quantity</code> for a Custom-Comments SMM product — the quote's quantity becomes <code>comments.length</code>; sending both or neither where one is required/forbidden gets you <code>invalid_comments</code>. Every other kind ignores <code>link</code>/<code>comments</code> and takes <code>quantity: 1</code>, except <code>smm</code>/<code>social_account</code>/<code>email_account</code>, which take a real quantity.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \\\"id\\\": \\\"quote-uuid\\\",\n  \\\"product_id\\\": \\\"uuid\\\",\n  \\\"quantity\\\": 500,\n  \\\"price_usd_cents\\\": 2495,\n  \\\"currency\\\": \\\"USD\\\",\n  \\\"expires_at\\\": \\\"2026-09-16T15:10:00.000Z\\\"\n}\n</code></pre>\n<p>This price is exactly what <code>POST /orders</code> will charge — pass this quote's <code>id</code> straight in as <code>quote_id</code>. See the Examples dropdown for the common error cases (expired product, out-of-range quantity, temporarily unavailable).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["quotes"],"host":["https://mouroam.com/api/v1"],"query":[],"variable":[]}},"response":[{"id":"4c1659f7-32fe-7861-2d2d-be2f4c88f004","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"product_id\": \"uuid\",\n  \"quantity\": 500,\n  \"link\": \"https://instagram.com/some_public_profile\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/quotes","description":"Quotes a real price for one product + quantity (+ link, for `smm`). `link` is **required** for `smm` — any public `http`/`https` URL; known tracking params (Instagram `stkn`/`igsh`, TikTok `_t`/`_r`, YouTube `si`, X `s`/`t`, Facebook `fbclid`/`mibextid`, etc.) are stripped server-side automatically. `comments` (an array of 1–1000 strings) **replaces** `quantity` for a Custom-Comments SMM product — the quote's quantity becomes `comments.length`; sending both or neither where one is required/forbidden gets you `invalid_comments`. Every other kind ignores `link`/`comments` and takes `quantity: 1`, except `smm`/`social_account`/`email_account`, which take a real quantity.\n\n```json\n{\n  \\\"id\\\": \\\"quote-uuid\\\",\n  \\\"product_id\\\": \\\"uuid\\\",\n  \\\"quantity\\\": 500,\n  \\\"price_usd_cents\\\": 2495,\n  \\\"currency\\\": \\\"USD\\\",\n  \\\"expires_at\\\": \\\"2026-09-16T15:10:00.000Z\\\"\n}\n```\n\nThis price is exactly what `POST /orders` will charge — pass this quote's `id` straight in as `quote_id`. See the Examples dropdown for the common error cases (expired product, out-of-range quantity, temporarily unavailable)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"9c4a2f1e-7b3d-4e5f-8a9b-0c1d2e3f4a5b\",\"product_id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"quantity\":500,\"price_usd_cents\":2495,\"currency\":\"USD\",\"expires_at\":\"2026-09-16T15:10:00.000Z\"}}"},{"id":"94cfa58e-3e62-db87-7255-7f8033940d4c","name":"Product not found — 404","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"product_id\": \"uuid\",\n  \"quantity\": 500,\n  \"link\": \"https://instagram.com/some_public_profile\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/quotes","description":"Quotes a real price for one product + quantity (+ link, for `smm`). `link` is **required** for `smm` — any public `http`/`https` URL; known tracking params (Instagram `stkn`/`igsh`, TikTok `_t`/`_r`, YouTube `si`, X `s`/`t`, Facebook `fbclid`/`mibextid`, etc.) are stripped server-side automatically. `comments` (an array of 1–1000 strings) **replaces** `quantity` for a Custom-Comments SMM product — the quote's quantity becomes `comments.length`; sending both or neither where one is required/forbidden gets you `invalid_comments`. Every other kind ignores `link`/`comments` and takes `quantity: 1`, except `smm`/`social_account`/`email_account`, which take a real quantity.\n\n```json\n{\n  \\\"id\\\": \\\"quote-uuid\\\",\n  \\\"product_id\\\": \\\"uuid\\\",\n  \\\"quantity\\\": 500,\n  \\\"price_usd_cents\\\": 2495,\n  \\\"currency\\\": \\\"USD\\\",\n  \\\"expires_at\\\": \\\"2026-09-16T15:10:00.000Z\\\"\n}\n```\n\nThis price is exactly what `POST /orders` will charge — pass this quote's `id` straight in as `quote_id`. See the Examples dropdown for the common error cases (expired product, out-of-range quantity, temporarily unavailable)."},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"Product not found. Refresh the catalog.\",\"code\":\"not_found\"}"},{"id":"650b5f37-47cf-b102-32a1-cc2ba8e52711","name":"Quantity out of range — 400","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"product_id\": \"uuid\",\n  \"quantity\": 500,\n  \"link\": \"https://instagram.com/some_public_profile\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/quotes","description":"Quotes a real price for one product + quantity (+ link, for `smm`). `link` is **required** for `smm` — any public `http`/`https` URL; known tracking params (Instagram `stkn`/`igsh`, TikTok `_t`/`_r`, YouTube `si`, X `s`/`t`, Facebook `fbclid`/`mibextid`, etc.) are stripped server-side automatically. `comments` (an array of 1–1000 strings) **replaces** `quantity` for a Custom-Comments SMM product — the quote's quantity becomes `comments.length`; sending both or neither where one is required/forbidden gets you `invalid_comments`. Every other kind ignores `link`/`comments` and takes `quantity: 1`, except `smm`/`social_account`/`email_account`, which take a real quantity.\n\n```json\n{\n  \\\"id\\\": \\\"quote-uuid\\\",\n  \\\"product_id\\\": \\\"uuid\\\",\n  \\\"quantity\\\": 500,\n  \\\"price_usd_cents\\\": 2495,\n  \\\"currency\\\": \\\"USD\\\",\n  \\\"expires_at\\\": \\\"2026-09-16T15:10:00.000Z\\\"\n}\n```\n\nThis price is exactly what `POST /orders` will charge — pass this quote's `id` straight in as `quote_id`. See the Examples dropdown for the common error cases (expired product, out-of-range quantity, temporarily unavailable)."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"Quantity is outside this product's current limits. Refresh the catalog.\",\"code\":\"invalid_quantity\"}"},{"id":"ed01b9a2-ccb4-df02-c855-11457557deab","name":"Product unavailable — 409","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"product_id\": \"uuid\",\n  \"quantity\": 500,\n  \"link\": \"https://instagram.com/some_public_profile\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/quotes","description":"Quotes a real price for one product + quantity (+ link, for `smm`). `link` is **required** for `smm` — any public `http`/`https` URL; known tracking params (Instagram `stkn`/`igsh`, TikTok `_t`/`_r`, YouTube `si`, X `s`/`t`, Facebook `fbclid`/`mibextid`, etc.) are stripped server-side automatically. `comments` (an array of 1–1000 strings) **replaces** `quantity` for a Custom-Comments SMM product — the quote's quantity becomes `comments.length`; sending both or neither where one is required/forbidden gets you `invalid_comments`. Every other kind ignores `link`/`comments` and takes `quantity: 1`, except `smm`/`social_account`/`email_account`, which take a real quantity.\n\n```json\n{\n  \\\"id\\\": \\\"quote-uuid\\\",\n  \\\"product_id\\\": \\\"uuid\\\",\n  \\\"quantity\\\": 500,\n  \\\"price_usd_cents\\\": 2495,\n  \\\"currency\\\": \\\"USD\\\",\n  \\\"expires_at\\\": \\\"2026-09-16T15:10:00.000Z\\\"\n}\n```\n\nThis price is exactly what `POST /orders` will charge — pass this quote's `id` straight in as `quote_id`. See the Examples dropdown for the common error cases (expired product, out-of-range quantity, temporarily unavailable)."},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"This product is currently unavailable.\",\"code\":\"product_unavailable\"}"}],"_postman_id":"83a364cd-ab5c-42e8-ac3e-7e1290bc611e"}],"id":"0acb740a-2e30-4c05-889e-7886a8603dd4","description":"<p>Lock in a real, server-computed price before placing an order. A quote is valid for 10 minutes and is scoped to exactly one product/quantity/link combination — a quote never gets cheaper or more expensive after it's issued, only expired.</p>\n","_postman_id":"0acb740a-2e30-4c05-889e-7886a8603dd4","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}}},{"name":"Orders","item":[{"name":"Place an order","id":"c2a024a1-622b-48bc-9d3a-e541e22cac36","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_order_id\": \"your-own-order-id\",\n  \"quote_id\": \"quote-uuid\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/orders","description":"<p>Turns a quote into a real, billable order. <code>external_order_id</code> (yours, 1–128 characters) is what makes a retry safe: resubmitting the exact same <code>external_order_id</code> always returns the same order, never places a second one. A <code>quote_id</code> whose request no longer matches what you originally submitted (i.e. reusing an <code>external_order_id</code> with a <em>different</em> quote) is rejected as <code>409 idempotency_conflict</code>.</p>\n<p>Returns <strong><code>202 Accepted</code></strong> with a near-empty snapshot while the order is still being placed against the upstream supplier (poll <code>GET /orders/{id}</code> or wait for a webhook from there), or <strong><code>200 OK</code></strong> with the full current snapshot if it settled immediately or you're replaying an <code>external_order_id</code> that already resolved. See the Examples dropdown for both success shapes plus the three error cases you'll hit most: a stale <code>quote_id</code> (<code>quote_expired</code>), an <code>external_order_id</code> reused with different parameters (<code>idempotency_conflict</code>), and a revoked/unknown key (<code>unauthorized</code>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["orders"],"host":["https://mouroam.com/api/v1"],"query":[],"variable":[]}},"response":[{"id":"5fdf2106-bfb0-ad4e-39a5-84290668f3f1","name":"Accepted — still processing (202)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_order_id\": \"your-own-order-id\",\n  \"quote_id\": \"quote-uuid\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/orders","description":"Turns a quote into a real, billable order. `external_order_id` (yours, 1–128 characters) is what makes a retry safe: resubmitting the exact same `external_order_id` always returns the same order, never places a second one. A `quote_id` whose request no longer matches what you originally submitted (i.e. reusing an `external_order_id` with a *different* quote) is rejected as `409 idempotency_conflict`.\n\nReturns **`202 Accepted`** with a near-empty snapshot while the order is still being placed against the upstream supplier (poll `GET /orders/{id}` or wait for a webhook from there), or **`200 OK`** with the full current snapshot if it settled immediately or you're replaying an `external_order_id` that already resolved. See the Examples dropdown for both success shapes plus the three error cases you'll hit most: a stale `quote_id` (`quote_expired`), an `external_order_id` reused with different parameters (`idempotency_conflict`), and a revoked/unknown key (`unauthorized`)."},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"9c4a2f1e-7b3d-4e5f-8a9b-0c1d2e3f4a5b\",\"external_order_id\":\"your-own-order-id\",\"kind\":\"smm\",\"product_id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"status\":\"queued\",\"version\":0,\"created_at\":\"2026-09-16T15:11:00.000Z\",\"updated_at\":\"2026-09-16T15:11:00.000Z\"}}"},{"id":"baee74ba-8071-62e2-9c13-4a0241d921af","name":"OK — already settled (200)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_order_id\": \"your-own-order-id\",\n  \"quote_id\": \"quote-uuid\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/orders","description":"Turns a quote into a real, billable order. `external_order_id` (yours, 1–128 characters) is what makes a retry safe: resubmitting the exact same `external_order_id` always returns the same order, never places a second one. A `quote_id` whose request no longer matches what you originally submitted (i.e. reusing an `external_order_id` with a *different* quote) is rejected as `409 idempotency_conflict`.\n\nReturns **`202 Accepted`** with a near-empty snapshot while the order is still being placed against the upstream supplier (poll `GET /orders/{id}` or wait for a webhook from there), or **`200 OK`** with the full current snapshot if it settled immediately or you're replaying an `external_order_id` that already resolved. See the Examples dropdown for both success shapes plus the three error cases you'll hit most: a stale `quote_id` (`quote_expired`), an `external_order_id` reused with different parameters (`idempotency_conflict`), and a revoked/unknown key (`unauthorized`)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"9c4a2f1e-7b3d-4e5f-8a9b-0c1d2e3f4a5b\",\"external_order_id\":\"your-own-order-id\",\"kind\":\"smm\",\"product_id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"status\":\"in_progress\",\"quantity\":500,\"price_usd_cents\":2495,\"refunded_usd_cents\":0,\"net_price_usd_cents\":2495,\"platform\":\"instagram\",\"service_type\":\"followers\",\"link\":\"https://instagram.com/some_public_profile\",\"start_count\":1820,\"remains\":210,\"refillable\":true,\"version\":2,\"created_at\":\"2026-09-16T15:11:00.000Z\",\"updated_at\":\"2026-09-16T15:12:30.000Z\"}}"},{"id":"cd1755b2-d571-7c5f-bc0c-34d5337bf1ad","name":"Idempotency conflict — 409","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_order_id\": \"your-own-order-id\",\n  \"quote_id\": \"quote-uuid\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/orders","description":"Turns a quote into a real, billable order. `external_order_id` (yours, 1–128 characters) is what makes a retry safe: resubmitting the exact same `external_order_id` always returns the same order, never places a second one. A `quote_id` whose request no longer matches what you originally submitted (i.e. reusing an `external_order_id` with a *different* quote) is rejected as `409 idempotency_conflict`.\n\nReturns **`202 Accepted`** with a near-empty snapshot while the order is still being placed against the upstream supplier (poll `GET /orders/{id}` or wait for a webhook from there), or **`200 OK`** with the full current snapshot if it settled immediately or you're replaying an `external_order_id` that already resolved. See the Examples dropdown for both success shapes plus the three error cases you'll hit most: a stale `quote_id` (`quote_expired`), an `external_order_id` reused with different parameters (`idempotency_conflict`), and a revoked/unknown key (`unauthorized`)."},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"external_order_id belongs to a different request.\",\"code\":\"idempotency_conflict\"}"},{"id":"9e4f278e-6c9d-efe3-4c84-e0edb708460b","name":"Quote expired — 409","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_order_id\": \"your-own-order-id\",\n  \"quote_id\": \"quote-uuid\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/orders","description":"Turns a quote into a real, billable order. `external_order_id` (yours, 1–128 characters) is what makes a retry safe: resubmitting the exact same `external_order_id` always returns the same order, never places a second one. A `quote_id` whose request no longer matches what you originally submitted (i.e. reusing an `external_order_id` with a *different* quote) is rejected as `409 idempotency_conflict`.\n\nReturns **`202 Accepted`** with a near-empty snapshot while the order is still being placed against the upstream supplier (poll `GET /orders/{id}` or wait for a webhook from there), or **`200 OK`** with the full current snapshot if it settled immediately or you're replaying an `external_order_id` that already resolved. See the Examples dropdown for both success shapes plus the three error cases you'll hit most: a stale `quote_id` (`quote_expired`), an `external_order_id` reused with different parameters (`idempotency_conflict`), and a revoked/unknown key (`unauthorized`)."},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"Get a fresh quote before placing this order.\",\"code\":\"quote_expired\"}"},{"id":"4f6dbb10-c751-a13f-b7a8-5cc2669ec9eb","name":"Unauthorized — revoked key (401)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_order_id\": \"your-own-order-id\",\n  \"quote_id\": \"quote-uuid\"\n}","options":{"raw":{"language":"json"}}},"url":"https://mouroam.com/api/v1/orders","description":"Turns a quote into a real, billable order. `external_order_id` (yours, 1–128 characters) is what makes a retry safe: resubmitting the exact same `external_order_id` always returns the same order, never places a second one. A `quote_id` whose request no longer matches what you originally submitted (i.e. reusing an `external_order_id` with a *different* quote) is rejected as `409 idempotency_conflict`.\n\nReturns **`202 Accepted`** with a near-empty snapshot while the order is still being placed against the upstream supplier (poll `GET /orders/{id}` or wait for a webhook from there), or **`200 OK`** with the full current snapshot if it settled immediately or you're replaying an `external_order_id` that already resolved. See the Examples dropdown for both success shapes plus the three error cases you'll hit most: a stale `quote_id` (`quote_expired`), an `external_order_id` reused with different parameters (`idempotency_conflict`), and a revoked/unknown key (`unauthorized`)."},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"Invalid or missing API key.\",\"code\":\"unauthorized\"}"}],"_postman_id":"c2a024a1-622b-48bc-9d3a-e541e22cac36"},{"name":"List orders","id":"6fd6d02b-4f5c-4644-973f-f2d89defffd3","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/orders?before=","description":"<p>Lists your orders newest-first, 50 per page. <code>before</code> is a cursor: pass the <code>id</code> (mouroam's internal order UUID, <strong>not</strong> your <code>external_order_id</code>) of the last order from the previous page to get the next 50.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \\\"orders\\\": [ { \\\"id\\\": \\\"...\\\", \\\"external_order_id\\\": \\\"...\\\", \\\"kind\\\": \\\"smm\\\", \\\"status\\\": \\\"in_progress\\\", ... } ],\n  \\\"next_cursor\\\": \\\"6fd6d02b-0000-0000-0000-000000000001\\\"\n}\n</code></pre>\n<p><code>next_cursor</code> is <code>null</code> on the last page.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["orders"],"host":["https://mouroam.com/api/v1"],"query":[{"key":"before","value":""}],"variable":[]}},"response":[{"id":"e206312f-c47b-cf5d-b626-a33944c61f74","name":"Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders?before=","host":["https://mouroam.com/api/v1"],"path":["orders"],"query":[{"key":"before","value":""}]},"description":"Lists your orders newest-first, 50 per page. `before` is a cursor: pass the `id` (mouroam's internal order UUID, **not** your `external_order_id`) of the last order from the previous page to get the next 50.\n\n```json\n{\n  \\\"orders\\\": [ { \\\"id\\\": \\\"...\\\", \\\"external_order_id\\\": \\\"...\\\", \\\"kind\\\": \\\"smm\\\", \\\"status\\\": \\\"in_progress\\\", ... } ],\n  \\\"next_cursor\\\": \\\"6fd6d02b-0000-0000-0000-000000000001\\\"\n}\n```\n\n`next_cursor` is `null` on the last page."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"orders\":[{\"id\":\"9c4a2f1e-7b3d-4e5f-8a9b-0c1d2e3f4a5b\",\"external_order_id\":\"your-own-order-id\",\"kind\":\"smm\",\"product_id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"status\":\"in_progress\",\"quantity\":500,\"price_usd_cents\":2495,\"refunded_usd_cents\":0,\"net_price_usd_cents\":2495,\"version\":2,\"created_at\":\"2026-09-16T15:11:00.000Z\",\"updated_at\":\"2026-09-16T15:12:30.000Z\"},{\"id\":\"7e2a9b1c-3d4e-4f5a-6b7c-8d9e0f1a2b3c\",\"external_order_id\":\"order-42\",\"kind\":\"vpn\",\"product_id\":\"e5f6a7b8-9c0d-4e1f-2a3b-4c5d6e7f8a9b\",\"status\":\"active\",\"quantity\":1,\"price_usd_cents\":899,\"refunded_usd_cents\":0,\"net_price_usd_cents\":899,\"expires_at\":\"2026-10-16T00:00:00.000Z\",\"version\":1,\"created_at\":\"2026-09-15T09:00:00.000Z\",\"updated_at\":\"2026-09-15T09:01:00.000Z\"}],\"next_cursor\":\"7e2a9b1c-3d4e-4f5a-6b7c-8d9e0f1a2b3c\"}}"}],"_postman_id":"6fd6d02b-4f5c-4644-973f-f2d89defffd3"},{"name":"Get an order","id":"51031ca5-72d0-44e2-8e7b-5942697bd5f2","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/orders/:id","description":"<p>Fetches one order by mouroam's own <code>id</code> (a UUID). To look it up by <strong>your</strong> <code>external_order_id</code> instead, see the next request in this folder (same route, <code>?by=external_order_id</code>).</p>\n<p>Never includes a provider order id, provider cost, or delivered secret — those live only in <code>GET /orders/{id}/delivery</code>, and only once ready. <code>refunded_usd_cents</code>/<code>net_price_usd_cents</code> are always present; trust them over <code>status</code> alone. See the Examples dropdown for six real shapes: an SMM order mid-delivery, a completed VPN order, an active/fulfilled eSIM (voice + SMS + data fields), a delivered mobile proxy (<code>expires_at</code>/<code>duration_days</code>), an order stuck in <code>review_required</code>, and one that <code>failed</code> with <code>error_code: \"insufficient_balance\"</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["orders",":id"],"host":["https://mouroam.com/api/v1"],"query":[],"variable":[{"type":"any","key":"id"}]}},"response":[{"id":"9269fdd0-8d0b-fc22-dc84-35649cf5b213","name":"SMM — in_progress","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id","host":["https://mouroam.com/api/v1"],"path":["orders",":id"],"variable":[{"key":"id"}]},"description":"Fetches one order by mouroam's own `id` (a UUID). To look it up by **your** `external_order_id` instead, see the next request in this folder (same route, `?by=external_order_id`).\n\nNever includes a provider order id, provider cost, or delivered secret — those live only in `GET /orders/{id}/delivery`, and only once ready. `refunded_usd_cents`/`net_price_usd_cents` are always present; trust them over `status` alone. See the Examples dropdown for four real shapes: an SMM order mid-delivery, a completed VPN order, an order stuck in `review_required`, and one that `failed` with `error_code: \\\"insufficient_balance\\\"`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"9c4a2f1e-7b3d-4e5f-8a9b-0c1d2e3f4a5b\",\"external_order_id\":\"your-own-order-id\",\"kind\":\"smm\",\"product_id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"status\":\"in_progress\",\"quantity\":500,\"price_usd_cents\":2495,\"refunded_usd_cents\":0,\"net_price_usd_cents\":2495,\"platform\":\"instagram\",\"service_type\":\"followers\",\"link\":\"https://instagram.com/some_public_profile\",\"start_count\":1820,\"remains\":210,\"refillable\":true,\"version\":2,\"created_at\":\"2026-09-16T15:11:00.000Z\",\"updated_at\":\"2026-09-16T15:12:30.000Z\"}}"},{"id":"81309029-8a1f-41a5-3046-79878ecbaa29","name":"VPN — active","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id","host":["https://mouroam.com/api/v1"],"path":["orders",":id"],"variable":[{"key":"id"}]},"description":"Fetches one order by mouroam's own `id` (a UUID). To look it up by **your** `external_order_id` instead, see the next request in this folder (same route, `?by=external_order_id`).\n\nNever includes a provider order id, provider cost, or delivered secret — those live only in `GET /orders/{id}/delivery`, and only once ready. `refunded_usd_cents`/`net_price_usd_cents` are always present; trust them over `status` alone. See the Examples dropdown for four real shapes: an SMM order mid-delivery, a completed VPN order, an order stuck in `review_required`, and one that `failed` with `error_code: \\\"insufficient_balance\\\"`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"7e2a9b1c-3d4e-4f5a-6b7c-8d9e0f1a2b3c\",\"external_order_id\":\"order-42\",\"kind\":\"vpn\",\"product_id\":\"e5f6a7b8-9c0d-4e1f-2a3b-4c5d6e7f8a9b\",\"status\":\"active\",\"quantity\":1,\"price_usd_cents\":899,\"refunded_usd_cents\":0,\"net_price_usd_cents\":899,\"expires_at\":\"2026-10-16T00:00:00.000Z\",\"version\":1,\"created_at\":\"2026-09-15T09:00:00.000Z\",\"updated_at\":\"2026-09-15T09:01:00.000Z\"}}"},{"id":"53d59049-4b3f-c699-95f0-480a8e988fff","name":"review_required","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id","host":["https://mouroam.com/api/v1"],"path":["orders",":id"],"variable":[{"key":"id"}]},"description":"Fetches one order by mouroam's own `id` (a UUID). To look it up by **your** `external_order_id` instead, see the next request in this folder (same route, `?by=external_order_id`).\n\nNever includes a provider order id, provider cost, or delivered secret — those live only in `GET /orders/{id}/delivery`, and only once ready. `refunded_usd_cents`/`net_price_usd_cents` are always present; trust them over `status` alone. See the Examples dropdown for four real shapes: an SMM order mid-delivery, a completed VPN order, an order stuck in `review_required`, and one that `failed` with `error_code: \\\"insufficient_balance\\\"`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\",\"external_order_id\":\"order-88\",\"kind\":\"esim\",\"product_id\":\"f6a7b8c9-0d1e-4f2a-3b4c-5d6e7f8a9b0c\",\"status\":\"review_required\",\"error_code\":\"confirmation_pending\",\"currency\":\"USD\",\"version\":1,\"created_at\":\"2026-09-16T14:00:00.000Z\",\"updated_at\":\"2026-09-16T14:10:00.000Z\"}}"},{"id":"60fa2ee4-fedd-f7bf-278c-3e9867823207","name":"failed — insufficient_balance","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id","host":["https://mouroam.com/api/v1"],"path":["orders",":id"],"variable":[{"key":"id"}]},"description":"Fetches one order by mouroam's own `id` (a UUID). To look it up by **your** `external_order_id` instead, see the next request in this folder (same route, `?by=external_order_id`).\n\nNever includes a provider order id, provider cost, or delivered secret — those live only in `GET /orders/{id}/delivery`, and only once ready. `refunded_usd_cents`/`net_price_usd_cents` are always present; trust them over `status` alone. See the Examples dropdown for four real shapes: an SMM order mid-delivery, a completed VPN order, an order stuck in `review_required`, and one that `failed` with `error_code: \\\"insufficient_balance\\\"`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f\",\"external_order_id\":\"order-91\",\"kind\":\"smm\",\"product_id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"status\":\"failed\",\"error_code\":\"insufficient_balance\",\"currency\":\"USD\",\"price_usd_cents\":0,\"refunded_usd_cents\":0,\"net_price_usd_cents\":0,\"version\":1,\"created_at\":\"2026-09-16T14:20:00.000Z\",\"updated_at\":\"2026-09-16T14:20:02.000Z\"}}"},{"id":"ccda9180-098a-fff3-8bfb-e6c9a5505483","name":"esim — active (fulfilled)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id","host":["https://mouroam.com/api/v1"],"path":["orders",":id"],"variable":[{"key":"id"}]},"description":"Fetches one order by mouroam's own `id` (a UUID). To look it up by **your** `external_order_id` instead, see the next request in this folder (same route, `?by=external_order_id`).\n\nNever includes a provider order id, provider cost, or delivered secret — those live only in `GET /orders/{id}/delivery`, and only once ready. `refunded_usd_cents`/`net_price_usd_cents` are always present; trust them over `status` alone. See the Examples dropdown for five real shapes: an SMM order mid-delivery, a completed VPN order, an active/fulfilled eSIM (voice + SMS + data fields), an order stuck in `review_required`, and one that `failed` with `error_code: \"insufficient_balance\"`."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"d4e5f6a7-8b9c-4d0e-9f1a-2b3c4d5e6f7a\",\"external_order_id\":\"your-own-order-id\",\"kind\":\"esim\",\"product_id\":\"uuid\",\"status\":\"active\",\"quantity\":1,\"price_usd_cents\":3195,\"refunded_usd_cents\":0,\"net_price_usd_cents\":3195,\"version\":2,\"created_at\":\"2026-09-17T08:00:00.000Z\",\"updated_at\":\"2026-09-17T08:02:11.000Z\",\"expires_at\":\"2026-10-17T08:02:11.000Z\",\"esim_id\":\"d4e5f6a7-8b9c-4d0e-9f1a-2b3c4d5e6f7a\",\"data_used_bytes\":0,\"total_volume_bytes\":1073741824,\"voice_minutes\":100,\"sms_count\":50}}"},{"id":"b416fa7f-9636-a3a0-f52f-d3290db32a8d","name":"mobile_proxy — delivered","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id","host":["https://mouroam.com/api/v1"],"path":["orders",":id"],"variable":[{"key":"id"}]},"description":"Fetches one order by mouroam's own `id` (a UUID). To look it up by **your** `external_order_id` instead, see the next request in this folder (same route, `?by=external_order_id`).\n\nNever includes a provider order id, provider cost, or delivered secret — those live only in `GET /orders/{id}/delivery`, and only once ready. `refunded_usd_cents`/`net_price_usd_cents` are always present; trust them over `status` alone. See the Examples dropdown for five real shapes: an SMM order mid-delivery, a completed VPN order, an active/fulfilled eSIM (voice + SMS + data fields), an order stuck in `review_required`, and one that `failed` with `error_code: \"insufficient_balance\"`."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"f6a7b8c9-0d1e-4f2a-9b3c-4d5e6f7a8b9c\",\"external_order_id\":\"your-own-order-id\",\"kind\":\"mobile_proxy\",\"product_id\":\"e5f6a7b8-9c0d-4e1f-8a2b-3c4d5e6f7a8b\",\"status\":\"delivered\",\"quantity\":1,\"price_usd_cents\":7000,\"refunded_usd_cents\":0,\"net_price_usd_cents\":7000,\"version\":2,\"created_at\":\"2026-09-17T09:00:00.000Z\",\"updated_at\":\"2026-09-17T09:00:05.000Z\",\"expires_at\":\"2026-09-24T09:00:05.000Z\",\"duration_days\":7}}"}],"_postman_id":"51031ca5-72d0-44e2-8e7b-5942697bd5f2"},{"name":"Get an order by your external_order_id","id":"de795973-1644-46f7-9cd3-a2d6c39e68a4","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/orders/:id?by=external_order_id","description":"<p>Identical response shape to \"Get an order\" — the only difference is the <code>:id</code> path segment is <strong>your own</strong> <code>external_order_id</code> instead of mouroam's UUID, selected by <code>?by=external_order_id</code>. Useful when your own system only tracks its own order id and you don't want to also persist mouroam's.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["orders",":id"],"host":["https://mouroam.com/api/v1"],"query":[{"key":"by","value":"external_order_id"}],"variable":[{"type":"any","key":"id"}]}},"response":[{"id":"334f0c33-2d13-5fc8-2d51-49a128019575","name":"Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id?by=external_order_id","host":["https://mouroam.com/api/v1"],"path":["orders",":id"],"query":[{"key":"by","value":"external_order_id"}],"variable":[{"key":"id"}]},"description":"Identical response shape to \\\"Get an order\\\" — the only difference is the `:id` path segment is **your own** `external_order_id` instead of mouroam's UUID, selected by `?by=external_order_id`. Useful when your own system only tracks its own order id and you don't want to also persist mouroam's."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"9c4a2f1e-7b3d-4e5f-8a9b-0c1d2e3f4a5b\",\"external_order_id\":\"your-own-order-id\",\"kind\":\"smm\",\"product_id\":\"b3f1e6d2-4a2b-4c3d-9e8f-1a2b3c4d5e6f\",\"status\":\"in_progress\",\"quantity\":500,\"price_usd_cents\":2495,\"refunded_usd_cents\":0,\"net_price_usd_cents\":2495,\"platform\":\"instagram\",\"service_type\":\"followers\",\"link\":\"https://instagram.com/some_public_profile\",\"start_count\":1820,\"remains\":210,\"refillable\":true,\"version\":2,\"created_at\":\"2026-09-16T15:11:00.000Z\",\"updated_at\":\"2026-09-16T15:12:30.000Z\"}}"}],"_postman_id":"de795973-1644-46f7-9cd3-a2d6c39e68a4"},{"name":"Get order delivery","id":"5adca99b-ad14-4ae5-a5e3-63223e01a222","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","description":"<p>Returns <code>409 delivery_pending</code> until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. <code>?include_raw=true</code> additionally includes <code>raw_record</code> (the exact, complete credential string exactly as delivered by the supplier) for <code>social_account</code>/<code>email_account</code> — a <code>cookie</code>-kind field is never included in <code>fields</code> either way, regardless of <code>include_raw</code>.</p>\n<p>Response shape differs by <code>kind</code> — see the Examples dropdown for real shapes for <code>vpn</code>, <code>esim</code>, <code>mobile_proxy</code> (a single opaque <code>credential</code> string, deliberately not parsed into fields), <code>social_account</code>, and <code>email_account</code>, plus the two error cases: not ready yet (<code>delivery_pending</code>), and calling this on a kind with nothing to deliver, like <code>smm</code> (<code>no_credentials</code> — use order status instead, the useful fields like <code>link</code>/<code>start_count</code>/<code>remains</code> are already there).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["orders",":id","delivery"],"host":["https://mouroam.com/api/v1"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"type":"any","key":"id"}]}},"response":[{"id":"caf3f17a-b5ab-cb87-51a9-3b793a2afa2f","name":"vpn","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","host":["https://mouroam.com/api/v1"],"path":["orders",":id","delivery"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"key":"id"}]},"description":"Returns `409 delivery_pending` until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. `?include_raw=true` additionally includes `raw_record` (the exact, complete credential string exactly as delivered by the supplier) for `social_account`/`email_account` — a `cookie`-kind field is never included in `fields` either way, regardless of `include_raw`.\n\nResponse shape differs by `kind` — see the Examples dropdown for real shapes for `vpn`, `esim`, `social_account`, and `email_account`, plus the two error cases: not ready yet (`delivery_pending`), and calling this on a kind with nothing to deliver, like `smm` (`no_credentials` — use order status instead, the useful fields like `link`/`start_count`/`remains` are already there)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"kind\":\"vpn\",\"username\":\"user_ab12cd\",\"password\":\"Xk9$mP2vQ\",\"expires_at\":\"2026-10-16T00:00:00.000Z\",\"app\":\"VPNClient\"}}"},{"id":"db0ba183-cffa-8d97-d20a-be7c97c21b3e","name":"esim","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","host":["https://mouroam.com/api/v1"],"path":["orders",":id","delivery"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"key":"id"}]},"description":"Returns `409 delivery_pending` until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. `?include_raw=true` additionally includes `raw_record` (the exact, complete credential string exactly as delivered by the supplier) for `social_account`/`email_account` — a `cookie`-kind field is never included in `fields` either way, regardless of `include_raw`.\n\nResponse shape differs by `kind` — see the Examples dropdown for real shapes for `vpn`, `esim`, `social_account`, and `email_account`, plus the two error cases: not ready yet (`delivery_pending`), and calling this on a kind with nothing to deliver, like `smm` (`no_credentials` — use order status instead, the useful fields like `link`/`start_count`/`remains` are already there)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"kind\":\"esim\",\"esim_id\":\"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\",\"activation_code\":\"LPA:1$rsp.pikasim.com$ABCD-1234-EFGH\",\"lpa_string\":\"LPA:1$rsp.pikasim.com$ABCD-1234-EFGH\",\"iccid\":\"8944500012345678901\",\"phone_number\":\"+15551234567\",\"expires_at\":\"2026-10-16T00:00:00.000Z\"}}"},{"id":"bef5e269-5e94-5644-50f7-39c7548cab79","name":"social_account","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","host":["https://mouroam.com/api/v1"],"path":["orders",":id","delivery"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"key":"id"}]},"description":"Returns `409 delivery_pending` until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. `?include_raw=true` additionally includes `raw_record` (the exact, complete credential string exactly as delivered by the supplier) for `social_account`/`email_account` — a `cookie`-kind field is never included in `fields` either way, regardless of `include_raw`.\n\nResponse shape differs by `kind` — see the Examples dropdown for real shapes for `vpn`, `esim`, `social_account`, and `email_account`, plus the two error cases: not ready yet (`delivery_pending`), and calling this on a kind with nothing to deliver, like `smm` (`no_credentials` — use order status instead, the useful fields like `link`/`start_count`/`remains` are already there)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"kind\":\"social_account\",\"accounts\":[{\"fields\":[{\"label\":\"Login\",\"value\":\"user_example92\",\"kind\":\"text\"},{\"label\":\"Password\",\"value\":\"P@ssw0rd123\",\"kind\":\"secret\"},{\"label\":\"Email\",\"value\":\"user_example92@outlook.com\",\"kind\":\"text\"},{\"label\":\"Email password\",\"value\":\"Em@il2024\",\"kind\":\"secret\"}]}]}}"},{"id":"4b0e23bd-069f-328f-9363-ef3a2da2e274","name":"email_account","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","host":["https://mouroam.com/api/v1"],"path":["orders",":id","delivery"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"key":"id"}]},"description":"Returns `409 delivery_pending` until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. `?include_raw=true` additionally includes `raw_record` (the exact, complete credential string exactly as delivered by the supplier) for `social_account`/`email_account` — a `cookie`-kind field is never included in `fields` either way, regardless of `include_raw`.\n\nResponse shape differs by `kind` — see the Examples dropdown for real shapes for `vpn`, `esim`, `social_account`, and `email_account`, plus the two error cases: not ready yet (`delivery_pending`), and calling this on a kind with nothing to deliver, like `smm` (`no_credentials` — use order status instead, the useful fields like `link`/`start_count`/`remains` are already there)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"kind\":\"email_account\",\"accounts\":[{\"fields\":[{\"label\":\"Email\",\"value\":\"reseller.buyer842@gmail.com\",\"kind\":\"text\"},{\"label\":\"Password\",\"value\":\"G!mail2024x\",\"kind\":\"secret\"},{\"label\":\"Recovery email\",\"value\":\"backup.842@outlook.com\",\"kind\":\"text\"}]}]}}"},{"id":"b2d26a15-c54e-ea95-1795-253095834c3c","name":"Not ready yet — delivery_pending (409)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","host":["https://mouroam.com/api/v1"],"path":["orders",":id","delivery"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"key":"id"}]},"description":"Returns `409 delivery_pending` until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. `?include_raw=true` additionally includes `raw_record` (the exact, complete credential string exactly as delivered by the supplier) for `social_account`/`email_account` — a `cookie`-kind field is never included in `fields` either way, regardless of `include_raw`.\n\nResponse shape differs by `kind` — see the Examples dropdown for real shapes for `vpn`, `esim`, `social_account`, and `email_account`, plus the two error cases: not ready yet (`delivery_pending`), and calling this on a kind with nothing to deliver, like `smm` (`no_credentials` — use order status instead, the useful fields like `link`/`start_count`/`remains` are already there)."},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"Delivery is not ready. Check order status.\",\"code\":\"delivery_pending\"}"},{"id":"93ae1eee-1b38-437e-3158-8160fb60b377","name":"Nothing to deliver — smm (no_credentials, 400)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","host":["https://mouroam.com/api/v1"],"path":["orders",":id","delivery"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"key":"id"}]},"description":"Returns `409 delivery_pending` until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. `?include_raw=true` additionally includes `raw_record` (the exact, complete credential string exactly as delivered by the supplier) for `social_account`/`email_account` — a `cookie`-kind field is never included in `fields` either way, regardless of `include_raw`.\n\nResponse shape differs by `kind` — see the Examples dropdown for real shapes for `vpn`, `esim`, `social_account`, and `email_account`, plus the two error cases: not ready yet (`delivery_pending`), and calling this on a kind with nothing to deliver, like `smm` (`no_credentials` — use order status instead, the useful fields like `link`/`start_count`/`remains` are already there)."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"This product has no downloadable credentials. Use order status.\",\"code\":\"no_credentials\"}"},{"id":"4af11189-a5b8-884d-e95a-343664ac4208","name":"mobile_proxy","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/delivery?include_raw=false","host":["https://mouroam.com/api/v1"],"path":["orders",":id","delivery"],"query":[{"key":"include_raw","value":"false"}],"variable":[{"key":"id"}]},"description":"Returns `409 delivery_pending` until the order is actually ready — always check order status first, or wait for a webhook, rather than polling this in a tight loop. `?include_raw=true` additionally includes `raw_record` (the exact, complete credential string exactly as delivered by the supplier) for `social_account`/`email_account` — a `cookie`-kind field is never included in `fields` either way, regardless of `include_raw`.\n\nResponse shape differs by `kind` — see the Examples dropdown for real shapes for `vpn`, `esim`, `social_account`, and `email_account`, plus the two error cases: not ready yet (`delivery_pending`), and calling this on a kind with nothing to deliver, like `smm` (`no_credentials` — use order status instead, the useful fields like `link`/`start_count`/`remains` are already there)."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"kind\":\"mobile_proxy\",\"credential\":\"socks5://198.51.100.20:7777:user_ab12cd:pass_ef34gh\\nhttp://198.51.100.20:8888:user_ab12cd:pass_ef34gh\\nrotation: https://api.example-supplier.com/rotate/ab12cd34\",\"expires_at\":\"2026-09-24T09:00:05.000Z\"}}"}],"_postman_id":"5adca99b-ad14-4ae5-a5e3-63223e01a222"}],"id":"2473e780-6851-4560-a54d-d7da26eafb10","description":"<p>Place and track orders. Placing an order (<code>POST /orders</code>) costs budget from the tighter 30/5min bucket; everything else here is a read (120/5min). <code>GET /orders/{id}</code> reflects the last known status reconciled from mouroam's own systems — it does not force a fresh check against every upstream supplier on every call, so a webhook or a few seconds' wait is normal between a real-world status change and seeing it here.</p>\n","_postman_id":"2473e780-6851-4560-a54d-d7da26eafb10","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}}},{"name":"Balance","item":[{"name":"Get balance","id":"92347609-e6c4-9cc2-08fe-c708ed2b7d25","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/balance","description":"<p>Returns the current wallet balance of the mouroam account behind your key — the exact same balance that gets debited when an order is placed. Poll this before placing a large order, or after seeing an order land <code>failed</code> with <code>error_code: \\\"insufficient_balance\\\"</code>, to confirm a top-up has landed.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \\\"balance_usd_cents\\\": 184523, \\\"currency\\\": \\\"USD\\\" }\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["balance"],"host":["https://mouroam.com/api/v1"],"query":[],"variable":[]}},"response":[{"id":"3d0f76ab-4e50-1f2f-8b6f-b58dc0878bf4","name":"Success","originalRequest":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/balance","description":"Returns the current wallet balance of the mouroam account behind your key — the exact same balance that gets debited when an order is placed. Poll this before placing a large order, or after seeing an order land `failed` with `error_code: \\\"insufficient_balance\\\"`, to confirm a top-up has landed.\n\n```json\n{ \\\"balance_usd_cents\\\": 184523, \\\"currency\\\": \\\"USD\\\" }\n```"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"balance_usd_cents\":184523,\"currency\":\"USD\"}}"}],"_postman_id":"92347609-e6c4-9cc2-08fe-c708ed2b7d25"}],"id":"d2b2c641-a675-9db6-cb4f-eb2f5aba3db2","_postman_id":"d2b2c641-a675-9db6-cb4f-eb2f5aba3db2","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}}},{"name":"Refills","item":[{"name":"Get the latest refill request","id":"ba7fc41d-34d6-1c00-aa2c-3817db684f84","request":{"method":"GET","header":[],"url":"https://mouroam.com/api/v1/orders/:id/refill","description":"<p>Returns the most recent refill request ever made for this order, or <code>null</code> if none has been requested yet.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"id\": \"refill-uuid\", \"status\": \"pending\", \"mode\": \"api\", \"created_at\": \"...\", \"updated_at\": \"...\" }\n</code></pre>\n<p>Only meaningful for a fulfilled <code>smm</code> order — any other kind, or an <code>smm</code> order that never actually placed with a supplier, returns <code>409 refill_unavailable</code>. <code>status</code> moves <code>submitting</code> → <code>pending</code>/<code>manual_review</code> → <code>completed</code>/<code>rejected</code>. See \"Request a refill\" (POST, same URL) in this folder to actually submit one.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["orders",":id","refill"],"host":["https://mouroam.com/api/v1"],"query":[],"variable":[{"type":"any","key":"id"}]}},"response":[{"id":"bb00a9f0-5a80-d054-9a9e-283e8080bdf1","name":"a request exists — pending","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/refill","host":["https://mouroam.com/api/v1"],"path":["orders",":id","refill"],"variable":[{"key":"id"}]},"description":"Returns the most recent refill request ever made for this order, or `null` if none has been requested yet.\n\n```json\n{ \"id\": \"refill-uuid\", \"status\": \"pending\", \"mode\": \"api\", \"created_at\": \"...\", \"updated_at\": \"...\" }\n```\n\nOnly meaningful for a fulfilled `smm` order — any other kind, or an `smm` order that never actually placed with a supplier, returns `409 refill_unavailable`. `status` moves `submitting` → `pending`/`manual_review` → `completed`/`rejected`. See \"Request a refill\" (POST, same URL) in this folder to actually submit one."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"7c1e2a3b-4d5f-4e6a-8b9c-0d1e2f3a4b5c\",\"status\":\"pending\",\"mode\":\"api\",\"created_at\":\"2026-09-17T09:10:00.000Z\",\"updated_at\":\"2026-09-17T09:10:04.000Z\"}}"},{"id":"c2b60d3b-db69-29a0-8959-afe8c8ac50e0","name":"no refill ever requested","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/refill","host":["https://mouroam.com/api/v1"],"path":["orders",":id","refill"],"variable":[{"key":"id"}]},"description":"Returns the most recent refill request ever made for this order, or `null` if none has been requested yet.\n\n```json\n{ \"id\": \"refill-uuid\", \"status\": \"pending\", \"mode\": \"api\", \"created_at\": \"...\", \"updated_at\": \"...\" }\n```\n\nOnly meaningful for a fulfilled `smm` order — any other kind, or an `smm` order that never actually placed with a supplier, returns `409 refill_unavailable`. `status` moves `submitting` → `pending`/`manual_review` → `completed`/`rejected`. See \"Request a refill\" (POST, same URL) in this folder to actually submit one."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":null}"}],"_postman_id":"ba7fc41d-34d6-1c00-aa2c-3817db684f84"},{"name":"Request a refill","id":"c9526272-c712-01ab-1ee0-02c57003eafa","request":{"method":"POST","header":[],"url":"https://mouroam.com/api/v1/orders/:id/refill","description":"<p>Claims and submits a new refill request for this order. No request body. At most one active request per order at a time, and at most one every 24 hours per order — either limit hit returns <code>409 refill_unavailable</code>.</p>\n<p><code>mode: \"api\"</code> means the supplier's own refill endpoint was called directly and <code>status</code> reflects its real, polled outcome (<code>pending</code> → <code>completed</code>/<code>rejected</code>). <code>mode: \"manual\"</code> means this order's supplier only offers a manual refill guarantee (see the catalog's <code>refill_mode</code> field, or <code>refill_mode</code> on <code>GET /orders/{id}</code> once you've placed the order) — the request goes to <code>manual_review</code> for a human on our side to verify and honor against the real supplier record, not auto-resolved.</p>\n<p>Only works on a fulfilled <code>smm</code> order, outside neither its <code>refill_window_days</code> nor the 24-hour resubmission cooldown — anything else is <code>409 refill_unavailable</code>. See the two saved examples for a successful <code>api</code>-mode submission and the <code>manual_review</code> case.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}},"urlObject":{"path":["orders",":id","refill"],"host":["https://mouroam.com/api/v1"],"query":[],"variable":[{"type":"any","key":"id"}]}},"response":[{"id":"06ba5b0e-9c6f-b81f-4997-17de38108b57","name":"submitted — api mode","originalRequest":{"method":"POST","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/refill","host":["https://mouroam.com/api/v1"],"path":["orders",":id","refill"],"variable":[{"key":"id"}]},"description":"Claims and submits a new refill request for this order. No request body. At most one active request per order at a time, and at most one every 24 hours per order — either limit hit returns `409 refill_unavailable`.\n\n`mode: \"api\"` means the supplier's own refill endpoint was called directly and `status` reflects its real, polled outcome (`pending` → `completed`/`rejected`). `mode: \"manual\"` means this order's supplier only offers a manual refill guarantee (see the catalog's `refill_mode` field, or `refill_mode` on `GET /orders/{id}` once you've placed the order) — the request goes to `manual_review` for a human on our side to verify and honor against the real supplier record, not auto-resolved.\n\nOnly works on a fulfilled `smm` order, outside neither its `refill_window_days` nor the 24-hour resubmission cooldown — anything else is `409 refill_unavailable`. See the two saved examples for a successful `api`-mode submission and the `manual_review` case."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"7c1e2a3b-4d5f-4e6a-8b9c-0d1e2f3a4b5c\",\"status\":\"pending\",\"mode\":\"api\",\"created_at\":\"2026-09-17T09:10:00.000Z\",\"updated_at\":\"2026-09-17T09:10:04.000Z\"}}"},{"id":"65197a66-c889-f9c5-0699-6399525f0973","name":"submitted — manual review","originalRequest":{"method":"POST","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/refill","host":["https://mouroam.com/api/v1"],"path":["orders",":id","refill"],"variable":[{"key":"id"}]},"description":"Claims and submits a new refill request for this order. No request body. At most one active request per order at a time, and at most one every 24 hours per order — either limit hit returns `409 refill_unavailable`.\n\n`mode: \"api\"` means the supplier's own refill endpoint was called directly and `status` reflects its real, polled outcome (`pending` → `completed`/`rejected`). `mode: \"manual\"` means this order's supplier only offers a manual refill guarantee (see the catalog's `refill_mode` field, or `refill_mode` on `GET /orders/{id}` once you've placed the order) — the request goes to `manual_review` for a human on our side to verify and honor against the real supplier record, not auto-resolved.\n\nOnly works on a fulfilled `smm` order, outside neither its `refill_window_days` nor the 24-hour resubmission cooldown — anything else is `409 refill_unavailable`. See the two saved examples for a successful `api`-mode submission and the `manual_review` case."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"data\":{\"id\":\"9e2f3a4b-5c6d-4f7a-9b0c-1d2e3f4a5b6c\",\"status\":\"manual_review\",\"mode\":\"manual\",\"created_at\":\"2026-09-17T09:15:00.000Z\",\"updated_at\":\"2026-09-17T09:15:00.000Z\"}}"},{"id":"e7d8edc9-f3f2-b191-7ab8-4710b13cdcd0","name":"409 — refill unavailable","originalRequest":{"method":"POST","header":[],"url":{"raw":"https://mouroam.com/api/v1/orders/:id/refill","host":["https://mouroam.com/api/v1"],"path":["orders",":id","refill"],"variable":[{"key":"id"}]},"description":"Claims and submits a new refill request for this order. No request body. At most one active request per order at a time, and at most one every 24 hours per order — either limit hit returns `409 refill_unavailable`.\n\n`mode: \"api\"` means the supplier's own refill endpoint was called directly and `status` reflects its real, polled outcome (`pending` → `completed`/`rejected`). `mode: \"manual\"` means this order's supplier only offers a manual refill guarantee (see the catalog's `refill_mode` field, or `refill_mode` on `GET /orders/{id}` once you've placed the order) — the request goes to `manual_review` for a human on our side to verify and honor against the real supplier record, not auto-resolved.\n\nOnly works on a fulfilled `smm` order, outside neither its `refill_window_days` nor the 24-hour resubmission cooldown — anything else is `409 refill_unavailable`. See the two saved examples for a successful `api`-mode submission and the `manual_review` case."},"status":"Conflict","code":409,"_postman_previewlanguage":"Text","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":false,\"error\":\"A refill is unavailable, outside its support window, or was already requested within 24 hours.\",\"code\":\"refill_unavailable\"}"}],"_postman_id":"c9526272-c712-01ab-1ee0-02c57003eafa"}],"id":"c5b10c78-c3c8-2b2b-67d5-5ab575862c39","_postman_id":"c5b10c78-c3c8-2b2b-67d5-5ab575862c39","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"c2d77dde-b214-4f18-8f97-a3ad93190472","id":"c2d77dde-b214-4f18-8f97-a3ad93190472","name":"mouroam Reseller API","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]}},"variable":[{"id":"95a56822-795d-44d8-921d-e518c5332551","key":"base_url","value":"https://mouroam.com/api/v1","description":"The reseller API's base URL."},{"id":"aa764c2e-abba-4b88-a24a-0ed41a94c546","key":"api_key","value":"","description":"Your own sk_live_... reseller API key. Required to actually run any request in this collection — leave blank to just browse the docs."}]}