How to Test Linear Webhooks
Capture Linear issue, comment, and project events with HMAC-SHA256 signatures — inspect every payload before writing your handler.
TL;DR: Copy a URL from requex.me, go to Linear Settings → API → Webhooks → New webhook, paste the URL, select the resources you care about, and create or update an issue. The signed JSON payload appears in Requex immediately.
What Linear Sends
Linear webhooks send clean, well-structured JSON. Unlike Jira, Linear sends one event per request — no batching. Each webhook includes the full object representation plus metadata about the actor and the type of change.
| Resource | Actions | Use Case |
|---|---|---|
Issue | create, update, delete | Status sync, Slack alerts, GitHub PR linking |
Comment | create, update, delete | Notifications, activity feeds |
Project | create, update | Portfolio tracking, reporting |
Cycle | create, update, complete | Sprint metrics, velocity tracking |
Step 1 — Generate a Requex Endpoint
Open requex.me and copy your unique URL:
https://requex.me/hook/a1b2c3d4-e5f6-7890-abcd-ef1234567890
Step 2 — Configure Linear Webhook
- In Linear, click your workspace name in the top-left and go to Settings.
- In the left sidebar, find API under the Developer section.
- Click Webhooks, then New webhook.
- Paste your Requex URL into the URL field.
- Optionally add a Label (e.g., "Requex Dev Test") for easy identification.
- Select which resources to subscribe to: Issues, Comments, Projects, and Cycles are the most common.
- Optionally scope to a specific team using the Team dropdown.
- Click Create webhook. Linear immediately displays the signing secret — copy it for signature verification later.
Step 3 — Trigger a Test Event
Create a new issue in Linear: click the + button in any team's issue list, add a title, and press Enter. The Issue create event fires immediately and appears in Requex.
To test updates, change the issue's status, priority, or assignee. Linear fires one webhook per change — unlike Jira, changes to multiple fields do not batch into a single event.
Step 4 — Inspect the Payload
In Requex, click the incoming request. Linear sends a compact but complete JSON object:
{
"action": "create",
"actor": {
"id": "usr_abc123",
"name": "Jane Smith",
"email": "jane@example.com"
},
"createdAt": "2026-04-05T12:00:00.000Z",
"data": {
"id": "iss_xyz789",
"title": "Fix login redirect bug",
"description": "Users are being redirected to /home after OAuth instead of /dashboard",
"priority": 2,
"state": {
"id": "state_abc",
"name": "Todo",
"type": "unstarted"
},
"team": {
"id": "team_def",
"name": "Backend"
},
"assignee": null,
"labels": [],
"estimate": 3,
"identifier": "BACK-42"
},
"type": "Issue",
"organizationId": "org_ghi456",
"webhookTimestamp": 1712345678901
}Notice the top-level action field ("create", "update", or "remove") and type field ("Issue", "Comment", etc.) — these are the two fields your handler should use to route events. Also check the Headers tab for the linear-signature header.
Linear Signature Verification
Linear signs every webhook with HMAC-SHA256 using the secret shown when you created the webhook. The signature is sent in the linear-signature header as a hex digest.
// Node.js — verify Linear HMAC-SHA256 signature
const crypto = require('crypto');
function verifyLinearSignature(rawBody, signature, signingSecret) {
const expected = crypto
.createHmac('sha256', signingSecret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expected, 'hex')
);
}
// Express handler
app.post('/webhooks/linear',
express.raw({ type: 'application/json' }),
(req, res) => {
const sig = req.headers['linear-signature'];
const secret = process.env.LINEAR_WEBHOOK_SECRET;
if (!verifyLinearSignature(req.body, sig, secret)) {
return res.status(403).send('Invalid signature');
}
const { type, action, data, actor } = JSON.parse(req.body);
if (type === 'Issue' && action === 'create') {
console.log('New issue:', data.identifier, data.title);
}
res.sendStatus(200);
}
);Use Requex to capture a real Linear request, copy the exact raw body and linear-signature header, and test this verification function locally before deploying.
Common Issues
| Problem | Cause | Fix |
|---|---|---|
| No events from specific team | Webhook scoped to a different team | Edit the webhook and change the Team filter to "All teams" or the correct team |
| Signature verification fails | Body parsed before reaching the raw buffer check | Use express.raw() on the route — not express.json() |
| Missing signing secret | Secret only shown once at creation time | Delete and recreate the webhook — the secret cannot be retrieved after initial creation |
Test Linear Webhooks Free
Capture real Linear payloads and verify signatures without deploying a server. No signup required.
Open Requex →Related guides
Start Testing Webhooks Now
Generate your unique URL and test webhooks instantly. Free, no signup.
Open Webhook Tester →