Sume schedule run: communication.mode webhook alone sends nothing

On a Sume schedule run, communication.mode is descriptive only. Delivery starts when communication.webhook_url is set, an HTTPS URL up to 2,048 characters.

5 min readSume
All posts

Setting communication.mode to webhook on a schedule run does not by itself send a webhook. The Sume docs describe mode as descriptive only: it takes async (the default) or webhook, and it is communication.webhook_url that arms delivery. The URL must be HTTPS and at most 2,048 characters. Without it, the run behaves as async and you read the receipt by polling.

Request fields that touch delivery

The API silently drops unknown top-level properties instead of returning a 400. A misspelled communication key therefore looks accepted and then does nothing, which is the usual way a webhook run ends up silent.

Sume also accepts communication.callback_url as an alias for webhook_url; send one or the other. Top-level webhook_url, callback_url and mode are fal-shaped aliases that Sume normalizes into communication.*, and values that disagree between the two layers return 400 invalid_request.

POST /v1/actions/{action_id}/runs body fields (Sume docs as of 2026-10-09)
FieldTypeDefaultEffect
communication.modeasync or webhookasyncDescriptive only
communication.webhook_urlHTTPS URI, up to 2048noneTerminal delivery target; arms delivery
on_active_runskip or rejectskipWhat to do if a run is already active
inputobject{}Up to 64 properties and 2 MiB

Test it in the right order

Start a run with a public HTTPS URL and a fresh Idempotency-Key. Sume rejects localhost, private-network and non-HTTPS URLs with 400 invalid_request, so test against a tunnel or a staging host, not http://localhost. Read the receipt: it should return 202 with status queued and a next_action of poll_status. Then poll status_url until the run reaches a terminal status; polling always works whether or not a webhook is armed.

The run webhook docs describe the delivery contract, including what is sent and when. Read them before you write a receiver, and make the receiver refuse requests when its signing secret is empty rather than skipping verification.

What a webhook does not replace

Poll as a backstop. A run that has not reported within your own deadline should be read from status_url, and you can cancel it with cancel_url while it is queued or processing.

  • The receipt and the result route stay the source of truth; use them if a delivery is missed.
  • events_url on a receipt is always null, because there is no public run events route.
  • Canceled runs do not send a webhook; the status route still shows canceled.

One more check before production

Run the same request twice with the same Idempotency-Key. The second response should be an idempotency replay (idempotency_hit true) rather than a new run, which tells you your retry logic cannot double-start the schedule.

Sources

Related posts

More in Agents

All Agents posts

Written by Sume