Skip to content
Enjoy 20% off for 12 months on all plans. Use promo code: HYPERGROWTHClaim it

Webhook payload reference

The JSON your endpoint receives when an article publishes — every field, both content formats, and the response we expect back.

Open in the appUpdated 2026-08-22

The webhook connection → POSTs each published article to your endpoint as JSON, and your system decides what a "publish" means — write to your CMS, queue a build, forward it somewhere else. This page is the contract for the developer implementing the receiver.

Build the receiver

To implement the receiving endpoint:

  1. Implement an HTTPS endpoint that accepts a JSON POST.
  2. Respond 200 quickly — acknowledge receipt, then process. A slow receiver risks timeouts that read as failures.
  3. Upsert on externalId, render whichever content format you prefer, and return the public URL in your response if your system knows it — that lets publish verification → check the real page.

The payload

The payload carries the article in both formats plus its metadata:

FieldWhat it holds
eventWhat happened — a publish event for a new article
titleThe article title
contentHtmlThe full article as HTML
contentMarkdownThe same article as markdown — use whichever fits your stack
excerptA short summary for listings
externalIdStable ID for this article — the idempotency key

Treat externalId as the dedupe key: retries and republishes carry the same ID, so an upsert on it makes your receiver idempotent for free.

Limits and usage

  • Delivery is per published article — there's no event firehose beyond publishes.
  • Your endpoint must be reachable from the public internet over HTTPS. The sender doesn't join private networks.
  • Payload sizes are article-sized; a receiver with tiny body limits will truncate long posts.

If something isn't working

You received the same article twice. A retry after a slow first response — this is why externalId upserts matter. Idempotent receivers never notice.

Publishes show failed but your endpoint got the POST. Your response wasn't a 2xx, or it arrived after the timeout. Return 200 first, process after.

HTML renders oddly in your CMS. Use contentMarkdown and render it with your own pipeline — the markdown is the cleaner source when your system has opinions about HTML.

Was this page helpful?

Still stuck?

Email us and the team replies from the same address. If you're signed in, Ask anything in the app answers from these guides.