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>"
},
"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:
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.