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
POSTwith 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
- Open Library → Integrations
- Under Webhooks, click Add
- Set a Display name (for example
Production ingest) - Paste your Webhook URL (full HTTPS URL)
- Optionally add an API key — BlogCrew sends it as a
Bearertoken - Changes save automatically
- Click Test to verify your endpoint responds, then Done
- Confirm a Publisher is linked (BlogCrew links your default publisher if free, or creates one)
Config fields
| Field | Required | Description |
|---|---|---|
| Display name | Yes | Label shown in Library and on Publisher settings |
| Webhook URL | Yes | HTTPS ingest URL (for example https://your-site.com/api/v1/content/publish) |
| API key | No | Sent as Authorization: Bearer <token> when set |
Use it from a Publisher
- Open Agents and select (or create) a Publisher
- Choose this webhook connection as the publish destination
- Move an approved article to ready-to-publish on the board
- 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
| Field | Type | Description |
|---|---|---|
event | string | "marketing.content.publish" on live publish; "marketing.content.publish.test" on Library → Test |
publishedAt | string | ISO 8601 timestamp when BlogCrew built the payload |
item | object | Board item metadata (keywords, schedule, SEO score, optional form slug) |
blog | object | Article body and SEO fields to ingest |
item fields
| Field | Type | Description |
|---|---|---|
id | string | Marketing item ID |
title | string | Board item title |
mainKeyword | string | null | Primary keyword |
secondaryKeywords | string[] | Secondary keywords |
status | string | Item status at publish time (typically "approved") |
scheduledAt | string | null | ISO 8601 schedule time, if set |
publishDestination | string | Human label for the destination (for example "Webhook") |
seoScore | number | null | SEO score snapshot when present |
formSlug | string | null | Linked form slug when the Form agent produced one |
blog fields
| Field | Type | Description |
|---|---|---|
id | string | Blog post ID |
slug | string | null | Public slug |
title | string | Article title |
excerpt | string | null | Short summary |
bodyMd | string | null | Full article Markdown |
seoTitle | string | null | SEO title |
seoDescription | string | null | SEO description |
ogImageUrl | string | null | Open Graph image URL |
ogImageAlt | string | null | Open Graph image alt text |
category | string | null | Category label when set |
authorName | string | null | Author byline from publisher defaults / workspace owner |
authorAvatarUrl | string | null | Author 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