Content Production
Generate content briefs from your top opportunities and draft full articles — a step-by-step guide through the brief → draft → publish flow.
Content production requires the Builder tier ($49/mo) or above.
This guide walks through the full content chain: pick an opportunity, generate a brief, draft an article, and log the outcome.
Prerequisites
You need a completed pipeline run with opportunities. If you haven't done that yet, start with the Quickstart.
Step-by-step
Fetch your action queue — it's pre-sorted by priority:
curl -s \
-H "X-API-Key: $BM_API_KEY" \
"https://api.boringmarketing.com/brands/$BRAND_ID/queue" \
| python3 -m json.tool{
"brand_id": "brand-uuid",
"total": 8,
"queue": [
{
"id": "qi-uuid-1",
"kind": "opportunity",
"status": "pending",
"rank": 1,
"priority": 0.95,
"item": {
"play": "AI Marketing Tools Comparison Guide",
"summary": "High-intent cluster with 12K monthly volume, KD 34",
"recommended_format": "comparison_post"
}
}
]
}Take the id of the top item.
curl -s -X POST \
-H "X-API-Key: $BM_API_KEY" \
-H "Content-Type: application/json" \
"https://api.boringmarketing.com/brands/$BRAND_ID/brief" \
-d '{"queue_item_id": "qi-uuid-1"}'{
"run_id": "brief-run-uuid",
"status": "queued"
}Poll the run (brief generation takes 1-3 minutes):
curl -s \
-H "X-API-Key: $BM_API_KEY" \
"https://api.boringmarketing.com/brands/$BRAND_ID/runs/brief-run-uuid"Once the run completes, fetch the generated brief:
curl -s \
-H "X-API-Key: $BM_API_KEY" \
"https://api.boringmarketing.com/brands/$BRAND_ID/briefs" \
| python3 -m json.toolThe brief includes:
- Strategy — competitive angle, positioning, target audience
- Pages — structured outline with H2/H3 hierarchy, section guidance, word counts
- Internal links — recommended links to existing brand content
- Key entities — people, tools, and concepts to reference
- Brand context — your trust signals, terminology, and voice injected into the brief
Review the brief before drafting. The draft follows it closely — fixing the brief is faster than fixing the draft.
Take the brief_id from the previous step and request a full draft:
curl -s -X POST \
-H "X-API-Key: $BM_API_KEY" \
-H "Content-Type: application/json" \
"https://api.boringmarketing.com/brands/$BRAND_ID/execute" \
-d '{"brief_id": "brief-uuid"}'{
"run_id": "exec-run-uuid",
"status": "queued"
}Draft generation takes 3-8 minutes (Opus produces long-form content).
First list executions to find the execution_id (the execute endpoint returns a run_id, but drafts are stored and fetched by execution_id, which is a separate identifier):
curl -s \
-H "X-API-Key: $BM_API_KEY" \
"https://api.boringmarketing.com/brands/$BRAND_ID/executions" \
| python3 -m json.toolThen fetch the specific execution:
curl -s \
-H "X-API-Key: $BM_API_KEY" \
"https://api.boringmarketing.com/brands/$BRAND_ID/executions/$EXECUTION_ID" \
| python3 -m json.toolThe article content lives in the outputs field. The response also includes gate_scores, format, and the run_id that produced this execution.
After publishing, tell the API so the learning loop can track performance:
curl -s -X POST \
-H "X-API-Key: $BM_API_KEY" \
-H "Content-Type: application/json" \
"https://api.boringmarketing.com/track/outcomes/report" \
-d '{
"brand_id": "'$BRAND_ID'",
"recommendation_id": "opp-uuid-1",
"brief_id": "brief-uuid",
"event_type": "completed",
"notes": "Published at https://yourdomain.com/article"
}'Also capture a baseline snapshot so later diffs can show what changed:
curl -s -X POST \
-H "X-API-Key: $BM_API_KEY" \
"https://api.boringmarketing.com/track/brands/$BRAND_ID/snapshot"See Tracking Outcomes for the full snapshot + changes + outcome-report workflow.
Batch production
For producing multiple articles, repeat steps 2-5 for each queue item. A future POST /brands/{id}/brief/batch endpoint will handle bulk brief generation — for now, iterate through queue items sequentially.