HTTP signals receive JSON payloads over POST. The same endpoint serves two use cases:Documentation Index
Fetch the complete documentation index at: https://docs.hellofriday.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Webhooks from external services (GitHub, Bitbucket, Jira, etc.) delivered through the bundled tunnel
- Programmatic triggers from the CLI, Studio, or API calls directly against Friday
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
path | string | Yes | — | HTTP path for the webhook (method is always POST) |
timeout | string | No | — | Max time before the signal handler gives up (e.g. 30s, 2m) |
Example
workspace.yml
Webhook URLs
External services deliver events to the bundled tunnel, which forwards them into Friday. The public URL shape is:{tunnel-domain}— your Cloudflare tunnel host (ephemeral, shown in Studio → Settings → Webhook tunnel){provider}— determines how the incoming payload is transformed before reaching your job{workspaceId}— the workspace owning the signal{signalId}— the signal name fromworkspace.yml
Built-in providers
| Provider | Behavior |
|---|---|
github | Extracts pr_url from GitHub pull request events |
bitbucket | Extracts pr_url from Bitbucket pull request events |
jira | Extracts issue_key, project_key from Jira issue events |
raw | Forwards the payload as-is (no transformation) |
Webhook mappings
The tunnel uses awebhook-mappings.yml file to decide which events to accept and how to extract signal payload fields from incoming webhook bodies. The image ships with sensible defaults for the starter spaces.
Each provider entry defines:
event_headerorevent_field— where to find the event type (HTTP header for GitHub/Bitbucket, body field for Jira)signature_header— header used for -SHA256 verificationevents— map of event names to an optionalactionsfilter and amappingof output field to dot-path into the webhook body
Default webhook-mappings.yml
Default webhook-mappings.yml
Customizing mappings
Place a customwebhook-mappings.yml in the config/ subdirectory of the Friday home directory (default ~/.atlas/config/webhook-mappings.yml). Friday loads it on startup, overriding the built-in defaults.
Triggering manually
The same signal can be fired directly against Friday — no tunnel, no provider prefix. This is how Studio’s Run button,friday signal trigger, and any API caller invoke HTTP signals.
| Field | Type | Description |
|---|---|---|
payload | object | Signal payload — validated against schema if present |
streamId | string | Optional stream ID for Server-Sent Events progress |
Payload validation
If a signal declares aschema block, the payload is validated before the job runs. Invalid requests get a 400 with the specific validation error; the job never starts.
workspace.yml
Signature verification
For external webhooks, the tunnel verifies HMAC-SHA256 signatures using thesignature_header defined in the mapping. Set the shared secret on the external service’s side; Friday looks it up from workspace credentials.
If signature verification fails, the tunnel returns 401 and the event never reaches Friday.
Troubleshooting
Tunnel URL keeps changing
Tunnel URL keeps changing
The default development tunnel is ephemeral — it gets a new random URL on every restart. For production, set
TUNNEL_TOKEN to use a named Cloudflare tunnel with a stable hostname, or point the external service at a real reverse proxy.Events are delivered but the job doesn't run
Events are delivered but the job doesn't run
Check that the event type is in the
events: list for your provider in webhook-mappings.yml. Events not listed are dropped silently. Also check that actions (if present) includes the action on the incoming event — e.g. GitHub PR events with action: closed are filtered out by the default mapping.Payload is empty in the job
Payload is empty in the job
Double-check the dot-paths in the mapping — a typo (e.g.
pull_request.url instead of pull_request.html_url) silently resolves to undefined and the job sees an empty payload. Mapping errors don’t fail the webhook; they just produce empty fields.Signature verification fails
Signature verification fails
The shared secret on the external service must match what Friday has stored. For GitHub, set the webhook secret in repo settings and rotate the corresponding Friday credential in the same push. Trailing whitespace in copied secrets is a common cause.

