Skip to main content
Creates a content draft against an action ticket OR an ingested conversation. The draft lands at status=‘queued’ — never published. Returns the editor URL so the user can review, edit, and approve in the web UI before scheduling. Provide EXACTLY ONE of source_task_id or from_conversation_id, never both. Who it’s for and what it should win (both required): the buyer persona the post is for, given EITHER as persona (its name exactly as get_brand_context lists it, same capitals and spacing) OR as persona_id, never both; and target_prompt_ids are the tracked questions it should win, as plan_question_bank returns them (not search_prompt_intelligence row ids). The post is measured by those questions once it’s posted. A draft without them is refused, and nothing is saved. New version of an earlier draft: pass the earlier draft’s id as supersedes_id, and it is set to cancelled when this one is saved. Only a draft made by the same person’s AI connection that hasn’t been posted or approved can be replaced; otherwise nothing is saved. Scheduled drafts can’t be replaced here. Quality signal (returned in structuredContent): geoScore (0-100 — the unified GEO/AEO citability score), artifactsFlagged: string[]. For the explainable breakdown (baseline gates + per-dimension why/fix + prompt-fit), call score_content.
  • If geoScore < 60 OR artifactsFlagged is non-empty, REVISE the body and re-call. The flags name the AI-slop pattern detected (e.g., “hollow heading opener”, “fictional persona intro”). Aim for clean drafts — the queued state is for review, not damage control.
Use this when:
  • The user has agreed on what to post next.
  • You want to materialize the result of a brand conversation as a draft (pair with from_conversation_id from a prior ingest_conversation call).
Skip when:
  • The user is just brainstorming — wait for an explicit “draft this” instruction.
  • The user wants to publish — Citable does not call platform APIs; we record posted_url AFTER the user posts manually (see mark_content_posted).
Body limits: 1–8000 chars. For long-form (blog) posts, write the full body here; the editor URL lets the user iterate from there.

Inputs