Documentation Index
Fetch the complete documentation index at: https://docs.roboticks.io/llms.txt
Use this file to discover all available pages before exploring further.
Webhooks
Every action GitHub takes that matters to Roboticks — a PR opened, a push tomain, an installation suspended — arrives as a webhook delivery to https://api.roboticks.io/api/v1/github/webhooks. This page documents what we listen to, how we verify it, and what happens next.
Endpoint
X-GitHub-Delivery, and returns within 1 second for every delivery (heavy work is queued).
Subscribed events
| Event | Sub-actions handled | What we do |
|---|---|---|
installation | created, deleted, suspend, unsuspend | Create / disable / re-enable the installation record. On deleted, retain history; on suspend, stop dispatching new jobs. |
installation_repositories | added, removed | Sync the project ↔ repo mapping. Removed repos go to a disconnected state but historical data is retained. |
pull_request | opened, synchronize, reopened, ready_for_review, closed | Enqueue a test run for the head SHA. On closed we cancel any in-flight job for that PR. |
push | created, deleted (branch) | Trigger runs for branches that match the project’s branch policy — by default main, master, and release/*. |
workflow_run | completed | If a customer runs the Roboticks SDK inside their own GitHub Actions workflow, we pick up the JUnit + MCAP artifacts via this event. |
check_suite | rerequested, requested | Re-dispatch the test run when a user clicks Re-run all jobs on the Check Suite. |
What happens on a delivery
The HTTP response is always within 1 s because we acknowledge before processing. GitHub retries on 5xx; we do not want to be in the retry loop, so heavy work is queued behind a fast ack.HMAC verification
Each installation has a webhook secret rotated every 90 days. GitHub signs every delivery with that secret using HMAC-SHA256 over the raw request body. The signature arrives inX-Hub-Signature-256.
- We verify on the raw body, before JSON parsing. Reformatting the body invalidates the signature.
- We use
hmac.compare_digestfor constant-time comparison — no timing side channels. - Any failure short-circuits to HTTP 401 and the delivery is dropped. GitHub will retry; if your secret has actually rotated and our copy is stale, the retries will all fail and you’ll see the corresponding alert on the dashboard.
Replay protection
X-GitHub-Delivery is a UUID per delivery. We store every delivery ID for 24 hours in Redis and 401 on any duplicate. Why:
- A leaked-but-valid signed payload can’t be replayed to re-trigger a job.
- A malicious mirror that captures and re-posts cannot bypass the window.
Payload examples
pull_request.opened (excerpt)
pull_request.opened (excerpt)
installation.created (excerpt)
installation.created (excerpt)
check_suite.rerequested (excerpt)
check_suite.rerequested (excerpt)
Delivery observability
Two surfaces:- GitHub side —
Settings → Applications → Roboticks → Advanced → Recent Deliveries. Every delivery, its payload, our response code, and a redeliver button. - Roboticks side —
Settings → Integrations → GitHub App → Webhook log. Same data, plus the resolved installation, project, and downstream job ID for each delivery.
Skipped deliveries
We accept the delivery (202) but skip downstream processing if:- The installation is suspended.
- The repo has been removed from the installation since the event fired.
- The repo is not linked to any Roboticks project (this is normal during onboarding).
- The PR is a draft and the project’s policy excludes drafts (default: skip drafts).
Next
Permissions
The scopes that back the webhook handler.
Check Runs
The output produced by a webhook-triggered job.
Troubleshooting
Webhook 4xx errors and how to recover.