Webhooks - Publish from any tool
Every Fanvaiy site has its own webhook. Send articles to it from Outrank, n8n, Zapier, Make, an AI agent or your own CMS, and they appear on your site as posts, live or waiting in your review queue. No CMS login to share and no plugin to install.
Auto-publish the SEO articles Outrank writes for you, straight into the category you pick.
Pipe content in from an RSS feed, a Google Doc, a Notion page or another CMS without writing code.
Bulk-import an old archive, sync from your own backend, or build internal publishing tools.
Let an agent draft and post on a schedule, sending drafts to review so an editor signs off first.
In your dashboard open your site settings, go to the Webhook tab and choose Create webhook.
Choose the category and author new posts go under. Each article can still override the category.
Paste the webhook URL and token into your tool. Regenerate the token any time to cut off old access.
Keep the token private. Anyone holding it can publish to your site. You can also switch the webhook off without deleting it.
POST https://app.fanvaiy.com/api/webhooks/posts
| Header | Value |
|---|---|
| Authorization | Bearer <your-webhook-token> |
| Content-Type | application/json |
event_type must be
publish_articles and
data.articles holds up to 100 articles per request.
The optional timestamp is recorded as your last sync time.
{
"event_type": "publish_articles",
"timestamp": "2026-09-15T10:00:00Z",
"data": {
"articles": [
{
"id": "article-1042",
"title": "Article title",
"content_html": "<p>Full article body</p>",
"meta_description": "Short summary",
"image_url": "https://example.com/cover.jpg",
"slug": "article-title",
"created_at": "2026-09-15T10:00:00Z",
"category": "news",
"status": "published"
}
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Your own stable id for the article. Sending the same id again updates that post instead of creating a duplicate. |
| title | string | No | Post title. Falls back to "Untitled". |
| content_html | string | No | The article body as HTML. Scripts, iframes, inline event handlers and javascript links are stripped on import. |
| meta_description | string | No | Stored as the post summary. |
| image_url | string | No | Featured image for the post. |
| slug | string | No | URL slug for the post. |
| created_at | ISO 8601 | No | Publish date. Missing or invalid values fall back to now. |
| category | string | No | A category slug or id on your site. Unknown values fall back to the default category and are noted in the response. |
| status | string | No | "published" (default) or "pending_review". Only applied when the post is created, never on updates. |
The same call in whichever stack you work in. In n8n, Zapier or Make, use an HTTP request step with the same URL, headers and JSON body.
curl -X POST https://app.fanvaiy.com/api/webhooks/posts \
-H "Authorization: Bearer $FANVAIY_WEBHOOK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"event_type": "publish_articles",
"data": {
"articles": [
{ "id": "article-1042", "title": "Hello", "content_html": "<p>Hi</p>" }
]
}
}'
A 200 comes back even when some articles
are skipped, so always read the per-article articles
list and any errors notes.
Each article reports an action of created,
updated or
skipped.
{
"success": true,
"processed": 2,
"total": 3,
"errors": [
"Article a3: unknown category 'sportz', used default"
],
"articles": [
{ "id": "a1", "action": "created", "status": "published", "category": "news" },
{ "id": "a2", "action": "updated", "status": "pending_review", "category": "opinion" },
{ "id": "a3", "action": "created", "status": "published", "category": "news" }
]
}
| 200 | Request handled. Check each article for its result. |
| 400 | Wrong event_type, missing articles, or more than 100 in one request |
| 401 | Missing or unknown token, or the webhook is switched off |
| 500 | Something went wrong on our side. Retry later. |
Re-sending an article with the same id updates its content in place. It never unpublishes a live post or publishes one that is waiting for review.
New posts count toward your monthly post limit, the same as posts written in the editor. Updates do not.
Bodies are sanitized on import, so scripts, iframes and inline event handlers never reach your readers.
A token only ever publishes to the site it belongs to. Run several sites and each gets its own webhook.
Create a webhook from your site settings and your next article can publish itself.