Integrations/Webhook
Flexible

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 — always application/json
  • X-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.

See WordPress setup →