> ## 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.

# emit_outreach

> Reply on a social thread — validates persona-intent, creates or updates the reply, and records the action for 30-day measurement.

## 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`](/mcp/writes/emit-content).
* The outreach is a paid placement — use [`emit_paid`](/mcp/writes/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

```json theme={null}
{
  "actionId": 8512,
  "replyId": 6041,
  "channel": "reddit",
  "status": "queued",
  "scheduledFor": null,
  "validation": {
    "status": "allowed",
    "violations": [],
    "overrideIds": []
  }
}
```

For gated channels (`gmail`, `linkedin_dm`):

```json theme={null}
{
  "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:

```json theme={null}
{
  "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]
}
```
