Docs
Integrations
Webhook

Webhook / REST

Receive a signed JSON payload for every published article β€” send it anywhere you like.

The Webhook integration is IndexPine's most flexible publishing option. When an article is published, IndexPine makes a single POST request to the URL you specify with the full article content as a JSON body. This works with any backend, any CMS, any automation platform, or any database that can accept an HTTP request.

Setting up the webhook

  1. In your IndexPine dashboard, go to Settings > CMS Connection.
  2. Select "Webhook" as the CMS type.
  3. Enter the full HTTPS URL of your endpoint in the "Webhook Endpoint URL" field.
  4. Generate a Webhook Secret by clicking "Generate secret" β€” or paste your own random string. Keep this secret private.
  5. Click "Test connection". IndexPine will send a ping payload to verify your endpoint responds with 2xx.

Verification ping format

When you save or test your webhook endpoint in IndexPine, a test ping is sent immediately to verify your endpoint responds with 2xx:

json
{
  "event": "verification",
  "sentAt": "2026-06-29T09:00:00.000Z"
}

Payload format

Every published article sends an HTTP POST request with this exact JSON payload structure:

json
{
  "event": "article.published",
  "publishedAt": "2026-06-29T09:00:00.000Z",
  "site": {
    "name": "My SaaS Blog",
    "url": "https://myblog.com",
    "language": "en"
  },
  "article": {
    "title": "10 Proven SEO Strategies for SaaS Companies in 2025",
    "slug": "seo-strategies-saas-companies",
    "metaDescription": "A concise teaser of the article suitable for meta descriptions.",
    "language": "en",
    "translationGroupId": null,
    "wordCount": 2340,
    "seoScore": 88,
    "sources": [
      {
        "url": "https://example.com/study",
        "title": "Industry study"
      }
    ],
    "markdown": "# 10 Proven SEO Strategies for SaaS Companies in 2025\n\n...",
    "html": "<h1>10 Proven SEO Strategies for SaaS Companies in 2025</h1><p>...</p>"
  },
  "images": [
    {
      "url": "https://cdn.indexpine.com/images/art_01hx9z.jpg",
      "alt": "10 Proven SEO Strategies for SaaS Companies in 2025"
    }
  ]
}

Payload Field Dictionary

  • event (string) β€” Set to "article.published" for publication events, or "verification" for test pings.
  • publishedAt (string) β€” ISO 8601 timestamp when the article went live.
  • site.name (string) β€” Name of your site configured in IndexPine.
  • site.url (string) β€” Base domain URL of your website.
  • site.language (string) β€” Primary target locale language code (e.g. "en", "es", "fr").
  • article.title (string) β€” The headline of the published article.
  • article.slug (string) β€” URL-friendly slug.
  • article.metaDescription (string) β€” One-paragraph summary designed for meta tags.
  • article.wordCount (number) β€” Total word count of the article.
  • article.seoScore (number) β€” Computed SEO quality score (0-100).
  • article.sources (array) β€” Primary citations with "url" and "title".
  • article.markdown (string) β€” Complete article body in Markdown format.
  • article.html (string) β€” Semantically formatted, clean HTML containing headings, paragraphs, blockquotes, and lists.
  • images (array) β€” Array of image objects containing "url" and "alt" text.

Verifying the signature

Every request IndexPine sends includes two headers:

  • Authorization: Bearer <your-webhook-secret>
  • x-webhook-secret: <your-webhook-secret>

Your endpoint should validate this header before processing the payload to ensure the request genuinely came from IndexPine and has not been tampered with. Here is an example in Node.js:

javascript
app.post('/indexpine-webhook', (req, res) => {
  const secret = req.headers['x-webhook-secret'];
  if (secret !== process.env.INDEXPINE_WEBHOOK_SECRET) {
    return res.status(401).send('Unauthorized');
  }
  const { event, article } = req.body;
  if (event === 'article.published') {
    // Save to your database, post to your CMS, etc.
    console.log('New article:', article.title);
  }
  res.status(200).send('OK');
});

Retry behaviour

If your endpoint returns a non-2xx status code or times out (IndexPine waits up to 10 seconds for a response), IndexPine will retry the delivery up to three more times at 5-minute intervals. After four failed attempts the delivery is marked as failed and an alert appears in your dashboard.

Testing with webhook.site
During development, use webhook.site to get a temporary public HTTPS URL. Paste it as your Webhook Endpoint URL in IndexPine, then generate a test article β€” you will see the full payload arrive in real time.