Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a type discriminator.
Event Types
The {eventType} path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field.
Transcript formats: Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable).
A deal is one object that changes over time: re-send it whenever it changes and include crmLastModifiedAt so the new state is not discarded as a duplicate of the previous push.
Email, call and social events accept crmOpportunityId / crmAccountId / crmAccountDomain. When crmOpportunityId matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events.
Deduplication
You can provide an optional eventId field for explicit deduplication. If not provided, an ID is auto-generated from the event content:
CRM:opportunityId + eventType + crmLastModifiedAt — or, when crmLastModifiedAt is absent, a hash of the deal’s mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate
A payload that fails schema validation is answered with HTTP 200 and received: false, with the per-field messages in validationErrors — check received, not just the status code. The request body is limited to 10 MB.
Authentication
Workspace is identified by API key, passed as an api_key header or, on this endpoint only, as the api_key query parameter.
POST
/
api
/
v2
/
analytics
/
webhook
/
receive
/
generic
/
{eventType}
curl --request POST \ --url https://app.octavehq.com/api/v2/analytics/webhook/receive/generic/{eventType} \ --header 'Content-Type: application/json' \ --header 'api_key: <api-key>' \ --data '{ "eventTimestamp": "2024-02-03T10:30:00Z", "eventType": "sent", "subject": "Follow up on our conversation", "body": { "text": "Hi John, Just wanted to follow up on our call yesterday...", "html": "<p>Hi John,</p><p>Just wanted to follow up on our call yesterday...</p>" }, "from": { "email": "sarah@company.com", "name": "Sarah Johnson" }, "to": [ { "email": "john@prospect.com", "name": "John Smith" } ], "conversationId": "conv_abc123", "campaignId": "campaign_xyz"}'
Timestamp of the event. Accepts an ISO 8601 string (e.g., "2024-02-03T10:30:00Z"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.
Explicit event ID for deduplication. If not provided, auto-generated from: from_email + subject + timestamp + first_to_email. Unique across every event type in the workspace: an email and a call may not share an ID.
The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.
Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.
Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.
Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.
Per-field validation errors when the payload fails schema validation. Mirrors Zod's flatten() output so callers can map errors back to the offending fields.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Octave API","colors":{"primary":"#333999","light":"#4B53C3","dark":"#3D3299"},"logo":{"light":"https://mintcdn.com/octave/SNMu0rTVOCvjTqcW/logo/logo.svg?fit=max\u0026auto=format\u0026n=SNMu0rTVOCvjTqcW\u0026q=85\u0026s=4f2d9698f4a42a583deee9e8721a9211","dark":"https://mintcdn.com/octave/SNMu0rTVOCvjTqcW/logo/logo.svg?fit=max\u0026auto=format\u0026n=SNMu0rTVOCvjTqcW\u0026q=85\u0026s=4f2d9698f4a42a583deee9e8721a9211"},"favicon":"https://mintcdn.com/octave/SNMu0rTVOCvjTqcW/favicon.svg?fit=max\u0026auto=format\u0026n=SNMu0rTVOCvjTqcW\u0026q=85\u0026s=f2d2b56c810a0fd21cf18ef023ddfab4","api":{"mdx":{"auth":{"method":"key","name":"api_key"}}},"navbar":{"links":[{"href":"mailto:support@octavehq.com","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.octavehq.com"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/octavehq"}},"seo":{"metatags":{"og:site_name":"Octave API Documentation","og:type":"website","og:locale":"en_US"},"indexing":"navigable"},"integrations":{"ga4":{"measurementId":"G-QW3B8BG664"},"posthog":{"apiKey":"phc_J3I5lz22TVmvufdByV6yBKkp0FTbjAAR9LiYPX7ss7k","apiHost":"https://us.i.posthog.com"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"octave","hasAudioNarration":false,"actualSubdomain":"octave","customDomains":["docs.octavehq.com"],"gitSource":{"type":"github","owner":"octavehq","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad29841669989d80e4e39e5","collectionId":"87662524-ef0d-4143-8068-3bcc32f9f084","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad29841669989d80e4e39e5"},"entitlements":{},"buildId":"6ad29841669989d80e4e39e5","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"V2 API Reference","count":250},{"language":"default","tag":"Getting Started","count":45},{"language":"default","tag":"Concepts","count":29},{"language":"default","tag":"Asset","count":23},{"language":"default","tag":"Agents","count":18},{"language":"default","tag":"MCP","count":12},{"language":"default","tag":"Events","count":11},{"language":"default","tag":"Custom Extractors","count":10},{"language":"default","tag":"Sources","count":8},{"language":"default","tag":"Data warehouse","count":8}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"v2-api-reference/events/log-event","slug":"/v2-api-reference/events/log-event","pageMetadata":{"openapi":"post /api/v2/analytics/webhook/receive/generic/{eventType}","title":"Log Event","description":"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a `type` discriminator.\n\n## Event Types\n\nThe `{eventType}` path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field.\n\n### `emails` — Email Events\n\nSupported `eventType` values: `sent`, `reply`, `opened`, `clicked`, `bounced`, `unsubscribed`\n\n- Only **`sent`** and **`reply`** are processed for analytics; others are ingested but not processed.\n- Required fields: `eventTimestamp`, `eventType`, `subject`, `body` (text or html), `from`, `to`\n- Optional: `cc`, `bcc`, `eventId`, `messageId`, `conversationId`, `campaignId`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `octaveRequestId`, `customMetadata`\n\n### `calls` — Call/Meeting Events\n\nSupported `eventType` values: `transcript`, `scheduled`, `completed`, `missed`\n\n- Only **`transcript`** is processed for analytics; others are ingested but not processed.\n- Required fields: `eventTimestamp`, `eventType`, `title`, `transcript`, `participants`\n- Optional: `duration`, `recordingUrl`, `meetingPlatform`, `eventId`, `conversationId`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `customMetadata`\n- **Transcript formats:** Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable).\n\n### `crm` — CRM Events\n\nSupported `eventType` values: `opportunity_created`, `deal_won`, `deal_lost`, `meeting_booked`\n\n- All CRM event types are processed for analytics.\n- Required fields: `eventTimestamp`, `eventType`, `opportunityId`, `opportunityName`\n- Optional: `amount`, `currency`, `stage`, `stageCategory`, `crmPipelineId`, `crmPipelineName`, `accountName`, `crmAccountId`, `crmAccountDomain`, `contactEmail`, `contactName`, `contactEmails`, `ownerName`, `ownerEmail`, `crmOwnerId`, `closeDate`, `createdDate`, `crmLastModifiedAt`, `lossReason`, `mergedOpportunityIds`, `eventId`, `sourceProviderName`, `customMetadata`\n- A deal is one object that changes over time: re-send it whenever it changes and include `crmLastModifiedAt` so the new state is not discarded as a duplicate of the previous push.\n\n### `social` — Social/LinkedIn Events\n\nSupported `eventType` values: `connection_sent`, `connection_accepted`, `message_sent`, `message_received`\n\n- All social event types are processed for analytics.\n- Required fields: `eventTimestamp`, `eventType`, `body` (text or html), `from`, `to`\n- Optional: `subject`, `eventId`, `conversationId`, `campaignId`, `messageType`, `campaignName`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `octaveRequestId`, `customMetadata`\n\n## Linking to deals\n\nEmail, call and social events accept `crmOpportunityId` / `crmAccountId` / `crmAccountDomain`. When `crmOpportunityId` matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events.\n\n## Deduplication\n\nYou can provide an optional `eventId` field for explicit deduplication. If not provided, an ID is auto-generated from the event content:\n\n- **Emails:** `from_email + subject + timestamp + first_to_email`\n- **Calls:** `title + timestamp + first_participant + first_100_chars_transcript`\n- **CRM:** `opportunityId + eventType + crmLastModifiedAt` — or, when `crmLastModifiedAt` is absent, a hash of the deal's mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate\n- **Social:** `from_email + eventType + timestamp + first_to_email`\n\n## Response\n\nA payload that fails schema validation is answered with HTTP 200 and `received: false`, with the per-field messages in `validationErrors` — check `received`, not just the status code. The request body is limited to 10 MB.\n\n## Authentication\n\nWorkspace is identified by API key, passed as an `api_key` header or, on this endpoint only, as the `api_key` query parameter.","href":"/v2-api-reference/events/log-event"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n h2: \"h2\",\n h3: \"h3\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a \", _jsx(_components.code, {\n children: \"type\"\n }), \" discriminator.\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Event Types\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The \", _jsx(_components.code, {\n children: \"{eventType}\"\n }), \" path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field.\"]\n }), \"\\n\", _jsxs(_components.h3, {\n children: [_jsx(_components.code, {\n children: \"emails\"\n }), \" — Email Events\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Supported \", _jsx(_components.code, {\n children: \"eventType\"\n }), \" values: \", _jsx(_components.code, {\n children: \"sent\"\n }), \", \", _jsx(_components.code, {\n children: \"reply\"\n }), \", \", _jsx(_components.code, {\n children: \"opened\"\n }), \", \", _jsx(_components.code, {\n children: \"clicked\"\n }), \", \", _jsx(_components.code, {\n children: \"bounced\"\n }), \", \", _jsx(_components.code, {\n children: \"unsubscribed\"\n })]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"Only \", _jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"sent\"\n })\n }), \" and \", _jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"reply\"\n })\n }), \" are processed for analytics; others are ingested but not processed.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Required fields: \", _jsx(_components.code, {\n children: \"eventTimestamp\"\n }), \", \", _jsx(_components.code, {\n children: \"eventType\"\n }), \", \", _jsx(_components.code, {\n children: \"subject\"\n }), \", \", _jsx(_components.code, {\n children: \"body\"\n }), \" (text or html), \", _jsx(_components.code, {\n children: \"from\"\n }), \", \", _jsx(_components.code, {\n children: \"to\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Optional: \", _jsx(_components.code, {\n children: \"cc\"\n }), \", \", _jsx(_components.code, {\n children: \"bcc\"\n }), \", \", _jsx(_components.code, {\n children: \"eventId\"\n }), \", \", _jsx(_components.code, {\n children: \"messageId\"\n }), \", \", _jsx(_components.code, {\n children: \"conversationId\"\n }), \", \", _jsx(_components.code, {\n children: \"campaignId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmOpportunityId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountDomain\"\n }), \", \", _jsx(_components.code, {\n children: \"sourceProviderName\"\n }), \", \", _jsx(_components.code, {\n children: \"octaveRequestId\"\n }), \", \", _jsx(_components.code, {\n children: \"customMetadata\"\n })]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.h3, {\n children: [_jsx(_components.code, {\n children: \"calls\"\n }), \" — Call/Meeting Events\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Supported \", _jsx(_components.code, {\n children: \"eventType\"\n }), \" values: \", _jsx(_components.code, {\n children: \"transcript\"\n }), \", \", _jsx(_components.code, {\n children: \"scheduled\"\n }), \", \", _jsx(_components.code, {\n children: \"completed\"\n }), \", \", _jsx(_components.code, {\n children: \"missed\"\n })]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"Only \", _jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"transcript\"\n })\n }), \" is processed for analytics; others are ingested but not processed.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Required fields: \", _jsx(_components.code, {\n children: \"eventTimestamp\"\n }), \", \", _jsx(_components.code, {\n children: \"eventType\"\n }), \", \", _jsx(_components.code, {\n children: \"title\"\n }), \", \", _jsx(_components.code, {\n children: \"transcript\"\n }), \", \", _jsx(_components.code, {\n children: \"participants\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Optional: \", _jsx(_components.code, {\n children: \"duration\"\n }), \", \", _jsx(_components.code, {\n children: \"recordingUrl\"\n }), \", \", _jsx(_components.code, {\n children: \"meetingPlatform\"\n }), \", \", _jsx(_components.code, {\n children: \"eventId\"\n }), \", \", _jsx(_components.code, {\n children: \"conversationId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmOpportunityId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountDomain\"\n }), \", \", _jsx(_components.code, {\n children: \"sourceProviderName\"\n }), \", \", _jsx(_components.code, {\n children: \"customMetadata\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Transcript formats:\"\n }), \" Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable).\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.h3, {\n children: [_jsx(_components.code, {\n children: \"crm\"\n }), \" — CRM Events\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Supported \", _jsx(_components.code, {\n children: \"eventType\"\n }), \" values: \", _jsx(_components.code, {\n children: \"opportunity_created\"\n }), \", \", _jsx(_components.code, {\n children: \"deal_won\"\n }), \", \", _jsx(_components.code, {\n children: \"deal_lost\"\n }), \", \", _jsx(_components.code, {\n children: \"meeting_booked\"\n })]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"All CRM event types are processed for analytics.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Required fields: \", _jsx(_components.code, {\n children: \"eventTimestamp\"\n }), \", \", _jsx(_components.code, {\n children: \"eventType\"\n }), \", \", _jsx(_components.code, {\n children: \"opportunityId\"\n }), \", \", _jsx(_components.code, {\n children: \"opportunityName\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Optional: \", _jsx(_components.code, {\n children: \"amount\"\n }), \", \", _jsx(_components.code, {\n children: \"currency\"\n }), \", \", _jsx(_components.code, {\n children: \"stage\"\n }), \", \", _jsx(_components.code, {\n children: \"stageCategory\"\n }), \", \", _jsx(_components.code, {\n children: \"crmPipelineId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmPipelineName\"\n }), \", \", _jsx(_components.code, {\n children: \"accountName\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountDomain\"\n }), \", \", _jsx(_components.code, {\n children: \"contactEmail\"\n }), \", \", _jsx(_components.code, {\n children: \"contactName\"\n }), \", \", _jsx(_components.code, {\n children: \"contactEmails\"\n }), \", \", _jsx(_components.code, {\n children: \"ownerName\"\n }), \", \", _jsx(_components.code, {\n children: \"ownerEmail\"\n }), \", \", _jsx(_components.code, {\n children: \"crmOwnerId\"\n }), \", \", _jsx(_components.code, {\n children: \"closeDate\"\n }), \", \", _jsx(_components.code, {\n children: \"createdDate\"\n }), \", \", _jsx(_components.code, {\n children: \"crmLastModifiedAt\"\n }), \", \", _jsx(_components.code, {\n children: \"lossReason\"\n }), \", \", _jsx(_components.code, {\n children: \"mergedOpportunityIds\"\n }), \", \", _jsx(_components.code, {\n children: \"eventId\"\n }), \", \", _jsx(_components.code, {\n children: \"sourceProviderName\"\n }), \", \", _jsx(_components.code, {\n children: \"customMetadata\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"A deal is one object that changes over time: re-send it whenever it changes and include \", _jsx(_components.code, {\n children: \"crmLastModifiedAt\"\n }), \" so the new state is not discarded as a duplicate of the previous push.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.h3, {\n children: [_jsx(_components.code, {\n children: \"social\"\n }), \" — Social/LinkedIn Events\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Supported \", _jsx(_components.code, {\n children: \"eventType\"\n }), \" values: \", _jsx(_components.code, {\n children: \"connection_sent\"\n }), \", \", _jsx(_components.code, {\n children: \"connection_accepted\"\n }), \", \", _jsx(_components.code, {\n children: \"message_sent\"\n }), \", \", _jsx(_components.code, {\n children: \"message_received\"\n })]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"All social event types are processed for analytics.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Required fields: \", _jsx(_components.code, {\n children: \"eventTimestamp\"\n }), \", \", _jsx(_components.code, {\n children: \"eventType\"\n }), \", \", _jsx(_components.code, {\n children: \"body\"\n }), \" (text or html), \", _jsx(_components.code, {\n children: \"from\"\n }), \", \", _jsx(_components.code, {\n children: \"to\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Optional: \", _jsx(_components.code, {\n children: \"subject\"\n }), \", \", _jsx(_components.code, {\n children: \"eventId\"\n }), \", \", _jsx(_components.code, {\n children: \"conversationId\"\n }), \", \", _jsx(_components.code, {\n children: \"campaignId\"\n }), \", \", _jsx(_components.code, {\n children: \"messageType\"\n }), \", \", _jsx(_components.code, {\n children: \"campaignName\"\n }), \", \", _jsx(_components.code, {\n children: \"crmOpportunityId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountId\"\n }), \", \", _jsx(_components.code, {\n children: \"crmAccountDomain\"\n }), \", \", _jsx(_components.code, {\n children: \"sourceProviderName\"\n }), \", \", _jsx(_components.code, {\n children: \"octaveRequestId\"\n }), \", \", _jsx(_components.code, {\n children: \"customMetadata\"\n })]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Linking to deals\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Email, call and social events accept \", _jsx(_components.code, {\n children: \"crmOpportunityId\"\n }), \" / \", _jsx(_components.code, {\n children: \"crmAccountId\"\n }), \" / \", _jsx(_components.code, {\n children: \"crmAccountDomain\"\n }), \". When \", _jsx(_components.code, {\n children: \"crmOpportunityId\"\n }), \" matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events.\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Deduplication\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"You can provide an optional \", _jsx(_components.code, {\n children: \"eventId\"\n }), \" field for explicit deduplication. If not provided, an ID is auto-generated from the event content:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Emails:\"\n }), \" \", _jsx(_components.code, {\n children: \"from_email + subject + timestamp + first_to_email\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Calls:\"\n }), \" \", _jsx(_components.code, {\n children: \"title + timestamp + first_participant + first_100_chars_transcript\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"CRM:\"\n }), \" \", _jsx(_components.code, {\n children: \"opportunityId + eventType + crmLastModifiedAt\"\n }), \" — or, when \", _jsx(_components.code, {\n children: \"crmLastModifiedAt\"\n }), \" is absent, a hash of the deal’s mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Social:\"\n }), \" \", _jsx(_components.code, {\n children: \"from_email + eventType + timestamp + first_to_email\"\n })]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Response\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A payload that fails schema validation is answered with HTTP 200 and \", _jsx(_components.code, {\n children: \"received: false\"\n }), \", with the per-field messages in \", _jsx(_components.code, {\n children: \"validationErrors\"\n }), \" — check \", _jsx(_components.code, {\n children: \"received\"\n }), \", not just the status code. The request body is limited to 10 MB.\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Authentication\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Workspace is identified by API key, passed as an \", _jsx(_components.code, {\n children: \"api_key\"\n }), \" header or, on this endpoint only, as the \", _jsx(_components.code, {\n children: \"api_key\"\n }), \" query parameter.\"]\n })]\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":{"openapi":"post /api/v2/analytics/webhook/receive/generic/{eventType}","title":"Log Event","description":"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a `type` discriminator.\n\n## Event Types\n\nThe `{eventType}` path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field.\n\n### `emails` — Email Events\n\nSupported `eventType` values: `sent`, `reply`, `opened`, `clicked`, `bounced`, `unsubscribed`\n\n- Only **`sent`** and **`reply`** are processed for analytics; others are ingested but not processed.\n- Required fields: `eventTimestamp`, `eventType`, `subject`, `body` (text or html), `from`, `to`\n- Optional: `cc`, `bcc`, `eventId`, `messageId`, `conversationId`, `campaignId`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `octaveRequestId`, `customMetadata`\n\n### `calls` — Call/Meeting Events\n\nSupported `eventType` values: `transcript`, `scheduled`, `completed`, `missed`\n\n- Only **`transcript`** is processed for analytics; others are ingested but not processed.\n- Required fields: `eventTimestamp`, `eventType`, `title`, `transcript`, `participants`\n- Optional: `duration`, `recordingUrl`, `meetingPlatform`, `eventId`, `conversationId`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `customMetadata`\n- **Transcript formats:** Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable).\n\n### `crm` — CRM Events\n\nSupported `eventType` values: `opportunity_created`, `deal_won`, `deal_lost`, `meeting_booked`\n\n- All CRM event types are processed for analytics.\n- Required fields: `eventTimestamp`, `eventType`, `opportunityId`, `opportunityName`\n- Optional: `amount`, `currency`, `stage`, `stageCategory`, `crmPipelineId`, `crmPipelineName`, `accountName`, `crmAccountId`, `crmAccountDomain`, `contactEmail`, `contactName`, `contactEmails`, `ownerName`, `ownerEmail`, `crmOwnerId`, `closeDate`, `createdDate`, `crmLastModifiedAt`, `lossReason`, `mergedOpportunityIds`, `eventId`, `sourceProviderName`, `customMetadata`\n- A deal is one object that changes over time: re-send it whenever it changes and include `crmLastModifiedAt` so the new state is not discarded as a duplicate of the previous push.\n\n### `social` — Social/LinkedIn Events\n\nSupported `eventType` values: `connection_sent`, `connection_accepted`, `message_sent`, `message_received`\n\n- All social event types are processed for analytics.\n- Required fields: `eventTimestamp`, `eventType`, `body` (text or html), `from`, `to`\n- Optional: `subject`, `eventId`, `conversationId`, `campaignId`, `messageType`, `campaignName`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `octaveRequestId`, `customMetadata`\n\n## Linking to deals\n\nEmail, call and social events accept `crmOpportunityId` / `crmAccountId` / `crmAccountDomain`. When `crmOpportunityId` matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events.\n\n## Deduplication\n\nYou can provide an optional `eventId` field for explicit deduplication. If not provided, an ID is auto-generated from the event content:\n\n- **Emails:** `from_email + subject + timestamp + first_to_email`\n- **Calls:** `title + timestamp + first_participant + first_100_chars_transcript`\n- **CRM:** `opportunityId + eventType + crmLastModifiedAt` — or, when `crmLastModifiedAt` is absent, a hash of the deal's mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate\n- **Social:** `from_email + eventType + timestamp + first_to_email`\n\n## Response\n\nA payload that fails schema validation is answered with HTTP 200 and `received: false`, with the per-field messages in `validationErrors` — check `received`, not just the status code. The request body is limited to 10 MB.\n\n## Authentication\n\nWorkspace is identified by API key, passed as an `api_key` header or, on this endpoint only, as the `api_key` query parameter.","href":"/v2-api-reference/events/log-event"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/octave/ad2757b864166314/schema.js"],"openApiReferenceData":{"operation":{"deprecated":false,"operationId":"logEvent","summary":"Log Event","description":"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a `type` discriminator.\n\n## Event Types\n\nThe `{eventType}` path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field.\n\n### `emails` — Email Events\n\nSupported `eventType` values: `sent`, `reply`, `opened`, `clicked`, `bounced`, `unsubscribed`\n\n- Only **`sent`** and **`reply`** are processed for analytics; others are ingested but not processed.\n- Required fields: `eventTimestamp`, `eventType`, `subject`, `body` (text or html), `from`, `to`\n- Optional: `cc`, `bcc`, `eventId`, `messageId`, `conversationId`, `campaignId`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `octaveRequestId`, `customMetadata`\n\n### `calls` — Call/Meeting Events\n\nSupported `eventType` values: `transcript`, `scheduled`, `completed`, `missed`\n\n- Only **`transcript`** is processed for analytics; others are ingested but not processed.\n- Required fields: `eventTimestamp`, `eventType`, `title`, `transcript`, `participants`\n- Optional: `duration`, `recordingUrl`, `meetingPlatform`, `eventId`, `conversationId`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `customMetadata`\n- **Transcript formats:** Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable).\n\n### `crm` — CRM Events\n\nSupported `eventType` values: `opportunity_created`, `deal_won`, `deal_lost`, `meeting_booked`\n\n- All CRM event types are processed for analytics.\n- Required fields: `eventTimestamp`, `eventType`, `opportunityId`, `opportunityName`\n- Optional: `amount`, `currency`, `stage`, `stageCategory`, `crmPipelineId`, `crmPipelineName`, `accountName`, `crmAccountId`, `crmAccountDomain`, `contactEmail`, `contactName`, `contactEmails`, `ownerName`, `ownerEmail`, `crmOwnerId`, `closeDate`, `createdDate`, `crmLastModifiedAt`, `lossReason`, `mergedOpportunityIds`, `eventId`, `sourceProviderName`, `customMetadata`\n- A deal is one object that changes over time: re-send it whenever it changes and include `crmLastModifiedAt` so the new state is not discarded as a duplicate of the previous push.\n\n### `social` — Social/LinkedIn Events\n\nSupported `eventType` values: `connection_sent`, `connection_accepted`, `message_sent`, `message_received`\n\n- All social event types are processed for analytics.\n- Required fields: `eventTimestamp`, `eventType`, `body` (text or html), `from`, `to`\n- Optional: `subject`, `eventId`, `conversationId`, `campaignId`, `messageType`, `campaignName`, `crmOpportunityId`, `crmAccountId`, `crmAccountDomain`, `sourceProviderName`, `octaveRequestId`, `customMetadata`\n\n## Linking to deals\n\nEmail, call and social events accept `crmOpportunityId` / `crmAccountId` / `crmAccountDomain`. When `crmOpportunityId` matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events.\n\n## Deduplication\n\nYou can provide an optional `eventId` field for explicit deduplication. If not provided, an ID is auto-generated from the event content:\n\n- **Emails:** `from_email + subject + timestamp + first_to_email`\n- **Calls:** `title + timestamp + first_participant + first_100_chars_transcript`\n- **CRM:** `opportunityId + eventType + crmLastModifiedAt` — or, when `crmLastModifiedAt` is absent, a hash of the deal's mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate\n- **Social:** `from_email + eventType + timestamp + first_to_email`\n\n## Response\n\nA payload that fails schema validation is answered with HTTP 200 and `received: false`, with the per-field messages in `validationErrors` — check `received`, not just the status code. The request body is limited to 10 MB.\n\n## Authentication\n\nWorkspace is identified by API key, passed as an `api_key` header or, on this endpoint only, as the `api_key` query parameter.","tags":["Events"],"x-visibility":"public","parameters":["f99e5f10-cb89-4465-956b-2cfe24aba3dd","d6738364-91c1-4a4d-a40c-06c72290d2d2"],"requestBody":"d1337eed-d4ee-4bc2-ad56-9173c4c7fdec","responses":{"200":"b5cc3bf2-07cf-46d7-9984-eead450600d9","400":"c49be869-c2c1-4fb7-a1a0-cfada6a6c6e4","404":"ebb14cc7-e0ae-4128-aa13-b8d2623887ef"},"method":"post","type":"path","servers":["80f2e4ba-6bdd-4b60-98d6-f0697e937bc7"],"security":["488bd04d-b181-41af-8ce0-a9e9dcfaa69b"],"path":"/api/v2/analytics/webhook/receive/generic/{eventType}","baseUrlOptions":["https://app.octavehq.com"],"title":"Log Event","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"f99e5f10-cb89-4465-956b-2cfe24aba3dd":{"schema":{"type":"string","enum":["emails","calls","crm","social"],"description":"Type of event being sent","example":"emails","isRequired":true,"uniqueKey":"","typeLabel":"enum\u003cstring>"},"required":true,"description":"Type of event being sent","name":"eventType","in":"path"},"d6738364-91c1-4a4d-a40c-06c72290d2d2":{"schema":{"type":"string","description":"Provide api key if not in header","isRequired":false,"uniqueKey":"","typeLabel":"string"},"required":false,"description":"Provide api key if not in header","name":"api_key","in":"query"}},"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Email Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","subject","body","from","to"],"example":{"eventTimestamp":"2024-02-03T10:30:00Z","eventType":"sent","subject":"Follow up on our conversation","body":{"text":"Hi John, Just wanted to follow up on our call yesterday...","html":"\u003cp>Hi John,\u003c/p>\u003cp>Just wanted to follow up on our call yesterday...\u003c/p>"},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_abc123","campaignId":"campaign_xyz"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.0.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.0.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.0.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of email event. Only 'sent' and 'reply' are processed for analytics; others are ingested but not processed.","enum":["sent","reply","opened","clicked","bounced","unsubscribed"],"isRequired":true,"uniqueKey":"oneOf.0.eventType","typeLabel":"enum\u003cstring>"},"subject":{"type":"string","description":"Email subject line","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"oneOf.0.subject","typeLabel":"string"},"body":{"type":"object","description":"Email body. At least one of text or html must be provided.","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.0.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.0.body.html","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.body","typeLabel":"object"},"from":{"type":"object","description":"Sender","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.0.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.0.from.name","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.0.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.0.to.items.[INDEX].name","typeLabel":"string"}},"uniqueKey":"oneOf.0.to.items.[INDEX]","typeLabel":"object"},"description":"Recipients (at least one required)","minItems":1,"isRequired":true,"uniqueKey":"oneOf.0.to","typeLabel":"object[]"},"cc":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.0.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.0.cc.items.[INDEX].name","typeLabel":"string"}},"uniqueKey":"oneOf.0.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"oneOf.0.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.0.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.0.bcc.items.[INDEX].name","typeLabel":"string"}},"uniqueKey":"oneOf.0.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"oneOf.0.bcc","typeLabel":"object[]"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: from_email + subject + timestamp + first_to_email. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-email-sent-1","uniqueKey":"oneOf.0.eventId","typeLabel":"string"},"messageId":{"type":"string","description":"The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.","maxLength":255,"example":"\u003cCAF1b2c3d4@mail.gmail.com>","uniqueKey":"oneOf.0.messageId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related emails","uniqueKey":"oneOf.0.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping campaign emails","uniqueKey":"oneOf.0.campaignId","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.0.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.0.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.0.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.0.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.0.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.0.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.0.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.0.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.0.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.0.customMetadata","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"Email Event · object"},{"type":"object","title":"Call Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","title","transcript","participants","subject","body","from","to"],"example":{"eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":[{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Hi John, thanks for taking the time today. How are you doing?","timestamp":"00:00:05"},{"speaker":{"name":"John Smith","email":"john@prospect.com","role":"external"},"text":"Good, thanks! Yeah, I was excited to learn more about what you all do.","timestamp":"00:00:12"},{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Great! So I'd love to start by understanding a bit about your current setup...","timestamp":"00:00:20"}],"participants":[{"email":"sarah@company.com","name":"Sarah Johnson","role":"internal"},{"email":"john@prospect.com","name":"John Smith","role":"external"}],"duration":1800,"meetingPlatform":"zoom"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.1.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.1.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.1.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of call event. Only 'transcript' is processed for analytics; others are ingested but not processed.","enum":[],"isRequired":true,"uniqueKey":"oneOf.1.eventType","typeLabel":"enum\u003cstring>"},"subject":{"type":"string","description":"Email subject line","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"oneOf.1.subject","typeLabel":"string"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.1.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.1.body.html","typeLabel":"string"}},"description":"Email body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.1.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.1.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.1.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.1.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.1.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.1.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.1.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.1.to","typeLabel":"object[]"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"oneOf.1.title","typeLabel":"string"},"transcript":{"oneOf":[{"type":"string","description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minLength":1,"isRequired":true,"uniqueKey":"oneOf.1.transcript.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.1.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.1.transcript.oneOf.1.items.[INDEX].speaker.email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"description":"'internal' for your team, 'external' for prospects/customers","uniqueKey":"oneOf.1.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"required":["name"],"isRequired":true,"uniqueKey":"oneOf.1.transcript.oneOf.1.items.[INDEX].speaker","typeLabel":"object"},"text":{"type":"string","example":"Hi John, thanks for taking the time today.","isRequired":true,"uniqueKey":"oneOf.1.transcript.oneOf.1.items.[INDEX].text","typeLabel":"string"},"timestamp":{"type":"string","description":"Timestamp offset (ISO 8601 or seconds from start)","example":"00:00:05","uniqueKey":"oneOf.1.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"required":["speaker","text"],"uniqueKey":"oneOf.1.transcript.oneOf.1.items.[INDEX]","typeLabel":"object"},"description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minItems":1,"isRequired":true,"uniqueKey":"oneOf.1.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"oneOf.1.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.1.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.1.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"oneOf.1.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"required":["name"],"uniqueKey":"oneOf.1.participants.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Call participants (at least one required)","isRequired":true,"uniqueKey":"oneOf.1.participants","typeLabel":"object[]"},"cc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.1.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.1.cc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.1.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"oneOf.1.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.1.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.1.bcc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.1.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"oneOf.1.bcc","typeLabel":"object[]"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: title + timestamp + first_participant + first_100_chars_transcript. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-call-discovery","uniqueKey":"oneOf.1.eventId","typeLabel":"string"},"messageId":{"type":"string","maxLength":255,"description":"The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.","example":"\u003cCAF1b2c3d4@mail.gmail.com>","uniqueKey":"oneOf.1.messageId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation ID for grouping related calls","uniqueKey":"oneOf.1.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping campaign emails","uniqueKey":"oneOf.1.campaignId","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.1.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.1.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.1.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.1.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.1.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.1.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.1.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.1.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.1.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.1.customMetadata","typeLabel":"object"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"oneOf.1.duration","typeLabel":"number"},"recordingUrl":{"type":"string","format":"uri","description":"URL to the call recording","uniqueKey":"oneOf.1.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"oneOf.1.meetingPlatform","typeLabel":"string"}},"uniqueKey":"oneOf.1","typeLabel":"Call Event · object"},{"type":"object","title":"CRM Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","opportunityId","opportunityName","subject","body","from","to"],"example":{"eventTimestamp":"2024-02-03T16:00:00Z","eventType":"opportunity_created","opportunityId":"opp_12345","opportunityName":"Acme Corp - Enterprise Plan","amount":"50000.00","currency":"USD","stage":"Qualification","stageCategory":"open","accountName":"Acme Corp","crmAccountId":"acct_67890","crmAccountDomain":"acme.com","contactEmail":"john@acme.com","contactName":"John Smith","contactEmails":["john@acme.com","priya@acme.com"],"ownerEmail":"rep@yourcompany.com","closeDate":"2024-03-31T00:00:00Z","crmLastModifiedAt":"2024-02-03T16:00:00Z"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.2.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.2.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.2.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of CRM event","enum":[],"isRequired":true,"uniqueKey":"oneOf.2.eventType","typeLabel":"enum\u003cstring>"},"subject":{"type":"string","description":"Email subject line","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"oneOf.2.subject","typeLabel":"string"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.2.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.2.body.html","typeLabel":"string"}},"description":"Email body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.2.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.2.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.2.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.2.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.2.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.2.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.2.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.2.to","typeLabel":"object[]"},"opportunityId":{"type":"string","description":"External opportunity/deal ID","example":"opp_12345","isRequired":true,"uniqueKey":"oneOf.2.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"oneOf.2.opportunityName","typeLabel":"string"},"cc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.2.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.2.cc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.2.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"oneOf.2.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.2.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.2.bcc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.2.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"oneOf.2.bcc","typeLabel":"object[]"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. When omitted it is derived from opportunityId + eventType + the deal's current state, so re-sending a CHANGED deal is treated as a new event rather than a duplicate of the last push. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-email-sent-1","uniqueKey":"oneOf.2.eventId","typeLabel":"string"},"messageId":{"type":"string","maxLength":255,"description":"The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.","example":"\u003cCAF1b2c3d4@mail.gmail.com>","uniqueKey":"oneOf.2.messageId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related emails","uniqueKey":"oneOf.2.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping campaign emails","uniqueKey":"oneOf.2.campaignId","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.2.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.2.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.2.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID — the durable join key for account linking. Matching on name alone cannot separate two deals that share a company name under different domains.","example":"acct_67890","uniqueKey":"oneOf.2.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"Account domain, used to link events by company","example":"acme.com","uniqueKey":"oneOf.2.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.2.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.2.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.2.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.2.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.2.customMetadata","typeLabel":"object"},"amount":{"oneOf":[{"type":"number","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.2.amount.oneOf.0","typeLabel":"number"},{"type":"string","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.2.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"oneOf.2.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"oneOf.2.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"oneOf.2.stage","typeLabel":"string"},"stageCategory":{"type":"string","enum":["open","closed_won","closed_lost","other"],"description":"Normalized stage bucket: `open`, `closed_won`, `closed_lost` or `other`. Supply this when your stage names do not map cleanly from eventType — without it the category is inferred from the event type alone, so a deal sitting in late-stage procurement still reads as open.","example":"open","uniqueKey":"oneOf.2.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"oneOf.2.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"oneOf.2.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"oneOf.2.accountName","typeLabel":"string"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email","example":"john@acme.com","uniqueKey":"oneOf.2.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"oneOf.2.contactEmails.items.[INDEX]","typeLabel":"string\u003cemail>"},"description":"Every contact on the deal, not just the primary. Event linking matches on all of them, so sending the full set is the biggest lever on how many emails and calls attach to this opportunity.","example":["john@acme.com","priya@acme.com"],"uniqueKey":"oneOf.2.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"oneOf.2.ownerName","typeLabel":"string"},"ownerEmail":{"type":"string","format":"email","description":"Deal owner's email — lets Octave match the owner to a teammate","example":"rep@yourcompany.com","uniqueKey":"oneOf.2.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"oneOf.2.crmOwnerId","typeLabel":"string"},"lossReason":{"type":"string","description":"Verbatim closed-lost reason. Classified into a category on ingest and used for win/loss analysis.","example":"Went with competitor","uniqueKey":"oneOf.2.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.2.mergedOpportunityIds.items.[INDEX]","typeLabel":"string"},"description":"IDs of deals merged INTO this one. Their mirrors are folded into this deal and tombstoned, so a merge does not leave duplicates counting toward pipeline.","uniqueKey":"oneOf.2.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"oneOf.2.contactName","typeLabel":"string"},"closeDate":{"oneOf":[{"type":"string","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.2.closeDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.2.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.2.closeDate","typeLabel":"string | number"},"createdDate":{"oneOf":[{"type":"string","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.2.createdDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.2.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.2.createdDate","typeLabel":"string | number"},"crmLastModifiedAt":{"oneOf":[{"type":"string","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.2.crmLastModifiedAt.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.2.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.2.crmLastModifiedAt","typeLabel":"string | number"}},"uniqueKey":"oneOf.2","typeLabel":"CRM Event · object"},{"type":"object","title":"Social Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","body","from","to","subject"],"example":{"eventTimestamp":"2024-02-03T11:00:00Z","eventType":"message_sent","subject":"Introduction","body":{"text":"Hi John, I came across your profile and would love to connect."},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_social_abc123","campaignId":"campaign_linkedin_1","messageType":"message","campaignName":"Q1 Outreach"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.3.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.3.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.3.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of social event (LinkedIn/social outreach). All types are processed for analytics.","enum":[],"isRequired":true,"uniqueKey":"oneOf.3.eventType","typeLabel":"enum\u003cstring>"},"subject":{"type":"string","description":"Subject or topic of the message","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"oneOf.3.subject","typeLabel":"string"},"body":{"type":"object","description":"Message body. At least one of text or html must be provided.","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.3.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.3.body.html","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.body","typeLabel":"object"},"from":{"type":"object","description":"Sender","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.3.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.3.from.name","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.3.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.3.to.items.[INDEX].name","typeLabel":"string"}},"uniqueKey":"oneOf.3.to.items.[INDEX]","typeLabel":"object"},"description":"Recipients (at least one required)","minItems":1,"isRequired":true,"uniqueKey":"oneOf.3.to","typeLabel":"object[]"},"cc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.3.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.3.cc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.3.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"oneOf.3.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.3.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.3.bcc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.3.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"oneOf.3.bcc","typeLabel":"object[]"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-email-sent-1","uniqueKey":"oneOf.3.eventId","typeLabel":"string"},"messageId":{"type":"string","maxLength":255,"description":"The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.","example":"\u003cCAF1b2c3d4@mail.gmail.com>","uniqueKey":"oneOf.3.messageId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related messages","uniqueKey":"oneOf.3.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping","uniqueKey":"oneOf.3.campaignId","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.3.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.3.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.3.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.3.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.3.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.3.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.3.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.3.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.3.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.3.customMetadata","typeLabel":"object"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"oneOf.3.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"oneOf.3.campaignName","typeLabel":"string"}},"uniqueKey":"oneOf.3","typeLabel":"Social Event · object"},{"type":"object","title":"Email Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","subject","body","from","to","title","transcript","participants"],"example":{"eventTimestamp":"2024-02-03T10:30:00Z","eventType":"sent","subject":"Follow up on our conversation","body":{"text":"Hi John, Just wanted to follow up on our call yesterday...","html":"\u003cp>Hi John,\u003c/p>\u003cp>Just wanted to follow up on our call yesterday...\u003c/p>"},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_abc123","campaignId":"campaign_xyz"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.4.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.4.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.4.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of email event. Only 'sent' and 'reply' are processed for analytics; others are ingested but not processed.","enum":[],"isRequired":true,"uniqueKey":"oneOf.4.eventType","typeLabel":"enum\u003cstring>"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"oneOf.4.title","typeLabel":"string"},"transcript":{"oneOf":[{"type":"string","description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minLength":1,"isRequired":true,"uniqueKey":"oneOf.4.transcript.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.4.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.4.transcript.oneOf.1.items.[INDEX].speaker.email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"description":"'internal' for your team, 'external' for prospects/customers","uniqueKey":"oneOf.4.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"required":["name"],"isRequired":true,"uniqueKey":"oneOf.4.transcript.oneOf.1.items.[INDEX].speaker","typeLabel":"object"},"text":{"type":"string","example":"Hi John, thanks for taking the time today.","isRequired":true,"uniqueKey":"oneOf.4.transcript.oneOf.1.items.[INDEX].text","typeLabel":"string"},"timestamp":{"type":"string","description":"Timestamp offset (ISO 8601 or seconds from start)","example":"00:00:05","uniqueKey":"oneOf.4.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"required":["speaker","text"],"uniqueKey":"oneOf.4.transcript.oneOf.1.items.[INDEX]","typeLabel":"object"},"description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minItems":1,"isRequired":true,"uniqueKey":"oneOf.4.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"oneOf.4.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.4.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.4.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"oneOf.4.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"required":["name"],"uniqueKey":"oneOf.4.participants.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Call participants (at least one required)","isRequired":true,"uniqueKey":"oneOf.4.participants","typeLabel":"object[]"},"subject":{"type":"string","description":"Email subject line","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"oneOf.4.subject","typeLabel":"string"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.4.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.4.body.html","typeLabel":"string"}},"description":"Email body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.4.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.4.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.4.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.4.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.4.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.4.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.4.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.4.to","typeLabel":"object[]"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"oneOf.4.duration","typeLabel":"number"},"recordingUrl":{"type":"string","format":"uri","description":"URL to the call recording","uniqueKey":"oneOf.4.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"oneOf.4.meetingPlatform","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: from_email + subject + timestamp + first_to_email. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-email-sent-1","uniqueKey":"oneOf.4.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related emails","uniqueKey":"oneOf.4.conversationId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.4.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.4.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.4.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.4.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.4.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.4.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.4.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.4.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.4.customMetadata","typeLabel":"object"},"cc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.4.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.4.cc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.4.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"oneOf.4.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.4.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.4.bcc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.4.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"oneOf.4.bcc","typeLabel":"object[]"},"messageId":{"type":"string","maxLength":255,"description":"The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.","example":"\u003cCAF1b2c3d4@mail.gmail.com>","uniqueKey":"oneOf.4.messageId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping campaign emails","uniqueKey":"oneOf.4.campaignId","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.4.octaveRequestId","typeLabel":"string"}},"uniqueKey":"oneOf.4","typeLabel":"Email Event · object"},{"type":"object","title":"Call Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","title","transcript","participants"],"example":{"eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":[{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Hi John, thanks for taking the time today. How are you doing?","timestamp":"00:00:05"},{"speaker":{"name":"John Smith","email":"john@prospect.com","role":"external"},"text":"Good, thanks! Yeah, I was excited to learn more about what you all do.","timestamp":"00:00:12"},{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Great! So I'd love to start by understanding a bit about your current setup...","timestamp":"00:00:20"}],"participants":[{"email":"sarah@company.com","name":"Sarah Johnson","role":"internal"},{"email":"john@prospect.com","name":"John Smith","role":"external"}],"duration":1800,"meetingPlatform":"zoom"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.5.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.5.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.5.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of call event. Only 'transcript' is processed for analytics; others are ingested but not processed.","enum":["transcript","scheduled","completed","missed"],"isRequired":true,"uniqueKey":"oneOf.5.eventType","typeLabel":"enum\u003cstring>"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"oneOf.5.title","typeLabel":"string"},"transcript":{"oneOf":[{"type":"string","description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minLength":1,"isRequired":true,"uniqueKey":"oneOf.5.transcript.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"object","required":["speaker","text"],"properties":{"speaker":{"type":"object","required":["name"],"properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.5.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.5.transcript.oneOf.1.items.[INDEX].speaker.email","typeLabel":"string\u003cemail>"},"role":{"type":"string","description":"'internal' for your team, 'external' for prospects/customers","enum":["internal","external"],"uniqueKey":"oneOf.5.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.5.transcript.oneOf.1.items.[INDEX].speaker","typeLabel":"object"},"text":{"type":"string","example":"Hi John, thanks for taking the time today.","isRequired":true,"uniqueKey":"oneOf.5.transcript.oneOf.1.items.[INDEX].text","typeLabel":"string"},"timestamp":{"type":"string","description":"Timestamp offset (ISO 8601 or seconds from start)","example":"00:00:05","uniqueKey":"oneOf.5.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"uniqueKey":"oneOf.5.transcript.oneOf.1.items.[INDEX]","typeLabel":"object"},"description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minItems":1,"isRequired":true,"uniqueKey":"oneOf.5.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"oneOf.5.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.5.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.5.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"oneOf.5.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.5.participants.items.[INDEX]","typeLabel":"object"},"description":"Call participants (at least one required)","minItems":1,"isRequired":true,"uniqueKey":"oneOf.5.participants","typeLabel":"object[]"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"oneOf.5.duration","typeLabel":"number"},"recordingUrl":{"type":"string","description":"URL to the call recording","format":"uri","uniqueKey":"oneOf.5.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"oneOf.5.meetingPlatform","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: title + timestamp + first_participant + first_100_chars_transcript. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-call-discovery","uniqueKey":"oneOf.5.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation ID for grouping related calls","uniqueKey":"oneOf.5.conversationId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.5.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.5.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.5.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.5.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.5.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.5.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.5.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.5.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.5.customMetadata","typeLabel":"object"}},"uniqueKey":"oneOf.5","typeLabel":"Call Event · object"},{"type":"object","title":"CRM Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","opportunityId","opportunityName","title","transcript","participants"],"example":{"eventTimestamp":"2024-02-03T16:00:00Z","eventType":"opportunity_created","opportunityId":"opp_12345","opportunityName":"Acme Corp - Enterprise Plan","amount":"50000.00","currency":"USD","stage":"Qualification","stageCategory":"open","accountName":"Acme Corp","crmAccountId":"acct_67890","crmAccountDomain":"acme.com","contactEmail":"john@acme.com","contactName":"John Smith","contactEmails":["john@acme.com","priya@acme.com"],"ownerEmail":"rep@yourcompany.com","closeDate":"2024-03-31T00:00:00Z","crmLastModifiedAt":"2024-02-03T16:00:00Z"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.6.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.6.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.6.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of CRM event","enum":[],"isRequired":true,"uniqueKey":"oneOf.6.eventType","typeLabel":"enum\u003cstring>"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"oneOf.6.title","typeLabel":"string"},"transcript":{"oneOf":[{"type":"string","description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minLength":1,"isRequired":true,"uniqueKey":"oneOf.6.transcript.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.6.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.6.transcript.oneOf.1.items.[INDEX].speaker.email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"description":"'internal' for your team, 'external' for prospects/customers","uniqueKey":"oneOf.6.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"required":["name"],"isRequired":true,"uniqueKey":"oneOf.6.transcript.oneOf.1.items.[INDEX].speaker","typeLabel":"object"},"text":{"type":"string","example":"Hi John, thanks for taking the time today.","isRequired":true,"uniqueKey":"oneOf.6.transcript.oneOf.1.items.[INDEX].text","typeLabel":"string"},"timestamp":{"type":"string","description":"Timestamp offset (ISO 8601 or seconds from start)","example":"00:00:05","uniqueKey":"oneOf.6.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"required":["speaker","text"],"uniqueKey":"oneOf.6.transcript.oneOf.1.items.[INDEX]","typeLabel":"object"},"description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minItems":1,"isRequired":true,"uniqueKey":"oneOf.6.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"oneOf.6.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.6.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.6.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"oneOf.6.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"required":["name"],"uniqueKey":"oneOf.6.participants.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Call participants (at least one required)","isRequired":true,"uniqueKey":"oneOf.6.participants","typeLabel":"object[]"},"opportunityId":{"type":"string","description":"External opportunity/deal ID","example":"opp_12345","isRequired":true,"uniqueKey":"oneOf.6.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"oneOf.6.opportunityName","typeLabel":"string"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"oneOf.6.duration","typeLabel":"number"},"recordingUrl":{"type":"string","format":"uri","description":"URL to the call recording","uniqueKey":"oneOf.6.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"oneOf.6.meetingPlatform","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. When omitted it is derived from opportunityId + eventType + the deal's current state, so re-sending a CHANGED deal is treated as a new event rather than a duplicate of the last push. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-call-discovery","uniqueKey":"oneOf.6.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation ID for grouping related calls","uniqueKey":"oneOf.6.conversationId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.6.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.6.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID — the durable join key for account linking. Matching on name alone cannot separate two deals that share a company name under different domains.","example":"acct_67890","uniqueKey":"oneOf.6.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"Account domain, used to link events by company","example":"acme.com","uniqueKey":"oneOf.6.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.6.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.6.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.6.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.6.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.6.customMetadata","typeLabel":"object"},"amount":{"oneOf":[{"type":"number","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.6.amount.oneOf.0","typeLabel":"number"},{"type":"string","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.6.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"oneOf.6.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"oneOf.6.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"oneOf.6.stage","typeLabel":"string"},"stageCategory":{"type":"string","enum":["open","closed_won","closed_lost","other"],"description":"Normalized stage bucket: `open`, `closed_won`, `closed_lost` or `other`. Supply this when your stage names do not map cleanly from eventType — without it the category is inferred from the event type alone, so a deal sitting in late-stage procurement still reads as open.","example":"open","uniqueKey":"oneOf.6.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"oneOf.6.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"oneOf.6.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"oneOf.6.accountName","typeLabel":"string"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email","example":"john@acme.com","uniqueKey":"oneOf.6.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"oneOf.6.contactEmails.items.[INDEX]","typeLabel":"string\u003cemail>"},"description":"Every contact on the deal, not just the primary. Event linking matches on all of them, so sending the full set is the biggest lever on how many emails and calls attach to this opportunity.","example":["john@acme.com","priya@acme.com"],"uniqueKey":"oneOf.6.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"oneOf.6.ownerName","typeLabel":"string"},"ownerEmail":{"type":"string","format":"email","description":"Deal owner's email — lets Octave match the owner to a teammate","example":"rep@yourcompany.com","uniqueKey":"oneOf.6.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"oneOf.6.crmOwnerId","typeLabel":"string"},"lossReason":{"type":"string","description":"Verbatim closed-lost reason. Classified into a category on ingest and used for win/loss analysis.","example":"Went with competitor","uniqueKey":"oneOf.6.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.6.mergedOpportunityIds.items.[INDEX]","typeLabel":"string"},"description":"IDs of deals merged INTO this one. Their mirrors are folded into this deal and tombstoned, so a merge does not leave duplicates counting toward pipeline.","uniqueKey":"oneOf.6.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"oneOf.6.contactName","typeLabel":"string"},"closeDate":{"oneOf":[{"type":"string","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.6.closeDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.6.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.6.closeDate","typeLabel":"string | number"},"createdDate":{"oneOf":[{"type":"string","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.6.createdDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.6.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.6.createdDate","typeLabel":"string | number"},"crmLastModifiedAt":{"oneOf":[{"type":"string","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.6.crmLastModifiedAt.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.6.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.6.crmLastModifiedAt","typeLabel":"string | number"}},"uniqueKey":"oneOf.6","typeLabel":"CRM Event · object"},{"type":"object","title":"Social Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","body","from","to","title","transcript","participants"],"example":{"eventTimestamp":"2024-02-03T11:00:00Z","eventType":"message_sent","subject":"Introduction","body":{"text":"Hi John, I came across your profile and would love to connect."},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_social_abc123","campaignId":"campaign_linkedin_1","messageType":"message","campaignName":"Q1 Outreach"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.7.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.7.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.7.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of social event (LinkedIn/social outreach). All types are processed for analytics.","enum":[],"isRequired":true,"uniqueKey":"oneOf.7.eventType","typeLabel":"enum\u003cstring>"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"oneOf.7.title","typeLabel":"string"},"transcript":{"oneOf":[{"type":"string","description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minLength":1,"isRequired":true,"uniqueKey":"oneOf.7.transcript.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.7.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.7.transcript.oneOf.1.items.[INDEX].speaker.email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"description":"'internal' for your team, 'external' for prospects/customers","uniqueKey":"oneOf.7.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"required":["name"],"isRequired":true,"uniqueKey":"oneOf.7.transcript.oneOf.1.items.[INDEX].speaker","typeLabel":"object"},"text":{"type":"string","example":"Hi John, thanks for taking the time today.","isRequired":true,"uniqueKey":"oneOf.7.transcript.oneOf.1.items.[INDEX].text","typeLabel":"string"},"timestamp":{"type":"string","description":"Timestamp offset (ISO 8601 or seconds from start)","example":"00:00:05","uniqueKey":"oneOf.7.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"required":["speaker","text"],"uniqueKey":"oneOf.7.transcript.oneOf.1.items.[INDEX]","typeLabel":"object"},"description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minItems":1,"isRequired":true,"uniqueKey":"oneOf.7.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"oneOf.7.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.7.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.7.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"oneOf.7.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"required":["name"],"uniqueKey":"oneOf.7.participants.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Call participants (at least one required)","isRequired":true,"uniqueKey":"oneOf.7.participants","typeLabel":"object[]"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.7.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.7.body.html","typeLabel":"string"}},"description":"Message body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.7.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.7.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.7.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.7.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.7.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.7.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.7.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.7.to","typeLabel":"object[]"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"oneOf.7.duration","typeLabel":"number"},"recordingUrl":{"type":"string","format":"uri","description":"URL to the call recording","uniqueKey":"oneOf.7.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"oneOf.7.meetingPlatform","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-call-discovery","uniqueKey":"oneOf.7.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related messages","uniqueKey":"oneOf.7.conversationId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.7.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.7.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.7.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.7.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.7.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.7.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.7.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.7.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.7.customMetadata","typeLabel":"object"},"subject":{"type":"string","description":"Subject or topic of the message","uniqueKey":"oneOf.7.subject","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping","uniqueKey":"oneOf.7.campaignId","typeLabel":"string"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"oneOf.7.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"oneOf.7.campaignName","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.7.octaveRequestId","typeLabel":"string"}},"uniqueKey":"oneOf.7","typeLabel":"Social Event · object"},{"type":"object","title":"Email Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","subject","body","from","to","opportunityId","opportunityName"],"example":{"eventTimestamp":"2024-02-03T10:30:00Z","eventType":"sent","subject":"Follow up on our conversation","body":{"text":"Hi John, Just wanted to follow up on our call yesterday...","html":"\u003cp>Hi John,\u003c/p>\u003cp>Just wanted to follow up on our call yesterday...\u003c/p>"},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_abc123","campaignId":"campaign_xyz"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.8.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.8.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.8.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of email event. Only 'sent' and 'reply' are processed for analytics; others are ingested but not processed.","enum":[],"isRequired":true,"uniqueKey":"oneOf.8.eventType","typeLabel":"enum\u003cstring>"},"opportunityId":{"type":"string","description":"External opportunity/deal ID","example":"opp_12345","isRequired":true,"uniqueKey":"oneOf.8.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"oneOf.8.opportunityName","typeLabel":"string"},"subject":{"type":"string","description":"Email subject line","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"oneOf.8.subject","typeLabel":"string"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.8.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.8.body.html","typeLabel":"string"}},"description":"Email body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.8.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.8.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.8.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.8.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.8.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.8.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.8.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.8.to","typeLabel":"object[]"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: from_email + subject + timestamp + first_to_email. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-email-sent-1","uniqueKey":"oneOf.8.eventId","typeLabel":"string"},"amount":{"oneOf":[{"type":"number","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.8.amount.oneOf.0","typeLabel":"number"},{"type":"string","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.8.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"oneOf.8.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"oneOf.8.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"oneOf.8.stage","typeLabel":"string"},"stageCategory":{"type":"string","enum":["open","closed_won","closed_lost","other"],"description":"Normalized stage bucket: `open`, `closed_won`, `closed_lost` or `other`. Supply this when your stage names do not map cleanly from eventType — without it the category is inferred from the event type alone, so a deal sitting in late-stage procurement still reads as open.","example":"open","uniqueKey":"oneOf.8.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"oneOf.8.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"oneOf.8.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"oneOf.8.accountName","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.8.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.8.crmAccountDomain","typeLabel":"string"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email","example":"john@acme.com","uniqueKey":"oneOf.8.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"oneOf.8.contactEmails.items.[INDEX]","typeLabel":"string\u003cemail>"},"description":"Every contact on the deal, not just the primary. Event linking matches on all of them, so sending the full set is the biggest lever on how many emails and calls attach to this opportunity.","example":["john@acme.com","priya@acme.com"],"uniqueKey":"oneOf.8.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"oneOf.8.ownerName","typeLabel":"string"},"ownerEmail":{"type":"string","format":"email","description":"Deal owner's email — lets Octave match the owner to a teammate","example":"rep@yourcompany.com","uniqueKey":"oneOf.8.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"oneOf.8.crmOwnerId","typeLabel":"string"},"lossReason":{"type":"string","description":"Verbatim closed-lost reason. Classified into a category on ingest and used for win/loss analysis.","example":"Went with competitor","uniqueKey":"oneOf.8.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.8.mergedOpportunityIds.items.[INDEX]","typeLabel":"string"},"description":"IDs of deals merged INTO this one. Their mirrors are folded into this deal and tombstoned, so a merge does not leave duplicates counting toward pipeline.","uniqueKey":"oneOf.8.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"oneOf.8.contactName","typeLabel":"string"},"closeDate":{"oneOf":[{"type":"string","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.8.closeDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.8.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.8.closeDate","typeLabel":"string | number"},"createdDate":{"oneOf":[{"type":"string","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.8.createdDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.8.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.8.createdDate","typeLabel":"string | number"},"crmLastModifiedAt":{"oneOf":[{"type":"string","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.8.crmLastModifiedAt.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.8.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.8.crmLastModifiedAt","typeLabel":"string | number"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.8.sourceProviderName","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.8.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.8.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.8.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.8.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.8.customMetadata","typeLabel":"object"},"cc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.8.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.8.cc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.8.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"oneOf.8.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.8.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.8.bcc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.8.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"oneOf.8.bcc","typeLabel":"object[]"},"messageId":{"type":"string","maxLength":255,"description":"The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.","example":"\u003cCAF1b2c3d4@mail.gmail.com>","uniqueKey":"oneOf.8.messageId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related emails","uniqueKey":"oneOf.8.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping campaign emails","uniqueKey":"oneOf.8.campaignId","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.8.octaveRequestId","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.8.crmOpportunityId","typeLabel":"string"}},"uniqueKey":"oneOf.8","typeLabel":"Email Event · object"},{"type":"object","title":"Call Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","title","transcript","participants","opportunityId","opportunityName"],"example":{"eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":[{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Hi John, thanks for taking the time today. How are you doing?","timestamp":"00:00:05"},{"speaker":{"name":"John Smith","email":"john@prospect.com","role":"external"},"text":"Good, thanks! Yeah, I was excited to learn more about what you all do.","timestamp":"00:00:12"},{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Great! So I'd love to start by understanding a bit about your current setup...","timestamp":"00:00:20"}],"participants":[{"email":"sarah@company.com","name":"Sarah Johnson","role":"internal"},{"email":"john@prospect.com","name":"John Smith","role":"external"}],"duration":1800,"meetingPlatform":"zoom"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.9.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.9.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.9.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of call event. Only 'transcript' is processed for analytics; others are ingested but not processed.","enum":[],"isRequired":true,"uniqueKey":"oneOf.9.eventType","typeLabel":"enum\u003cstring>"},"opportunityId":{"type":"string","description":"External opportunity/deal ID","example":"opp_12345","isRequired":true,"uniqueKey":"oneOf.9.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"oneOf.9.opportunityName","typeLabel":"string"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"oneOf.9.title","typeLabel":"string"},"transcript":{"oneOf":[{"type":"string","description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minLength":1,"isRequired":true,"uniqueKey":"oneOf.9.transcript.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.9.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.9.transcript.oneOf.1.items.[INDEX].speaker.email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"description":"'internal' for your team, 'external' for prospects/customers","uniqueKey":"oneOf.9.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"required":["name"],"isRequired":true,"uniqueKey":"oneOf.9.transcript.oneOf.1.items.[INDEX].speaker","typeLabel":"object"},"text":{"type":"string","example":"Hi John, thanks for taking the time today.","isRequired":true,"uniqueKey":"oneOf.9.transcript.oneOf.1.items.[INDEX].text","typeLabel":"string"},"timestamp":{"type":"string","description":"Timestamp offset (ISO 8601 or seconds from start)","example":"00:00:05","uniqueKey":"oneOf.9.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"required":["speaker","text"],"uniqueKey":"oneOf.9.transcript.oneOf.1.items.[INDEX]","typeLabel":"object"},"description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minItems":1,"isRequired":true,"uniqueKey":"oneOf.9.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"oneOf.9.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.9.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.9.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"oneOf.9.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"required":["name"],"uniqueKey":"oneOf.9.participants.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Call participants (at least one required)","isRequired":true,"uniqueKey":"oneOf.9.participants","typeLabel":"object[]"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: title + timestamp + first_participant + first_100_chars_transcript. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-call-discovery","uniqueKey":"oneOf.9.eventId","typeLabel":"string"},"amount":{"oneOf":[{"type":"number","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.9.amount.oneOf.0","typeLabel":"number"},{"type":"string","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.9.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"oneOf.9.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"oneOf.9.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"oneOf.9.stage","typeLabel":"string"},"stageCategory":{"type":"string","enum":["open","closed_won","closed_lost","other"],"description":"Normalized stage bucket: `open`, `closed_won`, `closed_lost` or `other`. Supply this when your stage names do not map cleanly from eventType — without it the category is inferred from the event type alone, so a deal sitting in late-stage procurement still reads as open.","example":"open","uniqueKey":"oneOf.9.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"oneOf.9.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"oneOf.9.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"oneOf.9.accountName","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.9.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.9.crmAccountDomain","typeLabel":"string"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email","example":"john@acme.com","uniqueKey":"oneOf.9.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"oneOf.9.contactEmails.items.[INDEX]","typeLabel":"string\u003cemail>"},"description":"Every contact on the deal, not just the primary. Event linking matches on all of them, so sending the full set is the biggest lever on how many emails and calls attach to this opportunity.","example":["john@acme.com","priya@acme.com"],"uniqueKey":"oneOf.9.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"oneOf.9.ownerName","typeLabel":"string"},"ownerEmail":{"type":"string","format":"email","description":"Deal owner's email — lets Octave match the owner to a teammate","example":"rep@yourcompany.com","uniqueKey":"oneOf.9.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"oneOf.9.crmOwnerId","typeLabel":"string"},"lossReason":{"type":"string","description":"Verbatim closed-lost reason. Classified into a category on ingest and used for win/loss analysis.","example":"Went with competitor","uniqueKey":"oneOf.9.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.9.mergedOpportunityIds.items.[INDEX]","typeLabel":"string"},"description":"IDs of deals merged INTO this one. Their mirrors are folded into this deal and tombstoned, so a merge does not leave duplicates counting toward pipeline.","uniqueKey":"oneOf.9.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"oneOf.9.contactName","typeLabel":"string"},"closeDate":{"oneOf":[{"type":"string","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.9.closeDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.9.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.9.closeDate","typeLabel":"string | number"},"createdDate":{"oneOf":[{"type":"string","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.9.createdDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.9.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.9.createdDate","typeLabel":"string | number"},"crmLastModifiedAt":{"oneOf":[{"type":"string","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.9.crmLastModifiedAt.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.9.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.9.crmLastModifiedAt","typeLabel":"string | number"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.9.sourceProviderName","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.9.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.9.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.9.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.9.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.9.customMetadata","typeLabel":"object"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"oneOf.9.duration","typeLabel":"number"},"recordingUrl":{"type":"string","format":"uri","description":"URL to the call recording","uniqueKey":"oneOf.9.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"oneOf.9.meetingPlatform","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation ID for grouping related calls","uniqueKey":"oneOf.9.conversationId","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.9.crmOpportunityId","typeLabel":"string"}},"uniqueKey":"oneOf.9","typeLabel":"Call Event · object"},{"type":"object","title":"CRM Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","opportunityId","opportunityName"],"example":{"eventTimestamp":"2024-02-03T16:00:00Z","eventType":"opportunity_created","opportunityId":"opp_12345","opportunityName":"Acme Corp - Enterprise Plan","amount":"50000.00","currency":"USD","stage":"Qualification","stageCategory":"open","accountName":"Acme Corp","crmAccountId":"acct_67890","crmAccountDomain":"acme.com","contactEmail":"john@acme.com","contactName":"John Smith","contactEmails":["john@acme.com","priya@acme.com"],"ownerEmail":"rep@yourcompany.com","closeDate":"2024-03-31T00:00:00Z","crmLastModifiedAt":"2024-02-03T16:00:00Z"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.10.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.10.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.10.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of CRM event","enum":["opportunity_created","deal_won","deal_lost","meeting_booked"],"isRequired":true,"uniqueKey":"oneOf.10.eventType","typeLabel":"enum\u003cstring>"},"opportunityId":{"type":"string","description":"External opportunity/deal ID","example":"opp_12345","isRequired":true,"uniqueKey":"oneOf.10.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"oneOf.10.opportunityName","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. When omitted it is derived from opportunityId + eventType + the deal's current state, so re-sending a CHANGED deal is treated as a new event rather than a duplicate of the last push. Unique across every event type in the workspace: an email and a call may not share an ID.","uniqueKey":"oneOf.10.eventId","typeLabel":"string"},"amount":{"oneOf":[{"type":"number","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.10.amount.oneOf.0","typeLabel":"number"},{"type":"string","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.10.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"oneOf.10.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"oneOf.10.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"oneOf.10.stage","typeLabel":"string"},"stageCategory":{"type":"string","description":"Normalized stage bucket: `open`, `closed_won`, `closed_lost` or `other`. Supply this when your stage names do not map cleanly from eventType — without it the category is inferred from the event type alone, so a deal sitting in late-stage procurement still reads as open.","enum":["open","closed_won","closed_lost","other"],"example":"open","uniqueKey":"oneOf.10.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"oneOf.10.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"oneOf.10.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"oneOf.10.accountName","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID — the durable join key for account linking. Matching on name alone cannot separate two deals that share a company name under different domains.","example":"acct_67890","uniqueKey":"oneOf.10.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"Account domain, used to link events by company","example":"acme.com","uniqueKey":"oneOf.10.crmAccountDomain","typeLabel":"string"},"contactEmail":{"type":"string","description":"Primary contact email","format":"email","example":"john@acme.com","uniqueKey":"oneOf.10.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"oneOf.10.contactEmails.items.[INDEX]","typeLabel":"string\u003cemail>"},"description":"Every contact on the deal, not just the primary. Event linking matches on all of them, so sending the full set is the biggest lever on how many emails and calls attach to this opportunity.","example":["john@acme.com","priya@acme.com"],"uniqueKey":"oneOf.10.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"oneOf.10.ownerName","typeLabel":"string"},"ownerEmail":{"type":"string","description":"Deal owner's email — lets Octave match the owner to a teammate","format":"email","example":"rep@yourcompany.com","uniqueKey":"oneOf.10.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"oneOf.10.crmOwnerId","typeLabel":"string"},"lossReason":{"type":"string","description":"Verbatim closed-lost reason. Classified into a category on ingest and used for win/loss analysis.","example":"Went with competitor","uniqueKey":"oneOf.10.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.10.mergedOpportunityIds.items.[INDEX]","typeLabel":"string"},"description":"IDs of deals merged INTO this one. Their mirrors are folded into this deal and tombstoned, so a merge does not leave duplicates counting toward pipeline.","uniqueKey":"oneOf.10.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"oneOf.10.contactName","typeLabel":"string"},"closeDate":{"oneOf":[{"type":"string","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.10.closeDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.10.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.10.closeDate","typeLabel":"string | number"},"createdDate":{"oneOf":[{"type":"string","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.10.createdDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.10.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.10.createdDate","typeLabel":"string | number"},"crmLastModifiedAt":{"oneOf":[{"type":"string","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.10.crmLastModifiedAt.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.10.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.10.crmLastModifiedAt","typeLabel":"string | number"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.10.sourceProviderName","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.10.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.10.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.10.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.10.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.10.customMetadata","typeLabel":"object"}},"uniqueKey":"oneOf.10","typeLabel":"CRM Event · object"},{"type":"object","title":"Social Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","body","from","to","opportunityId","opportunityName"],"example":{"eventTimestamp":"2024-02-03T11:00:00Z","eventType":"message_sent","subject":"Introduction","body":{"text":"Hi John, I came across your profile and would love to connect."},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_social_abc123","campaignId":"campaign_linkedin_1","messageType":"message","campaignName":"Q1 Outreach"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.11.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.11.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.11.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of social event (LinkedIn/social outreach). All types are processed for analytics.","enum":[],"isRequired":true,"uniqueKey":"oneOf.11.eventType","typeLabel":"enum\u003cstring>"},"opportunityId":{"type":"string","description":"External opportunity/deal ID","example":"opp_12345","isRequired":true,"uniqueKey":"oneOf.11.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"oneOf.11.opportunityName","typeLabel":"string"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.11.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.11.body.html","typeLabel":"string"}},"description":"Message body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.11.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.11.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.11.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.11.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.11.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.11.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.11.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.11.to","typeLabel":"object[]"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. Unique across every event type in the workspace: an email and a call may not share an ID.","uniqueKey":"oneOf.11.eventId","typeLabel":"string"},"amount":{"oneOf":[{"type":"number","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.11.amount.oneOf.0","typeLabel":"number"},{"type":"string","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.11.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"oneOf.11.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"oneOf.11.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"oneOf.11.stage","typeLabel":"string"},"stageCategory":{"type":"string","enum":["open","closed_won","closed_lost","other"],"description":"Normalized stage bucket: `open`, `closed_won`, `closed_lost` or `other`. Supply this when your stage names do not map cleanly from eventType — without it the category is inferred from the event type alone, so a deal sitting in late-stage procurement still reads as open.","example":"open","uniqueKey":"oneOf.11.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"oneOf.11.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"oneOf.11.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"oneOf.11.accountName","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.11.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.11.crmAccountDomain","typeLabel":"string"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email","example":"john@acme.com","uniqueKey":"oneOf.11.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"oneOf.11.contactEmails.items.[INDEX]","typeLabel":"string\u003cemail>"},"description":"Every contact on the deal, not just the primary. Event linking matches on all of them, so sending the full set is the biggest lever on how many emails and calls attach to this opportunity.","example":["john@acme.com","priya@acme.com"],"uniqueKey":"oneOf.11.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"oneOf.11.ownerName","typeLabel":"string"},"ownerEmail":{"type":"string","format":"email","description":"Deal owner's email — lets Octave match the owner to a teammate","example":"rep@yourcompany.com","uniqueKey":"oneOf.11.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"oneOf.11.crmOwnerId","typeLabel":"string"},"lossReason":{"type":"string","description":"Verbatim closed-lost reason. Classified into a category on ingest and used for win/loss analysis.","example":"Went with competitor","uniqueKey":"oneOf.11.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.11.mergedOpportunityIds.items.[INDEX]","typeLabel":"string"},"description":"IDs of deals merged INTO this one. Their mirrors are folded into this deal and tombstoned, so a merge does not leave duplicates counting toward pipeline.","uniqueKey":"oneOf.11.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"oneOf.11.contactName","typeLabel":"string"},"closeDate":{"oneOf":[{"type":"string","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.11.closeDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.11.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.11.closeDate","typeLabel":"string | number"},"createdDate":{"oneOf":[{"type":"string","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.11.createdDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.11.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.11.createdDate","typeLabel":"string | number"},"crmLastModifiedAt":{"oneOf":[{"type":"string","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.11.crmLastModifiedAt.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.11.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.11.crmLastModifiedAt","typeLabel":"string | number"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.11.sourceProviderName","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.11.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.11.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.11.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.11.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.11.customMetadata","typeLabel":"object"},"subject":{"type":"string","description":"Subject or topic of the message","uniqueKey":"oneOf.11.subject","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related messages","uniqueKey":"oneOf.11.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping","uniqueKey":"oneOf.11.campaignId","typeLabel":"string"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"oneOf.11.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"oneOf.11.campaignName","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.11.octaveRequestId","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.11.crmOpportunityId","typeLabel":"string"}},"uniqueKey":"oneOf.11","typeLabel":"Social Event · object"},{"type":"object","title":"Email Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","subject","body","from","to"],"example":{"eventTimestamp":"2024-02-03T10:30:00Z","eventType":"sent","subject":"Follow up on our conversation","body":{"text":"Hi John, Just wanted to follow up on our call yesterday...","html":"\u003cp>Hi John,\u003c/p>\u003cp>Just wanted to follow up on our call yesterday...\u003c/p>"},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_abc123","campaignId":"campaign_xyz"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.12.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T10:30:00Z","isRequired":true,"uniqueKey":"oneOf.12.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.12.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of email event. Only 'sent' and 'reply' are processed for analytics; others are ingested but not processed.","enum":[],"isRequired":true,"uniqueKey":"oneOf.12.eventType","typeLabel":"enum\u003cstring>"},"body":{"type":"object","description":"Email body. At least one of text or html must be provided.","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.12.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.12.body.html","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.body","typeLabel":"object"},"from":{"type":"object","description":"Sender","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.12.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.12.from.name","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.12.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.12.to.items.[INDEX].name","typeLabel":"string"}},"uniqueKey":"oneOf.12.to.items.[INDEX]","typeLabel":"object"},"description":"Recipients (at least one required)","minItems":1,"isRequired":true,"uniqueKey":"oneOf.12.to","typeLabel":"object[]"},"subject":{"type":"string","description":"Email subject line","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"oneOf.12.subject","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: from_email + subject + timestamp + first_to_email. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-email-sent-1","uniqueKey":"oneOf.12.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related emails","uniqueKey":"oneOf.12.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping campaign emails","uniqueKey":"oneOf.12.campaignId","typeLabel":"string"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"oneOf.12.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"oneOf.12.campaignName","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.12.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.12.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.12.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.12.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.12.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.12.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.12.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.12.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.12.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.12.customMetadata","typeLabel":"object"},"cc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.12.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.12.cc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.12.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"oneOf.12.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"oneOf.12.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"oneOf.12.bcc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.12.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"oneOf.12.bcc","typeLabel":"object[]"},"messageId":{"type":"string","maxLength":255,"description":"The message's own identifier as the mail system assigned it (the RFC 5322 Message-ID). Lets Octave recognise the same email when it also arrives from another source, such as a CRM's logged copy. Max 255 characters.","example":"\u003cCAF1b2c3d4@mail.gmail.com>","uniqueKey":"oneOf.12.messageId","typeLabel":"string"}},"uniqueKey":"oneOf.12","typeLabel":"Email Event · object"},{"type":"object","title":"Call Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","title","transcript","participants","body","from","to"],"example":{"eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":[{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Hi John, thanks for taking the time today. How are you doing?","timestamp":"00:00:05"},{"speaker":{"name":"John Smith","email":"john@prospect.com","role":"external"},"text":"Good, thanks! Yeah, I was excited to learn more about what you all do.","timestamp":"00:00:12"},{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Great! So I'd love to start by understanding a bit about your current setup...","timestamp":"00:00:20"}],"participants":[{"email":"sarah@company.com","name":"Sarah Johnson","role":"internal"},{"email":"john@prospect.com","name":"John Smith","role":"external"}],"duration":1800,"meetingPlatform":"zoom"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.13.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T14:00:00Z","isRequired":true,"uniqueKey":"oneOf.13.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.13.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of call event. Only 'transcript' is processed for analytics; others are ingested but not processed.","enum":[],"isRequired":true,"uniqueKey":"oneOf.13.eventType","typeLabel":"enum\u003cstring>"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.13.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.13.body.html","typeLabel":"string"}},"description":"Message body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.13.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.13.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.13.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.13.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.13.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.13.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.13.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.13.to","typeLabel":"object[]"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"oneOf.13.title","typeLabel":"string"},"transcript":{"oneOf":[{"type":"string","description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minLength":1,"isRequired":true,"uniqueKey":"oneOf.13.transcript.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.13.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.13.transcript.oneOf.1.items.[INDEX].speaker.email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"description":"'internal' for your team, 'external' for prospects/customers","uniqueKey":"oneOf.13.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"required":["name"],"isRequired":true,"uniqueKey":"oneOf.13.transcript.oneOf.1.items.[INDEX].speaker","typeLabel":"object"},"text":{"type":"string","example":"Hi John, thanks for taking the time today.","isRequired":true,"uniqueKey":"oneOf.13.transcript.oneOf.1.items.[INDEX].text","typeLabel":"string"},"timestamp":{"type":"string","description":"Timestamp offset (ISO 8601 or seconds from start)","example":"00:00:05","uniqueKey":"oneOf.13.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"required":["speaker","text"],"uniqueKey":"oneOf.13.transcript.oneOf.1.items.[INDEX]","typeLabel":"object"},"description":"Transcript content. Either a flat string (LLM diarizes into speaker turns) or a structured array of entries with speaker attribution (recommended, faster and more reliable).","minItems":1,"isRequired":true,"uniqueKey":"oneOf.13.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"oneOf.13.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"oneOf.13.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"oneOf.13.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"oneOf.13.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"required":["name"],"uniqueKey":"oneOf.13.participants.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Call participants (at least one required)","isRequired":true,"uniqueKey":"oneOf.13.participants","typeLabel":"object[]"},"subject":{"type":"string","description":"Subject or topic of the message","uniqueKey":"oneOf.13.subject","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. If not provided, auto-generated from: title + timestamp + first_participant + first_100_chars_transcript. Unique across every event type in the workspace: an email and a call may not share an ID.","example":"deal-001-call-discovery","uniqueKey":"oneOf.13.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation ID for grouping related calls","uniqueKey":"oneOf.13.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping","uniqueKey":"oneOf.13.campaignId","typeLabel":"string"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"oneOf.13.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"oneOf.13.campaignName","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.13.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.13.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.13.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.13.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.13.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.13.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.13.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.13.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.13.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.13.customMetadata","typeLabel":"object"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"oneOf.13.duration","typeLabel":"number"},"recordingUrl":{"type":"string","format":"uri","description":"URL to the call recording","uniqueKey":"oneOf.13.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"oneOf.13.meetingPlatform","typeLabel":"string"}},"uniqueKey":"oneOf.13","typeLabel":"Call Event · object"},{"type":"object","title":"CRM Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","opportunityId","opportunityName","body","from","to"],"example":{"eventTimestamp":"2024-02-03T16:00:00Z","eventType":"opportunity_created","opportunityId":"opp_12345","opportunityName":"Acme Corp - Enterprise Plan","amount":"50000.00","currency":"USD","stage":"Qualification","stageCategory":"open","accountName":"Acme Corp","crmAccountId":"acct_67890","crmAccountDomain":"acme.com","contactEmail":"john@acme.com","contactName":"John Smith","contactEmails":["john@acme.com","priya@acme.com"],"ownerEmail":"rep@yourcompany.com","closeDate":"2024-03-31T00:00:00Z","crmLastModifiedAt":"2024-02-03T16:00:00Z"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.14.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T16:00:00Z","isRequired":true,"uniqueKey":"oneOf.14.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.14.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of CRM event","enum":[],"isRequired":true,"uniqueKey":"oneOf.14.eventType","typeLabel":"enum\u003cstring>"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.14.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.14.body.html","typeLabel":"string"}},"description":"Message body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"oneOf.14.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.14.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.14.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"oneOf.14.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.14.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.14.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"oneOf.14.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"oneOf.14.to","typeLabel":"object[]"},"opportunityId":{"type":"string","description":"External opportunity/deal ID","example":"opp_12345","isRequired":true,"uniqueKey":"oneOf.14.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"oneOf.14.opportunityName","typeLabel":"string"},"subject":{"type":"string","description":"Subject or topic of the message","uniqueKey":"oneOf.14.subject","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. When omitted it is derived from opportunityId + eventType + the deal's current state, so re-sending a CHANGED deal is treated as a new event rather than a duplicate of the last push. Unique across every event type in the workspace: an email and a call may not share an ID.","uniqueKey":"oneOf.14.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related messages","uniqueKey":"oneOf.14.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping","uniqueKey":"oneOf.14.campaignId","typeLabel":"string"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"oneOf.14.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"oneOf.14.campaignName","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.14.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.14.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.14.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID — the durable join key for account linking. Matching on name alone cannot separate two deals that share a company name under different domains.","example":"acct_67890","uniqueKey":"oneOf.14.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"Account domain, used to link events by company","example":"acme.com","uniqueKey":"oneOf.14.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.14.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.14.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.14.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.14.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.14.customMetadata","typeLabel":"object"},"amount":{"oneOf":[{"type":"number","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.14.amount.oneOf.0","typeLabel":"number"},{"type":"string","description":"Deal amount. Send a string to preserve decimal precision exactly as your system holds it.","example":"50000.00","uniqueKey":"oneOf.14.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"oneOf.14.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"oneOf.14.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"oneOf.14.stage","typeLabel":"string"},"stageCategory":{"type":"string","enum":["open","closed_won","closed_lost","other"],"description":"Normalized stage bucket: `open`, `closed_won`, `closed_lost` or `other`. Supply this when your stage names do not map cleanly from eventType — without it the category is inferred from the event type alone, so a deal sitting in late-stage procurement still reads as open.","example":"open","uniqueKey":"oneOf.14.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"oneOf.14.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"oneOf.14.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"oneOf.14.accountName","typeLabel":"string"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email","example":"john@acme.com","uniqueKey":"oneOf.14.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"oneOf.14.contactEmails.items.[INDEX]","typeLabel":"string\u003cemail>"},"description":"Every contact on the deal, not just the primary. Event linking matches on all of them, so sending the full set is the biggest lever on how many emails and calls attach to this opportunity.","example":["john@acme.com","priya@acme.com"],"uniqueKey":"oneOf.14.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"oneOf.14.ownerName","typeLabel":"string"},"ownerEmail":{"type":"string","format":"email","description":"Deal owner's email — lets Octave match the owner to a teammate","example":"rep@yourcompany.com","uniqueKey":"oneOf.14.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"oneOf.14.crmOwnerId","typeLabel":"string"},"lossReason":{"type":"string","description":"Verbatim closed-lost reason. Classified into a category on ingest and used for win/loss analysis.","example":"Went with competitor","uniqueKey":"oneOf.14.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.14.mergedOpportunityIds.items.[INDEX]","typeLabel":"string"},"description":"IDs of deals merged INTO this one. Their mirrors are folded into this deal and tombstoned, so a merge does not leave duplicates counting toward pipeline.","uniqueKey":"oneOf.14.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"oneOf.14.contactName","typeLabel":"string"},"closeDate":{"oneOf":[{"type":"string","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.14.closeDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"Expected close date. Accepts an ISO 8601 string (e.g., \"2024-03-31T00:00:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-03-31T00:00:00Z","uniqueKey":"oneOf.14.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.14.closeDate","typeLabel":"string | number"},"createdDate":{"oneOf":[{"type":"string","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.14.createdDate.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal was created in your system. Defaults to eventTimestamp.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.14.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.14.createdDate","typeLabel":"string | number"},"crmLastModifiedAt":{"oneOf":[{"type":"string","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.14.crmLastModifiedAt.oneOf.0","typeLabel":"string"},{"type":"number","description":"When the deal last changed in your system. Strongly recommended: it is the state marker that lets a re-sent deal be recognised as a NEW state rather than a duplicate of the previous push, which is what allows amount, stage and close-date edits to land.","example":"2024-02-03T16:00:00Z","uniqueKey":"oneOf.14.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"oneOf.14.crmLastModifiedAt","typeLabel":"string | number"}},"uniqueKey":"oneOf.14","typeLabel":"CRM Event · object"},{"type":"object","title":"Social Event","description":"Webhook payload. The schema depends on the `{eventType}` path parameter:\n- `emails` — Email Event schema\n- `calls` — Call Event schema\n- `crm` — CRM Event schema\n- `social` — Social Event schema (LinkedIn/social outreach)","required":["eventTimestamp","eventType","body","from","to"],"example":{"eventTimestamp":"2024-02-03T11:00:00Z","eventType":"message_sent","subject":"Introduction","body":{"text":"Hi John, I came across your profile and would love to connect."},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_social_abc123","campaignId":"campaign_linkedin_1","messageType":"message","campaignName":"Q1 Outreach"},"properties":{"eventTimestamp":{"oneOf":[{"type":"string","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.15.eventTimestamp.oneOf.0","typeLabel":"string"},{"type":"number","description":"Timestamp of the event. Accepts an ISO 8601 string (e.g., \"2024-02-03T10:30:00Z\"), a Unix epoch in milliseconds (>= 1e12), or a Unix epoch in seconds. A string with no offset or Z is read as UTC. Must resolve to a date within 50 years past or 5 years future.","example":"2024-02-03T11:00:00Z","isRequired":true,"uniqueKey":"oneOf.15.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"oneOf.15.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","description":"Type of social event (LinkedIn/social outreach). All types are processed for analytics.","enum":["connection_sent","connection_accepted","message_sent","message_received"],"isRequired":true,"uniqueKey":"oneOf.15.eventType","typeLabel":"enum\u003cstring>"},"body":{"type":"object","description":"Message body. At least one of text or html must be provided.","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"oneOf.15.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"oneOf.15.body.html","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.body","typeLabel":"object"},"from":{"type":"object","description":"Sender","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"oneOf.15.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"oneOf.15.from.name","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"oneOf.15.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"oneOf.15.to.items.[INDEX].name","typeLabel":"string"}},"uniqueKey":"oneOf.15.to.items.[INDEX]","typeLabel":"object"},"description":"Recipients (at least one required)","minItems":1,"isRequired":true,"uniqueKey":"oneOf.15.to","typeLabel":"object[]"},"subject":{"type":"string","description":"Subject or topic of the message","uniqueKey":"oneOf.15.subject","typeLabel":"string"},"eventId":{"type":"string","description":"Explicit event ID for deduplication. Unique across every event type in the workspace: an email and a call may not share an ID.","uniqueKey":"oneOf.15.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related messages","uniqueKey":"oneOf.15.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping","uniqueKey":"oneOf.15.campaignId","typeLabel":"string"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"oneOf.15.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"oneOf.15.campaignName","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"oneOf.15.octaveRequestId","typeLabel":"string"},"sourceProviderName":{"type":"string","description":"Display override for the activity feed. Case-insensitive match against a supported provider name; when set, that provider's logo is shown instead of the generic Octave icon.","uniqueKey":"oneOf.15.sourceProviderName","typeLabel":"string"},"crmOpportunityId":{"type":"string","description":"Your system's deal ID. Links this event straight to that opportunity instead of Octave inferring the deal from participants and timing — which misses when the participant is not on the deal, and mis-fires when two deals share a domain.","example":"opp_12345","uniqueKey":"oneOf.15.crmOpportunityId","typeLabel":"string"},"crmAccountId":{"type":"string","description":"Your system's account/company ID. Names the account without naming a deal: Octave narrows its deal inference to that account's opportunities, so the event lands on the right deal even when none of its participants are on it.","example":"acct_67890","uniqueKey":"oneOf.15.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"The account's domain (e.g. acme.com). Same effect as crmAccountId, keyed by domain — use it when your source knows the company but not its CRM ID.","example":"acme.com","uniqueKey":"oneOf.15.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","description":"Arbitrary key-value metadata","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.15.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.15.customMetadata.additionalProperties.oneOf.2","typeLabel":"null"},{"type":"null","uniqueKey":"oneOf.15.customMetadata.additionalProperties.oneOf.3","typeLabel":"null"}],"uniqueKey":"oneOf.15.customMetadata.additionalProperties","typeLabel":"null"},"uniqueKey":"oneOf.15.customMetadata","typeLabel":"object"}},"uniqueKey":"oneOf.15","typeLabel":"Social Event · object"}],"uniqueKey":"","typeLabel":"Email Event · object · Call Event · object · CRM Event · object · Social Event · object · Email Event · object · Call Event · object · CRM Event · object · Social Event · object · Email Event · object · Call Event · object · CRM Event · object · Social Event · object · Email Event · object · Call Event · object · CRM Event · object · Social Event · object"},"examples":{"Email Event":{"title":"Email Event","value":{"eventTimestamp":"2024-02-03T10:30:00Z","eventType":"sent","subject":"Follow up on our conversation","body":{"text":"Hi John, Just wanted to follow up on our call yesterday...","html":"\u003cp>Hi John,\u003c/p>\u003cp>Just wanted to follow up on our call yesterday...\u003c/p>"},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_abc123","campaignId":"campaign_xyz"}},"Call Event (flat transcript)":{"title":"Call Event (flat transcript)","value":{"eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":"Sarah: Hi John, thanks for taking the time. John: Of course, happy to chat about your current setup...","participants":[{"email":"sarah@company.com","name":"Sarah Johnson","role":"internal"},{"email":"john@prospect.com","name":"John Smith","role":"external"}],"duration":1800,"meetingPlatform":"zoom"}},"Call Event (structured transcript)":{"title":"Call Event (structured transcript)","value":{"eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":[{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Hi John, thanks for taking the time today. How are you doing?","timestamp":"00:00:05"},{"speaker":{"name":"John Smith","email":"john@prospect.com","role":"external"},"text":"Good, thanks! Yeah, I was excited to learn more about what you all do.","timestamp":"00:00:12"},{"speaker":{"name":"Sarah Johnson","email":"sarah@company.com","role":"internal"},"text":"Great! So I'd love to start by understanding a bit about your current setup...","timestamp":"00:00:20"}],"participants":[{"email":"sarah@company.com","name":"Sarah Johnson","role":"internal"},{"email":"john@prospect.com","name":"John Smith","role":"external"}],"duration":1800,"meetingPlatform":"zoom"}},"CRM Event":{"title":"CRM Event","value":{"eventTimestamp":"2024-02-03T16:00:00Z","eventType":"opportunity_created","opportunityId":"opp_12345","opportunityName":"Acme Corp - Enterprise Plan","amount":"50000.00","currency":"USD","stage":"Qualification","stageCategory":"open","accountName":"Acme Corp","crmAccountId":"acct_67890","crmAccountDomain":"acme.com","contactEmail":"john@acme.com","contactName":"John Smith","contactEmails":["john@acme.com","priya@acme.com"],"ownerEmail":"rep@yourcompany.com","closeDate":"2024-03-31T00:00:00Z","crmLastModifiedAt":"2024-02-03T16:00:00Z"}},"Social Event":{"title":"Social Event","value":{"eventTimestamp":"2024-02-03T11:00:00Z","eventType":"message_sent","subject":"Introduction","body":{"text":"Hi John, I came across your profile and would love to connect."},"from":{"email":"sarah@company.com","name":"Sarah Johnson"},"to":[{"email":"john@prospect.com","name":"John Smith"}],"conversationId":"conv_social_abc123","campaignId":"campaign_linkedin_1","messageType":"message","campaignName":"Q1 Outreach"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"b5cc3bf2-07cf-46d7-9984-eead450600d9":{"description":"Webhook received successfully","content":{"application/json":{"schema":{"type":"object","properties":{"_metadata":{"type":"object","properties":{"requestId":{"type":"string","example":"requestId","description":"Request ID","isRequired":true,"uniqueKey":"_metadata.requestId","typeLabel":"string"},"timestamp":{"type":"string","example":"2021-01-01T00:00:00.000Z","description":"Timestamp","isRequired":true,"uniqueKey":"_metadata.timestamp","typeLabel":"string"},"usage":{"type":"number","default":0,"example":0,"description":"API usage","uniqueKey":"_metadata.usage","typeLabel":"number"},"message":{"type":"string","example":"message","description":"Message","uniqueKey":"_metadata.message","typeLabel":"string"}},"required":["requestId","timestamp"],"isRequired":true,"uniqueKey":"_metadata","typeLabel":"object"},"received":{"type":"boolean","description":"Whether the payload was received","isRequired":true,"uniqueKey":"received","typeLabel":"boolean"},"connection":{"oneOf":[{"type":"object","properties":{"providerName":{"type":"string","enum":["INSTANTLY","FATHOM","AMPERSAND_HUBSPOT","AMPERSAND_SALESFORCE","AMPERSAND_ATTIO","ATTIO_CALLS","SMARTLEAD","EMAILBISON","FIREFLIES","GONG","CHORUS","ORUM","SALESFINITY","OUTREACH","OCTAVE_RESOURCES","OCTAVE_REVISIONS","SUPERSEND","OCTAVE_GENERIC_EMAIL","OCTAVE_GENERIC_CALL","OCTAVE_GENERIC_CRM","OCTAVE_GENERIC_SOCIAL","CIRCLEBACK","SYBILL","GRANOLA","SALESLOFT","APOLLO","HEYREACH","GOOGLE_ADS","META_ADS","LINEAR","ZOOM","CLARI_COPILOT"],"description":"Provider name for this event type","isRequired":true,"uniqueKey":"connection.oneOf.0.providerName","typeLabel":"enum\u003cstring>"},"shouldProcess":{"type":"boolean","description":"Whether the payload should be processed","isRequired":true,"uniqueKey":"connection.oneOf.0.shouldProcess","typeLabel":"boolean"},"connectionMethod":{"type":"string","enum":["WEBHOOK","CRON_JOB"],"description":"Connection method","isRequired":true,"uniqueKey":"connection.oneOf.0.connectionMethod","typeLabel":"enum\u003cstring>"}},"required":["providerName","shouldProcess","connectionMethod"],"description":"Connection details","isRequired":true,"uniqueKey":"connection.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"providerName":{"type":"string","enum":["INSTANTLY","FATHOM","AMPERSAND_HUBSPOT","AMPERSAND_SALESFORCE","AMPERSAND_ATTIO","ATTIO_CALLS","SMARTLEAD","EMAILBISON","FIREFLIES","GONG","CHORUS","ORUM","SALESFINITY","OUTREACH","OCTAVE_RESOURCES","OCTAVE_REVISIONS","SUPERSEND","OCTAVE_GENERIC_EMAIL","OCTAVE_GENERIC_CALL","OCTAVE_GENERIC_CRM","OCTAVE_GENERIC_SOCIAL","CIRCLEBACK","SYBILL","GRANOLA","SALESLOFT","APOLLO","HEYREACH","GOOGLE_ADS","META_ADS","LINEAR","ZOOM","CLARI_COPILOT"],"description":"Provider name for this event type"},"shouldProcess":{"type":"boolean","description":"Whether the payload should be processed"},"connectionMethod":{"type":"string","enum":["WEBHOOK","CRON_JOB"],"description":"Connection method"}},"required":["providerName","shouldProcess","connectionMethod"],"description":"Connection details","isRequired":true,"uniqueKey":"connection.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"connection","typeLabel":"object | null"},"additionalData":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"additionalData.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"additionalData.additionalProperties","typeLabel":"null"},"description":"Additional data about the processed event","uniqueKey":"additionalData","typeLabel":"object"},"validationErrors":{"type":"object","properties":{"fieldErrors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","uniqueKey":"validationErrors.fieldErrors.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"validationErrors.fieldErrors.additionalProperties","typeLabel":"string[]"},"isRequired":true,"uniqueKey":"validationErrors.fieldErrors","typeLabel":"object"},"formErrors":{"type":"array","items":{"type":"string","uniqueKey":"validationErrors.formErrors.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"validationErrors.formErrors","typeLabel":"string[]"}},"required":["fieldErrors","formErrors"],"description":"Per-field validation errors when the payload fails schema validation. Mirrors Zod's flatten() output so callers can map errors back to the offending fields.","uniqueKey":"validationErrors","typeLabel":"object"}},"required":["_metadata","received","connection"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"_metadata":{"requestId":"requestId","timestamp":"2021-01-01T00:00:00.000Z","usage":0,"message":"message"},"received":true,"connection":{"providerName":"INSTANTLY","shouldProcess":true,"connectionMethod":"WEBHOOK"},"additionalData":{},"validationErrors":{"fieldErrors":{},"formErrors":["\u003cstring>"]}}}},"exampleType":"generated"}},"exampleType":"generated"},"c49be869-c2c1-4fb7-a1a0-cfada6a6c6e4":{"description":"Bad request - invalid payload or event type","content":{"application/json":{"schema":{"type":"object","properties":{"_metadata":{"type":"object","properties":{"requestId":{"type":"string","example":"requestId","description":"Request ID","isRequired":true,"uniqueKey":"_metadata.requestId","typeLabel":"string"},"timestamp":{"type":"string","example":"2021-01-01T00:00:00.000Z","description":"Timestamp","isRequired":true,"uniqueKey":"_metadata.timestamp","typeLabel":"string"},"usage":{"type":"number","default":0,"example":0,"description":"API usage","uniqueKey":"_metadata.usage","typeLabel":"number"},"message":{"type":"string","example":"message","description":"Message","uniqueKey":"_metadata.message","typeLabel":"string"}},"required":["requestId","timestamp"],"isRequired":true,"uniqueKey":"_metadata","typeLabel":"object"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"required":["_metadata","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"_metadata":{"requestId":"requestId","timestamp":"2021-01-01T00:00:00.000Z","usage":0,"message":"message"},"message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"ebb14cc7-e0ae-4128-aa13-b8d2623887ef":{"description":"Workspace not found or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"_metadata":{"type":"object","properties":{"requestId":{"type":"string","example":"requestId","description":"Request ID","isRequired":true,"uniqueKey":"_metadata.requestId","typeLabel":"string"},"timestamp":{"type":"string","example":"2021-01-01T00:00:00.000Z","description":"Timestamp","isRequired":true,"uniqueKey":"_metadata.timestamp","typeLabel":"string"},"usage":{"type":"number","default":0,"example":0,"description":"API usage","uniqueKey":"_metadata.usage","typeLabel":"number"},"message":{"type":"string","example":"message","description":"Message","uniqueKey":"_metadata.message","typeLabel":"string"}},"required":["requestId","timestamp"],"isRequired":true,"uniqueKey":"_metadata","typeLabel":"object"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"required":["_metadata","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"_metadata":{"requestId":"requestId","timestamp":"2021-01-01T00:00:00.000Z","usage":0,"message":"message"},"message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"488bd04d-b181-41af-8ce0-a9e9dcfaa69b":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api_key","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"80f2e4ba-6bdd-4b60-98d6-f0697e937bc7":{"url":"https://app.octavehq.com"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"api_key","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"api_key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"api_key"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"v2-api-reference/openapi.json"},"subdomain":"octave","siteName":"Octave API","title":"Log Event - Octave API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-02T23:52:22.269Z","originalFileLocation":"v2-api-reference/events/log-event.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=\"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a type discriminator. ## Event Types The {eventType} path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field. ### emails — Email Events Supported eventType values: sent, reply, opened, clicked, bounced, unsubscribed - Only sent and reply are processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, subject, body (text or html), from, to - Optional: cc, bcc, eventId, messageId, conversationId, campaignId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ### calls — Call/Meeting Events Supported eventType values: transcript, scheduled, completed, missed - Only transcript is processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, title, transcript, participants - Optional: duration, recordingUrl, meetingPlatform, eventId, conversationId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, customMetadata - Transcript formats: Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable). ### crm — CRM Events Supported eventType values: opportunity_created, deal_won, deal_lost, meeting_booked - All CRM event types are processed for analytics. - Required fields: eventTimestamp, eventType, opportunityId, opportunityName - Optional: amount, currency, stage, stageCategory, crmPipelineId, crmPipelineName, accountName, crmAccountId, crmAccountDomain, contactEmail, contactName, contactEmails, ownerName, ownerEmail, crmOwnerId, closeDate, createdDate, crmLastModifiedAt, lossReason, mergedOpportunityIds, eventId, sourceProviderName, customMetadata - A deal is one object that changes over time: re-send it whenever it changes and include crmLastModifiedAt so the new state is not discarded as a duplicate of the previous push. ### social — Social/LinkedIn Events Supported eventType values: connection_sent, connection_accepted, message_sent, message_received - All social event types are processed for analytics. - Required fields: eventTimestamp, eventType, body (text or html), from, to - Optional: subject, eventId, conversationId, campaignId, messageType, campaignName, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ## Linking to deals Email, call and social events accept crmOpportunityId / crmAccountId / crmAccountDomain. When crmOpportunityId matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events. ## Deduplication You can provide an optional eventId field for explicit deduplication. If not provided, an ID is auto-generated from the event content: - Emails: from_email + subject + timestamp + first_to_email - Calls: title + timestamp + first_participant + first_100_chars_transcript - CRM: opportunityId + eventType + crmLastModifiedAt — or, when crmLastModifiedAt is absent, a hash of the deal\u0026#x27;s mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate - Social: from_email + eventType + timestamp + first_to_email ## Response A payload that fails schema validation is answered with HTTP 200 and received: false, with the per-field messages in validationErrors — check received, not just the status code. The request body is limited to 10 MB. ## Authentication Workspace is identified by API key, passed as an api_key header or, on this endpoint only, as the api_key query parameter.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Octave API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/octave/FIdKYiabDumANUaD/_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/octave/FIdKYiabDumANUaD/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/octave/FIdKYiabDumANUaD/_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/octave/FIdKYiabDumANUaD/_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/octave/FIdKYiabDumANUaD/_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/octave/FIdKYiabDumANUaD/_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/octave/FIdKYiabDumANUaD/_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/octave/FIdKYiabDumANUaD/_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/octave/FIdKYiabDumANUaD/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Log Event - Octave API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a type discriminator. ## Event Types The {eventType} path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field. ### emails — Email Events Supported eventType values: sent, reply, opened, clicked, bounced, unsubscribed - Only sent and reply are processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, subject, body (text or html), from, to - Optional: cc, bcc, eventId, messageId, conversationId, campaignId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ### calls — Call/Meeting Events Supported eventType values: transcript, scheduled, completed, missed - Only transcript is processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, title, transcript, participants - Optional: duration, recordingUrl, meetingPlatform, eventId, conversationId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, customMetadata - Transcript formats: Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable). ### crm — CRM Events Supported eventType values: opportunity_created, deal_won, deal_lost, meeting_booked - All CRM event types are processed for analytics. - Required fields: eventTimestamp, eventType, opportunityId, opportunityName - Optional: amount, currency, stage, stageCategory, crmPipelineId, crmPipelineName, accountName, crmAccountId, crmAccountDomain, contactEmail, contactName, contactEmails, ownerName, ownerEmail, crmOwnerId, closeDate, createdDate, crmLastModifiedAt, lossReason, mergedOpportunityIds, eventId, sourceProviderName, customMetadata - A deal is one object that changes over time: re-send it whenever it changes and include crmLastModifiedAt so the new state is not discarded as a duplicate of the previous push. ### social — Social/LinkedIn Events Supported eventType values: connection_sent, connection_accepted, message_sent, message_received - All social event types are processed for analytics. - Required fields: eventTimestamp, eventType, body (text or html), from, to - Optional: subject, eventId, conversationId, campaignId, messageType, campaignName, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ## Linking to deals Email, call and social events accept crmOpportunityId / crmAccountId / crmAccountDomain. When crmOpportunityId matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events. ## Deduplication You can provide an optional eventId field for explicit deduplication. If not provided, an ID is auto-generated from the event content: - Emails: from_email + subject + timestamp + first_to_email - Calls: title + timestamp + first_participant + first_100_chars_transcript - CRM: opportunityId + eventType + crmLastModifiedAt — or, when crmLastModifiedAt is absent, a hash of the deal\u0026#x27;s mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate - Social: from_email + eventType + timestamp + first_to_email ## Response A payload that fails schema validation is answered with HTTP 200 and received: false, with the per-field messages in validationErrors — check received, not just the status code. The request body is limited to 10 MB. ## Authentication Workspace is identified by API key, passed as an api_key header or, on this endpoint only, as the api_key query parameter.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Octave API Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.octavehq.com/v2-api-reference/events/log-event\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://octave.mintlify.app/_mintlify/api/og/v2?division=Events\u0026amp;title=Log+Event\u0026amp;description=Log+a+custom+event+%E2%80%94+emails%2C+calls%2C+CRM%2C+and+social+data+from+your+own+integrations+%28n8n%2C+Clay%2C+Make%2C+etc.%29+%E2%80%94+into+the+analytics+pipeline.+One+event+per+request\u0026amp;theme=7aca23396e4d7872f604e192\u0026amp;signature=36decb3985ec8eea7ab3504d1a90204dbcefb6faf945871bd2abec82f2060d07\">\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=\"Log Event - Octave API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a type discriminator. ## Event Types The {eventType} path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field. ### emails — Email Events Supported eventType values: sent, reply, opened, clicked, bounced, unsubscribed - Only sent and reply are processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, subject, body (text or html), from, to - Optional: cc, bcc, eventId, messageId, conversationId, campaignId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ### calls — Call/Meeting Events Supported eventType values: transcript, scheduled, completed, missed - Only transcript is processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, title, transcript, participants - Optional: duration, recordingUrl, meetingPlatform, eventId, conversationId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, customMetadata - Transcript formats: Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable). ### crm — CRM Events Supported eventType values: opportunity_created, deal_won, deal_lost, meeting_booked - All CRM event types are processed for analytics. - Required fields: eventTimestamp, eventType, opportunityId, opportunityName - Optional: amount, currency, stage, stageCategory, crmPipelineId, crmPipelineName, accountName, crmAccountId, crmAccountDomain, contactEmail, contactName, contactEmails, ownerName, ownerEmail, crmOwnerId, closeDate, createdDate, crmLastModifiedAt, lossReason, mergedOpportunityIds, eventId, sourceProviderName, customMetadata - A deal is one object that changes over time: re-send it whenever it changes and include crmLastModifiedAt so the new state is not discarded as a duplicate of the previous push. ### social — Social/LinkedIn Events Supported eventType values: connection_sent, connection_accepted, message_sent, message_received - All social event types are processed for analytics. - Required fields: eventTimestamp, eventType, body (text or html), from, to - Optional: subject, eventId, conversationId, campaignId, messageType, campaignName, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ## Linking to deals Email, call and social events accept crmOpportunityId / crmAccountId / crmAccountDomain. When crmOpportunityId matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events. ## Deduplication You can provide an optional eventId field for explicit deduplication. If not provided, an ID is auto-generated from the event content: - Emails: from_email + subject + timestamp + first_to_email - Calls: title + timestamp + first_participant + first_100_chars_transcript - CRM: opportunityId + eventType + crmLastModifiedAt — or, when crmLastModifiedAt is absent, a hash of the deal\u0026#x27;s mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate - Social: from_email + eventType + timestamp + first_to_email ## Response A payload that fails schema validation is answered with HTTP 200 and received: false, with the per-field messages in validationErrors — check received, not just the status code. The request body is limited to 10 MB. ## Authentication Workspace is identified by API key, passed as an api_key header or, on this endpoint only, as the api_key query parameter.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://octave.mintlify.app/_mintlify/api/og/v2?division=Events\u0026amp;title=Log+Event\u0026amp;description=Log+a+custom+event+%E2%80%94+emails%2C+calls%2C+CRM%2C+and+social+data+from+your+own+integrations+%28n8n%2C+Clay%2C+Make%2C+etc.%29+%E2%80%94+into+the+analytics+pipeline.+One+event+per+request\u0026amp;theme=7aca23396e4d7872f604e192\u0026amp;signature=36decb3985ec8eea7ab3504d1a90204dbcefb6faf945871bd2abec82f2060d07\">\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/octave/FIdKYiabDumANUaD/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Octave API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#333999\">\u003cmeta data-mint-head name=\"og:locale\" content=\"en_US\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.octavehq.com/v2-api-reference/events/log-event\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v2-api-reference/events/log-event.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.octavehq.com/#organization\",\"name\":\"Octave API\",\"url\":\"https://docs.octavehq.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/octave/SNMu0rTVOCvjTqcW/logo/logo.svg?fit=max\u0026auto=format\u0026n=SNMu0rTVOCvjTqcW\u0026q=85\u0026s=4f2d9698f4a42a583deee9e8721a9211\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.octavehq.com#website\",\"name\":\"Octave API\",\"url\":\"https://docs.octavehq.com\",\"publisher\":{\"@id\":\"https://docs.octavehq.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/log-event#webpage\",\"url\":\"https://docs.octavehq.com/v2-api-reference/events/log-event\",\"name\":\"Log Event\",\"description\":\"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a type discriminator. ## Event Types The {eventType} path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field. ### emails — Email Events Supported eventType values: sent, reply, opened, clicked, bounced, unsubscribed - Only sent and reply are processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, subject, body (text or html), from, to - Optional: cc, bcc, eventId, messageId, conversationId, campaignId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ### calls — Call/Meeting Events Supported eventType values: transcript, scheduled, completed, missed - Only transcript is processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, title, transcript, participants - Optional: duration, recordingUrl, meetingPlatform, eventId, conversationId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, customMetadata - Transcript formats: Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable). ### crm — CRM Events Supported eventType values: opportunity_created, deal_won, deal_lost, meeting_booked - All CRM event types are processed for analytics. - Required fields: eventTimestamp, eventType, opportunityId, opportunityName - Optional: amount, currency, stage, stageCategory, crmPipelineId, crmPipelineName, accountName, crmAccountId, crmAccountDomain, contactEmail, contactName, contactEmails, ownerName, ownerEmail, crmOwnerId, closeDate, createdDate, crmLastModifiedAt, lossReason, mergedOpportunityIds, eventId, sourceProviderName, customMetadata - A deal is one object that changes over time: re-send it whenever it changes and include crmLastModifiedAt so the new state is not discarded as a duplicate of the previous push. ### social — Social/LinkedIn Events Supported eventType values: connection_sent, connection_accepted, message_sent, message_received - All social event types are processed for analytics. - Required fields: eventTimestamp, eventType, body (text or html), from, to - Optional: subject, eventId, conversationId, campaignId, messageType, campaignName, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ## Linking to deals Email, call and social events accept crmOpportunityId / crmAccountId / crmAccountDomain. When crmOpportunityId matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events. ## Deduplication You can provide an optional eventId field for explicit deduplication. If not provided, an ID is auto-generated from the event content: - Emails: from_email + subject + timestamp + first_to_email - Calls: title + timestamp + first_participant + first_100_chars_transcript - CRM: opportunityId + eventType + crmLastModifiedAt — or, when crmLastModifiedAt is absent, a hash of the deal's mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate - Social: from_email + eventType + timestamp + first_to_email ## Response A payload that fails schema validation is answered with HTTP 200 and received: false, with the per-field messages in validationErrors — check received, not just the status code. The request body is limited to 10 MB. ## Authentication Workspace is identified by API key, passed as an api_key header or, on this endpoint only, as the api_key query parameter.\",\"dateModified\":\"2026-09-02T23:52:22.269Z\",\"isPartOf\":{\"@id\":\"https://docs.octavehq.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/log-event#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/log-event#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Events\",\"item\":\"https://docs.octavehq.com/v2-api-reference/events/list-events\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Log Event\",\"item\":\"https://docs.octavehq.com/v2-api-reference/events/log-event\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/log-event#apireference\",\"headline\":\"Log Event\",\"name\":\"Log Event\",\"description\":\"Log a custom event — emails, calls, CRM, and social data from your own integrations (n8n, Clay, Make, etc.) — into the analytics pipeline. One event per request; to load history in batches of up to 1000 use POST /event/import, which takes the same event shapes plus a type discriminator. ## Event Types The {eventType} path parameter determines the expected payload schema. Each event type has its own set of supported sub-types; the schema for each is listed under Body below, with a description per field. ### emails — Email Events Supported eventType values: sent, reply, opened, clicked, bounced, unsubscribed - Only sent and reply are processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, subject, body (text or html), from, to - Optional: cc, bcc, eventId, messageId, conversationId, campaignId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ### calls — Call/Meeting Events Supported eventType values: transcript, scheduled, completed, missed - Only transcript is processed for analytics; others are ingested but not processed. - Required fields: eventTimestamp, eventType, title, transcript, participants - Optional: duration, recordingUrl, meetingPlatform, eventId, conversationId, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, customMetadata - Transcript formats: Can be a flat string (LLM will diarize into speaker turns) or a structured array of entries with speaker attribution (recommended — faster and more reliable). ### crm — CRM Events Supported eventType values: opportunity_created, deal_won, deal_lost, meeting_booked - All CRM event types are processed for analytics. - Required fields: eventTimestamp, eventType, opportunityId, opportunityName - Optional: amount, currency, stage, stageCategory, crmPipelineId, crmPipelineName, accountName, crmAccountId, crmAccountDomain, contactEmail, contactName, contactEmails, ownerName, ownerEmail, crmOwnerId, closeDate, createdDate, crmLastModifiedAt, lossReason, mergedOpportunityIds, eventId, sourceProviderName, customMetadata - A deal is one object that changes over time: re-send it whenever it changes and include crmLastModifiedAt so the new state is not discarded as a duplicate of the previous push. ### social — Social/LinkedIn Events Supported eventType values: connection_sent, connection_accepted, message_sent, message_received - All social event types are processed for analytics. - Required fields: eventTimestamp, eventType, body (text or html), from, to - Optional: subject, eventId, conversationId, campaignId, messageType, campaignName, crmOpportunityId, crmAccountId, crmAccountDomain, sourceProviderName, octaveRequestId, customMetadata ## Linking to deals Email, call and social events accept crmOpportunityId / crmAccountId / crmAccountDomain. When crmOpportunityId matches a deal in the workspace the event is attached to it directly and participant/domain inference is skipped; an unknown ID falls back to inference. Use the same IDs you send on your CRM events. ## Deduplication You can provide an optional eventId field for explicit deduplication. If not provided, an ID is auto-generated from the event content: - Emails: from_email + subject + timestamp + first_to_email - Calls: title + timestamp + first_participant + first_100_chars_transcript - CRM: opportunityId + eventType + crmLastModifiedAt — or, when crmLastModifiedAt is absent, a hash of the deal's mutable fields, so a genuinely changed deal is a new event and an unchanged re-send is a duplicate - Social: from_email + eventType + timestamp + first_to_email ## Response A payload that fails schema validation is answered with HTTP 200 and received: false, with the per-field messages in validationErrors — check received, not just the status code. The request body is limited to 10 MB. ## Authentication Workspace is identified by API key, passed as an api_key header or, on this endpoint only, as the api_key query parameter.\",\"url\":\"https://docs.octavehq.com/v2-api-reference/events/log-event\",\"mainEntityOfPage\":{\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/log-event#webpage\"},\"dateModified\":\"2026-09-02T23:52:22.269Z\",\"publisher\":{\"@id\":\"https://docs.octavehq.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.octavehq.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Octave API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Octave API","nav":{"global":null,"tabs":[{"tab":"Getting Started","pages":[{"title":"Getting Started","href":"/introduction"}]},{"tab":"V2 API Reference","groups":[{"group":"Agents","pages":[{"openapi":"get /api/v2/agents/list","title":"List Agents","href":"/v2-api-reference/agents/list-agents"},{"openapi":"get /api/v2/agents/types","title":"List Agent Types","href":"/v2-api-reference/agents/list-agent-types"},{"openapi":"get /api/v2/agents/languages","title":"List Languages","href":"/v2-api-reference/agents/list-languages"},{"openapi":"get /api/v2/agents/get","title":"Get Agent","href":"/v2-api-reference/agents/get-agent"},{"openapi":"post /api/v2/agents/create","title":"Create Agent","href":"/v2-api-reference/agents/create-agent"},{"openapi":"post /api/v2/agents/update","title":"Update Agent","href":"/v2-api-reference/agents/update-agent"},{"openapi":"delete /api/v2/agents/delete","title":"Delete Agent","href":"/v2-api-reference/agents/delete-agent"},{"openapi":"post /api/v2/agents/experiment/create","title":"Create Agent Experiment","href":"/v2-api-reference/agents/create-agent-experiment"},{"openapi":"post /api/v2/agents/enrich-company/run","title":"Enrich Company Agent","href":"/v2-api-reference/agents/enrich-company-agent"},{"openapi":"post /api/v2/agents/enrich-person/run","title":"Enrich Person Agent","href":"/v2-api-reference/agents/enrich-person-agent"},{"openapi":"post /api/v2/agents/generate-content/run","title":"Content Agent","href":"/v2-api-reference/agents/content-agent"},{"openapi":"post /api/v2/agents/sequence/run","title":"Sequence Agent","href":"/v2-api-reference/agents/sequence-agent"},{"openapi":"post /api/v2/agents/prospector/run","title":"Prospector Agent","href":"/v2-api-reference/agents/prospector-agent"},{"openapi":"post /api/v2/agents/qualify-person/run","title":"Qualify Person Agent","href":"/v2-api-reference/agents/qualify-person-agent"},{"openapi":"post /api/v2/agents/qualify-company/run","title":"Qualify Company Agent","href":"/v2-api-reference/agents/qualify-company-agent"},{"openapi":"post /api/v2/agents/call-prep/run","title":"Call Prep Agent","href":"/v2-api-reference/agents/call-prep-agent"},{"openapi":"post /api/v2/agents/context/run","title":"Context Agent Run","href":"/v2-api-reference/agents/context-agent-run"},{"openapi":"post /api/v2/agents/workspace/build","title":"Workspace Builder Agent","href":"/v2-api-reference/agents/workspace-builder-agent"}]},{"group":"Async","pages":[{"openapi":"post /api/v2/async/agent/run","title":"Run Agents","href":"/v2-api-reference/async/run-agent"},{"openapi":"get /api/v2/async/agent/run/status","title":"Get Async Agent Run Status","href":"/v2-api-reference/async/get-async-agent-run-status"},{"openapi":"post /api/v2/async/headless/generate-emails","title":"Generate Emails","href":"/v2-api-reference/async/generate-emails"}]},{"group":"Runs","pages":[{"openapi":"post /api/v2/skills/{key}/runs","title":"Run a skill","href":"/v2-api-reference/run/run-a-skill"},{"openapi":"get /api/v2/runs/{oId}","title":"Get a run","href":"/v2-api-reference/run/get-a-run"},{"openapi":"post /api/v2/runs/{oId}/cancel","title":"Cancel a run","href":"/v2-api-reference/run/cancel-a-run"}]},{"group":"Workspace","pages":[{"openapi":"post /api/v2/agents/workspace/build","title":"Workspace Builder Agent","href":"/v2-api-reference/workspace/build"}]},{"group":"Research","pages":[{"openapi":"post /api/v2/person/resolve-profile","title":"Resolve Profile from Email","href":"/v2-api-reference/research/resolve-profile-from-email"},{"openapi":"post /api/v2/person/resolve-email","title":"Resolve Email from Profile","href":"/v2-api-reference/research/resolve-email-from-profile"}]},{"group":"API Key","pages":[{"openapi":"get /api/v2/api-key/list","title":"List API keys","href":"/v2-api-reference/api-key/list-api-keys"},{"openapi":"get /api/v2/api-key/validate","title":"Validate API key","href":"/v2-api-reference/api-key/validate-api-key"}]},{"group":"Entity Webhooks","pages":[{"openapi":"get /api/v2/entity-webhook/list","title":"List entity webhook endpoints","href":"/v2-api-reference/entity-webhooks/list-entity-webhook-endpoints"},{"openapi":"post /api/v2/entity-webhook/create","title":"Create an entity webhook endpoint","href":"/v2-api-reference/entity-webhooks/create-an-entity-webhook-endpoint"},{"openapi":"post /api/v2/entity-webhook/update","title":"Update an entity webhook endpoint","href":"/v2-api-reference/entity-webhooks/update-an-entity-webhook-endpoint"},{"openapi":"delete /api/v2/entity-webhook/delete","title":"Delete an entity webhook endpoint","href":"/v2-api-reference/entity-webhooks/delete-an-entity-webhook-endpoint"},{"openapi":"post /api/v2/entity-webhook/rotate-secret","title":"Rotate an entity webhook signing secret","href":"/v2-api-reference/entity-webhooks/rotate-an-entity-webhook-signing-secret"},{"openapi":"post /api/v2/entity-webhook/test","title":"Send a test entity webhook","href":"/v2-api-reference/entity-webhooks/send-a-test-entity-webhook"}]},{"group":"Credits","pages":[{"openapi":"get /api/v2/credits/usage","title":"Get credit usage","href":"/v2-api-reference/credits/get-credit-usage"}]},{"group":"Motion","pages":[{"openapi":"get /api/v2/motion/list","title":"List motions","href":"/v2-api-reference/motion/list-motions"},{"openapi":"get /api/v2/motion/get","title":"Get a motion","href":"/v2-api-reference/motion/get-a-motion"},{"openapi":"post /api/v2/motion/create","title":"Create a motion","href":"/v2-api-reference/motion/create-a-motion"},{"openapi":"post /api/v2/motion/update","title":"Update a motion","href":"/v2-api-reference/motion/update-a-motion"},{"openapi":"delete /api/v2/motion/delete","title":"Delete a motion","href":"/v2-api-reference/motion/delete-a-motion"}]},{"group":"Motion Playbook","pages":[{"openapi":"get /api/v2/motion-playbook/list","title":"List motion playbooks","href":"/v2-api-reference/motionplaybook/list-motion-playbooks"},{"openapi":"get /api/v2/motion-playbook/get","title":"Get a motion playbook","href":"/v2-api-reference/motionplaybook/get-a-motion-playbook"},{"openapi":"post /api/v2/motion-playbook/create","title":"Create a motion playbook","href":"/v2-api-reference/motionplaybook/create-a-motion-playbook"},{"openapi":"post /api/v2/motion-playbook/update","title":"Update a motion playbook","href":"/v2-api-reference/motionplaybook/update-a-motion-playbook"},{"openapi":"delete /api/v2/motion-playbook/delete","title":"Delete a motion playbook","href":"/v2-api-reference/motionplaybook/delete-a-motion-playbook"}]},{"group":"Motion ICP","pages":[{"openapi":"get /api/v2/motion-icp/list","title":"List Motion ICP cells","href":"/v2-api-reference/motionicp/list-motion-icp-cells"},{"openapi":"get /api/v2/motion-icp/get","title":"Get Motion ICP detail","href":"/v2-api-reference/motionicp/get-motion-icp-detail"},{"openapi":"get /api/v2/motion-icp/elements/list","title":"List recommended elements for a Motion ICP","href":"/v2-api-reference/motionicp/list-recommended-elements-for-a-motion-icp"},{"openapi":"get /api/v2/motion-icp/learnings/list","title":"List learnings for a Motion ICP","href":"/v2-api-reference/motionicp/list-learnings-for-a-motion-icp"},{"openapi":"get /api/v2/motion-icp/learnings/get","title":"Get a Motion ICP learning","href":"/v2-api-reference/motionicp/get-a-motion-icp-learning"},{"openapi":"post /api/v2/motion-icp/regenerate","title":"Regenerate a Motion ICP cell","href":"/v2-api-reference/motionicp/regenerate-a-motion-icp-cell"}]},{"group":"Product","pages":[{"openapi":"get /api/v2/product/get","title":"Get Product","href":"/v2-api-reference/product/get-product"},{"openapi":"get /api/v2/product/list","title":"List Products","href":"/v2-api-reference/product/list-products"},{"openapi":"post /api/v2/product/create","title":"Create Product","href":"/v2-api-reference/product/create-product"},{"openapi":"post /api/v2/product/update","title":"Update Product","href":"/v2-api-reference/product/update-product"},{"openapi":"post /api/v2/product/generate","title":"Generate Product","href":"/v2-api-reference/product/generate-product"},{"openapi":"delete /api/v2/product/delete","title":"Delete Product","href":"/v2-api-reference/product/delete-product"}]},{"group":"Service","pages":[{"openapi":"get /api/v2/service/list","title":"List Services","href":"/v2-api-reference/service/list-services"},{"openapi":"get /api/v2/service/get","title":"Get Service","href":"/v2-api-reference/service/get-service"},{"openapi":"post /api/v2/service/create","title":"Create Service","href":"/v2-api-reference/service/create-service"},{"openapi":"post /api/v2/service/update","title":"Update Service","href":"/v2-api-reference/service/update-service"},{"openapi":"post /api/v2/service/generate","title":"Generate Service","href":"/v2-api-reference/service/generate-service"},{"openapi":"post /api/v2/service/delete","title":"Delete Service","href":"/v2-api-reference/service/delete-service"}]},{"group":"Solution","pages":[{"openapi":"get /api/v2/solution/list","title":"List Solutions","href":"/v2-api-reference/solution/list-solutions"},{"openapi":"get /api/v2/solution/get","title":"Get Solution","href":"/v2-api-reference/solution/get-solution"},{"openapi":"post /api/v2/solution/create","title":"Create Solution","href":"/v2-api-reference/solution/create-solution"},{"openapi":"post /api/v2/solution/update","title":"Update Solution","href":"/v2-api-reference/solution/update-solution"},{"openapi":"post /api/v2/solution/generate","title":"Generate Solution","href":"/v2-api-reference/solution/generate-solution"},{"openapi":"delete /api/v2/solution/delete","title":"Delete Solution","href":"/v2-api-reference/solution/delete-solution"}]},{"group":"Segment","pages":[{"openapi":"get /api/v2/segment/get","title":"Get Segment","href":"/v2-api-reference/segment/get-segment"},{"openapi":"get /api/v2/segment/list","title":"List segments","href":"/v2-api-reference/segment/list-segments"},{"openapi":"post /api/v2/segment/update","title":"Update Segment","href":"/v2-api-reference/segment/update-segment"},{"openapi":"post /api/v2/segment/create","title":"Create Segment","href":"/v2-api-reference/segment/create-segment"},{"openapi":"post /api/v2/segment/generate","title":"Generate Segments","href":"/v2-api-reference/segment/generate-segments"},{"openapi":"delete /api/v2/segment/delete","title":"Delete Segment","href":"/v2-api-reference/segment/delete-segment"}]},{"group":"Persona","pages":[{"openapi":"get /api/v2/persona/get","title":"Get Persona","href":"/v2-api-reference/persona/get-persona"},{"openapi":"get /api/v2/persona/list","title":"List persona","href":"/v2-api-reference/persona/list-persona"},{"openapi":"post /api/v2/persona/update","title":"Update Persona","href":"/v2-api-reference/persona/update-persona"},{"openapi":"post /api/v2/persona/create","title":"Create Persona","href":"/v2-api-reference/persona/create-persona"},{"openapi":"post /api/v2/persona/generate","title":"Generate Personas","href":"/v2-api-reference/persona/generate-personas"},{"openapi":"delete /api/v2/persona/delete","title":"Delete Persona","href":"/v2-api-reference/persona/delete-persona"}]},{"group":"Use Case","pages":[{"openapi":"get /api/v2/use-case/get","title":"Get Use Case","href":"/v2-api-reference/use-case/get-use-case"},{"openapi":"get /api/v2/use-case/list","title":"List Use Cases","href":"/v2-api-reference/use-case/list-use-cases"},{"openapi":"post /api/v2/use-case/update","title":"Update Use Case","href":"/v2-api-reference/use-case/update-use-case"},{"openapi":"post /api/v2/use-case/create","title":"Create Use Case","href":"/v2-api-reference/use-case/create-use-case"},{"openapi":"post /api/v2/use-case/generate","title":"Generate Use Cases","href":"/v2-api-reference/use-case/generate-use-cases"},{"openapi":"delete /api/v2/use-case/delete","title":"Delete Use Case","href":"/v2-api-reference/use-case/delete-use-case"}]},{"group":"Reference","pages":[{"openapi":"get /api/v2/reference/get","title":"Get Reference","href":"/v2-api-reference/reference/get-reference"},{"openapi":"get /api/v2/reference/list","title":"List References","href":"/v2-api-reference/reference/list-references"},{"openapi":"post /api/v2/reference/create","title":"Create Reference","href":"/v2-api-reference/reference/create-reference"},{"openapi":"post /api/v2/reference/update","title":"Update Reference","href":"/v2-api-reference/reference/update-reference"},{"openapi":"post /api/v2/reference/generate","title":"Generate References","href":"/v2-api-reference/reference/generate-references"},{"openapi":"delete /api/v2/reference/delete","title":"Delete Reference","href":"/v2-api-reference/reference/delete-reference"}]},{"group":"Proof Point","pages":[{"openapi":"get /api/v2/proof-point/get","title":"Get Proof Point","href":"/v2-api-reference/proof-point/get-proof-point"},{"openapi":"get /api/v2/proof-point/list","title":"List proof points","href":"/v2-api-reference/proof-point/list-proof-points"},{"openapi":"post /api/v2/proof-point/update","title":"Update Proof Point","href":"/v2-api-reference/proof-point/update-proof-point"},{"openapi":"post /api/v2/proof-point/create","title":"Create Proof Point","href":"/v2-api-reference/proof-point/create-proof-point"},{"openapi":"post /api/v2/proof-point/generate","title":"Generate Proof Points","href":"/v2-api-reference/proof-point/generate-proof-points"},{"openapi":"delete /api/v2/proof-point/delete","title":"Delete Proof Point","href":"/v2-api-reference/proof-point/delete-proof-point"}]},{"group":"Competitor","pages":[{"openapi":"get /api/v2/competitor/get","title":"Get Competitor","href":"/v2-api-reference/competitor/get-competitor"},{"openapi":"get /api/v2/competitor/list","title":"List competitors","href":"/v2-api-reference/competitor/list-competitors"},{"openapi":"post /api/v2/competitor/update","title":"Update Competitor","href":"/v2-api-reference/competitor/update-competitor"},{"openapi":"post /api/v2/competitor/create","title":"Create Competitor","href":"/v2-api-reference/competitor/create-competitor"},{"openapi":"post /api/v2/competitor/generate","title":"Generate Competitors","href":"/v2-api-reference/competitor/generate-competitors"},{"openapi":"delete /api/v2/competitor/delete","title":"Delete Competitor","href":"/v2-api-reference/competitor/delete-competitor"}]},{"group":"Alternative","pages":[{"openapi":"get /api/v2/alternative/get","title":"Get Alternative","href":"/v2-api-reference/alternative/get-alternative"},{"openapi":"get /api/v2/alternative/list","title":"List alternatives","href":"/v2-api-reference/alternative/list-alternatives"},{"openapi":"post /api/v2/alternative/create","title":"Create Alternative","href":"/v2-api-reference/alternative/create-alternative"},{"openapi":"post /api/v2/alternative/update","title":"Update Alternative","href":"/v2-api-reference/alternative/update-alternative"},{"openapi":"post /api/v2/alternative/generate","title":"Generate Alternatives","href":"/v2-api-reference/alternative/generate-alternatives"},{"openapi":"delete /api/v2/alternative/delete","title":"Delete Alternative","href":"/v2-api-reference/alternative/delete-alternative"}]},{"group":"Buying Trigger","pages":[{"openapi":"get /api/v2/buying-trigger/get","title":"Get Buying Trigger","href":"/v2-api-reference/buying-trigger/get-buying-trigger"},{"openapi":"get /api/v2/buying-trigger/list","title":"List buying triggers","href":"/v2-api-reference/buying-trigger/list-buying-triggers"},{"openapi":"post /api/v2/buying-trigger/create","title":"Create Buying Trigger","href":"/v2-api-reference/buying-trigger/create-buying-trigger"},{"openapi":"post /api/v2/buying-trigger/update","title":"Update Buying Trigger","href":"/v2-api-reference/buying-trigger/update-buying-trigger"},{"openapi":"post /api/v2/buying-trigger/generate","title":"Generate Buying Triggers","href":"/v2-api-reference/buying-trigger/generate-buying-triggers"},{"openapi":"delete /api/v2/buying-trigger/delete","title":"Delete Buying Trigger","href":"/v2-api-reference/buying-trigger/delete-buying-trigger"}]},{"group":"Core Feature","pages":[{"openapi":"get /api/v2/core-feature/list","title":"List core features","href":"/v2-api-reference/core-feature/list-core-features"},{"openapi":"get /api/v2/core-feature/get","title":"Get Core Feature","href":"/v2-api-reference/core-feature/get-core-feature"},{"openapi":"post /api/v2/core-feature/create","title":"Create Core Feature","href":"/v2-api-reference/core-feature/create-core-feature"},{"openapi":"post /api/v2/core-feature/update","title":"Update Core Feature","href":"/v2-api-reference/core-feature/update-core-feature"},{"openapi":"post /api/v2/core-feature/generate","title":"Generate Core Features","href":"/v2-api-reference/core-feature/generate-core-features"},{"openapi":"delete /api/v2/core-feature/delete","title":"Delete Core Feature","href":"/v2-api-reference/core-feature/delete-core-feature"}]},{"group":"Objection","pages":[{"openapi":"get /api/v2/objection/list","title":"List objections","href":"/v2-api-reference/objection/list-objections"},{"openapi":"get /api/v2/objection/get","title":"Get Objection","href":"/v2-api-reference/objection/get-objection"},{"openapi":"post /api/v2/objection/create","title":"Create Objection","href":"/v2-api-reference/objection/create-objection"},{"openapi":"post /api/v2/objection/update","title":"Update Objection","href":"/v2-api-reference/objection/update-objection"},{"openapi":"post /api/v2/objection/generate","title":"Generate Objections","href":"/v2-api-reference/objection/generate-objections"},{"openapi":"delete /api/v2/objection/delete","title":"Delete Objection","href":"/v2-api-reference/objection/delete-objection"}]},{"group":"Brand Voice","pages":[{"openapi":"get /api/v2/brand-voice/list","title":"List Brand Voices","href":"/v2-api-reference/brand-voice/list-brand-voices"},{"openapi":"get /api/v2/brand-voice/get","title":"Get Brand Voice","href":"/v2-api-reference/brand-voice/get-brand-voice"},{"openapi":"post /api/v2/brand-voice/create","title":"Create Brand Voice","href":"/v2-api-reference/brand-voice/create-brand-voice"},{"openapi":"post /api/v2/brand-voice/update","title":"Update Brand Voice","href":"/v2-api-reference/brand-voice/update-brand-voice"},{"openapi":"post /api/v2/brand-voice/generate","title":"Generate Brand Voice","href":"/v2-api-reference/brand-voice/generate-brand-voice"},{"openapi":"post /api/v2/brand-voice/apply","title":"Apply Brand Voice","href":"/v2-api-reference/brand-voice/apply-brand-voice"},{"openapi":"post /api/v2/brand-voice/toggle-default","title":"Toggle Default Brand Voice","href":"/v2-api-reference/brand-voice/toggle-default-brand-voice"}]},{"group":"Library","pages":[{"openapi":"get /api/v2/library/download","title":"Download Library","href":"/v2-api-reference/library/download-library"},{"openapi":"get /api/v2/library/links","title":"Get Library Entity Links","href":"/v2-api-reference/library/get-library-entity-links"}]},{"group":"Library Locks","pages":[{"openapi":"post /api/v2/entity-lock/update","title":"Lock or unlock a library entity","href":"/v2-api-reference/library-locks/lock-or-unlock-a-library-entity"}]},{"group":"Context","pages":[{"openapi":"post /api/v2/context","title":"Context Search","href":"/v2-api-reference/context/context-search"}]},{"group":"Workflow","pages":[{"openapi":"post /api/v2/workflows/run","title":"Run a workflow","href":"/v2-api-reference/workflow/run-a-workflow"},{"openapi":"get /api/v2/workflows/run/status","title":"Get Workflow Run Status","href":"/v2-api-reference/workflow/get-workflow-run-status"}]},{"group":"Events","pages":[{"openapi":"get /api/v2/event/list","title":"List Events","href":"/v2-api-reference/events/list-events"},{"openapi":"post /api/v2/event/import","title":"Bulk import events","href":"/v2-api-reference/events/bulk-import-events"},{"openapi":"get /api/v2/event/import/status","title":"Get bulk import status","description":"Get the current status of a bulk event import job. Use this to poll for completion after POST /event/import. Recommended polling interval: 5–10 seconds. The job reaches COMPLETED only once every event is terminal — `ingested` is the authoritative success count.","href":"/v2-api-reference/events/get-bulk-import-status"},{"openapi":"post /api/v2/analytics/webhook/receive/generic/{eventType}","title":"Log Event","href":"/v2-api-reference/events/log-event"},{"openapi":"post /api/v2/event/count","title":"Count Events","description":"Count the events matching a date window and filters without returning them: total, a per-channel split, and distinct companies, external people and CRM deals. REST twin of the count_events MCP tool; takes the same window and filters as it and as list_events.","href":"/v2-api-reference/events/count-events"},{"openapi":"get /api/v2/event/get","title":"Get Event Detail","href":"/v2-api-reference/events/get-event-detail"},{"openapi":"post /api/v2/event/time-series","title":"Event Time Series","href":"/v2-api-reference/events/event-time-series"},{"openapi":"post /api/v2/event/cross-tab","title":"Event Cross-Tab","href":"/v2-api-reference/events/event-cross-tab"},{"openapi":"post /api/v2/event/top","title":"Top Event Entities","href":"/v2-api-reference/events/top-event-entities"},{"openapi":"post /api/v2/event/compare","title":"Compare Cohorts","href":"/v2-api-reference/events/compare-cohorts"},{"openapi":"post /api/v2/event/cohort-deals","title":"List Cohort Deals","href":"/v2-api-reference/events/list-cohort-deals"}]},{"group":"Findings","pages":[{"openapi":"get /api/v2/finding/list","title":"List Findings","href":"/v2-api-reference/findings/list-findings"},{"openapi":"post /api/v2/finding/search","title":"Search Findings","href":"/v2-api-reference/findings/search-findings"}]},{"group":"Custom Extractors","pages":[{"openapi":"get /api/v2/custom-extractor/list","title":"List Custom Extractors","href":"/v2-api-reference/custom-extractors/list-custom-extractors"},{"openapi":"post /api/v2/custom-extractor/create","title":"Create Custom Extractor","href":"/v2-api-reference/custom-extractors/create-custom-extractor"},{"openapi":"post /api/v2/custom-extractor/update","title":"Update Custom Extractor","href":"/v2-api-reference/custom-extractors/update-custom-extractor"},{"openapi":"delete /api/v2/custom-extractor/delete","title":"Delete Custom Extractor","href":"/v2-api-reference/custom-extractors/delete-custom-extractor"},{"openapi":"post /api/v2/custom-extractor/backtest","title":"Backtest Custom Extractor","href":"/v2-api-reference/custom-extractors/backtest-custom-extractor"},{"openapi":"post /api/v2/custom-extractor/backfill/estimate","title":"Estimate Custom Extractor Backfill","href":"/v2-api-reference/custom-extractors/estimate-custom-extractor-backfill"},{"openapi":"post /api/v2/custom-extractor/backfill/start","title":"Start Custom Extractor Backfill","href":"/v2-api-reference/custom-extractors/start-custom-extractor-backfill"},{"openapi":"get /api/v2/custom-extractor/backfill/get","title":"Get Custom Extractor Backfill","href":"/v2-api-reference/custom-extractors/get-custom-extractor-backfill"},{"openapi":"post /api/v2/custom-extractor/backfill/control","title":"Control Custom Extractor Backfill","href":"/v2-api-reference/custom-extractors/control-custom-extractor-backfill"},{"openapi":"post /api/v2/custom-extractor/purge-findings","title":"Purge Custom Extractor Findings","href":"/v2-api-reference/custom-extractors/purge-custom-extractor-findings"}]},{"group":"Transcript","pages":[{"openapi":"post /api/v2/transcript/search","title":"Search Call Transcripts","href":"/v2-api-reference/transcript/search-call-transcripts"},{"openapi":"post /api/v2/transcript/entity-evidence","title":"Get Entity Evidence","href":"/v2-api-reference/transcript/get-entity-evidence"}]},{"group":"Suggestions","pages":[{"openapi":"get /api/v2/suggestion/list","title":"List Suggestions","href":"/v2-api-reference/suggestions/list-suggestions"},{"openapi":"get /api/v2/suggestion/get","title":"Get Suggestion","href":"/v2-api-reference/suggestions/get-suggestion"},{"openapi":"post /api/v2/suggestion/create","title":"Create Suggestion","href":"/v2-api-reference/suggestions/create-suggestion"},{"openapi":"post /api/v2/suggestion/update","title":"Update Suggestion","href":"/v2-api-reference/suggestions/update-suggestion"},{"openapi":"post /api/v2/suggestion/accept","title":"Accept Suggestion","href":"/v2-api-reference/suggestions/accept-suggestion"},{"openapi":"post /api/v2/suggestion/reject","title":"Reject Suggestion","href":"/v2-api-reference/suggestions/reject-suggestion"}]},{"group":"Revisions","pages":[{"openapi":"get /api/v2/revision/list","title":"List Revisions","href":"/v2-api-reference/revision/list-revisions"},{"openapi":"get /api/v2/revision/get","title":"Get Revision","href":"/v2-api-reference/revision/get-revision"}]},{"group":"Insights","pages":[{"openapi":"get /api/v2/insights/top-entities","title":"Top Entities","href":"/v2-api-reference/insights/top-entities"},{"openapi":"get /api/v2/insights/entity-stats","title":"Entity Stats","href":"/v2-api-reference/insights/entity-stats"},{"openapi":"get /api/v2/insights/entity-time-series","title":"Entity Time Series","href":"/v2-api-reference/insights/entity-time-series"},{"openapi":"get /api/v2/insights/competitive","title":"Competitive Landscape","href":"/v2-api-reference/insights/competitive-landscape"},{"openapi":"get /api/v2/insights/library-health","title":"Library Health","href":"/v2-api-reference/insights/library-health"},{"openapi":"get /api/v2/insights/workspace-baseline","title":"Workspace Baseline","href":"/v2-api-reference/insights/workspace-baseline"},{"openapi":"get /api/v2/insights/entity-usage","title":"Entity Usage","href":"/v2-api-reference/insights/entity-usage"}]},{"group":"Intel","pages":[{"openapi":"get /api/v2/intel/list","title":"List intel","href":"/v2-api-reference/intel/list-intel"},{"openapi":"get /api/v2/intel/get","title":"Get intel","href":"/v2-api-reference/intel/get-intel"}]},{"group":"Tag Group","pages":[{"openapi":"get /api/v2/tag-group/list","title":"List Tag Groups","href":"/v2-api-reference/tag-group/list-tag-groups"},{"openapi":"post /api/v2/tag-group/create","title":"Create Tag Group","href":"/v2-api-reference/tag-group/create-tag-group"},{"openapi":"post /api/v2/tag-group/update","title":"Update Tag Group","href":"/v2-api-reference/tag-group/update-tag-group"},{"openapi":"delete /api/v2/tag-group/delete","title":"Delete Tag Group","href":"/v2-api-reference/tag-group/delete-tag-group"},{"openapi":"get /api/v2/tag-group/assignments","title":"List Tag Group Assignments","href":"/v2-api-reference/tag-group/list-tag-group-assignments"},{"openapi":"get /api/v2/tag-group/performance","title":"Get Tag Group Performance","href":"/v2-api-reference/tag-group/get-tag-group-performance"},{"openapi":"post /api/v2/tag-group/backfill","title":"Backfill Tag Group","href":"/v2-api-reference/tag-group/backfill-tag-group"}]},{"group":"Tag","pages":[{"openapi":"post /api/v2/tag/create","title":"Create Tag","href":"/v2-api-reference/tag/create-tag"},{"openapi":"post /api/v2/tag/update","title":"Update Tag","href":"/v2-api-reference/tag/update-tag"},{"openapi":"delete /api/v2/tag/delete","title":"Delete Tag","href":"/v2-api-reference/tag/delete-tag"},{"openapi":"post /api/v2/tag/assign","title":"Assign Tag","href":"/v2-api-reference/tag/assign-tag"},{"openapi":"post /api/v2/tag/unassign","title":"Unassign Tag","href":"/v2-api-reference/tag/unassign-tag"}]},{"group":"Reports","pages":[{"openapi":"get /api/v2/report-group/list","title":"List report groups","href":"/v2-api-reference/reportgroup/list-report-groups"},{"openapi":"get /api/v2/report-group/get","title":"Get a report group","href":"/v2-api-reference/reportgroup/get-a-report-group"},{"openapi":"get /api/v2/report-config/list","title":"List report configs","href":"/v2-api-reference/reportconfig/list-report-configs"},{"openapi":"get /api/v2/report-config/get","title":"Get a report config","href":"/v2-api-reference/reportconfig/get-a-report-config"},{"openapi":"get /api/v2/report-run/list","title":"List report runs","href":"/v2-api-reference/reportrun/list-report-runs"},{"openapi":"get /api/v2/report-run/get","title":"Get a report run","href":"/v2-api-reference/reportrun/get-a-report-run"}]},{"group":"CRM","pages":[{"openapi":"get /api/v2/crm/get-entity-schema","title":"Get CRM Entity Schema","href":"/v2-api-reference/crm/get-crm-entity-schema"}]},{"group":"Sources","pages":[{"title":"Get Source","openapi":"get /api/v2/resource/get","href":"/v2-api-reference/resource/get-resource"},{"title":"List Sources","openapi":"get /api/v2/resource/list","href":"/v2-api-reference/resource/list-resources"},{"title":"Create Source","openapi":"post /api/v2/resource/create","href":"/v2-api-reference/resource/create-resource"},{"title":"Delete Source(s)","openapi":"post /api/v2/resource/delete","href":"/v2-api-reference/resource/delete-resources"},{"title":"Get Source Status","openapi":"get /api/v2/resource/status","href":"/v2-api-reference/resource/get-resource-status"},{"title":"Search Sources","openapi":"post /api/v2/resource/search","href":"/v2-api-reference/resource/search-resources"},{"title":"Check Source Drift","openapi":"post /api/v2/resource/check-drift","href":"/v2-api-reference/resource/check-resource-drift"},{"title":"Link Entities to Source","openapi":"post /api/v2/resource/link-entities","href":"/v2-api-reference/resource/link-entities-to-resource"}]},{"group":"Skill","pages":[{"openapi":"get /api/v2/skill/list","title":"List Skills","href":"/v2-api-reference/skill/list-skills"},{"openapi":"get /api/v2/skill/get","title":"Get Skill","href":"/v2-api-reference/skill/get-skill"},{"openapi":"get /api/v2/skill/file","title":"Get Skill File","href":"/v2-api-reference/skill/get-skill-file"},{"openapi":"post /api/v2/skill/create","title":"Create Skill","href":"/v2-api-reference/skill/create-skill"},{"openapi":"post /api/v2/skill/update","title":"Update Skill","href":"/v2-api-reference/skill/update-skill"},{"openapi":"post /api/v2/skill/delete","title":"Delete Skill","href":"/v2-api-reference/skill/delete-skill"},{"openapi":"post /api/v2/skill/find","title":"Find Skill","href":"/v2-api-reference/skill/find-skill"}]},{"group":"Asset","pages":[{"title":"Publishing Assets via API","href":"/v2-api-reference/asset/publishing-assets"},{"openapi":"get /api/v2/asset/list","title":"List Assets","href":"/v2-api-reference/asset/list-assets"},{"openapi":"get /api/v2/asset/get","title":"Get Asset","href":"/v2-api-reference/asset/get-asset"},{"openapi":"post /api/v2/asset/update","title":"Update Asset","href":"/v2-api-reference/asset/update-asset"},{"openapi":"delete /api/v2/asset/delete","title":"Delete Asset","href":"/v2-api-reference/asset/delete-asset"},{"openapi":"get /api/v2/asset/stats","title":"Get Asset Stats","href":"/v2-api-reference/asset/get-asset-stats"},{"openapi":"get /api/v2/asset/visitors","title":"List Asset Visitors","href":"/v2-api-reference/asset/list-asset-visitors"},{"openapi":"get /api/v2/asset/versions/list","title":"List Asset Versions","href":"/v2-api-reference/asset/list-asset-versions"},{"openapi":"post /api/v2/asset/versions/restore","title":"Restore Asset Version","href":"/v2-api-reference/asset/restore-asset-version"},{"openapi":"delete /api/v2/asset/versions/delete","title":"Delete Asset Version","href":"/v2-api-reference/asset/delete-asset-version"},{"openapi":"get /api/v2/asset/shares/list","title":"List Asset Shares","href":"/v2-api-reference/asset/list-asset-shares"},{"openapi":"post /api/v2/asset/shares/create","title":"Create Asset Share","href":"/v2-api-reference/asset/create-asset-share"},{"openapi":"delete /api/v2/asset/shares/revoke","title":"Revoke Asset Share","href":"/v2-api-reference/asset/revoke-asset-share"},{"openapi":"post /api/v2/asset/shares/add-recipients","title":"Add Asset Share Recipients","href":"/v2-api-reference/asset/add-asset-share-recipients"},{"openapi":"post /api/v2/asset/shares/remove-recipients","title":"Remove Asset Share Recipients","href":"/v2-api-reference/asset/remove-asset-share-recipients"},{"openapi":"post /api/v2/asset/shares/add-domains","title":"Add Asset Share Domains","href":"/v2-api-reference/asset/add-asset-share-domains"},{"openapi":"post /api/v2/asset/shares/remove-domains","title":"Remove Asset Share Domains","href":"/v2-api-reference/asset/remove-asset-share-domains"},{"openapi":"get /api/v2/asset/access-requests/list","title":"List Asset Access Requests","href":"/v2-api-reference/asset/list-asset-access-requests"},{"openapi":"post /api/v2/asset/access-requests/grant","title":"Grant Asset Access Request","href":"/v2-api-reference/asset/grant-asset-access-request"},{"openapi":"post /api/v2/asset/access-requests/dismiss","title":"Dismiss Asset Access Request","href":"/v2-api-reference/asset/dismiss-asset-access-request"},{"openapi":"post /api/v2/asset/access-token/generate","title":"Generate Asset Access Token","href":"/v2-api-reference/asset/generate-asset-access-token"},{"openapi":"post /api/v2/asset/access-token/refresh","title":"Refresh Asset Access Token","href":"/v2-api-reference/asset/refresh-asset-access-token"},{"openapi":"post /api/v2/asset/transfer","title":"Transfer Asset","href":"/v2-api-reference/asset/transfer-asset"}]},{"group":"Workspace Company","pages":[{"openapi":"get /api/v2/workspace-company/get","title":"Get Workspace Company","href":"/v2-api-reference/workspace-company/get-workspace-company"},{"openapi":"post /api/v2/workspace-company/update","title":"Update Workspace Company","href":"/v2-api-reference/workspace-company/update-workspace-company"},{"openapi":"post /api/v2/workspace-company/generate","title":"Generate Workspace Company","href":"/v2-api-reference/workspace-company/generate-workspace-company"}]},{"group":"Legacy Playbooks","pages":[{"title":"Legacy Playbooks (deprecated)","href":"/concepts/playbooks"},{"openapi":"get /api/v2/playbook/list","title":"List Playbooks","href":"/v2-api-reference/playbook/list-playbooks"},{"openapi":"get /api/v2/playbook/get","title":"Get Playbook","href":"/v2-api-reference/playbook/get-playbook"},{"openapi":"post /api/v2/playbook/create","title":"Create Playbook","href":"/v2-api-reference/playbook/create-playbook"},{"openapi":"post /api/v2/playbook/update","title":"Update Playbook","href":"/v2-api-reference/playbook/update-playbook"},{"openapi":"delete /api/v2/playbook/delete","title":"Delete Playbook","href":"/v2-api-reference/playbook/delete-playbook"}]}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/mcp/overview"}]}]},"title":"Log Event - Octave API","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-BRm_l__d.js","utils-f1l1Oc-G.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BlhqDhJO.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DHCB7rsC.js","snippetPresets-CYXLx6Hv.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-B78P2dEq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C4YLPVAh.js","shallow-vlLnTDkQ.js","getApiPlaygroundDisplay-D_98hhvf.js","CodeSnippet-DtnZHGqq.js","CodeSnippets-CLFb8KJt.js","Page-kQh739Uz.js","getPastedJson-Cq-zlbnU.js","icon-sN3t983t.js","MethodPill-P_YQ2s09.js","DuplicateIcon-BVzyNsGJ.js","createIcon-B3jqgqC6.js","DynamicMarkdown-Crwq6WG_.js","SectionHeading-C7pGS2Bb.js","axios-vUo_bRtp.js","Markdown-BuPH8yuW.js","clsx-CCOYKgaU.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BnkC_6oA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BM4S31-f.js"]}