Mobidoo

Bulk runs

The real sheet-driven POST /v1/formats/mobidoo/live-commerce/bulk-runs Mobidoo fired — envelope, raw item body, and how to poll the queue.

Mobidoo uses two methods to run live-commerce. The Live Commerce API page gives the single-run method with typed clips: one POST …/runs, a receipt with opening[] / middle[] / closing[], and thread-based clip retry.

This page gives the other method, a sheet-driven batch. One row of the broadcast sheet becomes one item. The full sheet becomes one POST …/bulk-runs. The schema keeps only full_video, the one field that the batch uses. The 2026-08-28 HBS No.45–65 batch used this shape. This page gives that batch in full, so that your backend can make the same body.

This method does not replace the clip schema. For typed clips and per-scene retry, continue to use mobidoo/live-commerce/v1.

Workspace key

The rule is the same as for all Mobidoo Format calls. Use a Mobidoo team workspace API key (a key created under the Mobidoo team, not a personal key). If you use a personal key to call mobidoo/live-commerce, the call fails with 403 workspace_key_required. Refer to Team Formats need a team key.

The key must have formats:write to create the queue and formats:read to poll the queue. You cannot add scopes to a key after you create it. Create a new key.

If you are not in the Mobidoo workspace yet, ask 허채원 (Chase Huh) for an invite on Slack. You can also send an email to chase@sume.com. Refer to Workspace access.

The call

Keep the body in a file. When each row has its own VO, the body is much too long for a shell heredoc.

Create a new Idempotency-Key for each batch ($(uuidgen)). If you send a used key again, the API returns 202 and the old queue. The API does not start a new queue.

The envelope

bulk-runs-body.json has two keys. All other data is in each item.

The 2026-08-28 batch sent concurrency: 2 and 20 items: HBS No.45 to No.65, but not No.50. That row had no completed draft. Remove such rows on the client side. There is no “empty item” that you can send.

The item sequence is the sequence in which you send the items. items[i].index on the receipt is that position. Thus, keep your own map of each sheet row to its index.

The create call returns 202 with a frq_… queue. At that time, the first concurrency items are in progress. These values identify the batch above: queue frq_cfd22d14-68db-4aeb-9816-404a79f0badf, live-commerce v38, and counts at create 20 total / 2 running / 18 queued. Only the key that created that queue has access to it. You cannot GET the queue with your key.

The Bulk runs page gives the full envelope contract, the limits (concurrency 1–16, items 1–100), the queue receipt shape, and all error codes.

Item 0 — the raw body

Each item is the same as the body of one POST …/runs. The block below is item 0 (sheet No.45) as the batch sent it, with two changes: communication.webhook_url is a placeholder, and the spend cap uses the current generation_spend_cap_credits field with an example value. The other 19 items have the same six keys, with the data of their own rows.

What each key is doing

KeyNotes
instructionProse and the raw sheet row. The tab-separated block is the sheet line, copied with no change. The quoted block is the full approved VO. No step parses the text before the Format reads it.
inputThe same row again, as structured JSON. Thus, your backend does not depend on the Format to parse the TSV again. script.segments has the VO as one long block, not as one object for each cut.
output_schemamobidoo/live-commerce/desk-iamdry/v1, strict: false, and only full_video as a required field (SumeMediaFile#). If a batch publishes only the assembled cut, it is better not to ask for clip arrays that the batch will not read.
primary_output_key"full_video".
generation_spend_cap_credits8000 for each item. This value is the ceiling for that one child run, not for the queue. Twenty items can use twenty caps.
communicationThe terminal webhook for each item. This page shows it as https://example.com/hooks/format-run. Set it to your own endpoint.

desk-iamdry/v1 is a schema name that applies only to its request. It is not a new partner contract. When you bind this schema, the schema changes what that run returns. The schema does not rebase mobidoo/live-commerce/v1.

instruction and input each give the row, because the two keys have different functions. instruction is guidance. input is data. Refer to what is carried.

Also obey the size limits in Size: two limits. The API rejects input if it has more than 2 MiB (2097152 UTF-8 bytes) or more than 64 top-level properties. Below these limits, the API carries the full value into the run. When the API carries instruction into the run, the API cuts the text at approximately 4 000 characters. The API gives no error for this cut.

After the 202

  • The queue has no webhook. Each item has its own communication.webhook_url. There is no callback at the queue level. Poll status_url (GET /v1/format-run-queues/{queue_id}) to get the progress.
  • The queue status completed does not mean “all succeeded.” It means that all items are terminal. Examine counts.failed and counts.canceled to select the next step.
  • Read the failures on the child run. Use items[i].run_id to call GET /v1/format-runs/{run_id}. The queue item has only the general format_run_failed.
  • Each child is a usual Format run. Thus, you can repair a weak row on its own thread with previous_run_id. But you can do this only when the body binds the clip schema. With only full_video, there are no scene ids that you can name.

Next