BigCommerce sends only the order ID: fetch it, then render a Sume clip
BigCommerce order webhooks carry a scope and an ID, not the order. Ack, fetch the order yourself, then submit POST /v1/videos to Sume with a stable key.

A BigCommerce webhook does not contain the order. It contains a scope, a data object with a type and an id, and a hash. So the pattern is three steps: answer 200 immediately, fetch the order from BigCommerce, then submit a video job to Sume and let Sume call you back when it is done.
Everything about the order itself (line items, product images, copy) has to come from your own call to BigCommerce, which this post does not cover. The Sume half is below.
What arrives from BigCommerce
Per the BigCommerce webhooks page, callbacks are deliberately small.
| Field | Content |
|---|---|
| store_id, producer | Which store and which BigCommerce producer sent it |
| scope | The event name |
| data | An object holding the event type and the id (the example shows only type and id) |
| hash | Used for duplicate detection |
What Sume gives you back
POST /v1/videos is asynchronous. A submit returns 202 with an id, a polling_url, a status and the model. The video is downloaded later from GET /v1/videos/{id}/content.
| Item | Value |
|---|---|
| Submit | POST https://api.sume.com/v1/videos |
| Response | 202 with id, polling_url, status (pending on submit), model |
| Completion notice | callback_url (HTTPS); the signed event is job.completed, job.failed or job.canceled |
| Required fields | model and prompt |
| Example model | seedance-2: 4 to 15 second durations, 480p, 720p and 1080p |
Submit with a key derived from the order
BigCommerce can deliver the same event more than once, so derive the Sume idempotency key from the order id. The Sume jobs docs say to send an Idempotency-Key on submit requests that a client may retry, and that the same key with the same payload returns the original job. The /v1/videos page itself does not list that header in its parameter table, so confirm it against the live OpenAPI before you rely on it; your own order-id lookup table is the fallback.
const KEY = process.env.SUME_API_KEY;
async function renderOrderClip(orderId, prompt) {
const res = await fetch("https://api.sume.com/v1/videos", {
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": `bc-order-${orderId}`,
},
body: JSON.stringify({
model: "seedance-2",
prompt,
duration: 5,
resolution: "720p",
callback_url: "https://hooks.example.com/sume",
}),
});
if (res.status !== 202) throw new Error(`submit failed: ${res.status}`);
return (await res.json()).id;
}
async function main() {
console.log(await renderOrderClip(1234, "Product shot, slow push-in"));
}
main();Wire it up
- BigCommerce handler: store the id, return 200 at once, enqueue the rest.
- Worker: fetch the order from BigCommerce, build the prompt, call renderOrderClip, save the Sume job id against the order.
- Sume callback handler: verify the HMAC signature, dedupe on job_id, fetch the result, attach the clip to the order.
- Backup: poll GET /v1/jobs/{id}/status if no callback arrives. Sume says to keep polls available for deliveries that never come.
Sources
Related posts
More in Integrations
- Calendly webhook signature t= v1= with 3 minutes vs Sume sume-v1
Calendly sends t=<ts>,v1=<sig> signed over t.body and suggests 3 minutes of tolerance. Sume signs timestamp.body as sume-v1; write a separate check for each.
- No generate_video tool for Sume in ChatGPT or Claude: Write is off
A Sume OAuth session with only mcp:read hides write and paid tools like generate_video. Reconnect with Write on, or use an API key; confirm in tools_list.
- Claude API MCP connector: public server, tool calls only, one toolset
The Claude API MCP connector reaches only public HTTP servers and supports only tool calls. mcp.sume.com fits. Here are the request, beta header and limits.
- Claude's MCP connector is not ZDR-eligible; what that means for Sume
Claude's MCP connector is not ZDR eligible and is unavailable on Bedrock and Google Cloud. For those cases, call Sume's REST API from your own backend.
Written by Sume