Deliver articles to any CMS via webhook
When an article is published, ClimbrIQ can send a JSON payload to your endpoint. Use it to create posts in a headless CMS, trigger an internal workflow, or feed a custom publishing pipeline.
How it works
Once enabled for a brand, ClimbrIQ makes an HTTP POST request to your webhook URL each time an article is published — whether published manually or via automation.
ClimbrIQ treats any 2xx response as success. Non-2xx responses are treated as delivery failures and shown to the user. There is no automatic retry.
Request format
Method
POST
Content type
application/json
Headers
Content-Type— alwaysapplication/jsonX-Webhook-Secret— the secret value configured for the brand (empty string if not set)
Payload (example)
{
"title": "How to Improve Your Local SEO in 2025",
"content": "<full article body as plain text / markdown>",
"excerpt": "A concise one-sentence summary of the article.",
"slug": "how-to-improve-local-seo-2025",
"metaTitle": "How to Improve Your Local SEO in 2025",
"metaDescription": "Discover actionable steps to boost your local search rankings and attract more nearby customers.",
"category": "Local SEO",
"status": "publish"
}Note: the automation publish path may omit some optional fields. Receivers should handle missing fields gracefully.
Authentication
ClimbrIQ sends X-Webhook-Secret with every request. We recommend validating it on your endpoint before processing the payload.
const secret = request.headers.get('X-Webhook-Secret');
if (secret !== process.env.EXPECTED_SECRET) {
return new Response('Forbidden', { status: 403 });
}Example receiver (Next.js Route Handler)
// app/api/climbriq-webhook/route.ts
import { NextResponse } from 'next/server';
export async function POST(request: Request) {
const secret = request.headers.get('X-Webhook-Secret');
if (secret !== process.env.CLIMBRIQ_WEBHOOK_SECRET) {
return NextResponse.json({ error: 'Forbidden' }, { status: 403 });
}
const body = (await request.json()) as {
title: string;
content: string;
excerpt?: string;
slug: string;
metaTitle?: string;
metaDescription?: string;
category?: string;
status?: string;
};
// Save or publish the article in your CMS
await yourCms.createPost({
title: body.title,
body: body.content,
slug: body.slug,
excerpt: body.excerpt ?? '',
seoTitle: body.metaTitle ?? body.title,
seoDescription: body.metaDescription ?? '',
});
return NextResponse.json({ received: true });
}Want the easiest setup?
If you’re on WordPress, the plugin-based integration is usually the fastest route.