Skip to main content
HTTP signals receive JSON payloads over POST. The same endpoint serves two use cases:
  • 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
There’s no separate “manual” signal type — triggering by hand is just a POST to the HTTP signal’s API route.

Config

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 → SettingsWebhook tunnel)
  • {provider} — determines how the incoming payload is transformed before reaching your job
  • {workspaceId} — the space owning the signal
  • {signalId} — the signal name from workspace.yml

Built-in providers

Configure these URLs in the external service’s webhook settings (GitHub repo settings, Bitbucket repository webhooks, Jira automation) to wire them into Friday workflows.

Webhook mappings

The tunnel uses a webhook-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_header or event_field — where to find the event type (HTTP header for GitHub/Bitbucket, body field for Jira)
  • signature_header — header used for -SHA256 verification
  • events — map of event names to an optional actions filter and a mapping of output field to dot-path into the webhook body

Customizing mappings

Place a custom webhook-mappings.yml in the config/ subdirectory of the Friday home directory (default ~/.friday/local/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.
The request body accepts two fields: The response is an execution handle that streaming clients can attach to.
friday signal trigger -n <signalId> -w <workspaceId> is the CLI wrapper for this call. See the CLI reference for the full command shape.

Payload validation

If a signal declares a schema 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 the signature_header defined in the mapping. Set the shared secret on the external service’s side; Friday looks it up from space credentials. If signature verification fails, the tunnel returns 401 and the event never reaches Friday.

Troubleshooting

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.
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.
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.
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.