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
- In your IndexPine dashboard, go to Settings > CMS Connection.
- Select "Webhook" as the CMS type.
- Enter the full HTTPS URL of your endpoint in the "Webhook Endpoint URL" field.
- Generate a Webhook Secret by clicking "Generate secret" — or paste your own random string. Keep this secret private.
- 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:
{
"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:
{
"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><script type=\"application/ld+json\">{...}</script>",
"jsonLd": {
"@context": "https://schema.org",
"@type": "Article",
"headline": "10 Proven SEO Strategies for SaaS Companies in 2025",
"description": "A concise teaser of the article suitable for meta descriptions.",
"image": "https://cdn.indexpine.com/images/art_01hx9z.jpg",
"datePublished": "2026-06-29T09:00:00.000Z",
"dateModified": "2026-06-29T09:00:00.000Z",
"author": { "@type": "Organization", "name": "My SaaS Blog" },
"publisher": { "@type": "Organization", "name": "My SaaS Blog" },
"mainEntityOfPage": { "@type": "WebPage", "@id": "https://myblog.com/seo-strategies-saas-companies" }
}
},
"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, with a schema.org Article JSON-LD <script> tag already appended — render it as-is and the structured data ships with it.
- article.jsonLd (object) — The same schema.org Article structured data as a raw object, in case you want to render or store it yourself instead of using the inline <script> tag already embedded in article.html.
- 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:
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.