Webhook (Zapier, Make, n8n, custom)
Receive every finished article as a signed JSON webhook — exact payload, headers, signature verification, and a Zapier walkthrough.
For any site without a native integration, Climb AI delivers each finished article as one signed HTTPS POST to a URL you control — as HTML, Markdown and plain fields, so a Zapier zap, a Make scenario, an n8n workflow, or your own route can each take what they need.
- 1Create an endpointA Zapier "Catch Hook" trigger, a Make/n8n webhook trigger, or a route on your own site — public HTTPS only; Climb AI rejects
http://and internal/private hosts. - 2Add it in Climb AIIn site setup, choose Webhook and paste the URL. Leave the secret blank to have one generated (shown once, starts with
whsec_), or paste your own. - 3Verify with a pingClimb AI sends a signed
pingevent and requires a 2xx response before saving the connection.
What is sent
| Header | Value |
|---|---|
| Content-Type | application/json |
| X-ClimbAI-Event | article.published (or ping for the verification test) |
| X-ClimbAI-Delivery | A stable ID per article — art_<articleId> — so you can dedupe retries |
| X-ClimbAI-Signature | t=<unix timestamp>,v1=<HMAC-SHA256 hex digest> |
{
"id": "art_66f1c2...",
"event": "article.published",
"createdAt": "2026-09-13T10:15:00.000Z",
"data": {
"id": "66f1c2...",
"title": "How to Choose a Climbing Harness",
"slug": "how-to-choose-a-climbing-harness",
"html": "<h1>...</h1><p>...</p>",
"markdown": "# How to Choose a Climbing Harness\n\n...",
"excerpt": "A quick guide to fit, weight and gear loops.",
"seo": { "metaTitle": "...", "metaDescription": "...", "focusKeyword": "climbing harness" },
"featuredImageUrl": "https://.../featured.webp",
"ogImageUrl": "https://.../og.webp",
"scheduledFor": null,
"website": { "id": "...", "url": "https://example.com", "name": "Example Co" }
}
}function verify(secret, rawBody, header) {
const { t, v1 } = Object.fromEntries(header.split(',').map(kv => kv.split('=')));
if (Math.abs(Date.now() / 1000 - t) > 300) return false; // 5-min tolerance
const expected = require('crypto').createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
const a = Buffer.from(expected, 'hex'), b = Buffer.from(v1, 'hex');
return a.length === b.length && require('crypto').timingSafeEqual(a, b);
}What to return
Return a 2xx status within 15 seconds. Optionally reply with { "url": "https://yoursite.com/the-post" } if you know the live URL — Climb AI records it as the article's published URL; any other 2xx body is fine, it just won't know the URL.
Zapier Catch Hook walkthrough
- 1Create a ZapChoose Webhooks by Zapier as the trigger, event Catch Hook.
- 2Copy the URLPaste Zapier's generated webhook URL into Climb AI's Webhook integration setup.
- 3Test and buildTrigger a test send from Climb AI; Zapier captures the JSON as sample data you can map into the rest of the Zap using
data.html,data.markdown, or the SEO fields.
Frequently asked questions
Only for articles on a site connected via Webhook, at their scheduled publish date — the same moment a native integration would publish.
- Export articles (HTML, Markdown, JSON) — Download any article as HTML, Markdown or JSON straight from the editor — the JSON is the same object your webhook receives.
- Connect your site — What each onboarding step asks for, what gets auto-filled, and where to pick a publishing platform.
- Notifications — Which events notify you in-app or by email, and how to turn each category on or off.
5-day free trial, nothing charged until day 6, 30-day money-back after that.
5-day free trial · 30-day money-back · price locked for life
Still stuck? hello@climbai.io