Webhooks - Publish from any tool

Publish to your site from the tools you already use

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.

Outrank

Auto-publish the SEO articles Outrank writes for you, straight into the category you pick.

n8n, Zapier and Make

Pipe content in from an RSS feed, a Google Doc, a Notion page or another CMS without writing code.

Your own scripts

Bulk-import an old archive, sync from your own backend, or build internal publishing tools.

AI agents

Let an agent draft and post on a schedule, sending drafts to review so an editor signs off first.

Set it up in a minute

1

Create the webhook

In your dashboard open your site settings, go to the Webhook tab and choose Create webhook.

2

Pick the defaults

Choose the category and author new posts go under. Each article can still override the category.

3

Copy URL and token

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.

The endpoint

POST https://app.fanvaiy.com/api/webhooks/posts
Header Value
Authorization Bearer <your-webhook-token>
Content-Type application/json

The payload

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.

Sending a request

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>" }
      ]
    }
  }'

The response

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" }
  ]
}

Status codes

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.

Why an article is skipped

  • Your plan's monthly post limit is reached
  • The site's subscription has expired
  • The site has no category or no author to fall back on
  • The article could not be saved

Good to know

Safe to re-send

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.

Counts toward your plan

New posts count toward your monthly post limit, the same as posts written in the editor. Updates do not.

Clean HTML only

Bodies are sanitized on import, so scripts, iframes and inline event handlers never reach your readers.

One site per token

A token only ever publishes to the site it belongs to. Run several sites and each gets its own webhook.

Connect your first tool

Create a webhook from your site settings and your next article can publish itself.