ReadBack is what Erdo understood from a playbook's text when it was saved.
· object
Only Actions[].Mode, WorkingHours, EmailHours and TextHours are enforced; the stages and the priority ladder are a picture of the text drawn for the person who wrote it, and every evaluation still reads the whole text.
LeadTimeline is everything the evaluation reads about one lead.
· object
Show child attributes
{"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":"6aecb047d226238b4601eb7a","collectionId":"4290f67d-be1c-4f57-b38b-c9020293bd0b","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aecb047d226238b4601eb7a"},"entitlements":{},"buildId":"6aede6d8b961f3bf48d4e836","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"default","tag":"API Reference","count":606},{"language":"default","tag":"Developers","count":356},{"language":"default","tag":"Product","count":71},{"language":"default","tag":"Features","count":56},{"language":"default","tag":"Platform API","count":46},{"language":"default","tag":"Get started","count":8},{"language":"default","tag":"Connect Erdo","count":7},{"language":"default","tag":"TypeScript SDK","count":5},{"language":"default","tag":"Build apps","count":1},{"language":"default","tag":"Python SDK","count":1}]},"assistantConfig":{},"basePath":"","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":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","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":"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":"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":"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":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","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":"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":"workos-sso-scim","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},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp","slug":"/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp","pageMetadata":{"title":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n","description":"tool. Nothing is stored and nothing is sent.\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","autogeneratedByOpenApi":true},"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: \"tool. Nothing is stored and nothing is sent.\"\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n","description":"tool. Nothing is stored and nothing is sent.\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","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"tool. Nothing is stored and nothing is sent.\n","operationId":"POST:mcp.EvaluateLeadNextActionAPI","parameters":["a7fef2c1-3058-463b-96f9-7f37277e2bdc","35f41277-f4f5-4ef7-b329-c8abdaf3a804"],"requestBody":"3b549803-172d-4bfa-b8dc-50e86b7762a1","responses":{"200":"f820ceff-300f-4150-9478-7c78c80da2ac","default":"8076946c-0f3b-4558-88ae-901e25f00e96"},"summary":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n","method":"post","type":"path","servers":["20caca57-c43c-45a2-bd80-d8321410ff29"],"security":["f209a82b-27fe-438e-803f-80311c7ab0b5"],"path":"/v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/evaluate","baseUrlOptions":["https://api.erdo.ai"],"title":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"a7fef2c1-3058-463b-96f9-7f37277e2bdc":{"allowEmptyValue":true,"explode":false,"in":"path","name":"datasetSlug","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"},"style":"simple"},"35f41277-f4f5-4ef7-b329-c8abdaf3a804":{"allowEmptyValue":true,"explode":false,"in":"path","name":"leadRef","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"},"style":"simple"}},"requestBody":{"content":{"application/json":{"schema":{"properties":{"agent_id":{"title":"AgentID tries the draft as that concierge. Read only alongside body: a dry run\nof the saved playbook uses its saved concierge.\n","type":"string","uniqueKey":"agent_id","typeLabel":"string"},"body":{"title":"Body is a draft playbook text to evaluate with instead of the saved one.\n","type":"string","maxLength":30000,"uniqueKey":"body","typeLabel":"string"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"agent_id":"\u003cstring>","body":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"f820ceff-300f-4150-9478-7c78c80da2ac":{"content":{"application/json":{"schema":{"properties":{"agent":{"properties":{"id":{"type":"string","uniqueKey":"agent.id","typeLabel":"string"},"name":{"type":"string","uniqueKey":"agent.name","typeLabel":"string"},"phone_number":{"description":"it has none.\n","title":"PhoneNumber is the number the concierge calls and texts from, empty when\n","type":"string","uniqueKey":"agent.phone_number","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"agent.slug","typeLabel":"string"}},"title":"PlaybookAgent is the concierge a playbook names, as the API returns it.\n","type":"object","uniqueKey":"agent","typeLabel":"PlaybookAgent is the concierge a playbook names, as the API returns it.\n · object"},"evaluation":{"properties":{"action_input":{"description":"it runs, and exactly what an approval card shows.\n","properties":{"accompanying_email":{"type":"object","title":"AccompanyingEmail is the email that goes out at once beside this decision\n","description":"while its card waits for a person. It is set only on a text or a call the playbook gates, and only when every rule a standalone automatic email obeys let it through. Null everywhere else.\n","properties":{"body_markdown":{"type":"string","uniqueKey":"evaluation.action_input.accompanying_email.body_markdown","typeLabel":"string"},"sent_at":{"description":"owed. It is the stored input's copy of accompanying\\_email\\_sent\\_at.\n","format":"date-time","title":"SentAt is when the email reached the mailer, or nil while it is still\n","type":"string","uniqueKey":"evaluation.action_input.accompanying_email.sent_at","typeLabel":"string\u003cdate-time>"},"subject":{"type":"string","uniqueKey":"evaluation.action_input.accompanying_email.subject","typeLabel":"string"},"to":{"type":"string","uniqueKey":"evaluation.action_input.accompanying_email.to","typeLabel":"string"},"to_name":{"type":"string","uniqueKey":"evaluation.action_input.accompanying_email.to_name","typeLabel":"string"}},"uniqueKey":"evaluation.action_input.accompanying_email","typeLabel":"AccompanyingEmail is the email that goes out at once beside this decision\n · object"},"agent":{"type":"object","title":"Agent is the concierge this decision was made and drafted as, stored with\n","description":"the decision so a card, a surface and the send itself all name the same person the lead already knows. Null when the playbook links none.\n","properties":{"id":{"type":"string","uniqueKey":"evaluation.action_input.agent.id","typeLabel":"string"},"name":{"type":"string","uniqueKey":"evaluation.action_input.agent.name","typeLabel":"string"},"phone_number":{"description":"it has none.\n","title":"PhoneNumber is the number the concierge calls and texts from, empty when\n","type":"string","uniqueKey":"evaluation.action_input.agent.phone_number","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"evaluation.action_input.agent.slug","typeLabel":"string"}},"uniqueKey":"evaluation.action_input.agent","typeLabel":"Agent is the concierge this decision was made and drafted as, stored with\n · object"},"agent_instructions":{"type":"object","title":"AgentInstructions is what the concierge is told to achieve and say, for an\n","description":"email, a text or a call. Null when no concierge is linked, and for every action that contacts nobody.\n","properties":{"instructions":{"title":"Instructions are what to say, what not to say, and in what register.\n","type":"string","uniqueKey":"evaluation.action_input.agent_instructions.instructions","typeLabel":"string"},"language":{"description":"in: the lead's own, as far as the playbook's supported languages allow. A call opens in it (callOpener). Empty on decisions written before it existed, which open in English.\n","title":"Language is the ISO 639-1 code of the language the message or call is\n","type":"string","uniqueKey":"evaluation.action_input.agent_instructions.language","typeLabel":"string"},"objective":{"title":"Objective is what this action is for, in one sentence.\n","type":"string","uniqueKey":"evaluation.action_input.agent_instructions.objective","typeLabel":"string"}},"uniqueKey":"evaluation.action_input.agent_instructions","typeLabel":"AgentInstructions is what the concierge is told to achieve and say, for an\n · object"},"dataset_id":{"type":"string","uniqueKey":"evaluation.action_input.dataset_id","typeLabel":"string"},"development":{"type":"string","uniqueKey":"evaluation.action_input.development","typeLabel":"string"},"downgrade_cause":{"type":"string","uniqueKey":"evaluation.action_input.downgrade_cause","typeLabel":"string"},"email":{"properties":{"body_markdown":{"type":"string","uniqueKey":"evaluation.action_input.email.body_markdown","typeLabel":"string"},"subject":{"type":"string","uniqueKey":"evaluation.action_input.email.subject","typeLabel":"string"}},"title":"EmailDraft is an email the evaluation wrote for the lead.\n","type":"object","uniqueKey":"evaluation.action_input.email","typeLabel":"EmailDraft is an email the evaluation wrote for the lead.\n · object"},"handoff":{"description":"channel the playbook wanted it done.\n","properties":{"suggested_channel":{"description":"It is \"email\" on a handoff that exists because an email could not be sent — the desk writes it themselves — and empty on a handoff the model chose, where the desk decides how to reach the lead.\n\nIt used to carry \"sms\" and \"call\" too, on decisions the platform rewrote into desk tasks. It no longer does: those are their own kinds. Decisions stored before that change still carry them and are still read.\n","title":"SuggestedChannel says how a desk task should be carried out.\n","type":"string","uniqueKey":"evaluation.action_input.handoff.suggested_channel","typeLabel":"string"},"summary":{"type":"string","uniqueKey":"evaluation.action_input.handoff.summary","typeLabel":"string"}},"title":"HandoffDraft is what the desk should do personally, and through which\n","type":"object","uniqueKey":"evaluation.action_input.handoff","typeLabel":"HandoffDraft is what the desk should do personally, and through which\n · object"},"hold_until":{"format":"date-time","type":"string","uniqueKey":"evaluation.action_input.hold_until","typeLabel":"string\u003cdate-time>"},"lead_contact":{"description":"surface can name a lead that never gave a name.\n\nIt is a LABEL, and it must not be read as \"where to reach this lead\". It picks one channel by a fixed preference that has nothing to do with the lead, and for a lead who gave both it always answers the email — which is why the handoff alert told a desk to email somebody who had just texted. Anything telling a person which channel to use reads LeadEmail and LeadPhone below instead.\n","title":"LeadContact is the lead's email, or its phone when it has no email, so a\n","type":"string","uniqueKey":"evaluation.action_input.lead_contact","typeLabel":"string"},"lead_email":{"description":"engine held when the decision was made, each stated as itself rather than collapsed into one value.\n\nThey exist because a decision that hands the lead to a PERSON is not a send. A send has to choose one channel and the engine chooses it; a desk task does not, and the desk is better served by seeing both and picking — so nothing downstream has to guess which channel a human would want. Both are empty for a lead that gave that channel nothing, which is itself worth showing: \"no number on file\" is why a card exists at all sometimes.\n\nStored on the input, like everything else a card is drawn from, because the alert and the queue render from the stored decision and must not read the lead's record again — it may have changed, and a card three days old is meant to say what was true when it was filed.\n","title":"LeadEmail and LeadPhone are every way of reaching this lead that the\n","type":"string","uniqueKey":"evaluation.action_input.lead_email","typeLabel":"string"},"lead_name":{"type":"string","uniqueKey":"evaluation.action_input.lead_name","typeLabel":"string"},"lead_phone":{"type":"string","uniqueKey":"evaluation.action_input.lead_phone","typeLabel":"string"},"lead_reference":{"type":"string","uniqueKey":"evaluation.action_input.lead_reference","typeLabel":"string"},"lead_zone":{"type":"object","title":"LeadZone is the clock this text or call is timed in, stored with the\n","description":"decision for two reasons. It is what the delivery step reads, so a call approved at 19:00 in the development's zone waits for the lead's own morning without re-deriving anything; and it is what puts the reading in front of a person, including when Erdo could not determine the lead's timezone and kept the development's hours. It is set for a text and a call, and absent for every other kind, which are timed in the development's zone by definition.\n","properties":{"evidence":{"title":"Evidence is the reading in words, for a card and for an operator.\n","type":"string","uniqueKey":"evaluation.action_input.lead_zone.evidence","typeLabel":"string"},"source":{"type":"string","uniqueKey":"evaluation.action_input.lead_zone.source","typeLabel":"string"},"timezone":{"type":"string","uniqueKey":"evaluation.action_input.lead_zone.timezone","typeLabel":"string"}},"uniqueKey":"evaluation.action_input.lead_zone","typeLabel":"LeadZone is the clock this text or call is timed in, stored with the\n · object"},"next_step_after_seconds":{"description":"the playbook's next step for the lead falls due if they do nothing in between. The engine looks at the lead again then rather than waiting out revisitAfterContact, so a follow-up or a handoff the playbook times shorter than that lands on time. 0 when the playbook names no such step. See revisitAfterCarriedOut.\n","format":"int64","title":"NextStepAfterSeconds is how long after this email, text or call goes out\n","type":"integer","uniqueKey":"evaluation.action_input.next_step_after_seconds","typeLabel":"integer\u003cint64>"},"next_step_at":{"description":"its clock started before this decision. Unlike NextStepAfterSeconds it is not moved by an approval or another delivery delay.\n","format":"date-time","title":"NextStepAt is the absolute moment the playbook's next step falls due when\n","type":"string","uniqueKey":"evaluation.action_input.next_step_at","typeLabel":"string\u003cdate-time>"},"note":{"type":"string","uniqueKey":"evaluation.action_input.note","typeLabel":"string"},"original_kind":{"type":"string","uniqueKey":"evaluation.action_input.original_kind","typeLabel":"string"},"playbook_revision":{"description":"into the input because an approval card is drawn from the input alone. A person looking at a card three days old can otherwise not tell whether the rules behind it are the ones the development is running now. It is 0 on a decision a person recorded by hand and on every decision written before this existed.\n","format":"int64","title":"PlaybookRevision is the revision of the playbook that decided this, copied\n","type":"integer","uniqueKey":"evaluation.action_input.playbook_revision","typeLabel":"integer\u003cint64>"},"reachability":{"description":"made, stored with it so a card can say why the lead is being chased this hard — or why it is not any more. See the constants in reachability.go.\n","title":"Reachability and ReachedVia are the lead's state when this decision was\n","type":"string","uniqueKey":"evaluation.action_input.reachability","typeLabel":"string"},"reached_via":{"type":"string","uniqueKey":"evaluation.action_input.reached_via","typeLabel":"string"},"signature_name":{"description":"this decision was drafted — the name the draft below is actually signed with. It is stored beside Agent for the same reason Agent is stored at all: the send happens later, and it must go out under the name the body says, not under whatever the playbook has been changed to since. Empty falls back to Agent.Name; see signedAs.\n","title":"SignatureName is the playbook's \"signs messages as\" name as it stood when\n","type":"string","uniqueKey":"evaluation.action_input.signature_name","typeLabel":"string"},"sms":{"type":"object","title":"SMS is the text the concierge would send, when the proposal was a text.\n","properties":{"body":{"type":"string","uniqueKey":"evaluation.action_input.sms.body","typeLabel":"string"}},"uniqueKey":"evaluation.action_input.sms","typeLabel":"SMS is the text the concierge would send, when the proposal was a text.\n · object"},"started_over_at":{"description":"from which the engine reads the lead afresh. Absent on a plain start.\n","format":"date-time","title":"StartedOverAt is set on a start that started the lead over: the moment\n","type":"string","uniqueKey":"evaluation.action_input.started_over_at","typeLabel":"string\u003cdate-time>"},"suggestion_id":{"type":"string","uniqueKey":"evaluation.action_input.suggestion_id","typeLabel":"string"},"to":{"type":"string","uniqueKey":"evaluation.action_input.to","typeLabel":"string"},"to_name":{"type":"string","uniqueKey":"evaluation.action_input.to_name","typeLabel":"string"},"whatsapp":{"type":"object","title":"WhatsApp is the WhatsApp message the concierge would send, when the\n","description":"proposal was one: the exact words the lead reads, and the approved template that carries them when it is Erdo's opening message.\n","properties":{"body":{"type":"string","uniqueKey":"evaluation.action_input.whatsapp.body","typeLabel":"string"},"from":{"description":"made: the concierge's own WhatsApp sender, or the shared sender standing in for it. Empty on decisions stored before shared senders, which send from the concierge's number as they always did.\n","title":"From is the number the message leaves from, read when the decision was\n","type":"string","uniqueKey":"evaluation.action_input.whatsapp.from","typeLabel":"string"},"shared":{"description":"so the card can say whose number the lead will see.\n","title":"Shared says From is a shared sender the development's manager lends it,\n","type":"boolean","uniqueKey":"evaluation.action_input.whatsapp.shared","typeLabel":"boolean"},"template":{"type":"object","title":"Template is set when Body is an approved template's text, which is the\n","description":"only thing WhatsApp lets a business send outside the 24-hour window. The send names the template rather than the words, so what goes out is Meta's approved copy; Body is what that copy says, filled in.\n","properties":{"key":{"type":"string","uniqueKey":"evaluation.action_input.whatsapp.template.key","typeLabel":"string"},"language":{"description":"e.g. \"pt\\_BR\". The send asks for the same one.\n","title":"Language is the language of the approved copy the body was read from,\n","type":"string","uniqueKey":"evaluation.action_input.whatsapp.template.language","typeLabel":"string"},"variables":{"additionalProperties":{"type":"string","uniqueKey":"evaluation.action_input.whatsapp.template.variables.additionalProperties","typeLabel":"string"},"type":"object","uniqueKey":"evaluation.action_input.whatsapp.template.variables","typeLabel":"object"}},"uniqueKey":"evaluation.action_input.whatsapp.template","typeLabel":"Template is set when Body is an approved template's text, which is the\n · object"}},"uniqueKey":"evaluation.action_input.whatsapp","typeLabel":"WhatsApp is the WhatsApp message the concierge would send, when the\n · object"}},"title":"ActionInput is the stored input of a suggestion: exactly what executes when\n","type":"object","uniqueKey":"evaluation.action_input","typeLabel":"ActionInput is the stored input of a suggestion: exactly what executes when\n · object"},"action_kind":{"type":"string","uniqueKey":"evaluation.action_kind","typeLabel":"string"},"due_at":{"format":"date-time","type":"string","uniqueKey":"evaluation.due_at","typeLabel":"string\u003cdate-time>"},"facts":{"description":"read nothing.\n\nA decision now carries only Language, the language the lead wrote in, which is the engine's own reading. What the lead stated is read from the lead's details instead. The other fields are filled only on decisions made before the engine read details.\n","properties":{"bedrooms":{"description":"read it from, so a person can check the reading against the row.\n","properties":{"source_column":{"type":"string","uniqueKey":"evaluation.facts.bedrooms.source_column","typeLabel":"string"},"value":{"type":"string","uniqueKey":"evaluation.facts.bedrooms.value","typeLabel":"string"}},"title":"LeadFact is one thing the evaluation read about the lead and the column it\n","type":"object","uniqueKey":"evaluation.facts.bedrooms","typeLabel":"LeadFact is one thing the evaluation read about the lead and the column it\n · object"},"broker":{"description":"read it from, so a person can check the reading against the row.\n","properties":{"source_column":{"type":"string","uniqueKey":"evaluation.facts.broker.source_column","typeLabel":"string"},"value":{"type":"string","uniqueKey":"evaluation.facts.broker.value","typeLabel":"string"}},"title":"LeadFact is one thing the evaluation read about the lead and the column it\n","type":"object","uniqueKey":"evaluation.facts.broker","typeLabel":"LeadFact is one thing the evaluation read about the lead and the column it\n · object"},"budget":{"description":"read it from, so a person can check the reading against the row.\n","properties":{"source_column":{"type":"string","uniqueKey":"evaluation.facts.budget.source_column","typeLabel":"string"},"value":{"type":"string","uniqueKey":"evaluation.facts.budget.value","typeLabel":"string"}},"title":"LeadFact is one thing the evaluation read about the lead and the column it\n","type":"object","uniqueKey":"evaluation.facts.budget","typeLabel":"LeadFact is one thing the evaluation read about the lead and the column it\n · object"},"financing":{"description":"read it from, so a person can check the reading against the row.\n","properties":{"source_column":{"type":"string","uniqueKey":"evaluation.facts.financing.source_column","typeLabel":"string"},"value":{"type":"string","uniqueKey":"evaluation.facts.financing.value","typeLabel":"string"}},"title":"LeadFact is one thing the evaluation read about the lead and the column it\n","type":"object","uniqueKey":"evaluation.facts.financing","typeLabel":"LeadFact is one thing the evaluation read about the lead and the column it\n · object"},"language":{"description":"read it from, so a person can check the reading against the row.\n","properties":{"source_column":{"type":"string","uniqueKey":"evaluation.facts.language.source_column","typeLabel":"string"},"value":{"type":"string","uniqueKey":"evaluation.facts.language.value","typeLabel":"string"}},"title":"LeadFact is one thing the evaluation read about the lead and the column it\n","type":"object","uniqueKey":"evaluation.facts.language","typeLabel":"LeadFact is one thing the evaluation read about the lead and the column it\n · object"},"purpose":{"description":"read it from, so a person can check the reading against the row.\n","properties":{"source_column":{"type":"string","uniqueKey":"evaluation.facts.purpose.source_column","typeLabel":"string"},"value":{"type":"string","uniqueKey":"evaluation.facts.purpose.value","typeLabel":"string"}},"title":"LeadFact is one thing the evaluation read about the lead and the column it\n","type":"object","uniqueKey":"evaluation.facts.purpose","typeLabel":"LeadFact is one thing the evaluation read about the lead and the column it\n · object"},"timeline":{"description":"read it from, so a person can check the reading against the row.\n","properties":{"source_column":{"type":"string","uniqueKey":"evaluation.facts.timeline.source_column","typeLabel":"string"},"value":{"type":"string","uniqueKey":"evaluation.facts.timeline.value","typeLabel":"string"}},"title":"LeadFact is one thing the evaluation read about the lead and the column it\n","type":"object","uniqueKey":"evaluation.facts.timeline","typeLabel":"LeadFact is one thing the evaluation read about the lead and the column it\n · object"}},"title":"LeadFacts is what an evaluation read about the lead. A nil field means it\n","type":"object","uniqueKey":"evaluation.facts","typeLabel":"LeadFacts is what an evaluation read about the lead. A nil field means it\n · object"},"mode":{"type":"string","uniqueKey":"evaluation.mode","typeLabel":"string"},"model":{"type":"string","uniqueKey":"evaluation.model","typeLabel":"string"},"priority":{"type":"string","uniqueKey":"evaluation.priority","typeLabel":"string"},"priority_reason":{"type":"string","uniqueKey":"evaluation.priority_reason","typeLabel":"string"},"proposed_kind":{"description":"ActionKind when the platform turned the proposal into a card.\n","title":"ProposedKind is what the model chose before enforcement; it differs from\n","type":"string","uniqueKey":"evaluation.proposed_kind","typeLabel":"string"},"rationale":{"type":"string","uniqueKey":"evaluation.rationale","typeLabel":"string"},"reachability":{"description":"this decision was made, and ReachedVia what reached them. They decide which set of contact gaps applied.\n","title":"Reachability is whether the lead had ever answered on any channel when\n","type":"string","uniqueKey":"evaluation.reachability","typeLabel":"string"},"reached_via":{"type":"string","uniqueKey":"evaluation.reached_via","typeLabel":"string"},"rule":{"type":"string","uniqueKey":"evaluation.rule","typeLabel":"string"},"rule_verified":{"type":"boolean","uniqueKey":"evaluation.rule_verified","typeLabel":"boolean"},"stage":{"type":"string","uniqueKey":"evaluation.stage","typeLabel":"string"}},"title":"Evaluation is one decision about one lead, after enforcement.\n","type":"object","uniqueKey":"evaluation","typeLabel":"Evaluation is one decision about one lead, after enforcement.\n · object"},"read_back":{"description":"Only Actions\\[].Mode, WorkingHours, EmailHours and TextHours are enforced; the stages and the priority ladder are a picture of the text drawn for the person who wrote it, and every evaluation still reads the whole text.\n","properties":{"accompanying_email":{"type":"object","title":"AccompanyingEmail is whether a decision this playbook gates behind a\n","description":"person — a text or a call — may also send the lead an email at once. Like the cadence it is always filled in, so a read-back stored before it existed answers with the default rather than with an empty string.\n","properties":{"mode":{"type":"string","uniqueKey":"read_back.accompanying_email.mode","typeLabel":"string"},"when":{"description":"empty when the text does not say.\n","title":"When is one short sentence from the text saying when it wants one, or\n","type":"string","uniqueKey":"read_back.accompanying_email.when","typeLabel":"string"}},"uniqueKey":"read_back.accompanying_email","typeLabel":"AccompanyingEmail is whether a decision this playbook gates behind a\n · object"},"actions":{"items":{"description":"person. Mode is after platform limits.\n","properties":{"kind":{"type":"string","uniqueKey":"read_back.actions.items.[INDEX].kind","typeLabel":"string"},"mode":{"type":"string","uniqueKey":"read_back.actions.items.[INDEX].mode","typeLabel":"string"},"when":{"type":"string","uniqueKey":"read_back.actions.items.[INDEX].when","typeLabel":"string"}},"title":"ReadBackAction is one action kind and whether the text lets it run without a\n","type":"object","uniqueKey":"read_back.actions.items.[INDEX]","typeLabel":"ReadBackAction is one action kind and whether the text lets it run without a\n · object"},"type":"array","uniqueKey":"read_back.actions","typeLabel":"ReadBackAction is one action kind and whether the text lets it run without a\n · object[]"},"cadence":{"type":"object","title":"Cadence is how fast this playbook may work one lead: the per-channel\n","description":"contact gaps in each reachability state and the new-lead grace. Unlike the priority ladder it IS enforced, and normalization always fills it in, so a read-back stored before it existed reads back as today's behaviour rather than as zeros. See ReadBackCadence in reachability.go.\n","properties":{"confirmed":{"type":"object","title":"Confirmed applies from the first inbound of any kind onwards.\n","description":"channel. Zero means \"the text did not say\", which reads as the default, never as \"no gap at all\".\n\nBetweenChannels is how long after a contact on one channel the next contact on a DIFFERENT channel waits (\"text them two minutes after the call\"). Empty when the playbook sets no such wait.\n\nWhatsAppMinutes is zero on every read-back stored before WhatsApp was a channel, and on any the text says nothing about WhatsApp in. Both read as the text gap, not as the WhatsApp default: see normalizeCadence.\n","properties":{"between_channels":{"items":{"description":"contact on After, a contact on Next waits Minutes.\n","properties":{"after":{"type":"string","uniqueKey":"read_back.cadence.confirmed.between_channels.items.[INDEX].after","typeLabel":"string"},"minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.confirmed.between_channels.items.[INDEX].minutes","typeLabel":"integer\u003cint64>"},"next":{"type":"string","uniqueKey":"read_back.cadence.confirmed.between_channels.items.[INDEX].next","typeLabel":"string"}},"title":"ChannelStep is one wait the playbook sets between two channels: after a\n","type":"object","uniqueKey":"read_back.cadence.confirmed.between_channels.items.[INDEX]","typeLabel":"ChannelStep is one wait the playbook sets between two channels: after a\n · object"},"type":"array","uniqueKey":"read_back.cadence.confirmed.between_channels","typeLabel":"ChannelStep is one wait the playbook sets between two channels: after a\n · object[]"},"call_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.confirmed.call_minutes","typeLabel":"integer\u003cint64>"},"email_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.confirmed.email_minutes","typeLabel":"integer\u003cint64>"},"sms_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.confirmed.sms_minutes","typeLabel":"integer\u003cint64>"},"whatsapp_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.confirmed.whatsapp_minutes","typeLabel":"integer\u003cint64>"}},"uniqueKey":"read_back.cadence.confirmed","typeLabel":"Confirmed applies from the first inbound of any kind onwards.\n · object"},"new_lead_grace_minutes":{"format":"int64","title":"NewLeadGraceMinutes is how long after capture a lead is left alone.\n","type":"integer","uniqueKey":"read_back.cadence.new_lead_grace_minutes","typeLabel":"integer\u003cint64>"},"unanswered_attempts":{"description":"never answered, in order, one entry per attempt — \"email\", \"text\" or \"call\" — including the last message it sends before giving up. Empty when the text schedules no such chase, or the read-back was stored before it existed. It sets how many unanswered messages may go without a person; see unansweredCeiling.\n","items":{"type":"string","uniqueKey":"read_back.cadence.unanswered_attempts.items.[INDEX]","typeLabel":"string"},"title":"UnansweredAttempts is every contact the text schedules for a lead who has\n","type":"array","uniqueKey":"read_back.cadence.unanswered_attempts","typeLabel":"string[]"},"unanswered_call_retries":{"description":"for a lead who has never answered, when it schedules one on the same day as the call before it: entry N times call N+1. Empty otherwise, and on every read-back stored before it existed — and it must stay ABSENT from their JSON, not merely empty, because the policy digest is taken over this struct and a new key would make every open decision look decided under an older playbook. See call\\_retries.go.\n","items":{"description":"never answered: how long after the previous call it may go. Minutes is that wait; NextDay places the call no sooner than the day after the previous one, counted where the lead is, and then Minutes is not read.\n","properties":{"minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.unanswered_call_retries.items.[INDEX].minutes","typeLabel":"integer\u003cint64>"},"next_day":{"type":"boolean","uniqueKey":"read_back.cadence.unanswered_call_retries.items.[INDEX].next_day","typeLabel":"boolean"}},"title":"CallRetryStep is one further call a playbook schedules to a lead who has\n","type":"object","uniqueKey":"read_back.cadence.unanswered_call_retries.items.[INDEX]","typeLabel":"CallRetryStep is one further call a playbook schedules to a lead who has\n · object"},"title":"UnansweredCallRetries is every further call the text schedules, in order,\n","type":"array","uniqueKey":"read_back.cadence.unanswered_call_retries","typeLabel":"CallRetryStep is one further call a playbook schedules to a lead who has\n · object[]"},"unconfirmed":{"type":"object","title":"Unconfirmed applies while the lead has never answered on any channel.\n","description":"channel. Zero means \"the text did not say\", which reads as the default, never as \"no gap at all\".\n\nBetweenChannels is how long after a contact on one channel the next contact on a DIFFERENT channel waits (\"text them two minutes after the call\"). Empty when the playbook sets no such wait.\n\nWhatsAppMinutes is zero on every read-back stored before WhatsApp was a channel, and on any the text says nothing about WhatsApp in. Both read as the text gap, not as the WhatsApp default: see normalizeCadence.\n","properties":{"between_channels":{"items":{"description":"contact on After, a contact on Next waits Minutes.\n","properties":{"after":{"type":"string","uniqueKey":"read_back.cadence.unconfirmed.between_channels.items.[INDEX].after","typeLabel":"string"},"minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.unconfirmed.between_channels.items.[INDEX].minutes","typeLabel":"integer\u003cint64>"},"next":{"type":"string","uniqueKey":"read_back.cadence.unconfirmed.between_channels.items.[INDEX].next","typeLabel":"string"}},"title":"ChannelStep is one wait the playbook sets between two channels: after a\n","type":"object","uniqueKey":"read_back.cadence.unconfirmed.between_channels.items.[INDEX]","typeLabel":"ChannelStep is one wait the playbook sets between two channels: after a\n · object"},"type":"array","uniqueKey":"read_back.cadence.unconfirmed.between_channels","typeLabel":"ChannelStep is one wait the playbook sets between two channels: after a\n · object[]"},"call_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.unconfirmed.call_minutes","typeLabel":"integer\u003cint64>"},"email_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.unconfirmed.email_minutes","typeLabel":"integer\u003cint64>"},"sms_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.unconfirmed.sms_minutes","typeLabel":"integer\u003cint64>"},"whatsapp_minutes":{"format":"int64","type":"integer","uniqueKey":"read_back.cadence.unconfirmed.whatsapp_minutes","typeLabel":"integer\u003cint64>"}},"uniqueKey":"read_back.cadence.unconfirmed","typeLabel":"Unconfirmed applies while the lead has never answered on any channel.\n · object"}},"uniqueKey":"read_back.cadence","typeLabel":"Cadence is how fast this playbook may work one lead: the per-channel\n · object"},"call_plan":{"description":"sentences: the playbook's call retries as Erdo read them, then the limits no playbook can move. The platform writes it from the settled cadence, so it is what will happen and a person can check it before saving. It is not read from storage and is no part of the policy digest.\n","items":{"type":"string","uniqueKey":"read_back.call_plan.items.[INDEX]","typeLabel":"string"},"title":"CallPlan is how Erdo will space calls to a lead who has not answered, in\n","type":"array","uniqueKey":"read_back.call_plan","typeLabel":"string[]"},"contact_hours":{"description":"the platform from the two fields above so a person can check it before saving. Like CallPlan it is not read from storage and is no part of the policy digest.\n","items":{"type":"string","uniqueKey":"read_back.contact_hours.items.[INDEX]","typeLabel":"string"},"title":"ContactHours is which hours hold each channel, in sentences, written by\n","type":"array","uniqueKey":"read_back.contact_hours","typeLabel":"string[]"},"email_hours":{"description":"a text (SMS or WhatsApp): HoursAnyTime or HoursWorkingHours. Each is stored only when the playbook's text moves that channel off what Erdo does by itself, so EmailHours is \"any\\_time\" or absent and TextHours is \"working\\_hours\" or absent. Absent means the default: an email inside the working hours, a text at any hour. A read-back stored before these existed therefore reads, encodes and digests exactly as it did. A call always keeps the working hours and has no such field. See heldByWorkingHours.\n","title":"EmailHours and TextHours are whether the working hours hold an email and\n","type":"string","uniqueKey":"read_back.email_hours","typeLabel":"string"},"flow":{"type":"object","title":"Flow is the order the playbook works a lead in, read out for drawing: the\n","description":"steps of each stage in sequence, the rules that win from any stage, and the facts that change which steps happen. Nothing enforces it — the engine reads the text. Null when the playbook was saved before flows existed or the flow could not be read. See ReadBackFlow.\n","properties":{"any_time":{"items":{"description":"the text gives them precedence.\n","properties":{"action":{"type":"string","uniqueKey":"read_back.flow.any_time.items.[INDEX].action","typeLabel":"string"},"exit_to":{"type":"string","uniqueKey":"read_back.flow.any_time.items.[INDEX].exit_to","typeLabel":"string"},"if":{"type":"string","uniqueKey":"read_back.flow.any_time.items.[INDEX].if","typeLabel":"string"},"source":{"type":"string","uniqueKey":"read_back.flow.any_time.items.[INDEX].source","typeLabel":"string"},"source_found":{"type":"boolean","uniqueKey":"read_back.flow.any_time.items.[INDEX].source_found","typeLabel":"boolean"}},"title":"FlowRule is a rule that applies whatever stage the lead is in, in the order\n","type":"object","uniqueKey":"read_back.flow.any_time.items.[INDEX]","typeLabel":"FlowRule is a rule that applies whatever stage the lead is in, in the order\n · object"},"type":"array","uniqueKey":"read_back.flow.any_time","typeLabel":"FlowRule is a rule that applies whatever stage the lead is in, in the order\n · object[]"},"conditions":{"items":{"description":"options are mutually exclusive. Built-in conditions (flowBuiltinConditions) are facts Erdo itself tracks for every lead and keep Erdo's own label and options whatever the model wrote; any other key is one the playbook's text defines, labelled in its own terms.\n","properties":{"builtin":{"type":"boolean","uniqueKey":"read_back.flow.conditions.items.[INDEX].builtin","typeLabel":"boolean"},"key":{"type":"string","uniqueKey":"read_back.flow.conditions.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","uniqueKey":"read_back.flow.conditions.items.[INDEX].label","typeLabel":"string"},"options":{"items":{"properties":{"label":{"type":"string","uniqueKey":"read_back.flow.conditions.items.[INDEX].options.items.[INDEX].label","typeLabel":"string"},"value":{"type":"string","uniqueKey":"read_back.flow.conditions.items.[INDEX].options.items.[INDEX].value","typeLabel":"string"}},"type":"object","uniqueKey":"read_back.flow.conditions.items.[INDEX].options.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"read_back.flow.conditions.items.[INDEX].options","typeLabel":"object[]"},"source":{"type":"string","uniqueKey":"read_back.flow.conditions.items.[INDEX].source","typeLabel":"string"},"source_found":{"type":"boolean","uniqueKey":"read_back.flow.conditions.items.[INDEX].source_found","typeLabel":"boolean"}},"title":"FlowCondition is one fact about a lead that changes which steps happen. The\n","type":"object","uniqueKey":"read_back.flow.conditions.items.[INDEX]","typeLabel":"FlowCondition is one fact about a lead that changes which steps happen. The\n · object"},"type":"array","uniqueKey":"read_back.flow.conditions","typeLabel":"FlowCondition is one fact about a lead that changes which steps happen. The\n · object[]"},"conflicts":{"description":"both happen. Only passages found in the text are kept as sources, and a conflict with none left is dropped (normalizeFlow). The extraction reports them rather than choosing, because the engine has to choose silently and the owner should choose instead.\n","items":{"properties":{"description":{"type":"string","uniqueKey":"read_back.flow.conflicts.items.[INDEX].description","typeLabel":"string"},"sources":{"items":{"type":"string","uniqueKey":"read_back.flow.conflicts.items.[INDEX].sources.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"read_back.flow.conflicts.items.[INDEX].sources","typeLabel":"string[]"}},"type":"object","uniqueKey":"read_back.flow.conflicts.items.[INDEX]","typeLabel":"object"},"title":"Conflicts are places where the text tells Erdo two things that cannot\n","type":"array","uniqueKey":"read_back.flow.conflicts","typeLabel":"Conflicts are places where the text tells Erdo two things that cannot\n · object[]"},"stages":{"items":{"properties":{"name":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].name","typeLabel":"string"},"phases":{"items":{"description":"a lead first answers us, typically. Most stages have one, with no name.\n","properties":{"aim":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].aim","typeLabel":"string"},"name":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].name","typeLabel":"string"},"steps":{"items":{"description":"a short label read relative to the step before it (\"at once\", \"+5 min\", \"next day\"). OnlyIf lists the conditions it applies under; empty means every lead. ExitTo names the stage the step moves the lead to, \"desk\" for a handoff that takes the lead off Erdo's hands, or is empty.\n","properties":{"action":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].action","typeLabel":"string"},"detail":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].detail","typeLabel":"string"},"exit_to":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].exit_to","typeLabel":"string"},"label":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].label","typeLabel":"string"},"only_if":{"items":{"properties":{"key":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].only_if.items.[INDEX].key","typeLabel":"string"},"values":{"items":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].only_if.items.[INDEX].values.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].only_if.items.[INDEX].values","typeLabel":"string[]"}},"type":"object","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].only_if.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].only_if","typeLabel":"object[]"},"source":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].source","typeLabel":"string"},"source_found":{"type":"boolean","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].source_found","typeLabel":"boolean"},"when":{"type":"string","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX].when","typeLabel":"string"}},"title":"FlowStep is one thing Erdo does, or one thing that moves the lead on. When is\n","type":"object","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps.items.[INDEX]","typeLabel":"FlowStep is one thing Erdo does, or one thing that moves the lead on. When is\n · object"},"type":"array","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX].steps","typeLabel":"FlowStep is one thing Erdo does, or one thing that moves the lead on. When is\n · object[]"}},"title":"FlowPhase is a part of a stage the text treats separately — before and after\n","type":"object","uniqueKey":"read_back.flow.stages.items.[INDEX].phases.items.[INDEX]","typeLabel":"FlowPhase is a part of a stage the text treats separately — before and after\n · object"},"type":"array","uniqueKey":"read_back.flow.stages.items.[INDEX].phases","typeLabel":"FlowPhase is a part of a stage the text treats separately — before and after\n · object[]"}},"type":"object","uniqueKey":"read_back.flow.stages.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"read_back.flow.stages","typeLabel":"object[]"}},"uniqueKey":"read_back.flow","typeLabel":"Flow is the order the playbook works a lead in, read out for drawing: the\n · object"},"limits":{"items":{"description":"renderer can say which rules the operator wrote and which Erdo applied.\n","properties":{"kind":{"type":"string","uniqueKey":"read_back.limits.items.[INDEX].kind","typeLabel":"string"},"mode":{"type":"string","uniqueKey":"read_back.limits.items.[INDEX].mode","typeLabel":"string"},"reason":{"type":"string","uniqueKey":"read_back.limits.items.[INDEX].reason","typeLabel":"string"}},"title":"ReadBackLimit is a restriction the platform imposed on top of the text, so a\n","type":"object","uniqueKey":"read_back.limits.items.[INDEX]","typeLabel":"ReadBackLimit is a restriction the platform imposed on top of the text, so a\n · object"},"type":"array","uniqueKey":"read_back.limits","typeLabel":"ReadBackLimit is a restriction the platform imposed on top of the text, so a\n · object[]"},"priority":{"type":"object","title":"Priority is the ladder read out of the text, or null when the text states\n","description":"none. Nothing enforces it — see ReadBackPriority.\n","properties":{"forbidden_factors":{"description":"a lead's country, city, name or language, say. Empty when it forbids none.\n","items":{"type":"string","uniqueKey":"read_back.priority.forbidden_factors.items.[INDEX]","typeLabel":"string"},"title":"ForbiddenFactors are the things the text says must NOT affect priority —\n","type":"array","uniqueKey":"read_back.priority.forbidden_factors","typeLabel":"string[]"},"high":{"description":"one short phrase each, in the text's own terms (\"budget $2M or more\", \"they replied to us\", \"timeline beyond a year\").\n","items":{"type":"string","uniqueKey":"read_back.priority.high.items.[INDEX]","typeLabel":"string"},"title":"High, Medium and Low are the conditions the text gives for each level,\n","type":"array","uniqueKey":"read_back.priority.high","typeLabel":"string[]"},"low":{"items":{"type":"string","uniqueKey":"read_back.priority.low.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"read_back.priority.low","typeLabel":"string[]"},"medium":{"items":{"type":"string","uniqueKey":"read_back.priority.medium.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"read_back.priority.medium","typeLabel":"string[]"}},"uniqueKey":"read_back.priority","typeLabel":"Priority is the ladder read out of the text, or null when the text states\n · object"},"stages":{"items":{"description":"from that stage.\n\nLabel and Tone are how a surface shows a lead in this stage. Label is the playbook's own name for the stage written out — \"qualified\\_out\" reads \"Qualified out\" — derived here rather than asked of the model, so a badge never carries wording the playbook did not use. Tone says whether being here is good news, still in progress, not a fit, or finished, which a badge colours because nothing in the name says so; it is read from the text like the summary, never enforced, and is empty on a read-back stored before it existed.\n","properties":{"actions":{"items":{"type":"string","uniqueKey":"read_back.stages.items.[INDEX].actions.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"read_back.stages.items.[INDEX].actions","typeLabel":"string[]"},"label":{"type":"string","uniqueKey":"read_back.stages.items.[INDEX].label","typeLabel":"string"},"name":{"type":"string","uniqueKey":"read_back.stages.items.[INDEX].name","typeLabel":"string"},"summary":{"type":"string","uniqueKey":"read_back.stages.items.[INDEX].summary","typeLabel":"string"},"tone":{"type":"string","uniqueKey":"read_back.stages.items.[INDEX].tone","typeLabel":"string"}},"title":"ReadBackStage is one stage the text describes, with the actions it allows\n","type":"object","uniqueKey":"read_back.stages.items.[INDEX]","typeLabel":"ReadBackStage is one stage the text describes, with the actions it allows\n · object"},"type":"array","uniqueKey":"read_back.stages","typeLabel":"ReadBackStage is one stage the text describes, with the actions it allows\n · object[]"},"text_hours":{"type":"string","uniqueKey":"read_back.text_hours","typeLabel":"string"},"working_hours":{"description":"lowercase three-letter names; Start and End are \"HH:MM\" in Timezone.\n","properties":{"days":{"items":{"type":"string","uniqueKey":"read_back.working_hours.days.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"read_back.working_hours.days","typeLabel":"string[]"},"end":{"type":"string","uniqueKey":"read_back.working_hours.end","typeLabel":"string"},"start":{"type":"string","uniqueKey":"read_back.working_hours.start","typeLabel":"string"},"timezone":{"type":"string","uniqueKey":"read_back.working_hours.timezone","typeLabel":"string"}},"title":"WorkingHours is the window automatic contact is allowed in. Days are\n","type":"object","uniqueKey":"read_back.working_hours","typeLabel":"WorkingHours is the window automatic contact is allowed in. Days are\n · object"}},"title":"ReadBack is what Erdo understood from a playbook's text when it was saved.\n","type":"object","uniqueKey":"read_back","typeLabel":"ReadBack is what Erdo understood from a playbook's text when it was saved.\n · object"},"timeline":{"properties":{"canonical_lead_id":{"type":"string","uniqueKey":"timeline.canonical_lead_id","typeLabel":"string"},"context_columns":{"description":"None of these columns is something the lead said: each is marked by the dataset's contract as bookkeeping, attribution, or a column the platform stamps itself, under whatever name the contract gave it. Read through partition, never directly.\n","items":{"type":"string","uniqueKey":"timeline.context_columns.items.[INDEX]","typeLabel":"string"},"title":"ContextColumns lists the row's columns that are never the lead's answers.\n","type":"array","uniqueKey":"timeline.context_columns","typeLabel":"string[]"},"dataset_id":{"type":"string","uniqueKey":"timeline.dataset_id","typeLabel":"string"},"dataset_slug":{"type":"string","uniqueKey":"timeline.dataset_slug","typeLabel":"string"},"details":{"description":"conversation, one entry per question with the answers it replaced.\n","items":{"description":"earlier one, newest first.\n","properties":{"definition":{"title":"Definition is the one-sentence question the key answers.\n","type":"string","uniqueKey":"timeline.details.items.[INDEX].definition","typeLabel":"string"},"earlier":{"description":"lead has said it once.\n","items":{"properties":{"observed_at":{"format":"date-time","type":"string","uniqueKey":"timeline.details.items.[INDEX].earlier.items.[INDEX].observed_at","typeLabel":"string\u003cdate-time>"},"quote":{"description":"typed.\n","title":"Quote is the lead's exact words. For a form answer it is the value they\n","type":"string","uniqueKey":"timeline.details.items.[INDEX].earlier.items.[INDEX].quote","typeLabel":"string"},"source_kind":{"description":"email\\_reply.\n","title":"SourceKind is form, phone_call, widget_conversation, sms, whatsapp or\n","type":"string","uniqueKey":"timeline.details.items.[INDEX].earlier.items.[INDEX].source_kind","typeLabel":"string"},"source_ref":{"description":"or inbound email the value came from — \"row\" for a form answer read from a row written before lead details existed.\n","title":"SourceRef is the capture receipt, call, widget session, message session\n","type":"string","uniqueKey":"timeline.details.items.[INDEX].earlier.items.[INDEX].source_ref","typeLabel":"string"},"value":{"type":"string","uniqueKey":"timeline.details.items.[INDEX].earlier.items.[INDEX].value","typeLabel":"string"}},"title":"LeadDetailObservation is one statement of one answer.\n","type":"object","uniqueKey":"timeline.details.items.[INDEX].earlier.items.[INDEX]","typeLabel":"LeadDetailObservation is one statement of one answer.\n · object"},"title":"Earlier are the answers this one replaced, newest first. Empty when the\n","type":"array","uniqueKey":"timeline.details.items.[INDEX].earlier","typeLabel":"LeadDetailObservation is one statement of one answer.\n · object[]"},"key":{"type":"string","uniqueKey":"timeline.details.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","uniqueKey":"timeline.details.items.[INDEX].label","typeLabel":"string"},"observed_at":{"format":"date-time","type":"string","uniqueKey":"timeline.details.items.[INDEX].observed_at","typeLabel":"string\u003cdate-time>"},"quote":{"type":"string","uniqueKey":"timeline.details.items.[INDEX].quote","typeLabel":"string"},"source_kind":{"type":"string","uniqueKey":"timeline.details.items.[INDEX].source_kind","typeLabel":"string"},"source_ref":{"type":"string","uniqueKey":"timeline.details.items.[INDEX].source_ref","typeLabel":"string"},"value":{"description":"Encore's OpenAPI generator drops an embedded struct's fields, so the public spec described a detail with no value, and every typed client built from it (Maurice's) could not read one.\n","title":"The current answer, spelled out field by field rather than embedded:\n","type":"string","uniqueKey":"timeline.details.items.[INDEX].value","typeLabel":"string"}},"title":"LeadDetail is one question a lead answered: the current answer and every\n","type":"object","uniqueKey":"timeline.details.items.[INDEX]","typeLabel":"LeadDetail is one question a lead answered: the current answer and every\n · object"},"title":"Details are what the lead has told us, on the form and in every\n","type":"array","uniqueKey":"timeline.details","typeLabel":"LeadDetail is one question a lead answered: the current answer and every\n · object[]"},"email_evidence":{"additionalProperties":{"description":"with us: whether they spelled it, whether they agreed when it was read back, and — when the spelling and what was heard disagreed with nobody confirming either — the other form they gave.\n\nIt comes from the conversation's own extracted contact (voice stores it beside the address it describes; see leadcontact.Contact), not from the lead row, because the row holds one value per column and a later conversation saying the same address differently would overwrite how the first one gave it.\n","properties":{"alternative":{"title":"Alternative is the other form of the address, only on a conflict.\n","type":"string","uniqueKey":"timeline.email_evidence.additionalProperties.alternative","typeLabel":"string"},"at":{"format":"date-time","type":"string","uniqueKey":"timeline.email_evidence.additionalProperties.at","typeLabel":"string\u003cdate-time>"},"check":{"title":"Check is a leadcontact.Check* value.\n","type":"string","uniqueKey":"timeline.email_evidence.additionalProperties.check","typeLabel":"string"},"via":{"title":"Via is the conversation it came from: KindCall or \"chat\".\n","type":"string","uniqueKey":"timeline.email_evidence.additionalProperties.via","typeLabel":"string"}},"title":"EmailEvidence is how the lead gave one of their addresses in a conversation\n","type":"object","uniqueKey":"timeline.email_evidence.additionalProperties","typeLabel":"EmailEvidence is how the lead gave one of their addresses in a conversation\n · object"},"description":"it for, how the lead gave it: spelled, confirmed on a read-back, or spelled one way and heard another (with that other form). Read by the evaluation so an address the lead confirmed is the one relied on, and a disputed one is checked with them rather than guessed at (email\\_evidence.go).\n","title":"EmailEvidence is, for each of the lead's addresses a call or chat recorded\n","type":"object","uniqueKey":"timeline.email_evidence","typeLabel":"EmailEvidence is, for each of the lead's addresses a call or chat recorded\n · object"},"emails":{"items":{"type":"string","uniqueKey":"timeline.emails.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"timeline.emails","typeLabel":"string[]"},"entries":{"items":{"properties":{"answered_call":{"description":"outbound call the lead picked up. Its Ref is the call, so the detailed timeline can read what the LEAD said on it — and only that: every inbound entry's words are trusted as the lead's own (knownTextFor, groundingSeeds), and the call's transcript and summary carry the concierge's side too.\n","title":"AnsweredCall marks the inbound entry answeredCallResponse adds for an\n","type":"boolean","uniqueKey":"timeline.entries.items.[INDEX].answered_call","typeLabel":"boolean"},"at":{"format":"date-time","type":"string","uniqueKey":"timeline.entries.items.[INDEX].at","typeLabel":"string\u003cdate-time>"},"delivery_failure":{"description":"message was, as messaging classified the provider's code: recipient, sender, message or unknown. Empty for everything else, and for a message that failed before the class was recorded.\n","title":"DeliveryFailure is whose problem a failed or undelivered text or WhatsApp\n","type":"string","uniqueKey":"timeline.entries.items.[INDEX].delivery_failure","typeLabel":"string"},"detail":{"type":"string","uniqueKey":"timeline.entries.items.[INDEX].detail","typeLabel":"string"},"direction":{"title":"Direction is inbound (the lead acted), outbound (we acted) or empty.\n","type":"string","uniqueKey":"timeline.entries.items.[INDEX].direction","typeLabel":"string"},"from_playbook":{"description":"text it sent, a call it placed. The fingerprint leaves those out while they are fine, because a contact the engine made is not the lead moving underneath the decision — the revisit time is what decides when to follow one up. Counting them made the engine supersede its own approved cards: a call placed at 15:52 reached the timeline a minute later, the next tick read the new record as \"the lead changed\", re-decided, and closed the card somebody had said yes to in between. A delivery that FAILED is still in the hash, because a bounced email or a rejected text changes what to do.\n\nHow a contact is recognized as ours differs by channel and both tests are exact. An email carries the context the mailer stamped on it; a text and a call are matched against the record this lead's own decision rows stored as their execution reference — the message id, the call id. A salesperson ringing or texting the lead from their own phone matches neither, and that is the point: it is news the engine has to react to. See markEngineContacts.\n","title":"FromPlaybook marks a contact this engine made ITSELF: an email it sent, a\n","type":"boolean","uniqueKey":"timeline.entries.items.[INDEX].from_playbook","typeLabel":"boolean"},"kind":{"description":"or suggestion.\n","title":"Kind is capture, email, email_reply, sms, whatsapp, call, chat, booking\n","type":"string","uniqueKey":"timeline.entries.items.[INDEX].kind","typeLabel":"string"},"meeting_at":{"description":"when the booking was made. Set on every booking that recorded its slot, whether it came from the lead's row or from a booking page's event; it is what the next and last meeting are read from (currentMeeting).\n","format":"date-time","title":"MeetingAt is the slot a booking entry is FOR, as opposed to At, which is\n","type":"string","uniqueKey":"timeline.entries.items.[INDEX].meeting_at","typeLabel":"string\u003cdate-time>"},"reached_nobody":{"description":"was reached: no answer, voicemail, busy or failed (callReachedNobody). It is what a playbook's call retry waits for; false also covers a call whose outcome is not on the record yet.\n","title":"ReachedNobody marks an outbound call whose stored outcome says no person\n","type":"boolean","uniqueKey":"timeline.entries.items.[INDEX].reached_nobody","typeLabel":"boolean"},"ref":{"title":"Ref identifies the underlying record (an email id, a call id, a session id).\n","type":"string","uniqueKey":"timeline.entries.items.[INDEX].ref","typeLabel":"string"},"status":{"type":"string","uniqueKey":"timeline.entries.items.[INDEX].status","typeLabel":"string"},"summary":{"type":"string","uniqueKey":"timeline.entries.items.[INDEX].summary","typeLabel":"string"}},"title":"TimelineEntry is one thing that happened with a lead, in any channel.\n","type":"object","uniqueKey":"timeline.entries.items.[INDEX]","typeLabel":"TimelineEntry is one thing that happened with a lead, in any channel.\n · object"},"type":"array","uniqueKey":"timeline.entries","typeLabel":"TimelineEntry is one thing that happened with a lead, in any channel.\n · object[]"},"lead_reference":{"type":"string","uniqueKey":"timeline.lead_reference","typeLabel":"string"},"phones":{"items":{"type":"string","uniqueKey":"timeline.phones.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"timeline.phones","typeLabel":"string[]"},"reset_at":{"description":"row's arrival and the answers above begin there, because that is what the engine decides from; absent for a lead that was never reset.\n","format":"date-time","title":"ResetAt is when the desk last started this lead over. The timeline, the\n","type":"string","uniqueKey":"timeline.reset_at","typeLabel":"string\u003cdate-time>"},"row":{"additionalProperties":{"type":"string","uniqueKey":"timeline.row.additionalProperties","typeLabel":"string"},"type":"object","uniqueKey":"timeline.row","typeLabel":"object"},"timing":{"description":"the platform so \"no response four days after the second email\" is matched on numbers rather than on date arithmetic the model does.\n","properties":{"awaiting_our_reply":{"description":"It is narrower than LastResponseAt by one kind: a booking is a response and owes no reply.\n","title":"AwaitingOurReply is the lead having SAID something we have not answered.\n","type":"boolean","uniqueKey":"timeline.timing.awaiting_our_reply","typeLabel":"boolean"},"captured_at":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.captured_at","typeLabel":"string\u003cdate-time>"},"days_since_capture":{"format":"int64","type":"integer","uniqueKey":"timeline.timing.days_since_capture","typeLabel":"integer\u003cint64>"},"days_since_last_outbound":{"format":"int64","type":"integer","uniqueKey":"timeline.timing.days_since_last_outbound","typeLabel":"integer\u003cint64>"},"days_since_last_response":{"format":"int64","type":"integer","uniqueKey":"timeline.timing.days_since_last_response","typeLabel":"integer\u003cint64>"},"last_meeting_at":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.last_meeting_at","typeLabel":"string\u003cdate-time>"},"last_outbound_at":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.last_outbound_at","typeLabel":"string\u003cdate-time>"},"last_outbound_by_channel":{"additionalProperties":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.last_outbound_by_channel.additionalProperties","typeLabel":"string\u003cdate-time>"},"description":"counting only what went out: the per-channel gaps are measured from here.\n","title":"LastOutboundByChannel is when we last reached out on each contact channel,\n","type":"object","uniqueKey":"timeline.timing.last_outbound_by_channel","typeLabel":"LastOutboundByChannel is when we last reached out on each contact channel,\n · object"},"last_response_at":{"description":"call, a chat, a text or a booking. A capture is excluded: it is the lead arriving, and a second one is the same person filling the same form in again. It used to be called last\\_inbound\\_at and counted captures, which told contactWindow the lead had responded since our last email and told the prompt \"never answered on any channel\" one line above \"the lead responded after our last email\".\n","format":"date-time","title":"LastResponseAt is when the lead last ANSWERED us — a reply, an inbound\n","type":"string","uniqueKey":"timeline.timing.last_response_at","typeLabel":"string\u003cdate-time>"},"lead_zone":{"type":"object","title":"LeadZone is the clock a text or a call to this lead is timed in, and how\n","description":"Erdo worked it out. See lead\\_timezone.go.\n","properties":{"evidence":{"title":"Evidence is the reading in words, for a card and for an operator.\n","type":"string","uniqueKey":"timeline.timing.lead_zone.evidence","typeLabel":"string"},"source":{"type":"string","uniqueKey":"timeline.timing.lead_zone.source","typeLabel":"string"},"timezone":{"type":"string","uniqueKey":"timeline.timing.lead_zone.timezone","typeLabel":"string"}},"uniqueKey":"timeline.timing.lead_zone","typeLabel":"LeadZone is the clock a text or a call to this lead is timed in, and how\n · object"},"local_time":{"type":"string","uniqueKey":"timeline.timing.local_time","typeLabel":"string"},"next_meeting_at":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.next_meeting_at","typeLabel":"string\u003cdate-time>"},"next_working_window_start":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.next_working_window_start","typeLabel":"string\u003cdate-time>"},"now":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.now","typeLabel":"string\u003cdate-time>"},"outbound_messages":{"format":"int64","type":"integer","uniqueKey":"timeline.timing.outbound_messages","typeLabel":"integer\u003cint64>"},"phone_hours":{"type":"object","title":"PhoneHours is the same working-hours window read in LeadZone: the\n","description":"development's days and hours in the lead's own timezone. It equals the development's reading whenever the lead's zone could not be determined.\n","properties":{"local_time":{"type":"string","uniqueKey":"timeline.timing.phone_hours.local_time","typeLabel":"string"},"next_working_window_start":{"format":"date-time","title":"NextStart is set only when the window is shut.\n","type":"string","uniqueKey":"timeline.timing.phone_hours.next_working_window_start","typeLabel":"string\u003cdate-time>"},"timezone":{"type":"string","uniqueKey":"timeline.timing.phone_hours.timezone","typeLabel":"string"},"within_working_hours":{"title":"Within is whether the window is open at the moment it was read.\n","type":"boolean","uniqueKey":"timeline.timing.phone_hours.within_working_hours","typeLabel":"boolean"}},"uniqueKey":"timeline.timing.phone_hours","typeLabel":"PhoneHours is the same working-hours window read in LeadZone: the\n · object"},"reachability":{"description":"\"confirmed\" from then on, permanently. It is derived here, once, so every gate, the prompt and the decision read the same answer.\n","title":"Reachability is \"unconfirmed\" until the lead answers on any channel and\n","type":"string","uniqueKey":"timeline.timing.reachability","typeLabel":"string"},"reached_at":{"format":"date-time","type":"string","uniqueKey":"timeline.timing.reached_at","typeLabel":"string\u003cdate-time>"},"reached_via":{"description":"(\"email\\_reply\", \"call\", \"chat\", \"sms\", \"whatsapp\", \"booking\"), empty while unconfirmed.\n","title":"ReachedVia is the kind of the first inbound that confirmed reachability\n","type":"string","uniqueKey":"timeline.timing.reached_via","typeLabel":"string"},"timezone":{"description":"DEVELOPMENT's working-hours reading, which is what an email is timed against. A call is timed against PhoneHours instead; a text is held by no working hours at all unless the playbook says so (heldByWorkingHours).\n","title":"Timezone, LocalTime, WithinWorkingHours and NextWorkingWindowStart are the\n","type":"string","uniqueKey":"timeline.timing.timezone","typeLabel":"string"},"unanswered_outbound_in_a_row":{"description":"answer since the lead last responded. Only a response resets it; a capture does not, or a lead who re-submits a form is never four attempts deep.\n","format":"int64","title":"UnansweredOutboundInARow is how many of our messages have gone without an\n","type":"integer","uniqueKey":"timeline.timing.unanswered_outbound_in_a_row","typeLabel":"integer\u003cint64>"},"within_working_hours":{"type":"boolean","uniqueKey":"timeline.timing.within_working_hours","typeLabel":"boolean"}},"title":"TimingFacts are the counts and clock readings a schedule rule needs, made by\n","type":"object","uniqueKey":"timeline.timing","typeLabel":"TimingFacts are the counts and clock readings a schedule rule needs, made by\n · object"},"unavailable":{"additionalProperties":{"type":"string","uniqueKey":"timeline.unavailable.additionalProperties","typeLabel":"string"},"description":"listed here is unknown, never empty — the evaluation is told so.\n","title":"Unavailable names each source that could not be read and why. A source\n","type":"object","uniqueKey":"timeline.unavailable","typeLabel":"Unavailable names each source that could not be read and why. A source\n · object"},"undeliverable_emails":{"additionalProperties":{"type":"string","uniqueKey":"timeline.undeliverable_emails.additionalProperties","typeLabel":"string"},"description":"showed cannot take mail — it bounced, or the person reported it as spam — with what the provider said. Email to one of them is refused (channelRefusal): a second message to a dead mailbox reaches nobody and costs the development's sending reputation, and one to a person who reported us is mail they have already refused.\n","title":"UndeliverableEmails is each of the lead's addresses that an earlier email\n","type":"object","uniqueKey":"timeline.undeliverable_emails","typeLabel":"UndeliverableEmails is each of the lead's addresses that an earlier email\n · object"}},"title":"LeadTimeline is everything the evaluation reads about one lead.\n","type":"object","uniqueKey":"timeline","typeLabel":"LeadTimeline is everything the evaluation reads about one lead.\n · object"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"agent":{"id":"\u003cstring>","name":"\u003cstring>","phone_number":"\u003cstring>","slug":"\u003cstring>"},"evaluation":{"action_input":{"accompanying_email":{"body_markdown":"\u003cstring>","sent_at":"2023-11-07T05:31:56Z","subject":"\u003cstring>","to":"\u003cstring>","to_name":"\u003cstring>"},"agent":{"id":"\u003cstring>","name":"\u003cstring>","phone_number":"\u003cstring>","slug":"\u003cstring>"},"agent_instructions":{"instructions":"\u003cstring>","language":"\u003cstring>","objective":"\u003cstring>"},"dataset_id":"\u003cstring>","development":"\u003cstring>","downgrade_cause":"\u003cstring>","email":{"body_markdown":"\u003cstring>","subject":"\u003cstring>"},"handoff":{"suggested_channel":"\u003cstring>","summary":"\u003cstring>"},"hold_until":"2023-11-07T05:31:56Z","lead_contact":"\u003cstring>","lead_email":"\u003cstring>","lead_name":"\u003cstring>","lead_phone":"\u003cstring>","lead_reference":"\u003cstring>","lead_zone":{"evidence":"\u003cstring>","source":"\u003cstring>","timezone":"\u003cstring>"},"next_step_after_seconds":123,"next_step_at":"2023-11-07T05:31:56Z","note":"\u003cstring>","original_kind":"\u003cstring>","playbook_revision":123,"reachability":"\u003cstring>","reached_via":"\u003cstring>","signature_name":"\u003cstring>","sms":{"body":"\u003cstring>"},"started_over_at":"2023-11-07T05:31:56Z","suggestion_id":"\u003cstring>","to":"\u003cstring>","to_name":"\u003cstring>","whatsapp":{"body":"\u003cstring>","from":"\u003cstring>","shared":true,"template":{"key":"\u003cstring>","language":"\u003cstring>","variables":{}}}},"action_kind":"\u003cstring>","due_at":"2023-11-07T05:31:56Z","facts":{"bedrooms":{"source_column":"\u003cstring>","value":"\u003cstring>"},"broker":{"source_column":"\u003cstring>","value":"\u003cstring>"},"budget":{"source_column":"\u003cstring>","value":"\u003cstring>"},"financing":{"source_column":"\u003cstring>","value":"\u003cstring>"},"language":{"source_column":"\u003cstring>","value":"\u003cstring>"},"purpose":{"source_column":"\u003cstring>","value":"\u003cstring>"},"timeline":{"source_column":"\u003cstring>","value":"\u003cstring>"}},"mode":"\u003cstring>","model":"\u003cstring>","priority":"\u003cstring>","priority_reason":"\u003cstring>","proposed_kind":"\u003cstring>","rationale":"\u003cstring>","reachability":"\u003cstring>","reached_via":"\u003cstring>","rule":"\u003cstring>","rule_verified":true,"stage":"\u003cstring>"},"read_back":{"accompanying_email":{"mode":"\u003cstring>","when":"\u003cstring>"},"actions":[{"kind":"\u003cstring>","mode":"\u003cstring>","when":"\u003cstring>"}],"cadence":{"confirmed":{"between_channels":[{"after":"\u003cstring>","minutes":123,"next":"\u003cstring>"}],"call_minutes":123,"email_minutes":123,"sms_minutes":123,"whatsapp_minutes":123},"new_lead_grace_minutes":123,"unanswered_attempts":["\u003cstring>"],"unanswered_call_retries":[{"minutes":123,"next_day":true}],"unconfirmed":{"between_channels":[{"after":"\u003cstring>","minutes":123,"next":"\u003cstring>"}],"call_minutes":123,"email_minutes":123,"sms_minutes":123,"whatsapp_minutes":123}},"call_plan":["\u003cstring>"],"contact_hours":["\u003cstring>"],"email_hours":"\u003cstring>","flow":{"any_time":[{"action":"\u003cstring>","exit_to":"\u003cstring>","if":"\u003cstring>","source":"\u003cstring>","source_found":true}],"conditions":[{"builtin":true,"key":"\u003cstring>","label":"\u003cstring>","options":[{"label":"\u003cstring>","value":"\u003cstring>"}],"source":"\u003cstring>","source_found":true}],"conflicts":[{"description":"\u003cstring>","sources":["\u003cstring>"]}],"stages":[{"name":"\u003cstring>","phases":[{"aim":"\u003cstring>","name":"\u003cstring>","steps":[{"action":"\u003cstring>","detail":"\u003cstring>","exit_to":"\u003cstring>","label":"\u003cstring>","only_if":[{"key":"\u003cstring>","values":["\u003cstring>"]}],"source":"\u003cstring>","source_found":true,"when":"\u003cstring>"}]}]}]},"limits":[{"kind":"\u003cstring>","mode":"\u003cstring>","reason":"\u003cstring>"}],"priority":{"forbidden_factors":["\u003cstring>"],"high":["\u003cstring>"],"low":["\u003cstring>"],"medium":["\u003cstring>"]},"stages":[{"actions":["\u003cstring>"],"label":"\u003cstring>","name":"\u003cstring>","summary":"\u003cstring>","tone":"\u003cstring>"}],"text_hours":"\u003cstring>","working_hours":{"days":["\u003cstring>"],"end":"\u003cstring>","start":"\u003cstring>","timezone":"\u003cstring>"}},"timeline":{"canonical_lead_id":"\u003cstring>","context_columns":["\u003cstring>"],"dataset_id":"\u003cstring>","dataset_slug":"\u003cstring>","details":[{"definition":"\u003cstring>","earlier":[{"observed_at":"2023-11-07T05:31:56Z","quote":"\u003cstring>","source_kind":"\u003cstring>","source_ref":"\u003cstring>","value":"\u003cstring>"}],"key":"\u003cstring>","label":"\u003cstring>","observed_at":"2023-11-07T05:31:56Z","quote":"\u003cstring>","source_kind":"\u003cstring>","source_ref":"\u003cstring>","value":"\u003cstring>"}],"email_evidence":{},"emails":["\u003cstring>"],"entries":[{"answered_call":true,"at":"2023-11-07T05:31:56Z","delivery_failure":"\u003cstring>","detail":"\u003cstring>","direction":"\u003cstring>","from_playbook":true,"kind":"\u003cstring>","meeting_at":"2023-11-07T05:31:56Z","reached_nobody":true,"ref":"\u003cstring>","status":"\u003cstring>","summary":"\u003cstring>"}],"lead_reference":"\u003cstring>","phones":["\u003cstring>"],"reset_at":"2023-11-07T05:31:56Z","row":{},"timing":{"awaiting_our_reply":true,"captured_at":"2023-11-07T05:31:56Z","days_since_capture":123,"days_since_last_outbound":123,"days_since_last_response":123,"last_meeting_at":"2023-11-07T05:31:56Z","last_outbound_at":"2023-11-07T05:31:56Z","last_outbound_by_channel":{},"last_response_at":"2023-11-07T05:31:56Z","lead_zone":{"evidence":"\u003cstring>","source":"\u003cstring>","timezone":"\u003cstring>"},"local_time":"\u003cstring>","next_meeting_at":"2023-11-07T05:31:56Z","next_working_window_start":"2023-11-07T05:31:56Z","now":"2023-11-07T05:31:56Z","outbound_messages":123,"phone_hours":{"local_time":"\u003cstring>","next_working_window_start":"2023-11-07T05:31:56Z","timezone":"\u003cstring>","within_working_hours":true},"reachability":"\u003cstring>","reached_at":"2023-11-07T05:31:56Z","reached_via":"\u003cstring>","timezone":"\u003cstring>","unanswered_outbound_in_a_row":123,"within_working_hours":true},"unavailable":{},"undeliverable_emails":{}}}}},"exampleType":"generated"}},"description":"Success response","exampleType":"generated"},"8076946c-0f3b-4558-88ae-901e25f00e96":{"content":{"application/json":{"schema":{"externalDocs":{"url":"https://pkg.go.dev/encore.dev/beta/errs#Error"},"properties":{"code":{"description":"Error code","example":"not_found","externalDocs":{"url":"https://pkg.go.dev/encore.dev/beta/errs#ErrCode"},"type":"string","uniqueKey":"code","typeLabel":"string"},"details":{"description":"Error details","type":"object","uniqueKey":"details","typeLabel":"object"},"message":{"description":"Error message","type":"string","uniqueKey":"message","typeLabel":"string"}},"title":"APIError","type":"object","uniqueKey":"","typeLabel":"APIError · object"},"examples":{"Example":{"title":"Example","value":{"code":"not_found","details":{},"message":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Error response","exampleType":"generated"}},"security":{"f209a82b-27fe-438e-803f-80311c7ab0b5":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"20caca57-c43c-45a2-bd80-d8321410ff29":{"url":"https://api.erdo.ai","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api/openapi.json"},"subdomain":"erdoai","siteName":"Erdo Docs","title":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n - Erdo Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-05T16:35:54.744Z","originalFileLocation":"api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp.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=\"tool. Nothing is stored and nothing is sent.\">\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=\"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n - Erdo Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"tool. Nothing is stored and nothing is sent.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Erdo Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://erdoai.mintlify.site/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=EvaluateLeadNextActionAPI+mirrors+the+erdo_evaluate_lead_next_action+MCP%0A\u0026amp;description=tool.+Nothing+is+stored+and+nothing+is+sent.%0A\u0026amp;theme=19c963d80c676f95ec8599a1\u0026amp;signature=80d7d94c7e9866380e406646f7db8d42acce7463ea3f48f16d5b47b5f8390d32\">\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=\"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n - Erdo Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"tool. Nothing is stored and nothing is sent.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://erdoai.mintlify.site/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=EvaluateLeadNextActionAPI+mirrors+the+erdo_evaluate_lead_next_action+MCP%0A\u0026amp;description=tool.+Nothing+is+stored+and+nothing+is+sent.%0A\u0026amp;theme=19c963d80c676f95ec8599a1\u0026amp;signature=80d7d94c7e9866380e406646f7db8d42acce7463ea3f48f16d5b47b5f8390d32\">\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/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp.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/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp#webpage\",\"url\":\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp\",\"name\":\"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\\n\",\"description\":\"tool. Nothing is stored and nothing is sent.\",\"dateModified\":\"2026-11-05T16:35:54.744Z\",\"isPartOf\":{\"@id\":\"https://docs.erdo.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.erdo.ai/api-reference/listactivityfeedapi-mirrors-erdo_list_activity_feed:-the-unified-ranked\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API Reference\",\"item\":\"https://docs.erdo.ai/api-reference/listactivityfeedapi-mirrors-erdo_list_activity_feed:-the-unified-ranked\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\\n\",\"item\":\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp#apireference\",\"headline\":\"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\\n\",\"name\":\"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\\n\",\"description\":\"tool. Nothing is stored and nothing is sent.\",\"url\":\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp\",\"mainEntityOfPage\":{\"@id\":\"https://docs.erdo.ai/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp#webpage\"},\"dateModified\":\"2026-11-05T16:35:54.744Z\",\"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","pages":[{"title":"Product","href":"/introduction"}]},{"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":"Audience readiness","href":"/audiences"},{"title":"Negative keyword coverage","href":"/negative-coverage"},{"title":"Audience observation and targeting","href":"/audience-mode"},{"title":"Retargeting readiness","href":"/retargeting"},{"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":"Lead reachability","href":"/lead-reachability"},{"title":"Strategies","href":"/strategies"},{"title":"Workstreams","href":"/workstreams"},{"title":"Workstream recommendations","href":"/recommendations"},{"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":"Ad creative reviews","href":"/ad-critic"},{"title":"Page reviews — the critic on any URL","href":"/page-reviews"},{"title":"Bounded outreach","href":"/outreach"},{"title":"Cross-customer priors","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":"GrantCreditsAPI mirrors erdo_admin_grant_credits. The billing service owns staff\nauthorization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/admin/credits/grant","href":"/api-reference/grantcreditsapi-mirrors-erdo_admin_grant_credits-the-billing-service-owns-staffauthorization"},{"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":"GetChannelStatusAPI mirrors erdo_channel_status: where the organization's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/channels/status","href":"/api-reference/getchannelstatusapi-mirrors-erdo_channel_status:-where-the-organizations"},{"title":"CreditBalanceAPI returns the authenticated current organization's credit\nbalance.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/credits/balance","href":"/api-reference/creditbalanceapi-returns-the-authenticated-current-organizations-creditbalance"},{"title":"ManagerCreditFundingAPI reads whether this organization funds its managed\norganizations.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/credits/manager-funding","href":"/api-reference/managercreditfundingapi-reads-whether-this-organization-funds-its-managedorganizations"},{"title":"UpdateManagerCreditFundingAPI changes the current organization's manager funding\nsetting.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/credits/manager-funding","href":"/api-reference/updatemanagercreditfundingapi-changes-the-current-organizations-manager-fundingsetting"},{"title":"CreateCriticReviewAPI reviews typed advertising creative on demand. Findings\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/critic/reviews","href":"/api-reference/createcriticreviewapi-reviews-typed-advertising-creative-on-demand-findings"},{"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":"SetCustomDomainHomeAPI changes what the domain root serves.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/custom-domains/{domain}/home","href":"/api-reference/setcustomdomainhomeapi-changes-what-the-domain-root-serves"},{"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":"ListLeadReachabilityAPI mirrors the erdo_list_lead_reachability MCP tool:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/lead-reachability","href":"/api-reference/listleadreachabilityapi-mirrors-the-erdo_list_lead_reachability-mcp-tool:"},{"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","description":"A hold or close replaces the lead's open suggestion and withdraws any card that suggestion filed. A start has the follow-up engine work the lead now — one captured before the engine was switched on, or test traffic — and with reset starts the lead over.\n\nThere is deliberately no MCP tool for this: a hold, close or start is the sales desk's call about a person it is talking to. A scoped API key is refused.\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","description":"needed.\n\nA handoff is accepted the moment Erdo files it: it is the desk's task, with no approval card, and the desk is emailed at once. Nothing automatic ever carries it out, so this is how it is closed — done (the desk dealt with the lead) or not needed. It answers FailedPrecondition when the lead's decision is not an open handoff, naming what it is instead.\n\nThere is deliberately no MCP tool for this, for the same reason as the hold, the close and the undo: it is the desk's word about a lead it is dealing with, not a model's. A scoped API key is refused.\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":"RetireDecisionAPI mirrors erdo_retire_decision.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/decisions/{decisionSlug}/retire","href":"/api-reference/retiredecisionapi-mirrors-erdo_retire_decision"},{"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":"SetIntegrationMemberAccessAPI sets whether teammates who reach a shared\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations/{integrationID}/member-access","href":"/api-reference/setintegrationmemberaccessapi-sets-whether-teammates-who-reach-a-shared"},{"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":"SetManagedOrganizationFeatureFlagAPI turns a feature flag on for a managed org\nyou operate, as an\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/managed-organizations/{orgSlug}/feature-flags/{key}","href":"/api-reference/setmanagedorganizationfeatureflagapi-turns-a-feature-flag-on-for-a-managed-orgyou-operate-as-an"},{"title":"ClearManagedOrganizationFeatureFlagAPI removes the override set above, so the\nmanaged org resolves\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/managed-organizations/{orgSlug}/feature-flags/{key}","href":"/api-reference/clearmanagedorganizationfeatureflagapi-removes-the-override-set-above-so-themanaged-org-resolves"},{"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":"SearchMCPToolsAPI mirrors erdo_search_tools. It finds a registered MCP tool\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/mcp/tools","href":"/api-reference/searchmcptoolsapi-mirrors-erdo_search_tools-it-finds-a-registered-mcp-tool"},{"title":"ListMCPToolsetsAPI mirrors erdo_list_toolsets. It describes the MCP catalog.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/mcp/toolsets","href":"/api-reference/listmcptoolsetsapi-mirrors-erdo_list_toolsets-it-describes-the-mcp-catalog"},{"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":"ListPaidMediaAudiencesAPI returns live provider evidence. status=partial or\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/paid-media/audiences","href":"/api-reference/listpaidmediaaudiencesapi-returns-live-provider-evidence-status=partial-or"},{"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":"SetPaidMediaAudienceModeAPI sets audience Observation or Targeting through\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/audience-mode","href":"/api-reference/setpaidmediaaudiencemodeapi-sets-audience-observation-or-targeting-through"},{"title":"SetPaidMediaCampaignBiddingAPI sets campaign bidding through the same\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/bidding","href":"/api-reference/setpaidmediacampaignbiddingapi-sets-campaign-bidding-through-the-same"},{"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":"SetPaidMediaNegativeKeywordsAPI adds and removes campaign or ad-group\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/negative-keywords","href":"/api-reference/setpaidmedianegativekeywordsapi-adds-and-removes-campaign-or-ad-group"},{"title":"SetPaidMediaCampaignNetworkSettingsAPI sets Search Partners and Display on\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/network-settings","href":"/api-reference/setpaidmediacampaignnetworksettingsapi-sets-search-partners-and-display-on"},{"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":"Lists this organization's lead sources: which sheet, webhook, import or ad\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/provider-lead-sources","href":"/api-reference/lists-this-organizations-lead-sources:-which-sheet-webhook-import-or-ad"},{"title":"Declares a lead source: where leads Erdo did not capture itself come from,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/provider-lead-sources","href":"/api-reference/declares-a-lead-source:-where-leads-erdo-did-not-capture-itself-come-from"},{"title":"Removes a lead source, by name or by provider and ad account. Leads already\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/provider-lead-sources","href":"/api-reference/removes-a-lead-source-by-name-or-by-provider-and-ad-account-leads-already"},{"title":"Lists the connection's lead gen forms for a LinkedIn ad account. Mirrors\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/provider-lead-sources/forms","href":"/api-reference/lists-the-connections-lead-gen-forms-for-a-linkedin-ad-account-mirrors"},{"title":"Imports one batch of a file (a header and at most 1,000 rows) into an import\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/provider-lead-sources/import","href":"/api-reference/imports-one-batch-of-a-file-a-header-and-at-most-1000-rows-into-an-import"},{"title":"RunQueriesAPI mirrors the erdo_run_queries MCP tool: several dataset reads\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/queries","href":"/api-reference/runqueriesapi-mirrors-the-erdo_run_queries-mcp-tool:-several-dataset-reads"},{"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":"SetVoiceAgentRealtimeModelAPI chooses how a voice agent turns speech into a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/agents/{slug}/realtime-model","href":"/api-reference/setvoiceagentrealtimemodelapi-chooses-how-a-voice-agent-turns-speech-into-a"},{"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 downloads the letter of authorization on file —\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/branded-calling/loa","href":"/api-reference/getvoicebrandedcallingloaapi-downloads-the-letter-of-authorization-on-file-—"},{"title":"SendVoiceBrandedCallingLOAAPI mirrors erdo_voice_branded_calling_loa: it\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/branded-calling/loa/send","href":"/api-reference/sendvoicebrandedcallingloaapi-mirrors-erdo_voice_branded_calling_loa:-it"},{"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":"SetVoiceWidgetRealtimeModelAPI chooses the same for one widget's own voice\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/widgets/{widget}/realtime-model","href":"/api-reference/setvoicewidgetrealtimemodelapi-chooses-the-same-for-one-widgets-own-voice"},{"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":"ManageWorkstreamRecommendationsAPI records an opportunity and its requested next\nstep.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/recommendations","href":"/api-reference/manageworkstreamrecommendationsapi-records-an-opportunity-and-its-requested-nextstep"},{"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"}]}]}]},"basePath":"","title":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n - Erdo Docs","buildId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","deploymentId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-Myd8dsju.js","utils-C2HkQgW0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-8rSppmTv.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B6MjiCFm.js","snippetPresets-DwrSAONL.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-1-a5UQKQ.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C541m7wZ.js","shallow-CWELCZ77.js","getApiPlaygroundDisplay-CTo5Zn03.js","CodeSnippet-D--dzvnl.js","CodeSnippets-DM3cXEDh.js","Page-CxAy5y67.js","getPastedJson-C-VECgcL.js","icon-BPq2-Mg3.js","MethodPill-D9J5cUHd.js","DuplicateIcon-BqHaxUnD.js","createIcon-CIbcZHp9.js","DynamicMarkdown-BKiHAm_d.js","SectionHeading-DstQXt3H.js","axios-vUo_bRtp.js","Markdown-CpxgzsKA.js","clsx-C5EfhVm0.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CJ9Oly2E.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Mk6P3qvh.js"]}