PageSourceSearch

https://ecom9.com/api-docs/

html ecom9.com collected 2026-10-02 01:27:53 UTC 58,967 bytes, 173 lines download raw bytes

1<!DOCTYPE html><!--mXHkIgtfeQ6f0mn_Qs4TO--><html lang="en" class="scroll-smooth"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/2b78fe563dbaf009.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-3cb0547478468349.js"/>
1<script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script>
1<script src="/_next/static/chunks/255-29f3dcaae8f3cb4e.js" async=""></script>
1<script src="/_next/static/chunks/main-app-212bd0e0626e15bf.js" async=""></script>
1<script src="/_next/static/chunks/619-ba102abea3e3d0e4.js" async=""></script>
1<script src="/_next/static/chunks/222-3153b59e93d17b15.js" async=""></script>
1<script src="/_next/static/chunks/app/layout-94682fbc8daf4fa2.js" async=""></script>
1<script src="/_next/static/chunks/app/page-797078708f07e547.js" async=""></script>
1<script src="/_next/static/chunks/app/api-docs/page-501a6b0cfcc62731.js" async=""></script>
1<link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-REQFH9PYBS" as="script"/><meta name="next-size-adjust" content=""/><title>API Documentation | ecom9</title><meta name="description" content="Reference for the ecom9 Transactions API, including authentication, integration workflow, REST endpoints, webhooks, and error handling."/><meta name="author" content="ecom9"/><meta name="keywords" content="paywall,checkout,Stripe,payment gateway,landing page,conversion,creators,coaches,SaaS subscriptions,no-code"/><meta name="robots" content="index, follow"/><link rel="canonical" href="https://ecom9.com/api-docs/"/><meta property="og:title" content="API Documentation | ecom9"/><meta property="og:description" content="Reference for the ecom9 Transactions API, including authentication, integration workflow, REST endpoints, webhooks, and error handling."/><meta property="og:url" content="https://ecom9.com/api-docs/"/><meta property="og:image" content="https://ecom9.com/og-image.png"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="API Documentation | ecom9"/><meta name="twitter:description" content="Reference for the ecom9 Transactions API, including authentication, integration workflow, REST endpoints, webhooks, and error handling."/><meta name="twitter:image" content="https://ecom9.com/og-image.png"/><link rel="icon" href="/images/ecom9favicon.png"/><link rel="apple-touch-icon" href="/images/ecom9webclip.png"/>
1<script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script>
1</head><body class="__variable_f367f3 min-h-screen bg-ecom-bg font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><header class="sticky top-0 z-30 border-b border-ecom-line/80 bg-ecom-bg/90 backdrop-blur-lg"><div class="mx-auto flex max-w-6xl items-center justify-between gap-6 px-6 py-4 lg:px-8"><a class="flex shrink-0 items-center gap-3 text-[15px] font-extrabold tracking-tight text-ecom-text" href="/"><img alt="eCom9" loading="lazy" width="38" height="38" decoding="async" data-nimg="1" class="h-[38px] w-[38px] object-contain" style="color:transparent" src="/images/ecom9logo.png"/>eCom9</a><nav class="hidden items-center gap-8 text-[15px] text-[#2d3935] md:flex"><a class="transition hover:text-ecom-primaryDark" href="/api-docs/">API Docs</a><div class="relative"><button type="button" aria-expanded="false" aria-haspopup="true" class="inline-flex items-center gap-1 transition hover:text-ecom-primaryDark">Who it&#x27;s for<span class="text-[10px] text-ecom-muted transition " aria-hidden="true">▼</span></button></div><a class="transition hover:text-ecom-primaryDark" href="/#features">Features</a><a class="transition hover:text-ecom-primaryDark" href="/#how">How it works</a><a class="transition hover:text-ecom-primaryDark" href="/#billing">Billing</a><a class="transition hover:text-ecom-primaryDark" href="/#pricing">Pricing</a></nav><div class="hidden items-center gap-3 md:flex"><a class="rounded-full border border-ecom-line bg-ecom-surface/80 px-4 py-2 text-sm font-semibold text-ecom-text shadow-sm transition hover:border-ecom-primary/40 hover:bg-ecom-surface" href="/#pricing">View pricing</a><a class="rounded-full bg-gradient-to-br from-[#16c57f] to-ecom-primaryDark px-4 py-2 text-sm font-semibold text-white shadow-ecom-primary transition hover:opacity-95" href="/manual-onboarding/">Start free</a></div><button type="button" class="inline-flex h-10 min-w-10 items-center justify-center rounded-xl border border-ecom-line bg-ecom-surface text-lg font-medium text-ecom-text md:hidden" aria-expanded="false" aria-label="Open menu">☰</button></div></header><div class="flex"><aside class="fixed inset-y-0 left-0 z-40 w-[268px] overflow-y-auto border-r border-ecom-line bg-ecom-surface2 px-5 pb-16 pt-6 transition-transform duration-200 lg:sticky lg:top-16 lg:h-[calc(100vh-64px)] lg:translate-x-0 lg:shrink-0 -translate-x-full"><div class="mb-3 flex items-center gap-2"><span class="h-2 w-2 rounded-full bg-ecom-primary"></span><span class="text-[11px] font-bold uppercase tracking-widest text-ecom-muted">ecom9 API Docs</span></div><nav class="space-y-5 text-sm"><div><p class="mb-1.5 px-2 text-[10px] font-bold uppercase tracking-widest text-ecom-muted/60">Getting Started</p><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#api-keys">Getting Your API Key</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#integration-overview">Integration Overview</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#authentication">Authentication</a></div><div><p class="mb-1.5 px-2 text-[10px] font-bold uppercase tracking-widest text-ecom-muted/60">Endpoints</p><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#endpoints">Overview</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#get-transactions">Transactions</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#check-account-status">Account Status</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#list-products">Products</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#create-invoice">Create Invoice</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#get-invoices">Get Invoices</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#get-tiers">Subscription Tiers</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#resolve-public-url">Resolve Public URL</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#fix-subscription">Fix Subscription</a></div><div><p class="mb-1.5 px-2 text-[10px] font-bold uppercase tracking-widest text-ecom-muted/60">Guides</p><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="/api-docs/webhooks/">Webhooks</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="/api-docs/credits/">Credits</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#error-responses">Error Responses</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#rate-limiting">Rate Limiting</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#data-privacy">Data Privacy</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#sdk-examples">SDK Examples</a><a class="flex items-center rounded-lg px-2.5 py-1.5 transition-colors text-ecom-muted hover:bg-ecom-line/50 hover:text-ecom-text" href="#support">Support</a></div></nav></aside><div class="min-w-0 flex-1"><div class="sticky top-16 z-20 flex items-center gap-3 border-b border-ecom-line bg-ecom-bg/90 px-6 py-3 backdrop-blur"><button class="flex items-center gap-1.5 rounded-lg border border-ecom-line px-3 py-1.5 text-sm text-ecom-muted lg:hidden">☰ Menu</button><span class="font-semibold text-ecom-text">API Reference</span><span class="rounded-full border border-ecom-line px-2 py-0.5 text-xs text-ecom-muted">v1</span></div><div class="mx-auto max-w-3xl px-6 py-10 lg:px-10"><span class="mb-4 inline-flex items-center gap-2 rounded-full border border-ecom-eyebrowBorder bg-ecom-eyebrowBg px-3.5 py-2 text-xs font-medium uppercase tracking-wide text-ecom-primaryDark"><span class="h-2 w-2 shrink-0 rounded-full bg-ecom-primary shadow-[0_0_0_6px_rgba(15,163,107,0.12)]" aria-hidden="true"></span>API reference</span><h1 class="mt-4 text-4xl font-semibold tracking-tight text-ecom-text">ecom9 API Documentation</h1><p class="mt-6 text-lg leading-relaxed text-ecom-muted">Access transactions, product catalogs, subscription state, and tier data for your connected accounts. Every request is authenticated with your Payment Gateway keys. See<!-- --> <a class="font-medium text-ecom-primaryDark underline-offset-2 hover:underline" href="/blog/subscription-event-handling/">
1Subscription Event Handling: Design Patterns and Best Practices</a> <!-- -->for lifecycle event guidance.</p><div class="mt-12 space-y-16"><section id="api-keys" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">Getting Your API Key</h2><ol class="mt-4 list-decimal space-y-2 pl-5 text-sm text-ecom-muted"><li>Sign in to the ecom9 dashboard.</li><li>Open <strong class="text-ecom-text">Payment Gateways</strong>.</li><li>Select your active sandbox or live gateway.</li><li>Copy the API Key and signing key ID from the gateway details and store them securely.</li></ol></section><section id="integration-overview" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">Integration Overview</h2><p class="mt-4 text-sm leading-relaxed text-ecom-muted"><strong class="text-ecom-text">account_ref_id is the primary identity key</strong> between ecom9 and your software. Use it to map customers, orgs, or workspaces and keep the same value across all API calls.</p><ul class="mt-4 list-disc space-y-2 pl-5 text-sm text-ecom-muted"><li><strong class="text-ecom-text">Required on most endpoints:</strong> pass <code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> on requests that read or write billing state.</li><li><strong class="text-ecom-text">Stable and internal:</strong>
1 choose an immutable ID from your system (user/org/workspace) to avoid remapping later.</li><li><strong class="text-ecom-text">Consistent across systems:</strong> we echo <code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> back in responses and webhook payloads.</li></ul><p class="mt-4 text-sm text-ecom-muted">Sandbox and production API keys are available in the dashboard under <strong class="text-ecom-text">Payment Gateways</strong>, letting you pick the right environment per deployment.</p><p class="mt-4 text-sm text-ecom-muted">Prefer using an SDK? Jump to <a href="#sdk-examples" class="font-medium text-ecom-primaryDark underline-offset-2 hover:underline">SDK Examples</a> for language-specific snippets that call each endpoint.</p></section><section id="authentication" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">Authentication</h2><p class="mt-4 text-sm text-ecom-muted">All endpoints require your Payment Gateway API key. Include it with each request using one of the supported headers.</p><div class="mt-4 space-y-4"><div><h3 class="text-xs font-bold uppercase tracking-wider text-ecom-muted">Option 1: Authorization header (recommended)</h3><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>Authorization: Bearer YOUR_API_KEY</code></pre></div><div><h3 class="text-xs font-bold uppercase tracking-wider text-ecom-muted">Option 2: X-API-Key header</h3><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>X-API-Key: YOUR_API_KEY</code></pre></div></div><p class="mt-4 text-sm text-ecom-muted">Base URL: <code class="rounded bg-ecom-surface2 px-1">https://app.ecom9.com/api/</code></p><h3 class="mt-6 text-xs font-bold uppercase tracking-wider text-ecom-muted">Test with curl</h3><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>curl -s https://app.ecom9.com/api/tiers/pro-plan/ \
2  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;</code></pre></section><section id="endpoints" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">Endpoints</h2><p class="mt-4 text-sm text-ecom-muted"><strong class="text-ecom-text">Base URL:</strong> <code class="rounded bg-ecom-surface2 px-1">https://app.ecom9.com/api/</code></p><article class="mt-10 border-t border-ecom-line pt-10" id="get-transactions"><h3 class="text-lg font-semibold text-ecom-text">Get Transactions by Account Reference ID</h3><p class="mt-2 text-sm text-ecom-muted">Retrieve the full transaction history for a specific account reference.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>GET https://app.ecom9.com/api/transactions/ACC123456789/?page=1&amp;page_size=20</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Parameters</p><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-ecom-muted"><li><code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> — path parameter (required)</li><li><code class="rounded bg-ecom-surface2 px-1">page</code> — query parameter (optional, default 1)</li><li><code class="rounded bg-ecom-surface2 px-1">page_size</code> — query parameter (optional, default 20, max 100)</li><li><code class="rounded bg-ecom-surface2 px-1">status</code> — query parameter (optional: pending, completed, failed, cancelled)</li></ul><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
3  &quot;count&quot;: 5,
4  &quot;next&quot;: null,
5  &quot;previous&quot;: null,
6  &quot;results&quot;: [
7    {
8      &quot;transaction_uuid&quot;: &quot;123e4567-e89b-12d3-a456-426614174000&quot;,
9      &quot;account_ref_id&quot;: &quot;ACC123456789&quot;,
10      &quot;status&quot;: &quot;completed&quot;,
11      &quot;amount&quot;: &quot;29.99&quot;,
12      &quot;currency&quot;: &quot;usd&quot;,
13      &quot;customer_email&quot;: &quot;[email protected]&quot;,
14      &quot;created_at&quot;: &quot;2024-01-15T10:30:00Z&quot;,
15      &quot;updated_at&quot;: &quot;2024-01-15T10:35:00Z&quot;
16    }
17  ]
18}</code></pre></article><article class="mt-10 border-t border-ecom-line pt-10" id="check-account-status"><h3 class="text-lg font-semibold text-ecom-text">Check Account Status</h3><p class="mt-2 text-sm text-ecom-muted">Return the live subscription state for an account reference, optionally filtered to a specific subscription + tier combination.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>GET https://app.ecom9.com/api/account/F8xQ2PnL7vKd93sH/status/?subscription=studio-suite&amp;tier=pro</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Parameters</p><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-ecom-muted"><li><code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> — path parameter (required)</li><li><code class="rounded bg-ecom-surface2 px-1">subscription</code> — query parameter (optional subscription label, required whenever <code class="rounded bg-ecom-surface2 px-1">tier</code> is provided)</li><li><code class="rounded bg-ecom-surface2 px-1">tier</code> — query parameter (optional tier label, only evaluated when paired with <code class="rounded bg-ecom-surface2 px-1">subscription</code>)</li></ul><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
19  &quot;account_ref_id&quot;: &quot;TWY4k2ZQPp19s8Hd&quot;,
20  &quot;is_active&quot;: true,
21  &quot;customer_email&quot;: &quot;[email protected]&quot;,
22  &quot;created_at&quot;: &quot;2024-03-02T14:11:27Z&quot;,
23  &quot;updated_at&quot;: &quot;2024-03-02T14:11:27Z&quot;,
24  &quot;subscription_tier&quot;: {
25    &quot;label_name&quot;: &quot;pro&quot;,
26    &quot;name&quot;: &quot;Aurora Growth&quot;,
27    &quot;description&quot;: &quot;45k send limit and co-marketing boosts&quot;,
28    &quot;price&quot;: &quot;32.00&quot;,
29    &quot;billing_cycle&quot;: &quot;monthly&quot;,
30    &quot;features&quot;: &quot;Deliverability audits, Campaign playbooks, Concierge migrations&quot;,
31    &quot;is_popular&quot;: true,
32    &quot;product_manage_id&quot;: &quot;P6ZmR29aTyQb&quot;
33  }
34}</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">
34Example response (multiple subscriptions)</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
35  &quot;account_ref_id&quot;: &quot;TWY4k2ZQPp19s8Hd&quot;,
36  &quot;customer_email&quot;: &quot;[email protected]&quot;,
37  &quot;subscriptions&quot;: [
38    {
39      &quot;is_active&quot;: false,
40      &quot;created_at&quot;: &quot;2023-12-18T09:54:12Z&quot;,
41      &quot;updated_at&quot;: &quot;2024-01-01T00:00:00Z&quot;,
42      &quot;subscription_tier&quot;: {
43        &quot;label_name&quot;: &quot;starter&quot;,
44        &quot;name&quot;: &quot;Pulse Lite&quot;,
45        &quot;description&quot;: &quot;5k send trial bundle&quot;,
46        &quot;price&quot;: &quot;0.00&quot;,
47        &quot;billing_cycle&quot;: &quot;monthly&quot;,
48        &quot;features&quot;: &quot;API sandbox, Limited automation&quot;,
49        &quot;is_popular&quot;: false,
50        &quot;product_manage_id&quot;: &quot;V8bLw4cNq0Xs&quot;
51      }
52    },
53    {
54      &quot;is_active&quot;: true,
55      &quot;created_at&quot;: &quot;2024-03-02T14:11:27Z&quot;,
56      &quot;updated_at&quot;: &quot;2024-03-02T14:11:27Z&quot;,
57      &quot;subscription_tier&quot;: {
58        &quot;label_name&quot;: &quot;pro&quot;,
59        &quot;name&quot;: &quot;Aurora Growth&quot;,
60        &quot;description&quot;: &quot;45k send limit and co-marketing boosts&quot;,
61        &quot;price&quot;: &quot;32.00&quot;,
62        &quot;billing_cycle&quot;: &quot;monthly&quot;,
63        &quot;features&quot;: &quot;Deliverability audits, Campaign playbooks, Concierge migrations&quot;,
64        &quot;is_popular&quot;: true,
65        &quot;product_manage_id&quot;: &quot;P6ZmR29aTyQb&quot;
66      }
67    }
68  ],
69  &quot;total_subscriptions&quot;: 2
70}</code></pre></article><article class="mt-10 border-t border-ecom-line pt-10" id="list-products"><h3 class="text-lg font-semibold text-ecom-text">List Products</h3><p class="mt-2 text-sm text-ecom-muted">Return the products for the authenticated user&#x27;s profile and payment gateway, ordered by title.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>GET https://app.ecom9.com/api/products/</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Response fields</p><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-ecom-muted"><li><code class="rounded bg-ecom-surface2 px-1">manage_id</code> — product&#x27;s unique manager ID</li><li><code class="rounded bg-ecom-surface2 px-1">label_name</code> — label name (for SaaS/subscription use)</li><li><code class="rounded bg-ecom-surface2 px-1">type</code> — product type (<code class="rounded bg-ecom-surface2 px-1">single</code> or <code class="rounded bg-ecom-surface2 px-1">subscription</code>)</li><li><code class="rounded bg-ecom-surface2 px-1">price</code> — price for <code class="rounded bg-ecom-surface2 px-1">single</code> products only</li></ul><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
71  &quot;results&quot;: [
72    { &quot;manage_id&quot;: &quot;abc12xyz&quot;, &quot;label_name&quot;: &quot;my-product&quot;, &quot;type&quot;: &quot;single&quot;, &quot;price&quot;: &quot;49.99&quot; },
73    { &quot;manage_id&quot;: &quot;def34uvw&quot;, &quot;label_name&quot;: &quot;pro-plan&quot;, &quot;type&quot;: &quot;subscription&quot; }
74  ],
75  &quot;count&quot;: 2
76}</code></pre></article><article class="mt-10 border-t border-ecom-line pt-10" id="create-invoice"><h3 class="text-lg font-semibold text-ecom-text">Create Invoice</h3><p class="mt-2 text-sm text-ecom-muted">Create a Stripe-hosted invoice for a product and return the hosted payment URL. Optionally email the invoice to the customer.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>POST https://app.ecom9.com/api/invoices/create/</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Sample payload</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
77  &quot;product_manage_id&quot;: &quot;AlC3WiWyOIN1&quot;,
78  &quot;amount&quot;: 25.00,
79  &quot;customer_email&quot;: &quot;[email protected]&quot;,
80  &quot;currency&quot;: &quot;usd&quot;,
81  &quot;description&quot;: &quot;Website development - Phase 1&quot;,
82  &quot;account_ref_id&quot;: &quot;usr_abc123&quot;,
83  &quot;send_to_customer&quot;: true,
84  &quot;return_url&quot;: &quot;https://yourapp.com/invoice/success&quot;
85}</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
86  &quot;hosted_invoice_url&quot;: &quot;https://invoice.stripe.com/i/acct_xxx/...&quot;,
87  &quot;
87stripe_invoice_id&quot;: &quot;in_1ABCdef...&quot;,
88  &quot;email_sent&quot;: true,
89  &quot;return_url&quot;: &quot;https://app.example.com/thank-you&quot;
90}</code></pre></article><article class="mt-10 border-t border-ecom-line pt-10" id="get-invoices"><h3 class="text-lg font-semibold text-ecom-text">Get Invoices</h3><p class="mt-2 text-sm text-ecom-muted">Retrieve invoices for an account. Optionally filter by email or status.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>GET https://app.ecom9.com/api/invoices/</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Query parameters</p><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-ecom-muted"><li><code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> - (optional) account reference ID</li><li><code class="rounded bg-ecom-surface2 px-1">email</code> - (optional) customer email</li><li><code class="rounded bg-ecom-surface2 px-1">status</code> - (optional) filter by status: <code class="rounded bg-ecom-surface2 px-1">draft</code>, <code class="rounded bg-ecom-surface2 px-1">open</code>, <code class="rounded bg-ecom-surface2 px-1">paid</code>, <code class="rounded bg-ecom-surface2 px-1">uncollectible</code>, <code class="rounded bg-ecom-surface2 px-1">void</code></li><li><code class="rounded bg-ecom-surface2 px-1">page</code> - (optional) page number (default 1)</li><li><code class="rounded bg-ecom-surface2 px-1">page_size</code> - (optional) items per page (default 20, max 100)</li></ul><div class="mt-3 border-l-4 border-ecom-primary bg-ecom-surface p-4 text-sm text-ecom-muted">At least one of <code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> or <code class="rounded bg-ecom-surface2 px-1">email</code> is required.</div><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
91  &quot;count&quot;: 3,
92  &quot;next&quot;: null,
93  &quot;previous&quot;: null,
94  &quot;results&quot;: [
95    {
96      &quot;stripe_invoice_id&quot;: &quot;in_1TJJ5rAaxKcgrBGsDZAY79gt&quot;,
97      &quot;account_ref_id&quot;: &quot;usr_abc123&quot;,
98      &quot;status&quot;: &quot;paid&quot;,
99      &quot;is_paid&quot;: true,
100      &quot;amount_due&quot;: 25.00,
101      &quot;amount_paid&quot;: 25.00,
102      &quot;currency&quot;: &quot;usd&quot;,
103      &quot;customer_email&quot;: &quot;[email protected]&quot;,
104      &quot;invoice_date&quot;: &quot;2026-04-06T19:46:00Z&quot;,
105      &quot;due_date&quot;: &quot;2026-05-06T19:46:00Z&quot;,
106      &quot;period_start&quot;: null,
107      &quot;period_end&quot;: null,
108      &quot;hosted_invoice_url&quot;: &quot;https://invoice.stripe.com/i/...&quot;,
109      &quot;stripe_subscription_id&quot;: &quot;&quot;,
110      &quot;product_manage_id&quot;: &quot;AlC3WiWyOIN1&quot;,
111      &quot;created_at&quot;: &quot;2026-04-06T19:46:00Z&quot;,
112      &quot;updated_at&quot;: &quot;2026-04-06T19:47:00Z&quot;
113    }
114  ]
115}</code></pre></article><article class="mt-10 border-t border-ecom-line pt-10" id="get-tiers"><h3 class="text-lg font-semibold text-ecom-text">Get Available Subscription Tiers</h3><p class="mt-2 text-sm text-ecom-muted">List every tier configured for a subscription product so you can display pricing or validate selection on the client side.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>GET https://app.ecom9.com/api/tiers/{subscription_name}/?page=1&amp;page_size=20</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Path parameters</p><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-ecom-muted"><li><code class="rounded bg-ecom-surface2 px-1">subscription_name</code> — required; the <code class="rounded bg-ecom-surface2 px-1">label_name</code> of the subscription product</li></ul><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
116  &quot;count&quot;: 3,
117  &quot;results&quot;: [
118    {
119      &quot;label_name&quot;: &quot;basic&quot;,
120      &quot;name&quot;: &quot;Basic Plan&quot;,
121      &quot;description&quot;: &quot;Essential features for getting started&quot;,
122      &quot;price&quot;: &quot;9.99&quot;,
123      &quot;billing_cycle&quot;: &quot;monthly&quot;,
124      &quot;features&quot;: &quot;Basic features, Email support&quot;,
125      &quot;is_popular&quot;: false,
126      &quot;product_manage_id&quot;: &quot;ABC123DEF456&quot;
127    }
128  ]
129}</code></pre></article><article class="mt-10 border-t border-ecom-line pt-10" id="resolve-public-url"><h3 class="text-lg font-semibold text-ecom-text">Resolve Public URL</h3><p class="mt-2 text-sm text-ecom-muted">Fetch the customer-facing link for a SaaS product or tier before appending your signed <code class="rounded bg-ecom-surface2 px-1">?u=</code>
129 token. The resolver only returns URLs for catalog entries tagged <code class="rounded bg-ecom-surface2 px-1">saas_only</code>.</p><div class="mt-4 rounded-xl border border-ecom-line bg-ecom-surface p-4"><p class="text-xs font-bold uppercase tracking-wider text-ecom-muted">Mandatory requirements</p><ul class="mt-2 list-disc space-y-2 pl-5 text-sm text-ecom-muted"><li><strong class="text-ecom-text"><code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> is required</strong> on every request and must match the account that owns the subscription.</li><li><strong class="text-ecom-text">When resolving by <code class="rounded bg-ecom-surface2 px-1">subscription_name</code> + <code class="rounded bg-ecom-surface2 px-1">tier_name</code> for a <code class="rounded bg-ecom-surface2 px-1">saas_only</code> subscription product, include <code class="rounded bg-ecom-surface2 px-1">email</code></strong> so we can match the subscriber.</li><li><strong class="text-ecom-text">When resolving a single <code class="rounded bg-ecom-surface2 px-1">product_name</code> that is <code class="rounded bg-ecom-surface2 px-1">saas_only</code>, include <code class="rounded bg-ecom-surface2 px-1">email</code></strong> to attach the SaaS customer record correctly.</li><li><strong class="text-ecom-text">We recommend sending <code class="rounded bg-ecom-surface2 px-1">email</code> for SaaS checkout links</strong> so customers do not pay with a different email that is harder to reconcile later. We do not lock buyers to that email, but it is required for subscription generation URLs.</li><li><strong class="text-ecom-text">Non-SaaS catalog items respond with <code class="rounded bg-ecom-surface2 px-1">404 Not Found</code>.</strong> Confirm the access mode before resolving.</li></ul></div><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>GET https://app.ecom9.com/api/resolve/public-url/?product_name=onboarding&amp;account_ref_id=demo-account-123</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Parameters</p><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-ecom-muted"><li><code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> — query parameter (required)</li><li><code class="rounded bg-ecom-surface2 px-1">product_name</code> — query parameter (optional, mutually exclusive with <code class="rounded bg-ecom-surface2 px-1">subscription_name</code> + <code class="rounded bg-ecom-surface2 px-1">tier_name</code>)</li><li><code class="rounded bg-ecom-surface2 px-1">subscription_name</code> — query parameter (optional, requires <code class="rounded bg-ecom-surface2 px-1">tier_name</code>)</li><li><code class="rounded bg-ecom-surface2 px-1">tier_name</code> — query parameter (optional, requires <code class="rounded bg-ecom-surface2 px-1">subscription_name</code>)</li><li><code class="rounded bg-ecom-surface2 px-1">email</code> — query parameter (required when using <code class="rounded bg-ecom-surface2 px-1">subscription_name</code> + <code class="rounded bg-ecom-surface2 px-1">tier_name</code> for a <code class="rounded bg-ecom-surface2 px-1">saas_only</code> subscription product; required when using a <code class="rounded bg-ecom-surface2 px-1">product_name</code> that is <code class="rounded bg-ecom-surface2 px-1">saas_only</code>; recommended for SaaS checkout links to keep customer records consistent)</li></ul><p class="mt-4 text-sm text-ecom-muted">Tip: Use <code class="rounded bg-ecom-surface2 px-1">product_name</code> for one-time product sales. Use <code class="rounded bg-ecom-surface2 px-1">subscription_name</code> + <code class="rounded bg-ecom-surface2 px-1">tier_name</code> for subscriptions with <code class="rounded bg-ecom-surface2 px-1">saas_mode</code> enabled.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Subscription + tier parameters</p><p class="mt-1 text-sm text-ecom-muted">Use when you only know the catalog names. Required query params: <code class="rounded bg-ecom-surface2 px-1">subscription_name</code>, <code class="rounded bg-ecom-surface2 px-1">tier_name</code>, <code class="rounded bg-ecom-surface2 px-1">account_ref_id</code>, <code class="rounded bg-ecom-surface2 px-1">email</code>.</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>curl -X GET &quot;https://app.ecom9.com/api/resolve/public-url/?subscription_name=pro-plan&amp;tier_name=pro&amp;account_ref_id=demo-account-123&amp;email=buyer%40example.com&quot; \
130  -H &quot;Authorization: Bearer YOUR_API_KEY_HERE&quot;</code></pre><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Single product parameters</p><p class="mt-1 text-sm text-ecom-muted">Required query params: <code class="rounded bg-ecom-surface2 px-1">product_name</code>, <code class="rounded bg-ecom-surface2 px-1">account_ref_id</code>. If the product is <code class="rounded bg-ecom-surface2 px-1">saas_only</code>, include <code class="rounded bg-ecom-surface2 px-1">email</code>.</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>curl -X GET &quot;https://app.ecom9.com/api/resolve/public-url/?product_name=onboarding&amp;account_ref_id=demo-account-123&quot; \
131  -H &quot;Authorization: Bearer YOUR_API_KEY_HERE&quot;</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
132  &quot;type&quot;: &quot;redirect&quot;,
133  &quot;url&quot;: &quot;https://your-domain.com/r/8f87f8e1-2f4c-4a7f-9b67-2f49a20e6d9a/&quot;
134}</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Common error payloads</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{ &quot;error&quot;: &quot;Provide product_name or both subscription_name and tier_name&quot; }
135{ &quot;error&quot;: &quot;Product not found&quot; }
136{ &quot;error&quot;: &quot;email is required when using subscription_name and tier_name&quot; }
137{ &quot;error&quot;: &quot;email is required when using a saas_only product&quot; }
138{ &quot;error&quot;: &quot;Subscription product not found&quot; }
139{ &quot;error&quot;: &quot;Subscription tier not found&quot; }</code></pre></article><article class="mt-10 border-t border-ecom-line pt-10" id="fix-subscription"><h3 class="text-lg font-semibold text-ecom-text">Fix Subscription</h3><p class="mt-2 text-sm text-ecom-muted">Return a hosted payment URL for the invoice that failed and put a subscription into a past-due or incomplete state.</p><p class="mt-4 text-xs font-semibold uppercase text-ecom-muted">Request URL</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>GET https://app.ecom9.com/api/fix-subscription/?account_ref_id=IAS0I48ZMYEF&amp;subscription_name=pro-plan&amp;tier_name=pro</code></pre><p class="mt-4 text-sm font-medium text-ecom-text">Parameters</p><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-ecom-muted"><li><code class="rounded bg-ecom-surface2 px-1">account_ref_id</code> — query parameter (required)</li><li><code class="rounded bg-ecom-surface2 px-1">subscription_name</code> — query parameter (required, requires <code class="rounded bg-ecom-surface2 px-1">tier_name</code>)</li><li><code class="rounded bg-ecom-surface2 px-1">tier_name</code> — query parameter (required, requires <code class="rounded bg-ecom-surface2 px-1">subscription_name</code>)</li></ul><p class="mt-4 text-sm font-medium text-ecom-text">Example response</p><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm mt-2"><code>{
140  &quot;url&quot;: &quot;https://app.ecom9.com/pay/in_1PLsXjKz8C7Demo&quot;
141}</code></pre><p class="mt-3 text-sm text-ecom-muted">If there is no past-due invoice or the subscription is already active, the response body is empty.</p></article></section><section id="error-responses" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">Error Responses</h2><div class="mt-4 space-y-3"><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm "><code>401 Unauthorized
142{
143  &quot;detail&quot;: &quot;Invalid API key&quot;
144}</code></pre><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm "><code>404 Not Found
145{
146  &quot;error&quot;: &quot;Account not found or invalid subscription tier&quot;
147}</code></pre><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm "><code>400 Bad Request
148{
149  &quot;field_name&quot;: [&quot;Error message describing the issue&quot;]
150}</code></pre></div></section><section id="rate-limiting" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">Rate Limiting</h2><p class="mt-4 text-sm text-ecom-muted">If you exceed your plan&#x27;s rate limit, responses include <code class="rounded bg-ecom-surface2 px-1">429 Too Many Requests</code>. Inspect the <code class="rounded bg-ecom-surface2 px-1">Retry-After</code> header before retrying.</p></section><section id="data-privacy" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">Data Privacy</h2><ul class="mt-4 list-disc space-y-2 pl-5 text-sm text-ecom-muted"><li>Only data tied to your Payment Gateway account is returned.</li><li>Customer email addresses appear for identification only.</li><li>Sensitive payment identifiers (Stripe IDs) are never exposed.</li><li>All timestamps use UTC (ISO 8601) format.</li></ul></section><section id="sdk-examples" class="scroll-mt-24"><h2 class="text-xl font-semibold text-ecom-text">SDK Examples</h2><p class="mt-4 text-sm text-ecom-muted">The official SDKs wrap the REST endpoints so you can keep signing, pagination, and retries consistent across services. Use the tabs to switch languages.</p><div class="mt-8 space-y-10"><div><h3 class="mb-3 text-base font-semibold text-ecom-text">Get Transactions</h3><div class="rounded-2xl border border-ecom-line bg-ecom-surface p-4"><div class="mb-4 flex flex-wrap gap-2"><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-ecom-text text-ecom-bg">Python</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">PHP</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">Node.js</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">React</button></div><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm "><code>from ecom9_sdk import Ecom9Client
151
152client = Ecom9Client(api_key=&quot;YOUR_API_KEY&quot;)
153
154transactions = client.transactions.list(
155  account_ref_id=&quot;ACC123456789&quot;,
156  page=1,
157  status=&quot;completed&quot;
158)
159
160for entry in transactions.results:
161  print(entry[&quot;transaction_uuid&quot;], entry[&quot;status&quot;])</code></pre></div></div><div><h3 class="mb-3 text-base font-semibold text-ecom-text">Check Account Status</h3><div class="rounded-2xl border border-ecom-line bg-ecom-surface p-4"><div class="mb-4 flex flex-wrap gap-2"><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-ecom-text text-ecom-bg">Python</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">PHP</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">Node.js</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">React</button></div><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm "><code>status = client.accounts.status(
162  account_ref_id=&quot;ACC123456789&quot;,
163  tier=&quot;pro&quot;
164)
165
166print(status[&quot;is_active&quot;], status[&quot;subscription_tier&quot;][&quot;label_name&quot;])</code></pre></div></div><div><h3 class="mb-3 text-base font-semibold text-ecom-text">Get Subscription Tiers</h3><div class="rounded-2xl border border-ecom-line bg-ecom-surface p-4"><div class="mb-4 flex flex-wrap gap-2"><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-ecom-text text-ecom-bg">Python</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">PHP</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">Node.js</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">React</button></div><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm "><code>tiers = client.tiers.list()
167
168print([tier[&quot;label_name&quot;] for tier in tiers[&quot;results&quot;]])</code></pre></div></div><div><h3 class="mb-3 text-base font-semibold text-ecom-text">Resolve Public URL</h3><p class="mb-3 text-sm text-ecom-muted">Use the SDK helper to wrap <code class="rounded bg-ecom-surface2 px-1">/api/resolve/public-url/</code>. Refer to the endpoint documentation above for required parameters and SaaS-only constraints.</p><div class="rounded-2xl border border-ecom-line bg-ecom-surface p-4"><div class="mb-4 flex flex-wrap gap-2"><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-ecom-text text-ecom-bg">Python</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">PHP</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">Node.js</button><button class="rounded-full border px-3 py-1 text-xs font-semibold transition border-ecom-line bg-transparent text-ecom-muted hover:text-ecom-text">React</button></div><pre class="overflow-x-auto rounded-2xl bg-ecom-dark p-4 text-left text-xs leading-relaxed text-emerald-50/95 sm:text-sm "><code>public_url = client.links.resolve_public_url(
169  product_name=&quot;onboarding&quot;,
170  account_ref_id=&quot;demo-account-123&quot;,
171)
172
173print(public_url[&quot;public_url&quot;])</code></pre></div></div></div></section><section id="support" class="rounded-2xl border border-ecom-line bg-ecom-surface p-8 shadow-ecom"><h2 class="text-lg font-semibold text-ecom-text">Support</h2><p class="mt-2 text-sm text-ecom-muted">Need a new endpoint or payload tweak? Reach the team through your dashboard chat or email support, and we&#x27;ll scope it with you.</p></section></div></div></div></div><!--$--><!--/$--><footer class="border-t border-ecom-line bg-ecom-surface2/50 py-14"><div class="mx-auto grid max-w-6xl gap-10 px-6 sm:grid-cols-2 lg:grid-cols-5 lg:gap-8 lg:px-8"><div class="sm:col-span-2 lg:col-span-1"><a class="inline-flex items-center gap-3 text-[15px] font-extrabold tracking-tight text-ecom-text" href="/"><img alt="eCom9" loading="lazy" width="38" height="38" decoding="async" data-nimg="1" class="h-[38px] w-[38px] object-contain" style="color:transparent" src="/images/ecom9logo.png"/>eCom9</a><p class="mt-4 max-w-xs text-sm leading-relaxed text-ecom-muted">
173Stripe-powered billing infrastructure for teams that want the payment engine without all the surrounding integration mess.</p></div><div><h4 class="text-sm font-bold text-ecom-text">Product</h4><div class="mt-4 flex flex-col gap-2 text-sm text-ecom-muted"><a class="transition hover:text-ecom-primaryDark" href="/#features">Features</a><a class="transition hover:text-ecom-primaryDark" href="/#how">How it works</a><a class="transition hover:text-ecom-primaryDark" href="/#pricing">Pricing</a></div></div><div><h4 class="text-sm font-bold text-ecom-text">Use Cases</h4><div class="mt-4 flex flex-col gap-2 text-sm text-ecom-muted"><a class="transition hover:text-ecom-primaryDark" href="/saas/">SaaS</a><a class="transition hover:text-ecom-primaryDark" href="/creators/">Creators</a><a class="transition hover:text-ecom-primaryDark" href="/coaches/">Coaches</a><a class="transition hover:text-ecom-primaryDark" href="/services/">Services</a><a class="transition hover:text-ecom-primaryDark" href="/sellers/">Sellers</a></div></div><div><h4 class="text-sm font-bold text-ecom-text">Resources</h4><div class="mt-4 flex flex-col gap-2 text-sm text-ecom-muted"><a class="transition hover:text-ecom-primaryDark" href="/api-docs/">API Docs</a><span class="text-ecom-line">Docs</span><span class="text-ecom-line">API</span></div></div><div><h4 class="text-sm font-bold text-ecom-text">Company</h4><div class="mt-4 flex flex-col gap-2 text-sm text-ecom-muted"><span class="text-ecom-line">Contact</span><a class="transition hover:text-ecom-primaryDark" href="/privacy/">Privacy</a><a class="transition hover:text-ecom-primaryDark" href="/terms/">Terms</a></div></div></div><p class="mx-auto mt-12 max-w-6xl px-6 text-center text-xs text-ecom-muted lg:px-8">© <!-- -->2026<!-- --> ecom9. All rights reserved.</p></footer>
173<script src="/_next/static/chunks/webpack-3cb0547478468349.js" id="_R_" async=""></script>
173<script>(self.__next_f=self.__next_f||[]).push([0])</script>
173<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1402,[\"619\",\"static/chunks/619-ba102abea3e3d0e4.js\",\"222\",\"static/chunks/222-3153b59e93d17b15.js\",\"177\",\"static/chunks/app/layout-94682fbc8daf4fa2.js\"],\"\"]\n3:I[8320,[\"619\",\"static/chunks/619-ba102abea3e3d0e4.js\",\"222\",\"static/chunks/222-3153b59e93d17b15.js\",\"177\",\"static/chunks/app/layout-94682fbc8daf4fa2.js\"],\"SiteHeader\"]\n4:I[9766,[],\"\"]\n5:I[8924,[],\"\"]\n6:I[2619,[\"619\",\"static/chunks/619-ba102abea3e3d0e4.js\",\"974\",\"static/chunks/app/page-797078708f07e547.js\"],\"\"]\n7:I[1356,[\"619\",\"static/chunks/619-ba102abea3e3d0e4.js\",\"222\",\"static/chunks/222-3153b59e93d17b15.js\",\"177\",\"static/chunks/app/layout-94682fbc8daf4fa2.js\"],\"Image\"]\n13:I[7150,[],\"\"]\n:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/2b78fe563dbaf009.css\",\"style\"]\n"])</script>
173<script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"mXHkIgtfeQ6f0mn-Qs4TO\",\"p\":\"\",\"c\":[\"\",\"api-docs\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"api-docs\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/2b78fe563dbaf009.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"scroll-smooth\",\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_f367f3 min-h-screen bg-ecom-bg font-sans antialiased\",\"children\":[[\"$\",\"$L2\",null,{\"id\":\"json-ld\",\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"[{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Organization\\\",\\\"@id\\\":\\\"https://ecom9.com/#organization\\\",\\\"name\\\":\\\"ecom9\\\",\\\"url\\\":\\\"https://ecom9.com\\\",\\\"logo\\\":\\\"https://ecom9.com/images/ecom9logo.png\\\",\\\"sameAs\\\":[\\\"https://twitter.com/ecom9\\\",\\\"https://www.linkedin.com/company/ecom9\\\"]},{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://ecom9.com/#website\\\",\\\"name\\\":\\\"ecom9\\\",\\\"url\\\":\\\"https://ecom9.com\\\"}]\"}}],[\"$\",\"$L2\",null,{\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-REQFH9PYBS\",\"strategy\":\"afterInteractive\"}],[\"$\",\"$L2\",null,{\"id\":\"gtag-init\",\"strategy\":\"afterInteractive\",\"children\":\"\\n          window.dataLayer = window.dataLayer || [];\\n          function gtag(){dataLayer.push(arguments);}\\n          gtag('js', new Date());\\n          gtag('config', 'G-REQFH9PYBS');\\n        \"}],[\"$\",\"$L3\",null,{}],[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"footer\",null,{\"className\":\"border-t border-ecom-line bg-ecom-surface2/50 py-14\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mx-auto grid max-w-6xl gap-10 px-6 sm:grid-cols-2 lg:grid-cols-5 lg:gap-8 lg:px-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sm:col-span-2 lg:col-span-1\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center gap-3 text-[15px] font-extrabold tracking-tight text-ecom-text\",\"children\":[[\"$\",\"$L7\",null,{\"src\":\"/images/ecom9logo.png\",\"alt\":\"eCom9\",\"width\":38,\"height\":38,\"className\":\"h-[38px] w-[38px] object-contain\"}],\"eCom9\"]}],[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-xs text-sm leading-relaxed text-ecom-muted\",\"children\":\"Stripe-powered billing infrastru
173cture for teams that want the payment engine without all the surrounding integration mess.\"}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"className\":\"text-sm font-bold text-ecom-text\",\"children\":\"Product\"}],[\"$\",\"div\",null,{\"className\":\"mt-4 flex flex-col gap-2 text-sm text-ecom-muted\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/#features\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Features\"}],[\"$\",\"$L6\",null,{\"href\":\"/#how\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"How it works\"}],[\"$\",\"$L6\",null,{\"href\":\"/#pricing\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Pricing\"}]]}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"className\":\"text-sm font-bold text-ecom-text\",\"children\":\"Use Cases\"}],[\"$\",\"div\",null,{\"className\":\"mt-4 flex flex-col gap-2 text-sm text-ecom-muted\",\"children\":[\"$L8\",\"$L9\",\"$La\",\"$Lb\",\"$Lc\"]}]]}],\"$Ld\",\"$Le\"]}],\"$Lf\"]}]]}]}]]}],{\"children\":[\"api-docs\",\"$L10\",{\"children\":[\"__PAGE__\",\"$L11\",{},null,false]},null,false]},null,false],\"$L12\",false]],\"m\":\"$undefined\",\"G\":[\"$13\",[]],\"s\":false,\"S\":true}\n"])</script>
173<script>self.__next_f.push([1,"14:I[1391,[\"619\",\"static/chunks/619-ba102abea3e3d0e4.js\",\"287\",\"static/chunks/app/api-docs/page-501a6b0cfcc62731.js\"],\"ApiDocsPage\"]\n15:I[4431,[],\"OutletBoundary\"]\n17:I[5278,[],\"AsyncMetadataOutlet\"]\n19:I[4431,[],\"ViewportBoundary\"]\n1b:I[4431,[],\"MetadataBoundary\"]\n1c:\"$Sreact.suspense\"\n8:[\"$\",\"$L6\",null,{\"href\":\"/saas\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"SaaS\"}]\n9:[\"$\",\"$L6\",null,{\"href\":\"/creators\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Creators\"}]\na:[\"$\",\"$L6\",null,{\"href\":\"/coaches\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Coaches\"}]\nb:[\"$\",\"$L6\",null,{\"href\":\"/services\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Services\"}]\nc:[\"$\",\"$L6\",null,{\"href\":\"/sellers\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Sellers\"}]\nd:[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"className\":\"text-sm font-bold text-ecom-text\",\"children\":\"Resources\"}],[\"$\",\"div\",null,{\"className\":\"mt-4 flex flex-col gap-2 text-sm text-ecom-muted\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/api-docs\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"API Docs\"}],[\"$\",\"span\",null,{\"className\":\"text-ecom-line\",\"children\":\"Docs\"}],[\"$\",\"span\",null,{\"className\":\"text-ecom-line\",\"children\":\"API\"}]]}]]}]\ne:[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"className\":\"text-sm font-bold text-ecom-text\",\"children\":\"Company\"}],[\"$\",\"div\",null,{\"className\":\"mt-4 flex flex-col gap-2 text-sm text-ecom-muted\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-ecom-line\",\"children\":\"Contact\"}],[\"$\",\"$L6\",null,{\"href\":\"/privacy\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Privacy\"}],[\"$\",\"$L6\",null,{\"href\":\"/terms\",\"className\":\"transition hover:text-ecom-primaryDark\",\"children\":\"Terms\"}]]}]]}]\nf:[\"$\",\"p\",null,{\"className\":\"mx-auto mt-12 max-w-6xl px-6 text-center text-xs text-ecom-muted lg:px-8\",\"children\":[\"© \",2026,\" ecom9. All rights reserved.\"]}]\n10:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey"])</script>
173<script>self.__next_f.push([1,"\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n11:[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L14\",null,{}],null,[\"$\",\"$L15\",null,{\"children\":[\"$L16\",[\"$\",\"$L17\",null,{\"promise\":\"$@18\"}]]}]]}]\n12:[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$L19\",null,{\"children\":\"$L1a\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L1b\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$1c\",null,{\"fallback\":null,\"children\":\"$L1d\"}]}]}]]}]\n"])</script>
173<script>self.__next_f.push([1,"1a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n16:null\n"])</script>
173<script>self.__next_f.push([1,"1e:I[622,[],\"IconMark\"]\n"])</script>
173<script>self.__next_f.push([1,"18:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"API Documentation | ecom9\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Reference for the ecom9 Transactions API, including authentication, integration workflow, REST endpoints, webhooks, and error handling.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"author\",\"content\":\"ecom9\"}],[\"$\",\"meta\",\"3\",{\"name\":\"keywords\",\"content\":\"paywall,checkout,Stripe,payment gateway,landing page,conversion,creators,coaches,SaaS subscriptions,no-code\"}],[\"$\",\"meta\",\"4\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"link\",\"5\",{\"rel\":\"canonical\",\"href\":\"https://ecom9.com/api-docs/\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:title\",\"content\":\"API Documentation | ecom9\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:description\",\"content\":\"Reference for the ecom9 Transactions API, including authentication, integration workflow, REST endpoints, webhooks, and error handling.\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:url\",\"content\":\"https://ecom9.com/api-docs/\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://ecom9.com/og-image.png\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"11\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:title\",\"content\":\"API Documentation | ecom9\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:description\",\"content\":\"Reference for the ecom9 Transactions API, including authentication, integration workflow, REST endpoints, webhooks, and error handling.\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:image\",\"content\":\"https://ecom9.com/og-image.png\"}],[\"$\",\"link\",\"15\",{\"rel\":\"icon\",\"href\":\"/images/ecom9favicon.png\"}],[\"$\",\"link\",\"16\",{\"rel\":\"apple-touch-icon\",\"href\":\"/images/ecom9webclip.png\"}],[\"$\",\"$L1e\",\"17\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script>
173<script>self.__next_f.push([1,"1d:\"$18:metadata\"\n"])</script>
173</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.