Incoming Webhooks
Incoming webhooks let external systems (GitHub, Stripe, your own app) POST events to Islo. Each delivery is authenticated, mapped to a sandbox, and runs a sequence of actions — create the sandbox if needed, resume it, forward the payload to a port inside it, pause, or delete.
Create a webhook via the SDK or POST /webhooks/incoming. The response includes a receiver_url — paste that into GitHub, Stripe, or any HTTP client. External callers hit that URL; you manage the config through the authenticated API.
How a delivery flows
Management endpoints (all under the compute plane Webhooks tag in API Reference):
Set status to disabled to stop processing without deleting the config.
Target resolution
Every delivery targets exactly one sandbox. Choose how the name is determined:
For sandbox_name_from_event, optional guards restrict what names are allowed:
required_prefix— e.g.pr-so onlypr-42style names matchallowed_pattern— regex allowlistallowed_names— explicit list
Example: derive a sandbox name from a GitHub PR number in the JSON body:
Rules and actions
A webhook has one or more rules. Each rule has:
when(optional) —json_path+equalsfilter on the payload; omit to run on every deliveryactions— ordered list of steps to run against the resolved sandbox
ensure_sandbox is the create-if-missing step. It does not recreate or update an existing sandbox. The template mirrors a create request: image, vcpus, memory_mb, disk_gb, optional gateway_profile, workdir, and optional lifecycle for auto-pause and delete.
Typical preview-env chain: ensure_sandbox → deliver_to_port with auto_resume: on_activity so a cold sandbox wakes before the HTTP forward.
Authentication
auth verifies the caller before any rule runs. Supported auth_type values:
Secrets are passed inline at create time as {name, value} pairs inside the verifier config. Responses redact values and return secret_ref names only.
Idempotency
idempotency deduplicates retries. Extract a key from:
- a header (
source: header,name: X-GitHub-Delivery) - a header param (
source: header_param) - a JSON path in the body
- the raw body SHA-256 (
source: body_sha256)
Duplicate keys within the retention window are acknowledged without re-running actions.
Example: GitHub PR preview
Per-PR sandbox with lifecycle policy, GitHub HMAC auth, and delivery to a dev server on port 3000:
deliver_to_port has its own auto_resume field, separate from the sandbox lifecycle.auto_resume. Set both to on_activity when you want webhook delivery to wake a paused sandbox before forwarding.
payload on deliver_to_port controls what gets forwarded (original sends the raw webhook body). Optional path appends a path segment on the upstream request.
Tips
- PR previews: combine
ensure_sandbox, a lifecycle policy, anddeliver_to_portso each PR gets its own sandbox that pauses when idle and deletes onclosed. - Cold starts: set
auto_resume: on_activityon both the sandbox lifecycle anddeliver_to_portso paused sandboxes wake before the payload is forwarded. - Deduping: always configure idempotency for providers that retry (GitHub, Stripe) to avoid duplicate sandbox actions.