Bounded outreach turns an operator’s explicit selection from a reviewed lead
snapshot into an auditable SMS batch. Erdo checks every selected person, shows
every exclusion, fixes the message and complete selection into a preview, and
sends only after a separate arm request confirms the exact preview a person
reviewed. Erdo never chooses the first N people or splits a selection into
automatic batches.This is a deliberately narrow surface for controlled outreach. It is not a
campaign builder: there are no editable cadences, branches, recurring schedules,
personalization rules, or automatic follow-ups.
Every REST request and MCP connection for outreach requires a validated
X-Project-ID. Omitting it is an error; Erdo never falls back to all projects.
The authenticated user must also be a persisted owner or admin of the active
organization; ordinary members and project-scoped external tokens cannot read
consent evidence or control provider actions.
The bounded_outreach rollout must also be enabled for the caller. Outside the
rollout, reads and writes return a clear setup error rather than an empty list.
Record explicit consent evidence for the recipients you may contact.
PUT the exact 1 to 700 recipients selected by the operator into a named
draft. The 700-person limit is a pilot safety ceiling, not a default or
automatic target.
Read the returned recipients, exclusions, final message, provider blockers,
preview_revision, eligible_count, and message_hash.
Arm that exact preview with a replay-safe action reference.
Read recipient receipts as Erdo records provider acceptance, delivery,
failure, replies, and opt-outs.
Creating or reading a draft never sends a message. Erdo appends Reply STOP to opt out. to the reviewed text and returns the final body and hash. Eligible
recipients are assigned deterministically: one-fifth, rounded up, is held for
seven days and the rest is due immediately. For any authorised eligible set,
the delayed count is ceil(eligible_count / 5) and every other eligible
recipient is immediate.
Consent is a separate resource because a boolean in a batch would only repeat
the caller’s claim. A grant records where the evidence came from, which version
of that evidence was reviewed, the stable lead identity and phone it covers,
and when consent was granted.
The pilot accepts explicit_opt_in only. evidence_text is required and stores
the exact consent wording or source excerpt that was reviewed, up to 4,000
characters. Replaying the same grant_ref and evidence returns the stored
grant. Reusing it for different evidence returns a conflict.Revoke without deleting the audit record:
List grants with GET /v1/outreach-consents?limit=25; pass the returned
next_cursor as cursor for the next page. Read one with
?grant_ref=crm-consent-lead-104-v1, or with recipient_ref, phone_raw, and
default_country when the source does not already know the grant reference.
The batch slug is the resource address inside the active project. The source
snapshot, initiative and sequence step are part of the immutable content:
curl -X PUT https://api.erdo.ai/v1/outreach-batches/selected-leads-aug-25 \ -H "Authorization: Bearer $ERDO_API_KEY" \ -H "X-Organization-ID: acme" \ -H "X-Project-ID: 01234567-89ab-cdef-0123-456789abcdef" \ -H "Content-Type: application/json" \ -d '{ "source_snapshot_ref": "historical-leads-2026-08-24-sha256-abcd", "initiative_ref": "historical-lead-follow-up", "sequence_step": "initial-sms", "default_country": "US", "message_body": "Hi — this is the Northline Residences team. Are you still considering a home in Miami?", "message_version": "initial-sms-v1", "recipients": [ {"recipient_ref":"lead-104","phone_raw":"(305) 555-0123"}, {"recipient_ref":"lead-105","phone_raw":"+13055550124","identity_status":"ambiguous"} ] }'
Erdo, not the caller, normalizes phone_raw, matches the consent ledger, checks
generic SMS and outreach-wide suppression, checks prior contact for the same
initiative step, and assigns cohorts. Missing evidence does not reject the
preview. The recipient remains visible with eligibility_state: "excluded"
and an exclusion_reason such as:
ambiguous_identity
invalid_phone
duplicate_recipient_ref
duplicate_canonical_phone
cross_batch_duplicate_recipient_ref
cross_batch_duplicate_canonical_phone
channel_suppressed or outreach_suppressed
prior_sequence_step_contact
prior_sequence_step_selection
no_matching_explicit_consent
Provider and contact-hours setup are also preview facts.
provider_readiness checks the dedicated outreach Twilio account and number,
its pin to the active project, registration approval, the HTTPS status callback,
and the independent dispatch switch. policy_readiness checks that the
organization has enabled a valid contact-hours window and timezone. A failed
check remains visible in its blockers; armable stays false and
arm_blockers contains the combined reasons.The provider blocker codes are
twilio_sms_outreach_account_sid_missing,
twilio_sms_outreach_account_not_dedicated,
twilio_root_credentials_missing,
twilio_sms_outreach_phone_number_missing,
twilio_sms_outreach_project_mismatch,
twilio_status_callback_not_configured,
twilio_sms_outreach_registration_not_approved, and
twilio_sms_outreach_dispatch_not_enabled. Contact-hours policy reports
outreach_contact_hours_policy_missing,
outreach_contact_hours_policy_unavailable, or
outreach_contact_hours_policy_disabled, or the more specific
outreach_contact_hours_window_invalid and
outreach_contact_hours_timezone_invalid.provider_cost_estimate shows the configured USD price per segment, segments
per recipient, estimated segment count, and estimated cost for the eligible
audience. When pricing is not configured, available is false and
unavailable_reason explains the missing fact; Erdo does not invent a cost.An operator may create another explicit batch for the same initiative_ref and
sequence_step after an earlier batch is armed. Erdo never broadens that later
selection: anyone already contacted is excluded as
prior_sequence_step_contact, while anyone still reserved by an active earlier
batch is excluded as prior_sequence_step_selection. Duplicate draft
selections remain visibly excluded rather than silently choosing one copy. The
lifetime initiative-step pool cannot grow beyond 700 distinct recipient
references, so multiple batches cannot bypass the pilot safety ceiling.Repeating the PUT with the same immutable input re-evaluates consent,
suppression, prior contact, cross-batch duplicates, cohorts, counts, and the
preview revision across the still-draft initiative step. It never sends.
Changing the source, recipients, message, version, initiative, or step under
the same slug returns a conflict; create a new batch slug for a new review.
Actions use one endpoint and always require a stable action_ref. Repeating an
action reference returns its stored receipt; it never performs the transition
again.Arming also compares the facts shown during review:
If any expected value differs, nothing starts. pause, resume, and cancel
bind the click to the exact immutable source, state, and batch version shown to
the operator:
Use all three expected values from the same batch read. If the request outcome
is unclear, retry the identical body. Erdo returns the original receipt with a
stable acted_at; changing the body under the same action_ref is rejected.
A new action reference with stale facts is also rejected, even if a later
pause/resume cycle returns the batch to the same named state. These actions
affect contact that has not reached the provider and cannot recall a message
already accepted by the provider.
GET /v1/outreach-batches?initiative_ref=historical-lead-follow-up&limit=25&cursor=...GET /v1/outreach-batches/selected-leads-aug-25GET /v1/outreach-batches/selected-leads-aug-25/recipients?limit=100&cursor=...
Each list item includes batch, counts, armable, arm_blockers,
provider_readiness, policy_readiness, and provider_cost_estimate. A
workspace can therefore render factual totals and blockers without fetching
every batch detail first.Batch state is draft, running, holding, paused, cancelled, or
completed. Recipient delivery state distinguishes draft, excluded, queued,
sending, provider_accepted, delivered, failed, held,
outcome_unknown, and cancelled. Response state is separate: none,
replied, or opted_out. Do not treat delivery as a reply or add overlapping
counts together. The batch summary’s contacted value is the unique number of
recipients accepted by the provider or beyond.outcome_unknown is a separate delivery state for the dangerous case where a
provider request may have succeeded but Erdo did not receive a conclusive
response. Erdo pauses the whole batch and will not send or resume it while that
receipt is unresolved. Every send includes signed per-recipient scope in its
status callback URL, so a later provider callback can attach the missing message
ID and repair the message ledger without sending again. resume remains blocked
until that callback resolves the unknown state; a retry never guesses that the
original send failed.Use initiative_ref when a workspace belongs to one outreach initiative. Erdo
applies the filter before pagination, so an app never fetches the newest page
across unrelated initiatives and then drops the batch it needed.Recipient states are deliberately not one ambiguous server filter: eligibility,
delivery, and response are separate axes. Page through the complete immutable
selection with limit=100 and each returned next_cursor, then filter the exact
axis in the client (eligibility_state, delivery_state, or response_state).
Summary counts and arm validation always cover the complete selection, never
only the current page.A STOP reply marks the receipt opted out, suppresses the stable lead across
later batches in the project, and cancels any queued or held contact for that
lead. Replies that cannot be tied to a stored outbound message are not attached
to a guessed batch.
A server can mint a key with outreach:read, outreach:send, or both.
outreach:send covers consent writes, draft creation, and lifecycle actions.
It is deliberately not implied by resources:write: arming outreach can contact
people and spend money. Both capabilities remain confined to the authenticated
project header and still require the key’s user to be a persisted organization
owner or admin.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Erdo Docs","colors":{"primary":"#008b1d","light":"#84bf88","dark":"#007c10"},"logo":{"light":"https://mintcdn.com/erdoai/a0Yf-u_wE-IxMDL6/logo/light.png?fit=max\u0026auto=format\u0026n=a0Yf-u_wE-IxMDL6\u0026q=85\u0026s=87480ed4521e74bd7996b5c35e23c346","dark":"https://mintcdn.com/erdoai/a0Yf-u_wE-IxMDL6/logo/dark.png?fit=max\u0026auto=format\u0026n=a0Yf-u_wE-IxMDL6\u0026q=85\u0026s=0db855b87e16887e9aeb3059fbf75f99"},"favicon":"https://mintcdn.com/erdoai/O_YT_Nxge5MHHZ8y/favicon.png?fit=max\u0026auto=format\u0026n=O_YT_Nxge5MHHZ8y\u0026q=85\u0026s=88f0d650ce929194af21b33be4594ecd","navbar":{"links":[{"href":"https://erdo.ai","label":"Platform"}],"primary":{"type":"button","label":"Get Started","href":"https://erdo.ai/signup"}},"footer":{"socials":{"github":"https://github.com/erdoai","linkedin":"https://linkedin.com/company/erdo-ai"}},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"erdoai","hasAudioNarration":false,"actualSubdomain":"erdoai","customDomains":["docs.erdo.ai"],"gitSource":{"type":"github","owner":"erdoai","repo":"erdo","deployBranch":"main","contentDirectory":"docs-public","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adc9a4a2892a8a2da11d4f2","collectionId":"54104034-bb98-4786-a14d-ccc9afdf69ee","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adc9a4a2892a8a2da11d4f2"},"entitlements":{},"buildId":"6adc9a4a2892a8a2da11d4f2","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"API Reference","count":548},{"language":"default","tag":"Developers","count":320},{"language":"default","tag":"Product","count":55},{"language":"default","tag":"Features","count":43},{"language":"default","tag":"Platform API","count":39},{"language":"default","tag":"Get started","count":7},{"language":"default","tag":"Connect Erdo","count":5},{"language":"default","tag":"TypeScript SDK","count":5},{"language":"default","tag":"Build apps","count":1},{"language":"default","tag":"Python SDK","count":1}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"outreach","slug":"/outreach","pageMetadata":{"title":"Bounded outreach","description":"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience","href":"/outreach"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`bounded-outreach`,children:`Bounded outreach`}),`\n`,_jsx(_components.p,{children:`Bounded outreach turns an operator’s explicit selection from a reviewed lead\nsnapshot into an auditable SMS batch. Erdo checks every selected person, shows\nevery exclusion, fixes the message and complete selection into a preview, and\nsends only after a separate arm request confirms the exact preview a person\nreviewed. Erdo never chooses the first N people or splits a selection into\nautomatic batches.`}),`\n`,_jsx(_components.p,{children:`This is a deliberately narrow surface for controlled outreach. It is not a\ncampaign builder: there are no editable cadences, branches, recurring schedules,\npersonalization rules, or automatic follow-ups.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Every REST request and MCP connection for outreach requires a validated\n`,_jsx(_components.code,{children:`X-Project-ID`}),`. Omitting it is an error; Erdo never falls back to all projects.\nThe authenticated user must also be a persisted owner or admin of the active\norganization; ordinary members and project-scoped external tokens cannot read\nconsent evidence or control provider actions.\nThe `,_jsx(_components.code,{children:`bounded_outreach`}),` rollout must also be enabled for the caller. Outside the\nrollout, reads and writes return a clear setup error rather than an empty list.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-one-batch-works`,children:`How one batch works`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Record explicit consent evidence for the recipients you may contact.`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`PUT`}),` the exact 1 to 700 recipients selected by the operator into a named\ndraft. The 700-person limit is a pilot safety ceiling, not a default or\nautomatic target.`]}),`\n`,_jsxs(_components.li,{children:[`Read the returned recipients, exclusions, final message, provider blockers,\n`,_jsx(_components.code,{children:`preview_revision`}),`, `,_jsx(_components.code,{children:`eligible_count`}),`, and `,_jsx(_components.code,{children:`message_hash`}),`.`]}),`\n`,_jsx(_components.li,{children:`Arm that exact preview with a replay-safe action reference.`}),`\n`,_jsx(_components.li,{children:`Read recipient receipts as Erdo records provider acceptance, delivery,\nfailure, replies, and opt-outs.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Creating or reading a draft never sends a message. Erdo appends `,_jsx(_components.code,{children:`Reply STOP to opt out.`}),` to the reviewed text and returns the final body and hash. Eligible\nrecipients are assigned deterministically: one-fifth, rounded up, is held for\nseven days and the rest is due immediately. For any authorised eligible set,\nthe delayed count is `,_jsx(_components.code,{children:`ceil(eligible_count / 5)`}),` and every other eligible\nrecipient is immediate.`]}),`\n`,_jsx(Heading,{level:`2`,id:`consent-evidence`,children:`Consent evidence`}),`\n`,_jsx(_components.p,{children:`Consent is a separate resource because a boolean in a batch would only repeat\nthe caller’s claim. A grant records where the evidence came from, which version\nof that evidence was reviewed, the stable lead identity and phone it covers,\nand when consent was granted.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`16`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PUT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.erdo.ai/v1/outreach-consents`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ERDO_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Organization-ID: acme\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Project-ID: 01234567-89ab-cdef-0123-456789abcdef\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"grant_ref\": \"crm-consent-lead-104-v1\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"recipient_ref\": \"lead-104\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"phone_raw\": \"(305) 555-0123\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"default_country\": \"US\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"basis\": \"explicit_opt_in\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"source_ref\": \"signed-form-8842\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"evidence_version\": \"sms-consent-2026-08\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"evidence_text\": \"I agree to receive text messages about Northline Residences.\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"granted_at\": \"2026-08-20T14:25:00Z\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The pilot accepts `,_jsx(_components.code,{children:`explicit_opt_in`}),` only. `,_jsx(_components.code,{children:`evidence_text`}),` is required and stores\nthe exact consent wording or source excerpt that was reviewed, up to 4,000\ncharacters. Replaying the same `,_jsx(_components.code,{children:`grant_ref`}),` and evidence returns the stored\ngrant. Reusing it for different evidence returns a conflict.`]}),`\n`,_jsx(_components.p,{children:`Revoke without deleting the audit record:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PUT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.erdo.ai/v1/outreach-consents`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ERDO_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Organization-ID: acme\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Project-ID: 01234567-89ab-cdef-0123-456789abcdef\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{\"grant_ref\":\"crm-consent-lead-104-v1\",\"revoked\":true}'`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`List grants with `,_jsx(_components.code,{children:`GET /v1/outreach-consents?limit=25`}),`; pass the returned\n`,_jsx(_components.code,{children:`next_cursor`}),` as `,_jsx(_components.code,{children:`cursor`}),` for the next page. Read one with\n`,_jsx(_components.code,{children:`?grant_ref=crm-consent-lead-104-v1`}),`, or with `,_jsx(_components.code,{children:`recipient_ref`}),`, `,_jsx(_components.code,{children:`phone_raw`}),`, and\n`,_jsx(_components.code,{children:`default_country`}),` when the source does not already know the grant reference.`]}),`\n`,_jsx(Heading,{level:`2`,id:`create-the-immutable-preview`,children:`Create the immutable preview`}),`\n`,_jsx(_components.p,{children:`The batch slug is the resource address inside the active project. The source\nsnapshot, initiative and sequence step are part of the immutable content:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PUT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.erdo.ai/v1/outreach-batches/selected-leads-aug-25`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ERDO_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Organization-ID: acme\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Project-ID: 01234567-89ab-cdef-0123-456789abcdef\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"source_snapshot_ref\": \"historical-leads-2026-08-24-sha256-abcd\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"initiative_ref\": \"historical-lead-follow-up\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"sequence_step\": \"initial-sms\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"default_country\": \"US\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"message_body\": \"Hi — this is the Northline Residences team. Are you still considering a home in Miami?\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"message_version\": \"initial-sms-v1\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"recipients\": [`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` {\"recipient_ref\":\"lead-104\",\"phone_raw\":\"(305) 555-0123\"},`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` {\"recipient_ref\":\"lead-105\",\"phone_raw\":\"+13055550124\",\"identity_status\":\"ambiguous\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Erdo, not the caller, normalizes `,_jsx(_components.code,{children:`phone_raw`}),`, matches the consent ledger, checks\ngeneric SMS and outreach-wide suppression, checks prior contact for the same\ninitiative step, and assigns cohorts. Missing evidence does not reject the\npreview. The recipient remains visible with `,_jsx(_components.code,{children:`eligibility_state: \"excluded\"`}),`\nand an `,_jsx(_components.code,{children:`exclusion_reason`}),` such as:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`ambiguous_identity`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`invalid_phone`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`duplicate_recipient_ref`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`duplicate_canonical_phone`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`cross_batch_duplicate_recipient_ref`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`cross_batch_duplicate_canonical_phone`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`channel_suppressed`}),` or `,_jsx(_components.code,{children:`outreach_suppressed`})]}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`prior_sequence_step_contact`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`prior_sequence_step_selection`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`no_matching_explicit_consent`})}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Provider and contact-hours setup are also preview facts.\n`,_jsx(_components.code,{children:`provider_readiness`}),` checks the dedicated outreach Twilio account and number,\nits pin to the active project, registration approval, the HTTPS status callback,\nand the independent dispatch switch. `,_jsx(_components.code,{children:`policy_readiness`}),` checks that the\norganization has enabled a valid contact-hours window and timezone. A failed\ncheck remains visible in its `,_jsx(_components.code,{children:`blockers`}),`; `,_jsx(_components.code,{children:`armable`}),` stays false and\n`,_jsx(_components.code,{children:`arm_blockers`}),` contains the combined reasons.`]}),`\n`,_jsxs(_components.p,{children:[`The provider blocker codes are\n`,_jsx(_components.code,{children:`twilio_sms_outreach_account_sid_missing`}),`,\n`,_jsx(_components.code,{children:`twilio_sms_outreach_account_not_dedicated`}),`,\n`,_jsx(_components.code,{children:`twilio_root_credentials_missing`}),`,\n`,_jsx(_components.code,{children:`twilio_sms_outreach_phone_number_missing`}),`,\n`,_jsx(_components.code,{children:`twilio_sms_outreach_project_mismatch`}),`,\n`,_jsx(_components.code,{children:`twilio_status_callback_not_configured`}),`,\n`,_jsx(_components.code,{children:`twilio_sms_outreach_registration_not_approved`}),`, and\n`,_jsx(_components.code,{children:`twilio_sms_outreach_dispatch_not_enabled`}),`. Contact-hours policy reports\n`,_jsx(_components.code,{children:`outreach_contact_hours_policy_missing`}),`,\n`,_jsx(_components.code,{children:`outreach_contact_hours_policy_unavailable`}),`, or\n`,_jsx(_components.code,{children:`outreach_contact_hours_policy_disabled`}),`, or the more specific\n`,_jsx(_components.code,{children:`outreach_contact_hours_window_invalid`}),` and\n`,_jsx(_components.code,{children:`outreach_contact_hours_timezone_invalid`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`provider_cost_estimate`}),` shows the configured USD price per segment, segments\nper recipient, estimated segment count, and estimated cost for the eligible\naudience. When pricing is not configured, `,_jsx(_components.code,{children:`available`}),` is false and\n`,_jsx(_components.code,{children:`unavailable_reason`}),` explains the missing fact; Erdo does not invent a cost.`]}),`\n`,_jsxs(_components.p,{children:[`An operator may create another explicit batch for the same `,_jsx(_components.code,{children:`initiative_ref`}),` and\n`,_jsx(_components.code,{children:`sequence_step`}),` after an earlier batch is armed. Erdo never broadens that later\nselection: anyone already contacted is excluded as\n`,_jsx(_components.code,{children:`prior_sequence_step_contact`}),`, while anyone still reserved by an active earlier\nbatch is excluded as `,_jsx(_components.code,{children:`prior_sequence_step_selection`}),`. Duplicate draft\nselections remain visibly excluded rather than silently choosing one copy. The\nlifetime initiative-step pool cannot grow beyond 700 distinct recipient\nreferences, so multiple batches cannot bypass the pilot safety ceiling.`]}),`\n`,_jsx(_components.p,{children:`Repeating the PUT with the same immutable input re-evaluates consent,\nsuppression, prior contact, cross-batch duplicates, cohorts, counts, and the\npreview revision across the still-draft initiative step. It never sends.\nChanging the source, recipients, message, version, initiative, or step under\nthe same slug returns a conflict; create a new batch slug for a new review.`}),`\n`,_jsx(Heading,{level:`2`,id:`arm-pause-resume-or-cancel`,children:`Arm, pause, resume, or cancel`}),`\n`,_jsxs(_components.p,{children:[`Actions use one endpoint and always require a stable `,_jsx(_components.code,{children:`action_ref`}),`. Repeating an\naction reference returns its stored receipt; it never performs the transition\nagain.`]}),`\n`,_jsx(_components.p,{children:`Arming also compares the facts shown during review:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`12`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.erdo.ai/v1/outreach-batches/selected-leads-aug-25/actions`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ERDO_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Organization-ID: acme\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Project-ID: 01234567-89ab-cdef-0123-456789abcdef\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"action\": \"arm\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"action_ref\": \"operator-approval-2026-08-24T1800Z\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"expected_preview_revision\": \"PREVIEW_REVISION_FROM_GET\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"expected_eligible_count\": 37,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"expected_message_hash\": \"MESSAGE_HASH_FROM_GET\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If any expected value differs, nothing starts. `,_jsx(_components.code,{children:`pause`}),`, `,_jsx(_components.code,{children:`resume`}),`, and `,_jsx(_components.code,{children:`cancel`}),`\nbind the click to the exact immutable source, state, and batch version shown to\nthe operator:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"pause\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"action_ref\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"pause-selected-leads-aug-25-running-v1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expected_source_snapshot_ref\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"historical-leads@01234567-89ab-4def-8123-456789abcdef\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expected_batch_state\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"running\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expected_batch_updated_at\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-08-25T10:15:30.123456Z\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Use all three expected values from the same batch read. If the request outcome\nis unclear, retry the identical body. Erdo returns the original receipt with a\nstable `,_jsx(_components.code,{children:`acted_at`}),`; changing the body under the same `,_jsx(_components.code,{children:`action_ref`}),` is rejected.\nA new action reference with stale facts is also rejected, even if a later\npause/resume cycle returns the batch to the same named state. These actions\naffect contact that has not reached the provider and cannot recall a message\nalready accepted by the provider.`]}),`\n`,_jsx(Heading,{level:`2`,id:`read-batches-and-recipient-receipts`,children:`Read batches and recipient receipts`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`GET /v1/outreach-batches?initiative_ref=historical-lead-follow-up\u0026limit=25\u0026cursor=...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`GET /v1/outreach-batches/selected-leads-aug-25`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`GET /v1/outreach-batches/selected-leads-aug-25/recipients?limit=100\u0026cursor=...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Each list item includes `,_jsx(_components.code,{children:`batch`}),`, `,_jsx(_components.code,{children:`counts`}),`, `,_jsx(_components.code,{children:`armable`}),`, `,_jsx(_components.code,{children:`arm_blockers`}),`,\n`,_jsx(_components.code,{children:`provider_readiness`}),`, `,_jsx(_components.code,{children:`policy_readiness`}),`, and `,_jsx(_components.code,{children:`provider_cost_estimate`}),`. A\nworkspace can therefore render factual totals and blockers without fetching\nevery batch detail first.`]}),`\n`,_jsxs(_components.p,{children:[`Batch state is `,_jsx(_components.code,{children:`draft`}),`, `,_jsx(_components.code,{children:`running`}),`, `,_jsx(_components.code,{children:`holding`}),`, `,_jsx(_components.code,{children:`paused`}),`, `,_jsx(_components.code,{children:`cancelled`}),`, or\n`,_jsx(_components.code,{children:`completed`}),`. Recipient delivery state distinguishes draft, excluded, queued,\n`,_jsx(_components.code,{children:`sending`}),`, `,_jsx(_components.code,{children:`provider_accepted`}),`, `,_jsx(_components.code,{children:`delivered`}),`, `,_jsx(_components.code,{children:`failed`}),`, `,_jsx(_components.code,{children:`held`}),`,\n`,_jsx(_components.code,{children:`outcome_unknown`}),`, and `,_jsx(_components.code,{children:`cancelled`}),`. Response state is separate: `,_jsx(_components.code,{children:`none`}),`,\n`,_jsx(_components.code,{children:`replied`}),`, or `,_jsx(_components.code,{children:`opted_out`}),`. Do not treat delivery as a reply or add overlapping\ncounts together. The batch summary’s `,_jsx(_components.code,{children:`contacted`}),` value is the unique number of\nrecipients accepted by the provider or beyond.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`outcome_unknown`}),` is a separate delivery state for the dangerous case where a\nprovider request may have succeeded but Erdo did not receive a conclusive\nresponse. Erdo pauses the whole batch and will not send or resume it while that\nreceipt is unresolved. Every send includes signed per-recipient scope in its\nstatus callback URL, so a later provider callback can attach the missing message\nID and repair the message ledger without sending again. `,_jsx(_components.code,{children:`resume`}),` remains blocked\nuntil that callback resolves the unknown state; a retry never guesses that the\noriginal send failed.`]}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.code,{children:`initiative_ref`}),` when a workspace belongs to one outreach initiative. Erdo\napplies the filter before pagination, so an app never fetches the newest page\nacross unrelated initiatives and then drops the batch it needed.`]}),`\n`,_jsxs(_components.p,{children:[`Recipient states are deliberately not one ambiguous server filter: eligibility,\ndelivery, and response are separate axes. Page through the complete immutable\nselection with `,_jsx(_components.code,{children:`limit=100`}),` and each returned `,_jsx(_components.code,{children:`next_cursor`}),`, then filter the exact\naxis in the client (`,_jsx(_components.code,{children:`eligibility_state`}),`, `,_jsx(_components.code,{children:`delivery_state`}),`, or `,_jsx(_components.code,{children:`response_state`}),`).\nSummary counts and arm validation always cover the complete selection, never\nonly the current page.`]}),`\n`,_jsx(_components.p,{children:`A STOP reply marks the receipt opted out, suppresses the stable lead across\nlater batches in the project, and cancels any queued or held contact for that\nlead. Replies that cannot be tied to a stored outbound message are not attached\nto a guessed batch.`}),`\n`,_jsx(Heading,{level:`2`,id:`mcp-tools`,children:`MCP tools`}),`\n`,_jsx(_components.p,{children:`The MCP surface uses the same authenticated project and the same service logic:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_put_outreach_batch`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_list_outreach_batches`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_get_outreach_batch`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_list_outreach_batch_recipients`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_act_on_outreach_batch`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_put_outreach_consent`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_list_outreach_consents`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`erdo_get_outreach_consent`})}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Add `,_jsx(_components.code,{children:`X-Project-ID`}),` to the MCP connection headers. A raw MCP client cannot use a\nscoped API key; that existing fail-closed rule remains unchanged.`]}),`\n`,_jsx(Heading,{level:`2`,id:`cli`,children:`CLI`}),`\n`,_jsxs(_components.p,{children:[`Every outreach command requires the global `,_jsx(_components.code,{children:`--project`}),` context. Use `,_jsx(_components.code,{children:`--org`}),` as\nwell when the key can operate more than one organization.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` consents`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` put`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --file`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` consent.json`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` consents`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` list`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` consents`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` crm-consent-lead-104-v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` consents`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --recipient-ref`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` lead-104`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --phone`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+13055550123\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --country`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` US`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` batches`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` put`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` selected-leads-aug-25`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --file`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` batch.json`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` batches`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` list`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --initiative`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` historical-lead-follow-up`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` batches`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` selected-leads-aug-25`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` batches`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` selected-leads-aug-25`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --recipients`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`erdo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --org`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` acme`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --project`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` outreach`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` batches`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` act`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` selected-leads-aug-25`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` arm`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --action-ref`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` operator-approval-01`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --preview-revision`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PREVIEW_REVISION`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --eligible-count`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ELIGIBLE_COUNT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --message-hash`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$MESSAGE_HASH`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`For revocation, the consent file contains only `,_jsx(_components.code,{children:`grant_ref`}),` and\n`,_jsx(_components.code,{children:`\"revoked\": true`}),`. List commands accept `,_jsx(_components.code,{children:`--limit`}),` and `,_jsx(_components.code,{children:`--cursor`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`scoped-api-keys`,children:`Scoped API keys`}),`\n`,_jsxs(_components.p,{children:[`A server can mint a key with `,_jsx(_components.code,{children:`outreach:read`}),`, `,_jsx(_components.code,{children:`outreach:send`}),`, or both.\n`,_jsx(_components.code,{children:`outreach:send`}),` covers consent writes, draft creation, and lifecycle actions.\nIt is deliberately not implied by `,_jsx(_components.code,{children:`resources:write`}),`: arming outreach can contact\npeople and spend money. Both capabilities remain confined to the authenticated\nproject header and still require the key’s user to be a persisted organization\nowner or admin.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Bounded outreach","description":"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience","href":"/outreach"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Bounded outreach","slug":"bounded-outreach","depth":1,"children":[]},{"title":"How one batch works","slug":"how-one-batch-works","depth":2,"children":[]},{"title":"Consent evidence","slug":"consent-evidence","depth":2,"children":[]},{"title":"Create the immutable preview","slug":"create-the-immutable-preview","depth":2,"children":[]},{"title":"Arm, pause, resume, or cancel","slug":"arm-pause-resume-or-cancel","depth":2,"children":[]},{"title":"Read batches and recipient receipts","slug":"read-batches-and-recipient-receipts","depth":2,"children":[]},{"title":"MCP tools","slug":"mcp-tools","depth":2,"children":[]},{"title":"CLI","slug":"cli","depth":2,"children":[]},{"title":"Scoped API keys","slug":"scoped-api-keys","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"erdoai","siteName":"Erdo Docs","title":"Bounded outreach - Erdo Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-05T13:24:04.617Z","originalFileLocation":"outreach.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience\">\u003cmeta data-mint-head name=\"application-name\" content=\"Erdo Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Bounded outreach - Erdo Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Erdo Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.erdo.ai/outreach\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://erdoai.mintlify.app/_mintlify/api/og/v2?division=Features\u0026amp;title=Bounded+outreach\u0026amp;description=Preview%2C+approve%2C+and+audit+consent-gated+SMS+to+an+explicit+operator-selected+audience\u0026amp;theme=19c963d80c676f95ec8599a1\u0026amp;signature=5edeb5d6ec4d633ad92a42f362c89622f08282146871d6829965572d3ba47cf6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Bounded outreach - Erdo Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://erdoai.mintlify.app/_mintlify/api/og/v2?division=Features\u0026amp;title=Bounded+outreach\u0026amp;description=Preview%2C+approve%2C+and+audit+consent-gated+SMS+to+an+explicit+operator-selected+audience\u0026amp;theme=19c963d80c676f95ec8599a1\u0026amp;signature=5edeb5d6ec4d633ad92a42f362c89622f08282146871d6829965572d3ba47cf6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Erdo Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#008b1d\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.erdo.ai/outreach\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/outreach.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.erdo.ai/#organization\",\"name\":\"Erdo Docs\",\"url\":\"https://docs.erdo.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/erdoai/a0Yf-u_wE-IxMDL6/logo/light.png?fit=max\u0026auto=format\u0026n=a0Yf-u_wE-IxMDL6\u0026q=85\u0026s=87480ed4521e74bd7996b5c35e23c346\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.erdo.ai#website\",\"name\":\"Erdo Docs\",\"url\":\"https://docs.erdo.ai\",\"publisher\":{\"@id\":\"https://docs.erdo.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.erdo.ai/outreach#webpage\",\"url\":\"https://docs.erdo.ai/outreach\",\"name\":\"Bounded outreach\",\"description\":\"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience\",\"dateModified\":\"2026-09-05T13:24:04.617Z\",\"isPartOf\":{\"@id\":\"https://docs.erdo.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.erdo.ai/outreach#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.erdo.ai/outreach#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Features\",\"item\":\"https://docs.erdo.ai/agents\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bounded outreach\",\"item\":\"https://docs.erdo.ai/outreach\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.erdo.ai/outreach#article\",\"headline\":\"Bounded outreach\",\"name\":\"Bounded outreach\",\"description\":\"Preview, approve, and audit consent-gated SMS to an explicit operator-selected audience\",\"url\":\"https://docs.erdo.ai/outreach\",\"mainEntityOfPage\":{\"@id\":\"https://docs.erdo.ai/outreach#webpage\"},\"dateModified\":\"2026-09-05T13:24:04.617Z\",\"publisher\":{\"@id\":\"https://docs.erdo.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.erdo.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Erdo Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Erdo Docs","nav":{"global":null,"tabs":[{"tab":"Product","groups":[{"group":"Get started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"Set up your workspace","href":"/onboarding"},{"title":"Core concepts","href":"/concepts"},{"title":"Settings","href":"/settings"},{"title":"Billing and promotion codes","href":"/billing"},{"title":"Getting help from Erdo support","href":"/support"}]},{"group":"Features","pages":[{"title":"Agents","href":"/agents"},{"title":"Data \u0026 Connectors","href":"/data"},{"title":"Extend a dataset's schema","href":"/dataset-schema"},{"title":"Write dataset rows","href":"/dataset-writes"},{"title":"Automatic capture maintenance","href":"/capture-maintenance"},{"title":"Dataset refreshes","href":"/dataset-refreshes"},{"title":"Liquidity-event research","href":"/liquidity-research"},{"title":"Find contact details","href":"/contact-enrichment"},{"title":"Filters","href":"/filters"},{"title":"Dataset revisions","href":"/dataset-revisions"},{"title":"Data Lakes","href":"/data-lake"},{"title":"Knowledge","href":"/knowledge"},{"title":"Read typed records","href":"/knowledge-records"},{"title":"The review queue","href":"/review-queue"},{"title":"Pages","href":"/pages"},{"title":"Follow-up pages","href":"/lead-follow-up-pages"},{"title":"Custom domains","href":"/custom-domains"},{"title":"Page analytics","href":"/page-analytics"},{"title":"Page health monitoring","href":"/page-health-monitor"},{"title":"Traffic quality monitoring","href":"/traffic-quality-monitor"},{"title":"Ad account monitors","href":"/ad-account-monitors"},{"title":"Google Ads report","href":"/google-ads-report"},{"title":"Phone and address assets","href":"/google-ads-call-location-assets"},{"title":"How Erdo bids","href":"/bidding"},{"title":"Page tracking","href":"/page-tracking"},{"title":"Automations","href":"/automations"},{"title":"Event pipelines","href":"/event-pipelines"},{"title":"Projects","href":"/projects"},{"title":"Strategies","href":"/strategies"},{"title":"Workstreams","href":"/workstreams"},{"title":"Growth reviews","href":"/growth-reviews"},{"title":"Decisions","href":"/decisions"},{"title":"Your attention feed","href":"/attention"},{"title":"Page feedback","href":"/page-feedback"},{"title":"Org history","href":"/history"},{"title":"Engine autonomy","href":"/autonomy"},{"title":"Experiments","href":"/experiments"},{"title":"A/B test your landing pages","href":"/ab-testing-pages"},{"title":"Persona panel — the wind tunnel","href":"/persona-panel"},{"title":"Conversations","href":"/conversations"},{"title":"Page reviews — the critic on any URL","href":"/page-reviews"},{"title":"The wind tunnel","href":"/wind-tunnel"},{"title":"How we validate synthetic panels","href":"/panel-validation"},{"title":"Judges and calibration","href":"/judges"},{"title":"Cross-customer priors","href":"/cross-customer-priors"},{"title":"Voice Calls \u0026 Scheduling","href":"/voice"},{"title":"Calling a Lead","href":"/voice-phone-calling"},{"title":"Booking Meetings on Phone Calls","href":"/voice-phone-booking"},{"title":"Phone Call Records","href":"/voice-call-records"},{"title":"Website Widget (concierge)","href":"/voice-widget"},{"title":"SMS Messaging","href":"/messaging"},{"title":"Registering a Number: Texts, Caller Name and Verified Calls","href":"/sms-registration"},{"title":"Branded Calling","href":"/branded-calling"},{"title":"Shared WhatsApp number","description":"Lend one of your approved WhatsApp numbers to the organizations you manage, so their lead follow-up reaches people abroad before their own number is on WhatsApp.","href":"/whatsapp-shared-number"},{"title":"Bounded outreach","href":"/outreach"},{"title":"Web Browsing","description":"Have an Erdo agent use a real web browser — log in, navigate, fill forms, extract data, download files, and capture screenshots — for the things that only happen in a browser.","href":"/browser"},{"title":"Inboxes","href":"/inboxes"},{"title":"Sent email","href":"/sent-email"},{"title":"Email sending domains","href":"/sending-domains"},{"title":"Arrival notifications","href":"/dataset-notifications"},{"title":"Lead capture observations","href":"/lead-capture-observations"},{"title":"Lead form protection","href":"/lead-form-protection"},{"title":"Row actions","href":"/dataset-row-actions"},{"title":"Lead identity","href":"/lead-identity"},{"title":"Delete a lead","href":"/delete-a-lead"},{"title":"Resolve refused submissions","href":"/capture-resolution"},{"title":"Lead details","href":"/lead-details"},{"title":"Lead next action","href":"/lead-next-action"},{"title":"Scheduled actions","href":"/scheduled-actions"},{"title":"Ad accounts","href":"/ad-accounts"},{"title":"Offline conversions","href":"/offline-conversions"}]},{"group":"Connect Erdo","pages":[{"title":"MCP Server","href":"/mcp/overview"},{"title":"CLI","href":"/cli"},{"title":"Connecting integrations","href":"/integrations"},{"title":"Slack agent","href":"/slack-agent"},{"title":"Enformion enrichment","href":"/apps/enformion"},{"title":"Which account a connection uses","href":"/connection-accounts"}]}]},{"tab":"Developers","groups":[{"group":"Platform API","pages":[{"title":"REST API","href":"/api/overview"},{"title":"Realtime updates","href":"/api/realtime"},{"title":"Scoped API Keys","href":"/api/scoped-keys"},{"title":"Manager accounts","href":"/manager-accounts"},{"title":"Email a Maurice proposal and Order","href":"/maurice-order-email"},{"title":"Custom domains","href":"/custom-domains"},{"title":"Email sending domains","href":"/sending-domains"},{"title":"Integration connect links","href":"/connect-links"},{"title":"Which account a connection uses","href":"/connection-accounts"},{"title":"Approvals","href":"/approvals"},{"title":"Ad accounts","href":"/ad-accounts"},{"title":"Paid-media campaign lifecycle","href":"/paid-media"},{"title":"Search campaign setup","href":"/search-campaign-setup"},{"title":"How Erdo bids","href":"/bidding"},{"title":"Org history","href":"/history"},{"title":"The review queue","href":"/review-queue"},{"title":"Page analytics","href":"/page-analytics"},{"title":"Page tracking","href":"/page-tracking"},{"title":"Evals","href":"/evals"},{"title":"Event pipelines","href":"/event-pipelines"},{"title":"Lead identity","href":"/lead-identity"},{"title":"Delete a lead","href":"/delete-a-lead"},{"title":"Resolve refused submissions","href":"/capture-resolution"},{"title":"Lead details","href":"/lead-details"},{"title":"Lead next action","href":"/lead-next-action"},{"title":"Strategies","href":"/strategies"},{"title":"Workstreams","href":"/workstreams"},{"title":"Growth reviews","href":"/growth-reviews"},{"title":"Decisions","href":"/decisions"},{"title":"Experiments","href":"/experiments"},{"title":"Your attention feed","href":"/attention"},{"title":"Page feedback","href":"/page-feedback"},{"title":"Engine autonomy","href":"/autonomy"},{"title":"Persona panel — the wind tunnel","href":"/persona-panel"},{"title":"Page reviews — the critic on any URL","description":"Review any landing page URL with Erdo's real conversion critic: typed defects with severity, the principle each one violates, the evidence in the captures, and the fix — plus what the page does well.","href":"/page-reviews"},{"title":"Bounded outreach","href":"/outreach"},{"title":"Cross-customer priors","description":"How Erdo learns aggregate priors from every organization's experiments — what is shared, what never is, and how to opt out.","href":"/cross-customer-priors"},{"title":"The wind tunnel","href":"/wind-tunnel"},{"title":"Judges and calibration","href":"/judges"}]},{"group":"API Reference","pages":[{"group":"API Reference","pages":[{"title":"ListActivityFeedAPI mirrors erdo_list_activity_feed: the unified, ranked,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/activity/feed","href":"/api-reference/listactivityfeedapi-mirrors-erdo_list_activity_feed:-the-unified-ranked"},{"title":"ListActivityHistoryAPI mirrors erdo_list_activity_history: the org's durable,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/activity/history","href":"/api-reference/listactivityhistoryapi-mirrors-erdo_list_activity_history:-the-orgs-durable"},{"title":"Lists the advertising accounts this organization's connected integrations can\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/ad-accounts","href":"/api-reference/lists-the-advertising-accounts-this-organizations-connected-integrations-can"},{"title":"ListApprovalPoliciesAPI lists standing policies for the active organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approval-policies","href":"/api-reference/listapprovalpoliciesapi-lists-standing-policies-for-the-active-organization"},{"title":"CreateApprovalPolicyAPI creates a standing policy without executing the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/approval-policies","href":"/api-reference/createapprovalpolicyapi-creates-a-standing-policy-without-executing-the"},{"title":"DeleteApprovalPolicyAPI removes one standing policy in the active organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/approval-policies/{id}","href":"/api-reference/deleteapprovalpolicyapi-removes-one-standing-policy-in-the-active-organization"},{"title":"GetApprovalSettingsAPI mirrors erdo_get_approval_settings: read the caller's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approval-settings","href":"/api-reference/getapprovalsettingsapi-mirrors-erdo_get_approval_settings:-read-the-callers"},{"title":"SetApprovalSettingsAPI mirrors erdo_set_approval_settings: replace the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/approval-settings","href":"/api-reference/setapprovalsettingsapi-mirrors-erdo_set_approval_settings:-replace-the"},{"title":"ListApprovalsAPI mirrors erdo_list_approvals.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approvals","href":"/api-reference/listapprovalsapi-mirrors-erdo_list_approvals"},{"title":"GetApprovalAPI mirrors erdo_get_approval: one request in full, the read a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approvals/{id}","href":"/api-reference/getapprovalapi-mirrors-erdo_get_approval:-one-request-in-full-the-read-a"},{"title":"DecideApprovalAPI mirrors erdo_decide_approval.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/approvals/{id}/decide","href":"/api-reference/decideapprovalapi-mirrors-erdo_decide_approval"},{"title":"ListArtifactsAPI mirrors the erdo_list_artifacts MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/artifacts","href":"/api-reference/listartifactsapi-mirrors-the-erdo_list_artifacts-mcp-tool"},{"title":"GetArtifactAPI mirrors the erdo_get_artifact MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/artifacts/{artifactID}","href":"/api-reference/getartifactapi-mirrors-the-erdo_get_artifact-mcp-tool"},{"title":"AskDataQuestionAPI mirrors the erdo_ask_data_question MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/ask","href":"/api-reference/askdataquestionapi-mirrors-the-erdo_ask_data_question-mcp-tool-as-a-restendpoint"},{"title":"ListAttentionItemsAPI mirrors erdo_list_attention_items.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/attention","href":"/api-reference/listattentionitemsapi-mirrors-erdo_list_attention_items"},{"title":"RespondAttentionItemAPI mirrors erdo_respond_attention_item: answer a choice\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/attention/{itemID}/respond","href":"/api-reference/respondattentionitemapi-mirrors-erdo_respond_attention_item:-answer-a-choice"},{"title":"GetAutonomyGatesAPI mirrors erdo_get_autonomy_gates: read which risk classes\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/autonomy-gates","href":"/api-reference/getautonomygatesapi-mirrors-erdo_get_autonomy_gates:-read-which-risk-classes"},{"title":"SetAutonomyGatesAPI mirrors erdo_set_autonomy_gates: replace the org's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/autonomy-gates","href":"/api-reference/setautonomygatesapi-mirrors-erdo_set_autonomy_gates:-replace-the-orgs"},{"title":"GetAutonomyModeAPI mirrors erdo_get_autonomy_mode: read the org's engine\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/autonomy-mode","href":"/api-reference/getautonomymodeapi-mirrors-erdo_get_autonomy_mode:-read-the-orgs-engine"},{"title":"SetAutonomyModeAPI mirrors erdo_set_autonomy_mode: set the org's engine\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/autonomy-mode","href":"/api-reference/setautonomymodeapi-mirrors-erdo_set_autonomy_mode:-set-the-orgs-engine"},{"title":"ListCrossCustomerPriorsAPI mirrors erdo_list_cross_customer_priors.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/cross-customer-priors","href":"/api-reference/listcrosscustomerpriorsapi-mirrors-erdo_list_cross_customer_priors"},{"title":"ListCustomDomainsAPI lists the caller org's custom page domains with live\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/custom-domains","href":"/api-reference/listcustomdomainsapi-lists-the-caller-orgs-custom-page-domains-with-live"},{"title":"CreateCustomDomainAPI registers a custom domain for the caller's org and\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/custom-domains","href":"/api-reference/createcustomdomainapi-registers-a-custom-domain-for-the-callers-org-and"},{"title":"DeleteCustomDomainAPI removes a custom domain registration (and its CDN\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/custom-domains/{domain}","href":"/api-reference/deletecustomdomainapi-removes-a-custom-domain-registration-and-its-cdn"},{"title":"SetCustomDomainManagerDefaultAPI marks a registered domain as the one the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/custom-domains/{domain}/manager-default","href":"/api-reference/setcustomdomainmanagerdefaultapi-marks-a-registered-domain-as-the-one-the"},{"title":"TransferCustomDomainAPI moves a custom domain to another organization the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/custom-domains/{domain}/transfer","href":"/api-reference/transfercustomdomainapi-moves-a-custom-domain-to-another-organization-the"},{"title":"GatherDatasetContextAPI mirrors the erdo_gather_dataset_context MCP tool as a\nREST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/dataset-context","href":"/api-reference/gatherdatasetcontextapi-mirrors-the-erdo_gather_dataset_context-mcp-tool-as-arest-endpoint"},{"title":"GetDatasetNotificationAPI reports who is emailed when new rows land in a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/dataset-notifications","href":"/api-reference/getdatasetnotificationapi-reports-who-is-emailed-when-new-rows-land-in-a"},{"title":"SetDatasetNotificationAPI replaces the email recipients and optional durable\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/dataset-notifications","href":"/api-reference/setdatasetnotificationapi-replaces-the-email-recipients-and-optional-durable"},{"title":"Lists what already happens to new rows in a dataset: every declaration on it,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/dataset-row-actions","href":"/api-reference/lists-what-already-happens-to-new-rows-in-a-dataset:-every-declaration-on-it"},{"title":"Declares what happens when new rows land in a dataset: invoke an action on\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/dataset-row-actions","href":"/api-reference/declares-what-happens-when-new-rows-land-in-a-dataset:-invoke-an-action-on"},{"title":"Renders the email a declaration would produce for one sample row and delivers\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/dataset-row-actions/test-send","href":"/api-reference/renders-the-email-a-declaration-would-produce-for-one-sample-row-and-delivers"},{"title":"ListDatasetsAPI mirrors the erdo_list_datasets MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets","href":"/api-reference/listdatasetsapi-mirrors-the-erdo_list_datasets-mcp-tool-as-a-rest-endpoint"},{"title":"CreateDatasetAPI creates a new empty dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets-create","href":"/api-reference/createdatasetapi-creates-a-new-empty-dataset"},{"title":"EnsureDatasetAPI creates, reuses, or explicitly adopts the one dataset for a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets-ensure","href":"/api-reference/ensuredatasetapi-creates-reuses-or-explicitly-adopts-the-one-dataset-for-a"},{"title":"ListDatasetPurposesAPI mirrors the erdo_list_dataset_purposes MCP tool as a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets-purposes","href":"/api-reference/listdatasetpurposesapi-mirrors-the-erdo_list_dataset_purposes-mcp-tool-as-a"},{"title":"SearchDatasetsAPI mirrors the erdo_search_datasets MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets-search","href":"/api-reference/searchdatasetsapi-mirrors-the-erdo_search_datasets-mcp-tool-as-a-rest-endpoint"},{"title":"UploadDatasetFileAPI mirrors the erdo_upload_dataset_file MCP tool as a REST\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets-upload","href":"/api-reference/uploaddatasetfileapi-mirrors-the-erdo_upload_dataset_file-mcp-tool-as-a-rest"},{"title":"GetDatasetSchemaAPI mirrors the erdo_get_dataset_schema MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetID}/schema","href":"/api-reference/getdatasetschemaapi-mirrors-the-erdo_get_dataset_schema-mcp-tool-as-a-restendpoint"},{"title":"DeleteDatasetAPI deletes a dataset by slug.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}","href":"/api-reference/deletedatasetapi-deletes-a-dataset-by-slug"},{"title":"FetchDatasetContentsAPI mirrors the erdo_fetch_dataset_contents MCP tool as a\nREST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/fetch","href":"/api-reference/fetchdatasetcontentsapi-mirrors-the-erdo_fetch_dataset_contents-mcp-tool-as-arest-endpoint"},{"title":"ListDatasetFiltersAPI mirrors the erdo_list_dataset_filters MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/filters","href":"/api-reference/listdatasetfiltersapi-mirrors-the-erdo_list_dataset_filters-mcp-tool"},{"title":"CreateDatasetFilterAPI mirrors the erdo_add_dataset_filter MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/filters","href":"/api-reference/createdatasetfilterapi-mirrors-the-erdo_add_dataset_filter-mcp-tool"},{"title":"DeleteDatasetFilterAPI mirrors the erdo_remove_dataset_filter MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/filters/{filterID}","href":"/api-reference/deletedatasetfilterapi-mirrors-the-erdo_remove_dataset_filter-mcp-tool"},{"title":"ListLeadMergeCandidatesAPI mirrors the erdo_list_lead_merge_candidates MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/lead-candidates","href":"/api-reference/listleadmergecandidatesapi-mirrors-the-erdo_list_lead_merge_candidates-mcp-tool"},{"title":"ResolveLeadCaptureAPI previews or records an audited disposition of a refused\ncapture.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/lead-captures/{captureID}/resolve","href":"/api-reference/resolveleadcaptureapi-previews-or-records-an-audited-disposition-of-a-refusedcapture"},{"title":"MaintainLeadIdentityAPI is the REST surface for previewing and performing a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/lead-identity/maintain","href":"/api-reference/maintainleadidentityapi-is-the-rest-surface-for-previewing-and-performing-a"},{"title":"GetLeadAPI mirrors the erdo_get_lead MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/leads/{leadRef}","href":"/api-reference/getleadapi-mirrors-the-erdo_get_lead-mcp-tool"},{"title":"DeleteLeadAPI removes one lead from Erdo: its row and identity, its\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/leads/{leadRef}","href":"/api-reference/deleteleadapi-removes-one-lead-from-erdo:-its-row-and-identity-its"},{"title":"MergeLeadsAPI makes two lead identities one lead: the absorbed identity points\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/merge","href":"/api-reference/mergeleadsapi-makes-two-lead-identities-one-lead:-the-absorbed-identity-points"},{"title":"GetLeadNextActionsAPI mirrors the erdo_get_lead_next_actions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions","href":"/api-reference/getleadnextactionsapi-mirrors-the-erdo_get_lead_next_actions-mcp-tool"},{"title":"RecordLeadNextActionAPI records a person's hold, close or start on one lead.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions","href":"/api-reference/recordleadnextactionapi-records-a-persons-hold-close-or-start-on-one-lead"},{"title":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/evaluate","href":"/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp"},{"title":"ResolveLeadHandoffAPI records the sales desk marking a handoff done or not\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/handoff","href":"/api-reference/resolveleadhandoffapi-records-the-sales-desk-marking-a-handoff-done-or-not"},{"title":"ResumeLeadNextActionsAPI hands a lead the desk snoozed (held) or stopped\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/resume","href":"/api-reference/resumeleadnextactionsapi-hands-a-lead-the-desk-snoozed-held-or-stopped"},{"title":"UndoLeadNextActionAPI takes back an approval that has not been carried out\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/undo","href":"/api-reference/undoleadnextactionapi-takes-back-an-approval-that-has-not-been-carried-out"},{"title":"GetLeadTimelineAPI mirrors the erdo_get_lead_timeline MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/leads/{leadRef}/timeline","href":"/api-reference/getleadtimelineapi-mirrors-the-erdo_get_lead_timeline-mcp-tool"},{"title":"List explicit user grants on a dataset in the active organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/permissions/users","href":"/api-reference/list-explicit-user-grants-on-a-dataset-in-the-active-organization"},{"title":"Set an explicit user grant and return the persisted grant. Ownership is\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/datasets/{datasetSlug}/permissions/users/{userID}","href":"/api-reference/set-an-explicit-user-grant-and-return-the-persisted-grant-ownership-is"},{"title":"Remove an explicit user grant and verify its absence. Inherited access may\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/permissions/users/{userID}","href":"/api-reference/remove-an-explicit-user-grant-and-verify-its-absence-inherited-access-may"},{"title":"RunQueryAPI mirrors the erdo_run_query MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/query","href":"/api-reference/runqueryapi-mirrors-the-erdo_run_query-mcp-tool-as-a-rest-endpoint"},{"title":"QueryDataNaturalLanguageAPI mirrors the erdo_query_data MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/query-nl","href":"/api-reference/querydatanaturallanguageapi-mirrors-the-erdo_query_data-mcp-tool-as-a-restendpoint"},{"title":"GetDatasetRefreshAPI mirrors the erdo_get_dataset_refresh MCP tool. A dataset\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/refresh","href":"/api-reference/getdatasetrefreshapi-mirrors-the-erdo_get_dataset_refresh-mcp-tool-a-dataset"},{"title":"ConfigureDatasetRefreshAPI mirrors the erdo_configure_dataset_refresh MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/datasets/{datasetSlug}/refresh","href":"/api-reference/configuredatasetrefreshapi-mirrors-the-erdo_configure_dataset_refresh-mcp"},{"title":"RunDatasetRefreshAPI mirrors the erdo_run_dataset_refresh MCP tool: it runs\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/refresh/run","href":"/api-reference/rundatasetrefreshapi-mirrors-the-erdo_run_dataset_refresh-mcp-tool:-it-runs"},{"title":"ListDatasetRevisionsAPI mirrors the erdo_list_dataset_revisions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/revisions","href":"/api-reference/listdatasetrevisionsapi-mirrors-the-erdo_list_dataset_revisions-mcp-tool"},{"title":"WriteDatasetRowsAPI writes/upserts rows to a dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/rows","href":"/api-reference/writedatasetrowsapi-writesupserts-rows-to-a-dataset"},{"title":"DeleteDatasetRowsAPI deletes rows from a dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/rows","href":"/api-reference/deletedatasetrowsapi-deletes-rows-from-a-dataset"},{"title":"UpdateDatasetSchemaAPI updates a dataset's schema (add/remove/rename columns,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/schema","href":"/api-reference/updatedatasetschemaapi-updates-a-datasets-schema-addremoverename-columns"},{"title":"ListDecisionsAPI mirrors erdo_list_decisions.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/decisions","href":"/api-reference/listdecisionsapi-mirrors-erdo_list_decisions"},{"title":"DecisionScorecardAPI mirrors erdo_decision_scorecard: raw aggregates with their\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/decisions-scorecard","href":"/api-reference/decisionscorecardapi-mirrors-erdo_decision_scorecard:-raw-aggregates-with-their"},{"title":"GetDecisionAPI mirrors erdo_get_decision: one decision in full — the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/decisions/{decisionSlug}","href":"/api-reference/getdecisionapi-mirrors-erdo_get_decision:-one-decision-in-full-—-the"},{"title":"ListEmailsAPI mirrors erdo_list_emails. Filters ride the query string, except\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/emails","href":"/api-reference/listemailsapi-mirrors-erdo_list_emails-filters-ride-the-query-string-except"},{"title":"ListEmailsPostAPI is the POST body form of the list endpoint. It exists for\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/emails-query","href":"/api-reference/listemailspostapi-is-the-post-body-form-of-the-list-endpoint-it-exists-for"},{"title":"GetEmailAPI mirrors erdo_get_email, returning one message with both bodies as\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/emails/{emailID}","href":"/api-reference/getemailapi-mirrors-erdo_get_email-returning-one-message-with-both-bodies-as"},{"title":"GetEvalLeaderboardAPI mirrors erdo_get_eval_leaderboard.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/leaderboard/{suiteSlug}","href":"/api-reference/getevalleaderboardapi-mirrors-erdo_get_eval_leaderboard"},{"title":"ListEvalRunsAPI mirrors erdo_list_eval_runs.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/runs","href":"/api-reference/listevalrunsapi-mirrors-erdo_list_eval_runs"},{"title":"GetEvalRunAPI mirrors erdo_get_eval_run.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/runs/{runID}","href":"/api-reference/getevalrunapi-mirrors-erdo_get_eval_run"},{"title":"ListEvalSuitesAPI mirrors erdo_list_eval_suites.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/suites","href":"/api-reference/listevalsuitesapi-mirrors-erdo_list_eval_suites"},{"title":"CreateEvalSuiteAPI mirrors erdo_create_eval_suite.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/evals/suites","href":"/api-reference/createevalsuiteapi-mirrors-erdo_create_eval_suite"},{"title":"GetEvalSuiteAPI mirrors erdo_get_eval_suite.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/suites/{suiteSlug}","href":"/api-reference/getevalsuiteapi-mirrors-erdo_get_eval_suite"},{"title":"UpdateEvalSuiteAPI mirrors erdo_update_eval_suite. Only provided fields change.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/evals/suites/{suiteSlug}","href":"/api-reference/updateevalsuiteapi-mirrors-erdo_update_eval_suite-only-provided-fields-change"},{"title":"AddEvalCaseAPI mirrors erdo_add_eval_case.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/evals/suites/{suiteSlug}/cases","href":"/api-reference/addevalcaseapi-mirrors-erdo_add_eval_case"},{"title":"UpdateEvalCaseAPI mirrors erdo_update_eval_case.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/evals/suites/{suiteSlug}/cases/{caseName}","href":"/api-reference/updateevalcaseapi-mirrors-erdo_update_eval_case"},{"title":"RemoveEvalCaseAPI mirrors erdo_remove_eval_case.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/evals/suites/{suiteSlug}/cases/{caseName}","href":"/api-reference/removeevalcaseapi-mirrors-erdo_remove_eval_case"},{"title":"RunEvalSuiteAPI mirrors erdo_run_eval_suite.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/evals/suites/{suiteSlug}/run","href":"/api-reference/runevalsuiteapi-mirrors-erdo_run_eval_suite"},{"title":"GetEvalWidgetCanaryAPI reads the deployed-experience widget canary for the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/widget-canary","href":"/api-reference/getevalwidgetcanaryapi-reads-the-deployed-experience-widget-canary-for-the"},{"title":"ConfigureEvalWidgetCanaryAPI designates an existing widget in the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/evals/widget-canary","href":"/api-reference/configureevalwidgetcanaryapi-designates-an-existing-widget-in-the"},{"title":"ListEventPipelinesAPI mirrors erdo_list_event_pipelines.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/event-pipelines","href":"/api-reference/listeventpipelinesapi-mirrors-erdo_list_event_pipelines"},{"title":"CreateEventPipelineAPI mirrors erdo_create_event_pipeline. Creation is where\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/event-pipelines","href":"/api-reference/createeventpipelineapi-mirrors-erdo_create_event_pipeline-creation-is-where"},{"title":"GetEventPipelineAPI mirrors erdo_get_event_pipeline (slug or uuid).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/event-pipelines/{pipelineSlug}","href":"/api-reference/geteventpipelineapi-mirrors-erdo_get_event_pipeline-slug-or-uuid"},{"title":"UpdateEventPipelineAPI mirrors erdo_update_event_pipeline. Fields merge over\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/event-pipelines/{pipelineSlug}","href":"/api-reference/updateeventpipelineapi-mirrors-erdo_update_event_pipeline-fields-merge-over"},{"title":"ListEventPipelineExecutionsAPI mirrors erdo_list_event_pipeline_executions.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/event-pipelines/{pipelineSlug}/executions","href":"/api-reference/listeventpipelineexecutionsapi-mirrors-erdo_list_event_pipeline_executions"},{"title":"MarkEventPipelineExecutionsHandledAPI records that pipeline failures have been\ndealt with.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/event-pipelines/{pipelineSlug}/executions/handled","href":"/api-reference/markeventpipelineexecutionshandledapi-records-that-pipeline-failures-have-beendealt-with"},{"title":"RotateEventPipelineSecretAPI mirrors erdo_rotate_event_pipeline_secret. The\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/event-pipelines/{pipelineSlug}/rotate-secret","href":"/api-reference/rotateeventpipelinesecretapi-mirrors-erdo_rotate_event_pipeline_secret-the"},{"title":"ListExperimentsAPI mirrors erdo_list_experiments.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments","href":"/api-reference/listexperimentsapi-mirrors-erdo_list_experiments"},{"title":"CreateExperimentAPI mirrors erdo_create_experiment.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments","href":"/api-reference/createexperimentapi-mirrors-erdo_create_experiment"},{"title":"GetExperimentAPI mirrors erdo_get_experiment (slug or uuid).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments/{experimentSlug}","href":"/api-reference/getexperimentapi-mirrors-erdo_get_experiment-slug-or-uuid"},{"title":"UpdateExperimentAPI mirrors erdo_update_experiment.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/experiments/{experimentSlug}","href":"/api-reference/updateexperimentapi-mirrors-erdo_update_experiment"},{"title":"RecordAllocationDecisionAPI mirrors erdo_record_allocation_decision: record\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/allocation-decisions","href":"/api-reference/recordallocationdecisionapi-mirrors-erdo_record_allocation_decision:-record"},{"title":"DiagnoseExperimentAPI mirrors erdo_diagnose_experiment_personas: run\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/diagnose","href":"/api-reference/diagnoseexperimentapi-mirrors-erdo_diagnose_experiment_personas:-run"},{"title":"ListExperimentObservationsAPI mirrors erdo_list_experiment_observations.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments/{experimentSlug}/observations","href":"/api-reference/listexperimentobservationsapi-mirrors-erdo_list_experiment_observations"},{"title":"RunPersonaPanelAPI mirrors erdo_run_persona_panel: start a persona panel\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/panel","href":"/api-reference/runpersonapanelapi-mirrors-erdo_run_persona_panel:-start-a-persona-panel"},{"title":"GetExperimentPolicyAPI mirrors erdo_get_experiment_policy — the decision\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments/{experimentSlug}/policy","href":"/api-reference/getexperimentpolicyapi-mirrors-erdo_get_experiment_policy-—-the-decision"},{"title":"RunTournamentAPI mirrors erdo_run_pairwise_tournament: rank an experiment's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/tournament","href":"/api-reference/runtournamentapi-mirrors-erdo_run_pairwise_tournament:-rank-an-experiments"},{"title":"ListHeartbeatsAPI mirrors the erdo_list_heartbeats MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/heartbeats","href":"/api-reference/listheartbeatsapi-mirrors-the-erdo_list_heartbeats-mcp-tool"},{"title":"CreateHeartbeatAPI mirrors the erdo_create_heartbeat MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/heartbeats","href":"/api-reference/createheartbeatapi-mirrors-the-erdo_create_heartbeat-mcp-tool"},{"title":"UpdateHeartbeatAPI mirrors the erdo_update_heartbeat MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/heartbeats/{heartbeatID}","href":"/api-reference/updateheartbeatapi-mirrors-the-erdo_update_heartbeat-mcp-tool"},{"title":"ListHeartbeatExecutionsAPI mirrors the erdo_list_heartbeat_executions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/heartbeats/{heartbeatID}/executions","href":"/api-reference/listheartbeatexecutionsapi-mirrors-the-erdo_list_heartbeat_executions-mcp-tool"},{"title":"RunHeartbeatAPI mirrors the erdo_run_heartbeat MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/heartbeats/{heartbeatID}/run","href":"/api-reference/runheartbeatapi-mirrors-the-erdo_run_heartbeat-mcp-tool"},{"title":"SetHeartbeatStateAPI mirrors the erdo_set_heartbeat_state MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/heartbeats/{heartbeatID}/state","href":"/api-reference/setheartbeatstateapi-mirrors-the-erdo_set_heartbeat_state-mcp-tool"},{"title":"UploadImageAPI mirrors the erdo_upload_image MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/images/upload","href":"/api-reference/uploadimageapi-mirrors-the-erdo_upload_image-mcp-tool-as-a-rest-endpoint"},{"title":"SearchIntegrationAppsAPI mirrors the erdo_search_integration_apps MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integration-apps","href":"/api-reference/searchintegrationappsapi-mirrors-the-erdo_search_integration_apps-mcp-tool"},{"title":"ListConnectLinksAPI mirrors erdo_list_integration_connect_links.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integration-connect-links","href":"/api-reference/listconnectlinksapi-mirrors-erdo_list_integration_connect_links"},{"title":"CreateConnectLinkAPI mirrors erdo_create_integration_connect_link.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-connect-links","href":"/api-reference/createconnectlinkapi-mirrors-erdo_create_integration_connect_link"},{"title":"RevokeConnectLinkAPI mirrors erdo_revoke_integration_connect_link.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-connect-links/{id}/revoke","href":"/api-reference/revokeconnectlinkapi-mirrors-erdo_revoke_integration_connect_link"},{"title":"CreateIntegrationDatasetAPI mirrors erdo_create_integration_dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-datasets","href":"/api-reference/createintegrationdatasetapi-mirrors-erdo_create_integration_dataset"},{"title":"ConfigureIntegrationDatasetAPI updates an existing integration dataset's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-datasets/{datasetID}/configure","href":"/api-reference/configureintegrationdatasetapi-updates-an-existing-integration-datasets"},{"title":"ListIntegrationsAPI mirrors the erdo_list_integrations MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations","href":"/api-reference/listintegrationsapi-mirrors-the-erdo_list_integrations-mcp-tool"},{"title":"ConnectIntegrationAPI mirrors the erdo_connect_integration MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations-connect","href":"/api-reference/connectintegrationapi-mirrors-the-erdo_connect_integration-mcp-tool"},{"title":"CheckIntegrationConnectionAPI mirrors the erdo_check_integration_connection MCP\ntool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations-connect/{app}","href":"/api-reference/checkintegrationconnectionapi-mirrors-the-erdo_check_integration_connection-mcptool"},{"title":"DeleteIntegrationAPI removes a connected integration: the credential row is\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/integrations/{integrationID}","href":"/api-reference/deleteintegrationapi-removes-a-connected-integration:-the-credential-row-is"},{"title":"GetConnectionScopeAPI mirrors the erdo_get_connection_scope MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations/{integrationID}/connection-scope","href":"/api-reference/getconnectionscopeapi-mirrors-the-erdo_get_connection_scope-mcp-tool"},{"title":"SetConnectionScopeAPI mirrors the erdo_set_connection_scope MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations/{integrationID}/connection-scope","href":"/api-reference/setconnectionscopeapi-mirrors-the-erdo_set_connection_scope-mcp-tool"},{"title":"SetIntegrationIdentityAPI writes a connection's stored account identity\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations/{integrationID}/identity","href":"/api-reference/setintegrationidentityapi-writes-a-connections-stored-account-identity"},{"title":"SetIntegrationManagedAccessAPI starts or stops providing a connection to the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations/{integrationID}/managed-access","href":"/api-reference/setintegrationmanagedaccessapi-starts-or-stops-providing-a-connection-to-the"},{"title":"DiscoverIntegrationTablesAPI mirrors erdo_discover_integration_tables.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations/{integrationRef}/tables","href":"/api-reference/discoverintegrationtablesapi-mirrors-erdo_discover_integration_tables"},{"title":"BacktestJudgeAPI mirrors erdo_backtest_judge: run a judge over the org's live\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/judge-backtests","href":"/api-reference/backtestjudgeapi-mirrors-erdo_backtest_judge:-run-a-judge-over-the-orgs-live"},{"title":"JudgeCalibrationAPI mirrors erdo_judge_calibration.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/judge-calibration","href":"/api-reference/judgecalibrationapi-mirrors-erdo_judge_calibration"},{"title":"ListKnowledgeAPI mirrors the erdo_list_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge","href":"/api-reference/listknowledgeapi-mirrors-the-erdo_list_knowledge-mcp-tool"},{"title":"CreateKnowledgeAPI mirrors the erdo_create_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/knowledge","href":"/api-reference/createknowledgeapi-mirrors-the-erdo_create_knowledge-mcp-tool"},{"title":"SearchKnowledgeAPI mirrors the erdo_search_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge-search","href":"/api-reference/searchknowledgeapi-mirrors-the-erdo_search_knowledge-mcp-tool"},{"title":"GetKnowledgeAPI mirrors the typed Knowledge read used by the app and MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge/{knowledgeObjectID}","href":"/api-reference/getknowledgeapi-mirrors-the-typed-knowledge-read-used-by-the-app-and-mcp"},{"title":"DeleteKnowledgeAPI mirrors the erdo_delete_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/knowledge/{knowledgeObjectID}","href":"/api-reference/deleteknowledgeapi-mirrors-the-erdo_delete_knowledge-mcp-tool"},{"title":"UpdateKnowledgeAPI mirrors the canonical typed Knowledge action. The action\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/knowledge/{knowledgeObjectID}/actions","href":"/api-reference/updateknowledgeapi-mirrors-the-canonical-typed-knowledge-action-the-action"},{"title":"SetKnowledgeVisibilityAPI mirrors the erdo_set_knowledge_visibility MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/knowledge/{knowledgeObjectID}/visibility","href":"/api-reference/setknowledgevisibilityapi-mirrors-the-erdo_set_knowledge_visibility-mcp-tool"},{"title":"ListKnowledgeAssetsAPI mirrors erdo_list_knowledge_assets.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge/{objectID}/attachments","href":"/api-reference/listknowledgeassetsapi-mirrors-erdo_list_knowledge_assets"},{"title":"AttachKnowledgeAssetAPI mirrors the erdo_attach_knowledge_asset MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/knowledge/{objectID}/attachments","href":"/api-reference/attachknowledgeassetapi-mirrors-the-erdo_attach_knowledge_asset-mcp-tool"},{"title":"ListKVStoresAPIv1 mirrors the erdo_list_kv_stores MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/kv","href":"/api-reference/listkvstoresapiv1-mirrors-the-erdo_list_kv_stores-mcp-tool"},{"title":"CreateKVStoreAPIv1 mirrors the erdo_create_kv_store MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/kv","href":"/api-reference/createkvstoreapiv1-mirrors-the-erdo_create_kv_store-mcp-tool"},{"title":"GetKVItemAPIv1 mirrors the erdo_get_kv_item MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/kv/{slug}/items/{key}","href":"/api-reference/getkvitemapiv1-mirrors-the-erdo_get_kv_item-mcp-tool"},{"title":"SetKVItemAPIv1 mirrors the erdo_set_kv_item MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/kv/{slug}/items/{key}","href":"/api-reference/setkvitemapiv1-mirrors-the-erdo_set_kv_item-mcp-tool"},{"title":"DeleteKVItemAPIv1 mirrors the erdo_delete_kv_item MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/kv/{slug}/items/{key}","href":"/api-reference/deletekvitemapiv1-mirrors-the-erdo_delete_kv_item-mcp-tool"},{"title":"ListLeadNextActionsAPI mirrors the erdo_list_lead_next_actions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-next-actions","href":"/api-reference/listleadnextactionsapi-mirrors-the-erdo_list_lead_next_actions-mcp-tool"},{"title":"GetLeadPlaybookAPI mirrors the erdo_get_lead_playbook MCP tool. An\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-playbook","href":"/api-reference/getleadplaybookapi-mirrors-the-erdo_get_lead_playbook-mcp-tool-an"},{"title":"PutLeadPlaybookAPI saves the playbook text, reads it into the typed\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/lead-playbook","href":"/api-reference/putleadplaybookapi-saves-the-playbook-text-reads-it-into-the-typed"},{"title":"PutLeadPlaybookHandoffAlertAPI changes only who is emailed about a handoff\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/lead-playbook/handoff-alert","href":"/api-reference/putleadplaybookhandoffalertapi-changes-only-who-is-emailed-about-a-handoff"},{"title":"ReadLeadPlaybookAPI mirrors the erdo_read_lead_playbook MCP tool: the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/lead-playbook/read-back","href":"/api-reference/readleadplaybookapi-mirrors-the-erdo_read_lead_playbook-mcp-tool:-the"},{"title":"ListLeadPlaybookRevisionsAPI mirrors the erdo_list_lead_playbook_revisions\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-playbook/revisions","href":"/api-reference/listleadplaybookrevisionsapi-mirrors-the-erdo_list_lead_playbook_revisions"},{"title":"GetLeadPlaybookRevisionAPI mirrors the erdo_get_lead_playbook_revision MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-playbook/revisions/{revision}","href":"/api-reference/getleadplaybookrevisionapi-mirrors-the-erdo_get_lead_playbook_revision-mcp"},{"title":"AdoptManagedOrganizationAPI brings an EXISTING org under the caller's manager\norg. Consent\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organization-adoptions","href":"/api-reference/adoptmanagedorganizationapi-brings-an-existing-org-under-the-callers-managerorg-consent"},{"title":"ManagerPerformanceAPI mirrors erdo_get_manager_performance.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/managed-organization-performance","href":"/api-reference/managerperformanceapi-mirrors-erdo_get_manager_performance"},{"title":"ListManagedOrganizationsAPI mirrors erdo_list_managed_organizations.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/managed-organizations","href":"/api-reference/listmanagedorganizationsapi-mirrors-erdo_list_managed_organizations"},{"title":"CreateManagedOrganizationAPI mirrors erdo_create_managed_organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations","href":"/api-reference/createmanagedorganizationapi-mirrors-erdo_create_managed_organization"},{"title":"RevokeManagedOrganizationAPI mirrors erdo_revoke_managed_organization (managed\norg named by slug).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/managed-organizations/{orgSlug}","href":"/api-reference/revokemanagedorganizationapi-mirrors-erdo_revoke_managed_organization-managedorg-named-by-slug"},{"title":"GetManagedOrganizationAdsContainerAPI reports the Google Ads container a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/managed-organizations/{orgSlug}/ads-container","href":"/api-reference/getmanagedorganizationadscontainerapi-reports-the-google-ads-container-a"},{"title":"ProvisionManagedOrganizationAdsContainerAPI gives a managed org its own Google\nAds container in\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations/{orgSlug}/ads-container","href":"/api-reference/provisionmanagedorganizationadscontainerapi-gives-a-managed-org-its-own-googleads-container-in"},{"title":"CreateManagedOrganizationHandoffTokenAPI mints a one-time token that offers an\nOWNERLESS managed\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations/{orgSlug}/handoff-tokens","href":"/api-reference/createmanagedorganizationhandofftokenapi-mints-a-one-time-token-that-offers-anownerless-managed"},{"title":"AddManagedOrganizationMemberAPI adds a human member to a managed org by email\n(role member or\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations/{orgSlug}/members","href":"/api-reference/addmanagedorganizationmemberapi-adds-a-human-member-to-a-managed-org-by-emailrole-member-or"},{"title":"CreateManagerKeyAPI creates or rotates the manager credential. The raw key is\nreturned exactly once.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/manager-key","href":"/api-reference/createmanagerkeyapi-creates-or-rotates-the-manager-credential-the-raw-key-isreturned-exactly-once"},{"title":"SendMauriceOrderEmailAPI sends Maurice's fixed billing-order message. The\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/maurice-order-emails","href":"/api-reference/sendmauriceorderemailapi-sends-maurices-fixed-billing-order-message-the"},{"title":"MeAPI returns the authenticated user and their currently-active org (the one\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/me","href":"/api-reference/meapi-returns-the-authenticated-user-and-their-currently-active-org-the-one"},{"title":"GetBusinessProfileAPI mirrors erdo_get_business_profile. The tax id is never\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/org/business-profile","href":"/api-reference/getbusinessprofileapi-mirrors-erdo_get_business_profile-the-tax-id-is-never"},{"title":"SetBusinessProfileAPI mirrors erdo_set_business_profile. PUT rather than\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/org/business-profile","href":"/api-reference/setbusinessprofileapi-mirrors-erdo_set_business_profile-put-rather-than"},{"title":"ListOrganizationsAPI lists the orgs the caller can enter, for `erdo org list`\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/organizations","href":"/api-reference/listorganizationsapi-lists-the-orgs-the-caller-can-enter-for-`erdo-org-list`"},{"title":"CreateOrganizationAPI creates a new top-level organization owned by the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/organizations","href":"/api-reference/createorganizationapi-creates-a-new-top-level-organization-owned-by-the"},{"title":"Get v1outreach batches","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-batches","href":"/api-reference/get-v1outreach-batches"},{"title":"Get v1outreach batches 1","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-batches/{batch}","href":"/api-reference/get-v1outreach-batches-1"},{"title":"Put v1outreach batches","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/outreach-batches/{batch}","href":"/api-reference/put-v1outreach-batches"},{"title":"Post v1outreach batches actions","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/outreach-batches/{batch}/actions","href":"/api-reference/post-v1outreach-batches-actions"},{"title":"Get v1outreach batches recipients","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-batches/{batch}/recipients","href":"/api-reference/get-v1outreach-batches-recipients"},{"title":"Get v1outreach consents","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-consents","href":"/api-reference/get-v1outreach-consents"},{"title":"Put v1outreach consents","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/outreach-consents","href":"/api-reference/put-v1outreach-consents"},{"title":"QueryPageAnalyticsAPI mirrors the erdo_page_analytics_query MCP tool: run a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/page-analytics/query","href":"/api-reference/querypageanalyticsapi-mirrors-the-erdo_page_analytics_query-mcp-tool:-run-a"},{"title":"RecordPageFeedbackAPI mirrors erdo_record_page_feedback: ingest one or more\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/page-feedback","href":"/api-reference/recordpagefeedbackapi-mirrors-erdo_record_page_feedback:-ingest-one-or-more"},{"title":"ListPageReviewsAPI mirrors erdo_list_page_reviews: past reviews newest first\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/page-reviews","href":"/api-reference/listpagereviewsapi-mirrors-erdo_list_page_reviews:-past-reviews-newest-first"},{"title":"CreatePageReviewAPI mirrors erdo_review_pages: start a review of one or more\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/page-reviews","href":"/api-reference/createpagereviewapi-mirrors-erdo_review_pages:-start-a-review-of-one-or-more"},{"title":"GetPageReviewAPI mirrors erdo_get_page_review: read a review's status and,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/page-reviews/{reviewID}","href":"/api-reference/getpagereviewapi-mirrors-erdo_get_page_review:-read-a-reviews-status-and"},{"title":"GetPageTrackingAPI mirrors the erdo_get_page_tracking MCP tool: read which\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/page-tracking","href":"/api-reference/getpagetrackingapi-mirrors-the-erdo_get_page_tracking-mcp-tool:-read-which"},{"title":"ListPagesAPI mirrors the erdo_list_pages MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/pages","href":"/api-reference/listpagesapi-mirrors-the-erdo_list_pages-mcp-tool"},{"title":"DeployPageAPI mirrors the erdo_deploy_page MCP tool. clone_from_page_id in\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages","href":"/api-reference/deploypageapi-mirrors-the-erdo_deploy_page-mcp-tool-clone_from_page_id-in"},{"title":"GetPageMonitoringAPI mirrors the erdo_get_page_monitoring MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/pages/monitoring/{pageID}","href":"/api-reference/getpagemonitoringapi-mirrors-the-erdo_get_page_monitoring-mcp-tool"},{"title":"SetPageMonitoringAPI mirrors the erdo_set_page_monitoring MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages/monitoring/{pageID}","href":"/api-reference/setpagemonitoringapi-mirrors-the-erdo_set_page_monitoring-mcp-tool"},{"title":"RestorePageAPI mirrors the erdo_restore_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages/restore/{pageID}","href":"/api-reference/restorepageapi-mirrors-the-erdo_restore_page-mcp-tool"},{"title":"ValidatePageAPI mirrors the erdo_validate_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages/validate","href":"/api-reference/validatepageapi-mirrors-the-erdo_validate_page-mcp-tool"},{"title":"UpdatePageAPI mirrors the erdo_update_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/pages/{pageID}","href":"/api-reference/updatepageapi-mirrors-the-erdo_update_page-mcp-tool"},{"title":"DeletePageAPI mirrors the erdo_delete_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/pages/{pageID}","href":"/api-reference/deletepageapi-mirrors-the-erdo_delete_page-mcp-tool"},{"title":"ListPaidMediaCampaignsAPI lists the organization's owned Google Ads\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/paid-media/campaigns","href":"/api-reference/listpaidmediacampaignsapi-lists-the-organizations-owned-google-ads"},{"title":"SetPaidMediaCampaignBudgetAPI mirrors erdo_set_paid_media_campaign_budget:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/budget","href":"/api-reference/setpaidmediacampaignbudgetapi-mirrors-erdo_set_paid_media_campaign_budget:"},{"title":"SetPaidMediaCampaignConversionGoalsAPI mirrors\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/conversion-goals","href":"/api-reference/setpaidmediacampaignconversiongoalsapi-mirrors"},{"title":"SetPaidMediaCampaignStatusAPI mirrors erdo_set_paid_media_campaign_status:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/status","href":"/api-reference/setpaidmediacampaignstatusapi-mirrors-erdo_set_paid_media_campaign_status:"},{"title":"EnsurePaidMediaConversionActionAPI finds or approval-gates creation of a lead\nconversion action.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/conversion-actions","href":"/api-reference/ensurepaidmediaconversionactionapi-finds-or-approval-gates-creation-of-a-leadconversion-action"},{"title":"GroundPersonasAPI mirrors erdo_ground_personas: ground the org's persona\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/persona-grounding","href":"/api-reference/groundpersonasapi-mirrors-erdo_ground_personas:-ground-the-orgs-persona"},{"title":"ListPersonasAPI mirrors erdo_list_personas for selecting named agents.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/personas","href":"/api-reference/listpersonasapi-mirrors-erdo_list_personas-for-selecting-named-agents"},{"title":"ListProjectsAPI mirrors erdo_list_projects.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/projects","href":"/api-reference/listprojectsapi-mirrors-erdo_list_projects"},{"title":"CreateProjectAPI mirrors erdo_create_project.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/projects","href":"/api-reference/createprojectapi-mirrors-erdo_create_project"},{"title":"CreateRealtimeTicketAPI creates a browser-origin-bound ticket for the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/realtime/tickets","href":"/api-reference/createrealtimeticketapi-creates-a-browser-origin-bound-ticket-for-the"},{"title":"ListReceivedEmailsAPI mirrors erdo_list_received_emails: the messages people\nhave sent back to\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/received-emails","href":"/api-reference/listreceivedemailsapi-mirrors-erdo_list_received_emails:-the-messages-peoplehave-sent-back-to"},{"title":"RenderChartAPI mirrors the erdo_render_chart MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/render/chart","href":"/api-reference/renderchartapi-mirrors-the-erdo_render_chart-mcp-tool-as-a-rest-endpoint"},{"title":"RenderTableAPI mirrors the erdo_render_table MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/render/table","href":"/api-reference/rendertableapi-mirrors-the-erdo_render_table-mcp-tool-as-a-rest-endpoint"},{"title":"ListReviewItemsAPI mirrors erdo_list_review_items.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/review-items","href":"/api-reference/listreviewitemsapi-mirrors-erdo_list_review_items"},{"title":"GetReviewItemAPI mirrors erdo_get_review_item.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/review-items/{id}","href":"/api-reference/getreviewitemapi-mirrors-erdo_get_review_item"},{"title":"DecideReviewItemAPI mirrors erdo_decide_review_item.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/review-items/{id}/decide","href":"/api-reference/decidereviewitemapi-mirrors-erdo_decide_review_item"},{"title":"ListAgentRunsAPI mirrors erdo_list_agent_runs.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/runs","href":"/api-reference/listagentrunsapi-mirrors-erdo_list_agent_runs"},{"title":"GetAgentRunAPIv1 mirrors erdo_get_agent_run.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/runs/{runID}","href":"/api-reference/getagentrunapiv1-mirrors-erdo_get_agent_run"},{"title":"Lists what an organization has declared to run on a schedule: each\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/scheduled-actions","href":"/api-reference/lists-what-an-organization-has-declared-to-run-on-a-schedule:-each"},{"title":"Declares work to run on a schedule: an ordered list of named steps, each an\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/scheduled-actions","href":"/api-reference/declares-work-to-run-on-a-schedule:-an-ordered-list-of-named-steps-each-an"},{"title":"ScreenshotAPI mirrors the erdo_screenshot MCP tool as a REST endpoint: capture\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/screenshot","href":"/api-reference/screenshotapi-mirrors-the-erdo_screenshot-mcp-tool-as-a-rest-endpoint:-capture"},{"title":"IOSScreenshotAPI mirrors the erdo_ios_screenshot MCP tool: capture a page on a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/screenshot/ios","href":"/api-reference/iosscreenshotapi-mirrors-the-erdo_ios_screenshot-mcp-tool:-capture-a-page-on-a"},{"title":"ScreenshotResultAPI polls an instructed capture started by ScreenshotAPI,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/screenshot/result","href":"/api-reference/screenshotresultapi-polls-an-instructed-capture-started-by-screenshotapi"},{"title":"ListSendingDomainsAPI lists the domains the caller org's outbound agent email\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/sending-domains","href":"/api-reference/listsendingdomainsapi-lists-the-domains-the-caller-orgs-outbound-agent-email"},{"title":"CreateSendingDomainAPI registers a sending domain for the caller's org and\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/sending-domains","href":"/api-reference/createsendingdomainapi-registers-a-sending-domain-for-the-callers-org-and"},{"title":"GetSendingDomainAPI reads one sending domain, named by the domain itself.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/sending-domains/{domain}","href":"/api-reference/getsendingdomainapi-reads-one-sending-domain-named-by-the-domain-itself"},{"title":"DeleteSendingDomainAPI removes a sending-domain registration, named by the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/sending-domains/{domain}","href":"/api-reference/deletesendingdomainapi-removes-a-sending-domain-registration-named-by-the"},{"title":"UpdateSendingDomainAPI edits a sending domain's identity settings — from\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/sending-domains/{domain}","href":"/api-reference/updatesendingdomainapi-edits-a-sending-domains-identity-settings-—-from"},{"title":"GetSendingThemeAPI reads the look the caller org's outbound mail renders in\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/sending-theme","href":"/api-reference/getsendingthemeapi-reads-the-look-the-caller-orgs-outbound-mail-renders-in"},{"title":"RefreshSendingThemeAPI derives the theme from the Brand Style record now and\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/sending-theme/refresh","href":"/api-reference/refreshsendingthemeapi-derives-the-theme-from-the-brand-style-record-now-and"},{"title":"ListThreadsAPI mirrors the erdo_list_threads MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads","href":"/api-reference/listthreadsapi-mirrors-the-erdo_list_threads-mcp-tool-as-a-rest-endpoint"},{"title":"CreateThreadAPI mirrors the erdo_create_thread MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads-create","href":"/api-reference/createthreadapi-mirrors-the-erdo_create_thread-mcp-tool"},{"title":"OpenDirectConversationAPI returns or creates the caller's direct conversation\nwith a persona.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads-direct","href":"/api-reference/opendirectconversationapi-returns-or-creates-the-callers-direct-conversationwith-a-persona"},{"title":"GetSeenThreadsAPI mirrors the authenticated thread seen-state read.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads-seen","href":"/api-reference/getseenthreadsapi-mirrors-the-authenticated-thread-seen-state-read"},{"title":"GetThreadAPI returns a thread and its participants.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads/{threadID}","href":"/api-reference/getthreadapi-returns-a-thread-and-its-participants"},{"title":"DeleteThreadAPI mirrors the erdo_delete_thread MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/threads/{threadID}","href":"/api-reference/deletethreadapi-mirrors-the-erdo_delete_thread-mcp-tool"},{"title":"CancelInvocationAPI requests cancellation of one invocation on a thread.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/cancel-invocation","href":"/api-reference/cancelinvocationapi-requests-cancellation-of-one-invocation-on-a-thread"},{"title":"GetThreadCompletionStatusAPI returns the thread owner's latest durable\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads/{threadID}/completion-status","href":"/api-reference/getthreadcompletionstatusapi-returns-the-thread-owners-latest-durable"},{"title":"GetThreadMessagesAPI mirrors the erdo_get_thread_messages MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads/{threadID}/messages","href":"/api-reference/getthreadmessagesapi-mirrors-the-erdo_get_thread_messages-mcp-tool-as-a-restendpoint"},{"title":"AddThreadParticipantAPI adds an org-enabled persona, or follows as the caller.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/participants","href":"/api-reference/addthreadparticipantapi-adds-an-org-enabled-persona-or-follows-as-the-caller"},{"title":"RemoveThreadParticipantAPI removes a persona, or unfollows when the id is the\ncaller.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/threads/{threadID}/participants/{personaID}","href":"/api-reference/removethreadparticipantapi-removes-a-persona-or-unfollows-when-the-id-is-thecaller"},{"title":"MarkThreadSeenAPI marks a thread as seen by the current caller.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/seen","href":"/api-reference/markthreadseenapi-marks-a-thread-as-seen-by-the-current-caller"},{"title":"SendMessageAPI mirrors the erdo_send_message MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/send","href":"/api-reference/sendmessageapi-mirrors-the-erdo_send_message-mcp-tool"},{"title":"ListTokensAPI lists the caller's API tokens. It never returns the token hash or\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/tokens","href":"/api-reference/listtokensapi-lists-the-callers-api-tokens-it-never-returns-the-token-hash-or"},{"title":"CreateTokenAPI mints a new API token for the caller. The raw token is returned\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/tokens","href":"/api-reference/createtokenapi-mints-a-new-api-token-for-the-caller-the-raw-token-is-returned"},{"title":"Revoke an API token, immediately and permanently.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/tokens/{tokenID}","href":"/api-reference/revoke-an-api-token-immediately-and-permanently"},{"title":"Replace an active API token atomically, without changing its grants.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/tokens/{tokenID}/rotate","href":"/api-reference/replace-an-active-api-token-atomically-without-changing-its-grants"},{"title":"ListVoiceAgentsAPI lists the organization's concierges — the managed voice\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/agents","href":"/api-reference/listvoiceagentsapi-lists-the-organizations-concierges-—-the-managed-voice"},{"title":"SetVoiceAgentSMSRepliesAPI turns a voice agent's answering of texts on or off.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/agents/{slug}/sms-replies","href":"/api-reference/setvoiceagentsmsrepliesapi-turns-a-voice-agents-answering-of-texts-on-or-off"},{"title":"SetVoiceAgentWhatsAppRepliesAPI turns a voice agent's answering on WhatsApp on\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/agents/{slug}/whatsapp-replies","href":"/api-reference/setvoiceagentwhatsapprepliesapi-turns-a-voice-agents-answering-on-whatsapp-on"},{"title":"GetVoiceBrandedCallingAPI mirrors erdo_voice_branded_calling_get: the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/branded-calling","href":"/api-reference/getvoicebrandedcallingapi-mirrors-erdo_voice_branded_calling_get:-the"},{"title":"SetVoiceBrandedCallingAPI mirrors erdo_voice_branded_calling_set: store the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/voice/branded-calling","href":"/api-reference/setvoicebrandedcallingapi-mirrors-erdo_voice_branded_calling_set:-store-the"},{"title":"GetVoiceBrandedCallingLOAAPI mirrors erdo_voice_branded_calling_loa: the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/branded-calling/loa","href":"/api-reference/getvoicebrandedcallingloaapi-mirrors-erdo_voice_branded_calling_loa:-the"},{"title":"ProvisionVoiceBrandedCallingAPI mirrors erdo_voice_branded_calling_provision:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/branded-calling/provision","href":"/api-reference/provisionvoicebrandedcallingapi-mirrors-erdo_voice_branded_calling_provision:"},{"title":"GetVoiceCallerNameAPI mirrors erdo_voice_caller_name_get: the organization's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/caller-name","href":"/api-reference/getvoicecallernameapi-mirrors-erdo_voice_caller_name_get:-the-organizations"},{"title":"ProvisionVoiceCallerNameAPI mirrors erdo_voice_caller_name_provision: it files\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/caller-name","href":"/api-reference/provisionvoicecallernameapi-mirrors-erdo_voice_caller_name_provision:-it-files"},{"title":"CheckVoiceCallerNameAPI mirrors erdo_voice_caller_name_check: a live lookup\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/caller-name/lookup","href":"/api-reference/checkvoicecallernameapi-mirrors-erdo_voice_caller_name_check:-a-live-lookup"},{"title":"ListVoiceCallsAPI mirrors erdo_voice_call_list. The filters, the since/until\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/calls","href":"/api-reference/listvoicecallsapi-mirrors-erdo_voice_call_list-the-filters-the-sinceuntil"},{"title":"ListVoiceCallsPostAPI is the POST body form of the list endpoint, for callers\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/calls","href":"/api-reference/listvoicecallspostapi-is-the-post-body-form-of-the-list-endpoint-for-callers"},{"title":"GetVoiceCallAPI mirrors erdo_voice_call_get, returning the displayable\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/calls/{callID}","href":"/api-reference/getvoicecallapi-mirrors-erdo_voice_call_get-returning-the-displayable"},{"title":"StartPersonCallAPI connects a person to a lead: Erdo rings the person's own\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/person-calls","href":"/api-reference/startpersoncallapi-connects-a-person-to-a-lead:-erdo-rings-the-persons-own"},{"title":"ListVoicePhoneNumbersAPI mirrors erdo_voice_phone_number_list: every number\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/phone-numbers","href":"/api-reference/listvoicephonenumbersapi-mirrors-erdo_voice_phone_number_list:-every-number"},{"title":"GetVoicePhoneNumberSMSAPI mirrors the single-number half of\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/phone-numbers/{number}/sms","href":"/api-reference/getvoicephonenumbersmsapi-mirrors-the-single-number-half-of"},{"title":"ProvisionVoicePhoneNumberSMSAPI mirrors erdo_voice_phone_number_sms_provision:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/phone-numbers/{number}/sms","href":"/api-reference/provisionvoicephonenumbersmsapi-mirrors-erdo_voice_phone_number_sms_provision:"},{"title":"ProvisionVoicePhoneNumberWhatsAppAPI mirrors\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/phone-numbers/{number}/whatsapp","href":"/api-reference/provisionvoicephonenumberwhatsappapi-mirrors"},{"title":"ListVoiceSMSConversationsAPI mirrors erdo_voice_sms_conversation_list. The\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/sms-conversations","href":"/api-reference/listvoicesmsconversationsapi-mirrors-erdo_voice_sms_conversation_list-the"},{"title":"ListVoiceSMSConversationsPostAPI is the POST body form of the list endpoint,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/sms-conversations","href":"/api-reference/listvoicesmsconversationspostapi-is-the-post-body-form-of-the-list-endpoint"},{"title":"GetVoiceSMSConversationAPI mirrors erdo_voice_sms_conversation_get, returning\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/sms-conversations/{sessionID}","href":"/api-reference/getvoicesmsconversationapi-mirrors-erdo_voice_sms_conversation_get-returning"},{"title":"ListVoiceWhatsAppConversationsAPI mirrors erdo_voice_whatsapp_conversation_list.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/whatsapp-conversations","href":"/api-reference/listvoicewhatsappconversationsapi-mirrors-erdo_voice_whatsapp_conversation_list"},{"title":"ListVoiceWhatsAppConversationsPostAPI is the POST body form of the list\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/whatsapp-conversations","href":"/api-reference/listvoicewhatsappconversationspostapi-is-the-post-body-form-of-the-list"},{"title":"GetVoiceWhatsAppConversationAPI mirrors erdo_voice_whatsapp_conversation_get,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/whatsapp-conversations/{sessionID}","href":"/api-reference/getvoicewhatsappconversationapi-mirrors-erdo_voice_whatsapp_conversation_get"},{"title":"ListVoiceWidgetConversationsAPI mirrors erdo_voice_widget_conversation_list.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/widget-conversations","href":"/api-reference/listvoicewidgetconversationsapi-mirrors-erdo_voice_widget_conversation_list"},{"title":"ListVoiceWidgetConversationsPostAPI is the POST body form of the list endpoint,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/widget-conversations","href":"/api-reference/listvoicewidgetconversationspostapi-is-the-post-body-form-of-the-list-endpoint"},{"title":"GetVoiceWidgetConversationAPI mirrors erdo_voice_widget_conversation_get,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/widget-conversations/get","href":"/api-reference/getvoicewidgetconversationapi-mirrors-erdo_voice_widget_conversation_get"},{"title":"SetVoiceWidgetStatusAPI turns a website concierge widget on or off. It is the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/widgets/{widget}/status","href":"/api-reference/setvoicewidgetstatusapi-turns-a-website-concierge-widget-on-or-off-it-is-the"},{"title":"ListWorkstreamsAPI mirrors erdo_list_workstreams.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams","href":"/api-reference/listworkstreamsapi-mirrors-erdo_list_workstreams"},{"title":"CreateWorkstreamAPI mirrors erdo_create_workstream.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams","href":"/api-reference/createworkstreamapi-mirrors-erdo_create_workstream"},{"title":"GetWorkstreamAPI mirrors erdo_get_workstream (slug or uuid).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}","href":"/api-reference/getworkstreamapi-mirrors-erdo_get_workstream-slug-or-uuid"},{"title":"ArmWorkstreamLoopAPI mirrors erdo_arm_workstream_loop: schedule the recurring\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/arm","href":"/api-reference/armworkstreamloopapi-mirrors-erdo_arm_workstream_loop:-schedule-the-recurring"},{"title":"ListWorkstreamEventsAPI mirrors erdo_list_workstream_events.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}/events","href":"/api-reference/listworkstreameventsapi-mirrors-erdo_list_workstream_events"},{"title":"AppendWorkstreamEventAPI mirrors erdo_append_workstream_event.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/events","href":"/api-reference/appendworkstreameventapi-mirrors-erdo_append_workstream_event"},{"title":"SetWorkstreamExternalRefsAPI declares which provider-owned objects a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/workstreams/{workstreamSlug}/external-refs","href":"/api-reference/setworkstreamexternalrefsapi-declares-which-provider-owned-objects-a"},{"title":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}/ledger","href":"/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators"},{"title":"AddWorkstreamPhaseAPI mirrors erdo_add_workstream_phase.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/phases","href":"/api-reference/addworkstreamphaseapi-mirrors-erdo_add_workstream_phase"},{"title":"AttachWorkstreamResourceAPI mirrors erdo_attach_workstream_resource.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/resources","href":"/api-reference/attachworkstreamresourceapi-mirrors-erdo_attach_workstream_resource"},{"title":"DetachWorkstreamResourceAPI mirrors erdo_attach_workstream_resource's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/workstreams/{workstreamSlug}/resources","href":"/api-reference/detachworkstreamresourceapi-mirrors-erdo_attach_workstream_resources"},{"title":"UpdateWorkStateAPI mirrors erdo_update_work_state.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/workstreams/{workstreamSlug}/state","href":"/api-reference/updateworkstateapi-mirrors-erdo_update_work_state"}]}]},{"group":"Build apps","pages":[{"title":"Build Apps on Erdo","href":"/apps/build-apps"}]},{"group":"Python SDK","pages":[{"title":"Python SDK — Invoke","href":"/sdk/invoke"}]},{"group":"TypeScript SDK","pages":[{"title":"TypeScript SDK Overview","href":"/ts-sdk/overview"},{"title":"Client Reference","href":"/ts-sdk/client"},{"title":"UI Components","href":"/ts-sdk/ui-components"},{"title":"Integration Patterns","href":"/ts-sdk/integration"},{"title":"Vercel AI SDK Integration","href":"/ts-sdk/vercel-ai-sdk"}]}]}]},"title":"Bounded outreach - Erdo Docs","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":[],"chunks":[]}