Build on the same rails our apps run on.
Two API surfaces: the Customer API brings your Plunk catalog intelligence into your own storefront or portal, and the Shopper App APIs power visualizer experiences: ours, or one your team builds.
Authentication & keys
Workspace owners issue API keys from inside Plunk Studio. There are two kinds; where a key may live is the security model, so it's enforced, not advisory.
| Key | Prefix | Lives in | Can do |
|---|---|---|---|
| Publishable | pk_live_… / pk_test_… |
Browser JS, mobile app bundles: shippable and public | Event ingest plus aggregate, non-PII reads (products, locations, recommendations). Origin-locked to your domains. Never returns revenue or personal data. |
| Secret | sk_live_… / sk_test_… |
Your server only, never a browser | Everything your workspace exposes, including revenue-bearing analytics. Requests from browser origins are rejected. |
# Send the key as a bearer token (or X-Api-Key header)
curl https://api.plunk.io/cx/v1/capabilities \
-H "Authorization: Bearer pk_live_XXXXXXXXXXXX"
Web tracking & conversions
The tracker is one snippet on your site. Page views, sessions, geography, and campaign attribution are automatic from the moment it loads; conversions and engagements are one call each wherever something worth counting happens. Your workspace ID is in Plunk Studio under Settings → Tracking, along with a copy-exact version of this snippet.
<!-- Paste in your shared footer, just before </body>, so it loads on every page --> <script> var plunkConfig = { appId: "YOUR_WORKSPACE_ID", accountId: "YOUR_WORKSPACE_ID" }; </script> <script src="https://s3.amazonaws.com/plunk.io/v4/js/plunk.tracker.io.js"></script> <!-- Optional, for conversions: keep a handle once the tracker is ready --> <script> document.addEventListener('plunk-tracker-ready', function () { window.plunkTracker = new Plunk.Tracker(window.plunkConfig); }); </script>
Conversions are the moments that matter: an order, a quote request,
a signup. value is money and flows into revenue
reporting, so set it when the moment has a price and leave it 0 when it doesn't.
// e.g. on your order confirmation page plunkTracker.sendConversion({ type: 'order', // your grouping: order, lead, signup… name: 'Order Placed', // how it reads in reporting identifier: 'INV-10442', // optional: order no, SKU, plan… value: 2450.00 // optional: dollars }, []);
Engagements are the steps on the way: a configure button, a swatch order, a dealer-locator search. They cost nothing to record and they're what makes funnel drop-off visible between page view and conversion.
plunkTracker.sendEngagement({
type: 'cta', // your grouping
action: 'click',
label: 'request-quote' // which one, for the breakdown
}, []);
Page URL, session, visitor, and campaign are attached automatically to every call; you only supply what the event means. Events appear in your workspace's Activity reporting within a couple of minutes, which is also the fastest way to verify the install.
Customer API api.plunk.io/cx/v1
Versioned, key-scoped, and self-describing: your integration contract is the capabilities document. It lists exactly the resource families and endpoints your key can reach; new resources appear there as your workspace grows, so code against it rather than a static list.
/cx/v1/capabilitiesGET
The discovery document for your key: workspace type, enabled resource families, and the concrete endpoints inside each. Start here.
{
"tenantType": "retail",
"families": [
{ "key": "products", "label": "Products",
"endpoints": ["GET /cx/v1/products/top/{range}"] },
{ "key": "locations", "label": "Showroom",
"endpoints": ["GET /cx/v1/locations"] }
]
}
/cx/v1/products/top/{range}GET
Bestsellers for a period. range takes named tokens
(this_month, last_month,
this_year, …) or a custom window
(custom_20260101_20260630). Options:
?groupBy=product|category,
?category=, ?limit=.
Publishable keys receive rank, units and order counts; revenue fields appear on
secret keys only.
/cx/v1/locationsGET
Your stores or showrooms: the store-locator feed for your own site.
The full surface covers catalog sync, recommendations, reviews, store and dealer analytics, audiences, contact interest, demand forecasting, and enrichment, and every family announces itself in your capabilities document.
Customer API referenceShopper App APIs share.plunk.io
The COM/COL Visualizer and the Sectional Builder are apps we provide, and they run on a public, key-gated API your own team (or agency) can build against instead. A Visualizer App key from Studio scopes which surfaces it opens, locks website keys to your domains, and attributes every render and captured lead back to your workspace. Part of the Studio Scale plan.
Drop-in embed (no code)
Website keys come with a copy-paste snippet: the fastest path to a visualizer on your site.
<script src="https://share.plunk.io/embed.js"
data-key="YOUR_SITE_KEY" data-surface="sectional"></script>
Or build your own: the Sectional Builder API
Send your key on every call as x-visualizer-key.
Four endpoints make a complete shopper experience:
# 1 · Bootstrap: units, materials, options, and your workspace's policy GET /sb/bootstrap → { "brand", "builderMode": "open" | "curated", "units": [...], "fabrics": [...], "options": [...], "publishedConfigs": [...] } # 2 · Render: cache-first; a warmed combination returns instantly POST /sb/render { "units": [ { "sku": "L-2750-52", "gx": 0, "gy": 0 }, { "sku": "L-2750-53", "gx": 3, "gy": 0 } ], "fabricKey": "2001-05", "options": { "nailhead": "brass" } } → 200 { "status": "ready", "url": "…" } # cache hit → 202 { "status": "rendering", "renderId": "…" } # composing now # 3 · Poll until the composed hero lands GET /sb/render/{renderId} → { "status": "ready" | "rendering" | "pending_review" | "failed", "url" } # 4 · Save & share: mints a branded board, captures the lead POST /sb/save { "units": [...], "fabricKey": "2001-05", "title": "Living room L", "email": "shopper@example.com" } → { "configId", "boardUrl", "totalPrice" }
Every accepted render caches forever; a configuration renders at most once per material set, workspace-wide, then serves free and instant. In curated mode, shoppers see only the configurations your team has published; anything else returns a clean refusal rather than a render.
Studio API referenceWant a custom shopper app?
We also design and build custom consumer-facing visualizer and sectional-builder apps on these same APIs: your brand, your flow, our rendering and cache. Contact us and mention a custom app.
Integrations
Plunk connects to the systems you already run. No connector fees; everything below ships with the platform.
Commerce & catalog
Shopify syncs products, orders, and customers nightly, and approved Studio renders can publish straight back to your product pages. Prefer flat files? Scheduled CSV data feeds (products, sales, customers, inventory) cover any ERP or POS, and the Customer API accepts the same data programmatically.
Render delivery
Approved Studio renders deliver automatically to Shopify, Amazon S3, Azure Blob Storage, Dropbox, SFTP, or FTP: your site, your DAM, or your retail partners' inboxes, without a manual export step.
Marketing channels
Content publishes to Meta, Google Business Profile, WordPress, Mailchimp, and Constant Contact. Ad campaigns run on Meta and Google with server-side conversion events, so ROAS reflects real sales.
AI integrations
Plunk ships an MCP server at mcp.plunk.io; connect
Claude or any MCP-capable client to your workspace and query products, analytics,
and Studio from an AI assistant. Ask us for the connection details for your
workspace.