Webhooks

Webhooks are the most flexible BlogCrew publish destination. When a Publisher ships an approved article, BlogCrew sends a JSON POST to your HTTPS endpoint.

Overview

Use webhooks when you:

  • Ingest content into a custom CMS or middleware
  • Trigger your own automation that is not on Zapier
  • Need a Bearer token on every publish request

Note: Webhooks deliver published articles, not form submissions. Nothing is sent until work is approved and ready to publish on the board.

Prerequisites

  • An HTTPS URL that accepts POST with a JSON body
  • Access to Library → Integrations in BlogCrew
  • A Publisher agent (BlogCrew can create or link one when you connect)

Set up a webhook

  1. Open Library → Integrations
  2. Under Webhooks, click Add
  3. Set a Display name (for example Production ingest)
  4. Paste your Webhook URL (full HTTPS URL)
  5. Optionally add an API key — BlogCrew sends it as a Bearer token
  6. Changes save automatically
  7. Click Test to verify your endpoint responds, then Done
  8. Confirm a Publisher is linked (BlogCrew links your default publisher if free, or creates one)

Config fields

FieldRequiredDescription
Display nameYesLabel shown in Library and on Publisher settings
Webhook URLYesHTTPS ingest URL (for example https://your-site.com/api/v1/content/publish)
API keyNoSent as Authorization: Bearer <token> when set

Use it from a Publisher

  1. Open Agents and select (or create) a Publisher
  2. Choose this webhook connection as the publish destination
  3. Move an approved article to ready-to-publish on the board
  4. Let the Publisher run — BlogCrew POSTs the article payload to your URL

Request format

  • Method: POST
  • Content-Type: application/json
  • Authorization: Bearer <API key> when an API key is configured (otherwise omitted)

Payload

Live publishes send event: "marketing.content.publish". Test from Library sends the same shape with event: "marketing.content.publish.test".

{
  "event": "marketing.content.publish",
  "publishedAt": "2026-04-15T10:30:00.000Z",
  "item": {
    "id": "clxitem123",
    "title": "Product-led growth playbook",
    "mainKeyword": "product led growth",
    "secondaryKeywords": ["plg onboarding", "saas activation"],
    "status": "approved",
    "scheduledAt": "2026-04-15T09:00:00.000Z",
    "publishDestination": "Webhook",
    "seoScore": 86,
    "formSlug": "lead-quiz"
  },
  "blog": {
    "id": "clxblog456",
    "slug": "product-led-growth-playbook",
    "title": "Product-led growth playbook",
    "excerpt": "How PLG teams turn activation into pipeline.",
    "bodyMd": "# Product-led growth playbook\n\nYour full article in Markdown…",
    "seoTitle": "Product-led growth playbook | Example",
    "seoDescription": "A practical PLG playbook for SaaS teams.",
    "ogImageUrl": "https://cdn.example.com/og/plg.png",
    "ogImageAlt": "Product-led growth cover",
    "category": "guides",
    "authorName": "Ada Lovelace",
    "authorAvatarUrl": "https://cdn.example.com/authors/ada.png"
  }
}

Top-level fields

FieldTypeDescription
eventstring"marketing.content.publish" on live publish; "marketing.content.publish.test" on Library → Test
publishedAtstringISO 8601 timestamp when BlogCrew built the payload
itemobjectBoard item metadata (keywords, schedule, SEO score, optional form slug)
blogobjectArticle body and SEO fields to ingest

item fields

FieldTypeDescription
idstringMarketing item ID
titlestringBoard item title
mainKeywordstring | nullPrimary keyword
secondaryKeywordsstring[]Secondary keywords
statusstringItem status at publish time (typically "approved")
scheduledAtstring | nullISO 8601 schedule time, if set
publishDestinationstringHuman label for the destination (for example "Webhook")
seoScorenumber | nullSEO score snapshot when present
formSlugstring | nullLinked form slug when the Form agent produced one

blog fields

FieldTypeDescription
idstringBlog post ID
slugstring | nullPublic slug
titlestringArticle title
excerptstring | nullShort summary
bodyMdstring | nullFull article Markdown
seoTitlestring | nullSEO title
seoDescriptionstring | nullSEO description
ogImageUrlstring | nullOpen Graph image URL
ogImageAltstring | nullOpen Graph image alt text
categorystring | nullCategory label when set
authorNamestring | nullAuthor byline from publisher defaults / workspace owner
authorAvatarUrlstring | nullAuthor avatar URL when available

Tip: Use Library → Integrations → Test to send a sample payload (marketing.content.publish.test) to your endpoint while you wire parsing.

Troubleshooting

  • Test fails — Confirm the URL is HTTPS, publicly reachable, and returns a 2xx status for the test payload
  • 401 / 403 — Check the optional API key matches what your server expects as a Bearer token
  • Timeouts — Your endpoint should respond promptly; long-running work should ack quickly and process asynchronously
  • Nothing arrives on publish — Confirm the article was approved, the Publisher uses this connection, and the connection is active in Library