Connecting any website via webhook

📅 September 16, 20263 min read
Table of Contents

Who it is for

If your site does not run on WordPress, Bitrix, InSales or Joomla, articles can be delivered by webhook. We send the finished article as a POST request to the address you configured, and a small handler on your side stores it the way your project does it.

Publishing to any website is available from the Starter plan and during the trial period.

Step 1. Add the site

  1. Open Sites → Add site.
  2. Choose the Any website platform.
  3. Enter the name, the site address and the address of the future handler, for example https://your-site.com/api/seowriter.
  4. Press Save and get the key.

Right after saving we show the secret key. It is visible in full only once — copy it and put it into your site configuration. The order is deliberate: without the key the handler cannot be written, so the connection test comes last rather than first.

Step 2. Add the handler

Take the ready file for your stack — the links are on the key screen and in site settings:

  • Next.js — an App Router route;
  • PHP — a single file placed in the site root;
  • Laravel — a controller and a route;
  • Python — a Django view plus a FastAPI variant.

You can hand the task to an AI assistant: the “Publishing to any website” page carries a ready prompt for Claude Code, Cursor or Codex — it describes the contract without secrets, and the assistant wires the handler following your codebase conventions.

Add the key to your environment as SEOWRITER_SECRET and restart the application.

Step 3. Test the connection

Return to Site settings and press Test connection — we send a probe request and show what your server replied. Then press Send a sample article: a real event with demo content arrives, and your monthly article quota stays untouched.

What arrives in the request

The body is more than HTML. Separate fields carry the title and H1, the slug, meta title and description, cover and images as links, question-answer pairs for a FAQ block, Schema.org markup, the category and a permanent article id.

The article.id never changes between deliveries — look your record up by it and update it, then a repeated delivery will not create a duplicate.

What to return in the response

A 200 is enough. But if you return {"ok": true, "url": "article URL"}, internal linking between articles, IndexNow submission and social announcements start working — all of them rely on the published page address.

Handler requirements

  • Reply fast and move heavy processing into a background job — we wait thirty seconds for a response.
  • Handle both events: article.published and article.updated. The update delivers the cover when it was rendered after publication.
  • Do not answer with a redirect — it counts as a delivery failure.
  • If your site sits behind nginx, raise client_max_body_size to at least 5 MB: a long article does not fit the default one megabyte.
  • Keep the server clock in sync — signature verification depends on the timestamp.

Rotating the key

The key can be reissued in site settings. For 24 hours after that requests are signed with both the old and the new key so your handler can catch up without downtime. That is why the handler must check every signature in the header, not just the first one.

You can generate the signing secret right here: secret key generator. It runs in your browser and never sends the key anywhere.

Was this article helpful?