Integration guide

Connect your website and let RankOnPilot send a fresh blog draft every day.

This page shows the full process: how to add your site, wire a receiving endpoint, verify signatures, test the connection, and turn on daily automatic draft delivery.

Automatic daily flow

Automatic runs always push drafts, not live posts. This keeps the pipeline safe while still giving your CMS a fresh article every day.

Manual live publish

From the article editor you can explicitly publish live. That is the only path that marks the RankOnPilot article as published.

One scheduled keyword per day

When you approve multiple keywords, RankOnPilot schedules them sequentially, one per day, starting from the website's configured UTC hour.

Full connection process

Follow these steps once per website. After the connection is tested, RankOnPilot can keep sending daily drafts without any manual upload work.

1. Add your website

Create a workspace, open New website, then enter your site URL, niche, target audience, tone, language, and optional sample article URLs.

2. Choose the daily schedule

Pick the UTC hour when RankOnPilot should queue the next article. Approved keywords are scheduled one per day using that hour.

3. Build a receiving endpoint

Expose an HTTPS endpoint on your CMS, app, or middleware that accepts JSON, verifies the HMAC signature, and stores the incoming article as a draft.

4. Add the integration in RankOnPilot

Go to Dashboard > Integrations, choose the website, paste the webhook URL, add the signing secret, and optionally include a bearer token if your endpoint requires auth.

5. Send a test payload

Use Send test to verify your receiver before going live. RankOnPilot delivers a synthetic draft payload with the same headers and JSON shape used in production.

6. Turn on daily automation

Enable Auto-publish on the website and Auto-push drafts on the integration. After that, every scheduled keyword that becomes a finished article is pushed automatically as a draft.

What your endpoint receives

RankOnPilot currently ships a generic webhook adapter. Your receiver should accept a POST request, verify the signature using the raw JSON body, and create or update a draft in your CMS.

HTTP headers

HeaderValue
Content-Typeapplication/json
X-RankOnPilot-Signaturehex HMAC-SHA256 of the raw JSON body
X-RankOnPilot-Eventarticle.publish
X-RankOnPilot-Article-IdThe RankOnPilot article id
AuthorizationBearer <token> when you configured an optional bearer token

Example payload

{
  "event": "article.publish",
  "status": "draft",
  "sentAt": "2026-05-16T21:00:00.000Z",
  "website": {
    "url": "https://example.com"
  },
  "article": {
    "id": "cmp8k780l00019w490v1213q3",
    "title": "How to Improve B2B SaaS Onboarding Conversion",
    "slug": "how-to-improve-b2b-saas-onboarding-conversion",
    "metaDescription": "A practical guide to improving onboarding conversion.",
    "body": "<h2>...</h2><p>...</p>",
    "faq": [],
    "headings": [{ "level": 2, "text": "Why onboarding conversion matters" }],
    "keywords": ["b2b saas onboarding conversion"],
    "featuredImage": "https://res.cloudinary.com/...png",
    "wordCount": 1287,
    "readingTime": 6
  }
}

Example Next.js receiver

This example verifies the HMAC signature and returns an external URL that RankOnPilot can store on the article record.

import crypto from "node:crypto";
import { NextRequest, NextResponse } from "next/server";

function expectedSignature(secret: string, rawBody: string) {
  return crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
}

export async function POST(req: NextRequest) {
  const rawBody = await req.text();
  const signature = req.headers.get("x-rankonpilot-signature") ?? "";
  const secret = process.env.RANKONPILOT_SIGNING_SECRET ?? "";

  if (!secret || signature !== expectedSignature(secret, rawBody)) {
    return NextResponse.json({ error: "invalid signature" }, { status: 401 });
  }

  const payload = JSON.parse(rawBody);

  // Store as a CMS draft here.
  // Example fields you usually persist:
  // payload.article.title
  // payload.article.slug
  // payload.article.metaDescription
  // payload.article.body
  // payload.article.featuredImage

  return NextResponse.json({ ok: true, externalUrl: "https://example.com/admin/drafts/123" });
}

Ready to connect your site?

Start with one website, send a test payload, and turn on daily draft delivery once your receiver is saving articles correctly.