Claude Dynamic Workflows events vs Sume's single terminal run event
Anthropic's Oct 9 Dynamic Workflows beta streams workflow_run.* events. Sume sends one terminal webhook per run, no stream. How to fan out and track progress.

Anthropic's release notes for October 9, 2026 describe Dynamic Workflows for Claude Managed Agents, a beta behind the managed-agents-2026-04-01 header. An agent writes a workflow for work with many pieces, runs many agents in phases, combines the results, and you follow progress through workflow_run.* events on the session event stream.
Sume's model is the opposite on the wire. There is no SSE or WebSocket transport on the Developer API. A run emits one signed terminal event, and the fan-out is something you queue yourself or ask Sume to queue for you.
Progress on Sume
Three pull or push options exist, and none is a live stream. For Format runs, GET /v1/format-runs/{run_id}/events returns the phase timeline, oldest first. For generation jobs, GET /v1/jobs/{id}/events returns a public timeline snapshot. For completion, a run webhook (format.run.terminal, action.run.terminal or agent.run.terminal) fires exactly once per turn, whatever the number of artifacts.
Action runs differ: there is no events endpoint for them, and events_url is always null on the receipt.
| Surface | Progress source | Terminal push |
|---|---|---|
| Format run | GET /v1/format-runs/{id}/events (phases) | format.run.terminal |
| Agent Completion | Poll /v1/agent-runs/{id} | agent.run.terminal |
| Action run | Poll status only; events_url is null | action.run.terminal |
| Generation job | GET /v1/jobs/{id}/events (snapshot) | job.completed / failed / canceled |
Fan-out without a workflow engine
For many pieces of work, POST /v1/formats/{handle}/{slug}/bulk-runs queues up to 100 Format runs with a concurrency window from 1 to 16, and returns a 202 queue receipt. Poll GET /v1/format-run-queues/{queue_id} for counts and read each child at GET /v1/format-runs/{run_id}. There is no public cancel for the queue; cancel children one at a time.
Each item is one ordinary run: one sandbox, one agent turn. The queue is not a different engine, so a workflow that depends on agents calling each other is not what this gives you.
- Use
communication.webhook_urlto avoid a poll loop per child. - Dedupe on
request_id, which equalsrun_idand is stable across retries. - Branch on
outcome(ok,degraded,error), not onlystatus.
Choosing
If you want an agent that plans its own phases and streams events, Anthropic's beta is built for that. If you want durable, billable runs with receipts and a spend cap that you start from your backend, Sume's run model fits. See one terminal event vs a stream for the delivery side.
Handling the single event
Because the terminal event fires once per turn, your receiver is simpler than a stream consumer. Verify the signature on the raw body, store the event under request_id, return 2xx, and process afterwards. Branch on outcome. A degraded run billed you and produced real artifacts but could not fill your output_schema, so route it to review, not to retry.
Canceled and skipped runs send no webhook. After you call cancel, poll status_url until the status is canceled. If a delivery fails ten times, Sume marks it exhausted; fetch the receipt from result_url or use Redeliver on the Format run, which does not consume one of the automatic attempts.
Sources
Related posts
More in Developers
- Compare GET /v1/balance micros with a clip total, in integers
Balance comes as USD micros and cents. A 30 s Seedance 720p clip is 17,334,000 micros, 1,733 cents rounded down. Integer compare, plus the expiring-soon fields.
- Contract test for 1:4, 4:1, 1:8, 8:1: pytest on /v1/images/models
A 12-line pytest that fails CI if Sume stops listing the Nano Banana 2.1 strip ratios. It reads GET /v1/images/models, so it generates nothing.
- Video Router body to /v1/videos: frame_images, input_references
Map Video Router image_url, end_image_url and reference_image_urls to /v1/videos frame_images and input_references, with a Node converter.
- Count queued and processing jobs with GET /v1/jobs before a wave
Page GET /v1/jobs with status=queued and status=processing, subtract from concurrency_limit, and submit only that many Seedance 2.5 or Omni clips.
Written by Sume