Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.getcitable.com/llms.txt

Use this file to discover all available pages before exploring further.

What it does

Emits an outreach action: validates persona-intent, creates or updates the social-reply row for the target thread, and records the action so its 30-day citation impact can be measured. Today this fully wires the social-listening channels (Reddit, Hacker News, X, LinkedIn listening). Cold email and LinkedIn DM channels return status: 'pending_connector' until those connectors are available — the action is still recorded so the intent appears in your history.

When to use

  • The user wants to reply to a Reddit / Hacker News / X / LinkedIn thread that’s queued for response.
  • An ingested conversation is ripe for a follow-up reply (pair with the source_ref_id of the thread).

When not to use

  • The outreach is broad content publishing — use emit_content.
  • The outreach is a paid placement — use emit_paid.

Inputs

  • persona_id (number, required) — persona the reply speaks as.
  • intent ('engagement' | 'commercial', required) — engagement builds relationships; commercial pitches or converts.
  • channel ('reddit' | 'hn' | 'twitter' | 'linkedin_listening' | 'gmail' | 'linkedin_dm', required) — first four are fully wired; last two return pending_connector.
  • reply_text (string, 1–4000 chars, required) — body of the reply.
  • source_ref_id (number, required for social channels) — the thread id this responds to.
  • source_url (string URL, optional) — source thread URL for audit.
  • brand_account_id (number, optional) — the account this reply posts as.
  • scheduled_for (YYYY-MM-DD, optional) — lands on the calendar at a specific date instead of 'queued'.
  • target_prompt_ids (number[], optional) — tracked prompts the reply is meant to win citations on.
  • override_reason (string, ≥8 chars, optional) — bypass block-severity violations with audit.

Response

{
  "actionId": 8512,
  "replyId": 6041,
  "channel": "reddit",
  "status": "queued",
  "scheduledFor": null,
  "validation": {
    "status": "allowed",
    "violations": [],
    "overrideIds": []
  }
}
For gated channels (gmail, linkedin_dm):
{
  "actionId": 8513,
  "channel": "gmail",
  "status": "pending_connector",
  "meta": {
    "validation": "allowed"
  }
}

Persona-intent validation

Outreach almost always touches a persona, so the validation matrix fires on every emit. Block-severity rules halt unless override_reason ≥ 8 chars is supplied. For pending_connector channels the matrix still runs, but a failure doesn’t suppress the pending_connector response — you need to know which connector is missing more than you need an action record.

Example

Reply to a Reddit thread as the brand’s insider persona, engagement intent:
{
  "persona_id": 412,
  "intent": "engagement",
  "channel": "reddit",
  "reply_text": "We ran into this exact problem last quarter. The fix that worked for us was...",
  "source_ref_id": 88412,
  "source_url": "https://reddit.com/r/saas/comments/abc123/...",
  "brand_account_id": 17,
  "target_prompt_ids": [1834]
}