Sectional Builder
New combinations render on demand, unless your account runs in curated mode, where only configurations your team has published can be served. Every accepted render is cached, so a configuration renders at most once per material set and then serves free and instantly.
GET /sb/bootstrap
Section titled “GET /sb/bootstrap”Everything the app needs to draw itself.
priceisnullwhen the key hides pricing (trade and designer apps).builderModeisopenorcurated.publishedConfigsis filled in curated mode.
{ "brand": "Sample Furniture Co.", "captureFirst": false, "showPricing": true, "builderMode": "open", "units": [ { "sku": "3772-ALC", "series": "3772", "title": "Armless Chair", "unitType": "armless", "armSide": null, "attachEdges": "left,right", "gridW": 1, "gridH": 1, "widthIn": 32.0, "price": 899.00, "imageUrl": "https://…/3772-alc-neutral.png" } ], "fabrics": [ { "fabricKey": "2001-05", "fabricName": "Stone", "swatchUrl": "https://…/2001-05.jpg", "family": "Performance weave" } ], "options": [ { "kind": "leg", "optionKey": "espresso", "name": "Espresso legs", "swatchUrl": "https://…/leg-espresso.jpg", "sort": 1 } ], "publishedConfigs": []}POST /sb/render
Section titled “POST /sb/render”Render a configuration: 2 to 8 units placed on the layout grid, a fabric, and any selected options. A cached, approved configuration returns ready immediately. Otherwise the render starts and you poll. In curated mode an unpublished combination returns 403 with status: "unavailable".
curl -X POST https://share.plunk.io/sb/render \ -H "x-visualizer-key: sk_••••" -H "x-surface: sectional" \ -H "Content-Type: application/json" \ -d '{ "units": [ { "sku": "3772-LAL", "gx": 0, "gy": 0 }, { "sku": "3772-ALC", "gx": 1, "gy": 0 }, { "sku": "3772-COR", "gx": 2, "gy": 0 }, { "sku": "3772-RAC", "gx": 2, "gy": 1 } ], "fabricKey": "2001-05", "options": { "leg": "espresso" } }'const headers = { 'x-visualizer-key': 'sk_••••', 'x-surface': 'sectional', 'Content-Type': 'application/json' };const body = { units: [ { sku: '3772-LAL', gx: 0, gy: 0 }, { sku: '3772-ALC', gx: 1, gy: 0 }, { sku: '3772-COR', gx: 2, gy: 0 }, { sku: '3772-RAC', gx: 2, gy: 1 }, ], fabricKey: '2001-05', options: { leg: 'espresso' },};let r = await (await fetch('https://share.plunk.io/sb/render', { method: 'POST', headers, body: JSON.stringify(body) })).json();// Show r.fallback.units (per-unit images) while it renderswhile (r.status === 'rendering') { await new Promise((res) => setTimeout(res, 3000)); r = await (await fetch(`https://share.plunk.io/sb/render/${r.renderId}`, { headers })).json();}import time, requests
headers = {"x-visualizer-key": "kk_••••", "x-surface": "sectional"}body = { "units": [ {"sku": "3772-LAL", "gx": 0, "gy": 0}, {"sku": "3772-ALC", "gx": 1, "gy": 0}, {"sku": "3772-COR", "gx": 2, "gy": 0}, {"sku": "3772-RAC", "gx": 2, "gy": 1}, ], "fabricKey": "2001-05", "options": {"leg": "espresso"},}r = requests.post("https://share.plunk.io/sb/render", headers=headers, json=body).json()while r["status"] == "rendering": time.sleep(3) r = requests.get(f"https://share.plunk.io/sb/render/{r['renderId']}", headers=headers).json(){ "status": "ready", "url": "https://…/hero.png", "configHash": "b04c…"}{ "status": "rendering", "renderId": "f2a91c…", "configHash": "b04c…", "fallback": { "units": [ { "sku": "3772-LAL", "url": "https://…/3772-lal-neutral.png" } ] }, "schematicUrl": "https://…/schematic.png"}fallback carries the per-unit images so the app can show an exploded view while it waits.
GET /sb/render/{renderId}
Section titled “GET /sb/render/{renderId}”Poll the render. Every result is checked against the units before it can serve. pending_review means it rendered but is waiting on staff approval and won’t serve until approved.
{ "status": "rendering" }{ "status": "pending_review" }{ "status": "failed", "verifyNote": "…" }{ "status": "ready", "url": "https://…/hero.png" }POST /sb/save
Section titled “POST /sb/save”Save the configuration and, when the shopper leaves an email, mint a branded board with the hero render and email them the link. If the render is still in flight, pass the renderId from /sb/render: the board waits for the render and the email goes out when it’s ready.
| Field | Type | Notes |
|---|---|---|
units |
array | Required. Same placement objects as /sb/render |
fabricKey |
string | Required. |
options |
object | Selected options, kind to key |
title |
string | Board title, default “My sectional” |
email |
string | Captures the lead and emails the board |
renderId |
string | An in-flight render to attach the board to |
{ "configId": "8c1b04d2ee…", "totalPrice": 4796.00, "boardUrl": "https://share.plunk.io/b/1f8e02aa41cd6b", "pendingBoard": false, "message": null}totalPrice is null when the key hides pricing. If the render was still in flight, pendingBoard is true and the board link is emailed on approval.
Related
Section titled “Related”Still stuck? Contact support and include the job or page you were on.