Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously.
One import job is created per event type present in the request; each job is tracked independently via GET /event/import/status.
Deduplication: supply eventId on each event for predictable dedupe, otherwise a deterministic ID is derived from the event’s content. Events whose ID matches an existing event in the workspace are skipped (reported as preSkipped); duplicate IDs within one request keep the first occurrence (later indices reported in duplicatesInBatch). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job’s skipped count, never as a second event.
Skipped vs failed: only processable event types produce analytics events (email sent/reply, call transcript, all CRM types, all social types) — other event types are accepted but land in the job’s skipped count, alongside duplicates and internal-only events. ingested is the authoritative success count.
Callback: if callbackUrl is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is { jobOId, provider, status, counts, completedAt } with the same counts object the status endpoint returns, sent with an X-Request-Id header.
Limits: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued).
Validation is all-or-nothing: a 400 means nothing in the request was imported; the message lists the offending zero-based indices.
Authentication: api_key header. Requires the analytics and write-API entitlements.
1 to 1000 events. Types can be mixed in one request; each event carries a type discriminator (email | call | crm | social) and otherwise follows the same structure as the single-event webhook for that type. Each serialized event must be under 1,000,000 bytes.
{"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/bulk-import-events","slug":"/v2-api-reference/events/bulk-import-events","pageMetadata":{"openapi":"post /api/v2/event/import","title":"Bulk import events","description":"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously.\n\nOne import job is created per event type present in the request; each job is tracked independently via GET /event/import/status.\n\n**Deduplication**: supply `eventId` on each event for predictable dedupe, otherwise a deterministic ID is derived from the event's content. Events whose ID matches an existing event in the workspace are skipped (reported as `preSkipped`); duplicate IDs within one request keep the first occurrence (later indices reported in `duplicatesInBatch`). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job's `skipped` count, never as a second event.\n\n**Skipped vs failed**: only processable event types produce analytics events (email `sent`/`reply`, call `transcript`, all CRM types, all social types) — other event types are accepted but land in the job's `skipped` count, alongside duplicates and internal-only events. `ingested` is the authoritative success count.\n\n**Callback**: if `callbackUrl` is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is `{ jobOId, provider, status, counts, completedAt }` with the same `counts` object the status endpoint returns, sent with an `X-Request-Id` header.\n\n**Limits**: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued).\n\n**Validation is all-or-nothing**: a 400 means nothing in the request was imported; the message lists the offending zero-based indices.\n\n**Authentication**: `api_key` header. Requires the analytics and write-API entitlements.","href":"/v2-api-reference/events/bulk-import-events"},"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 p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"One import job is created per event type present in the request; each job is tracked independently via GET /event/import/status.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Deduplication\"\n }), \": supply \", _jsx(_components.code, {\n children: \"eventId\"\n }), \" on each event for predictable dedupe, otherwise a deterministic ID is derived from the event’s content. Events whose ID matches an existing event in the workspace are skipped (reported as \", _jsx(_components.code, {\n children: \"preSkipped\"\n }), \"); duplicate IDs within one request keep the first occurrence (later indices reported in \", _jsx(_components.code, {\n children: \"duplicatesInBatch\"\n }), \"). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job’s \", _jsx(_components.code, {\n children: \"skipped\"\n }), \" count, never as a second event.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Skipped vs failed\"\n }), \": only processable event types produce analytics events (email \", _jsx(_components.code, {\n children: \"sent\"\n }), \"/\", _jsx(_components.code, {\n children: \"reply\"\n }), \", call \", _jsx(_components.code, {\n children: \"transcript\"\n }), \", all CRM types, all social types) — other event types are accepted but land in the job’s \", _jsx(_components.code, {\n children: \"skipped\"\n }), \" count, alongside duplicates and internal-only events. \", _jsx(_components.code, {\n children: \"ingested\"\n }), \" is the authoritative success count.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Callback\"\n }), \": if \", _jsx(_components.code, {\n children: \"callbackUrl\"\n }), \" is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is \", _jsx(_components.code, {\n children: \"{ jobOId, provider, status, counts, completedAt }\"\n }), \" with the same \", _jsx(_components.code, {\n children: \"counts\"\n }), \" object the status endpoint returns, sent with an \", _jsx(_components.code, {\n children: \"X-Request-Id\"\n }), \" header.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Limits\"\n }), \": 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Validation is all-or-nothing\"\n }), \": a 400 means nothing in the request was imported; the message lists the offending zero-based indices.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Authentication\"\n }), \": \", _jsx(_components.code, {\n children: \"api_key\"\n }), \" header. Requires the analytics and write-API entitlements.\"]\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/event/import","title":"Bulk import events","description":"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously.\n\nOne import job is created per event type present in the request; each job is tracked independently via GET /event/import/status.\n\n**Deduplication**: supply `eventId` on each event for predictable dedupe, otherwise a deterministic ID is derived from the event's content. Events whose ID matches an existing event in the workspace are skipped (reported as `preSkipped`); duplicate IDs within one request keep the first occurrence (later indices reported in `duplicatesInBatch`). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job's `skipped` count, never as a second event.\n\n**Skipped vs failed**: only processable event types produce analytics events (email `sent`/`reply`, call `transcript`, all CRM types, all social types) — other event types are accepted but land in the job's `skipped` count, alongside duplicates and internal-only events. `ingested` is the authoritative success count.\n\n**Callback**: if `callbackUrl` is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is `{ jobOId, provider, status, counts, completedAt }` with the same `counts` object the status endpoint returns, sent with an `X-Request-Id` header.\n\n**Limits**: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued).\n\n**Validation is all-or-nothing**: a 400 means nothing in the request was imported; the message lists the offending zero-based indices.\n\n**Authentication**: `api_key` header. Requires the analytics and write-API entitlements.","href":"/v2-api-reference/events/bulk-import-events"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/octave/ad2757b864166314/schema.js"],"openApiReferenceData":{"operation":{"deprecated":false,"operationId":"importEvents","summary":"Bulk import events","description":"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously.\n\nOne import job is created per event type present in the request; each job is tracked independently via GET /event/import/status.\n\n**Deduplication**: supply `eventId` on each event for predictable dedupe, otherwise a deterministic ID is derived from the event's content. Events whose ID matches an existing event in the workspace are skipped (reported as `preSkipped`); duplicate IDs within one request keep the first occurrence (later indices reported in `duplicatesInBatch`). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job's `skipped` count, never as a second event.\n\n**Skipped vs failed**: only processable event types produce analytics events (email `sent`/`reply`, call `transcript`, all CRM types, all social types) — other event types are accepted but land in the job's `skipped` count, alongside duplicates and internal-only events. `ingested` is the authoritative success count.\n\n**Callback**: if `callbackUrl` is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is `{ jobOId, provider, status, counts, completedAt }` with the same `counts` object the status endpoint returns, sent with an `X-Request-Id` header.\n\n**Limits**: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued).\n\n**Validation is all-or-nothing**: a 400 means nothing in the request was imported; the message lists the offending zero-based indices.\n\n**Authentication**: `api_key` header. Requires the analytics and write-API entitlements.","tags":["Events"],"x-visibility":"public","requestBody":"05ba5f75-b660-483e-a2e3-8463d715812c","responses":{"200":"b218d25e-e581-4d51-a501-a49fd95b2314","400":"adae1129-b2c0-4443-b5fb-86ba1ae0aefd"},"method":"post","type":"path","servers":["80f2e4ba-6bdd-4b60-98d6-f0697e937bc7"],"security":["488bd04d-b181-41af-8ce0-a9e9dcfaa69b"],"path":"/api/v2/event/import","baseUrlOptions":["https://app.octavehq.com"],"title":"Bulk import events","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"oneOf":[{"type":"object","title":"Email Event","required":["eventTimestamp","eventType","subject","body","from","to","type"],"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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.0.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","enum":["sent","reply","opened","clicked","bounced","unsubscribed"],"description":"Type of email event. Only 'sent' and 'reply' are processed for analytics; others are ingested but not processed.","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.eventType","typeLabel":"enum\u003cstring>"},"subject":{"type":"string","description":"Email subject line","example":"Follow up on our conversation","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.subject","typeLabel":"string"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"events.items.[INDEX].oneOf.0.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"events.items.[INDEX].oneOf.0.body.html","typeLabel":"string"}},"description":"Email body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"events.items.[INDEX].oneOf.0.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"events.items.[INDEX].oneOf.0.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"events.items.[INDEX].oneOf.0.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.to","typeLabel":"object[]"},"type":{"type":"string","enum":["email"],"description":"Event type discriminator","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"cc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.cc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"events.items.[INDEX].oneOf.0.cc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"events.items.[INDEX].oneOf.0.cc.items.[INDEX]","typeLabel":"object"},"description":"CC recipients","uniqueKey":"events.items.[INDEX].oneOf.0.cc","typeLabel":"object[]"},"bcc":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.0.bcc.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","uniqueKey":"events.items.[INDEX].oneOf.0.bcc.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"events.items.[INDEX].oneOf.0.bcc.items.[INDEX]","typeLabel":"object"},"description":"BCC recipients","uniqueKey":"events.items.[INDEX].oneOf.0.bcc","typeLabel":"object[]"},"eventId":{"type":"string","maxLength":255,"description":"Explicit event ID for deduplication (max 255 characters). Set it from your row's stable primary key so a re-run of the same batch comes back as `preSkipped` instead of duplicating; a corrected re-send under the same ID is skipped too, so a fix to an already-ingested event needs Octave to erase it first or a new ID. IDs are unique across every event type in the workspace. When omitted, an ID is derived from the event's content using the same rules as the single-event webhook.","example":"deal_12345_created","uniqueKey":"events.items.[INDEX].oneOf.0.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":"events.items.[INDEX].oneOf.0.messageId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related emails","uniqueKey":"events.items.[INDEX].oneOf.0.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping campaign emails","uniqueKey":"events.items.[INDEX].oneOf.0.campaignId","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.0.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"events.items.[INDEX].oneOf.0.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"events.items.[INDEX].oneOf.0.customMetadata.additionalProperties","typeLabel":"null"},"description":"Arbitrary key-value metadata","uniqueKey":"events.items.[INDEX].oneOf.0.customMetadata","typeLabel":"object"}},"uniqueKey":"events.items.[INDEX].oneOf.0","typeLabel":"Email Event · object"},{"type":"object","title":"Call Event","required":["eventTimestamp","eventType","title","transcript","participants","type"],"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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.1.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.1.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","enum":["transcript","scheduled","completed","missed"],"description":"Type of call event. Only 'transcript' is processed for analytics; others are ingested but not processed.","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.1.eventType","typeLabel":"enum\u003cstring>"},"title":{"type":"string","description":"Call/meeting title","example":"Discovery Call - Acme Corp","isRequired":true,"uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.1.transcript.oneOf.1.items.[INDEX].speaker.name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.1.transcript.oneOf.1.items.[INDEX].speaker.role","typeLabel":"enum\u003cstring>"}},"required":["name"],"isRequired":true,"uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.1.transcript.oneOf.1.items.[INDEX].timestamp","typeLabel":"string"}},"required":["speaker","text"],"uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.1.transcript.oneOf.1","typeLabel":"object[]"}],"isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.1.transcript","typeLabel":"string | object[]"},"participants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Sarah Johnson","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.1.participants.items.[INDEX].name","typeLabel":"string"},"email":{"type":"string","format":"email","example":"sarah@company.com","uniqueKey":"events.items.[INDEX].oneOf.1.participants.items.[INDEX].email","typeLabel":"string\u003cemail>"},"role":{"type":"string","enum":["internal","external"],"uniqueKey":"events.items.[INDEX].oneOf.1.participants.items.[INDEX].role","typeLabel":"enum\u003cstring>"}},"required":["name"],"uniqueKey":"events.items.[INDEX].oneOf.1.participants.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Call participants (at least one required)","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.1.participants","typeLabel":"object[]"},"type":{"type":"string","enum":["call"],"description":"Event type discriminator","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Call duration in seconds","example":1800,"uniqueKey":"events.items.[INDEX].oneOf.1.duration","typeLabel":"number"},"recordingUrl":{"type":"string","format":"uri","description":"URL to the call recording","uniqueKey":"events.items.[INDEX].oneOf.1.recordingUrl","typeLabel":"string\u003curi>"},"meetingPlatform":{"type":"string","description":"Meeting platform (e.g., 'zoom', 'teams', 'meet')","example":"zoom","uniqueKey":"events.items.[INDEX].oneOf.1.meetingPlatform","typeLabel":"string"},"eventId":{"type":"string","maxLength":255,"description":"Explicit event ID for deduplication (max 255 characters). Set it from your row's stable primary key so a re-run of the same batch comes back as `preSkipped` instead of duplicating; a corrected re-send under the same ID is skipped too, so a fix to an already-ingested event needs Octave to erase it first or a new ID. IDs are unique across every event type in the workspace. When omitted, an ID is derived from the event's content using the same rules as the single-event webhook.","example":"deal_12345_created","uniqueKey":"events.items.[INDEX].oneOf.1.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation ID for grouping related calls","uniqueKey":"events.items.[INDEX].oneOf.1.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":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.1.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"events.items.[INDEX].oneOf.1.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"events.items.[INDEX].oneOf.1.customMetadata.additionalProperties","typeLabel":"null"},"description":"Arbitrary key-value metadata","uniqueKey":"events.items.[INDEX].oneOf.1.customMetadata","typeLabel":"object"}},"uniqueKey":"events.items.[INDEX].oneOf.1","typeLabel":"Call Event · object"},{"type":"object","title":"CRM Event","required":["eventTimestamp","eventType","opportunityId","opportunityName","type"],"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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.2.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","enum":["opportunity_created","deal_won","deal_lost","meeting_booked"],"description":"Type of CRM event","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.2.eventType","typeLabel":"enum\u003cstring>"},"opportunityId":{"type":"string","maxLength":200,"description":"External opportunity/deal ID (max 200 characters — it is a prefix of the derived dedupe ID when `eventId` is omitted)","example":"opp_12345","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.2.opportunityId","typeLabel":"string"},"opportunityName":{"type":"string","description":"Name of the opportunity/deal","example":"Acme Corp - Enterprise Plan","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.2.opportunityName","typeLabel":"string"},"type":{"type":"string","enum":["crm"],"description":"Event type discriminator","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"eventId":{"type":"string","maxLength":255,"description":"Explicit event ID for deduplication (max 255 characters). Set it from your row's stable primary key so a re-run of the same batch comes back as `preSkipped` instead of duplicating; a corrected re-send under the same ID is skipped too, so a fix to an already-ingested event needs Octave to erase it first or a new ID. IDs are unique across every event type in the workspace. When omitted, an ID is derived from the event's content using the same rules as the single-event webhook.","example":"deal_12345_created","uniqueKey":"events.items.[INDEX].oneOf.2.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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.amount.oneOf.1","typeLabel":"string"}],"uniqueKey":"events.items.[INDEX].oneOf.2.amount","typeLabel":"number | string"},"currency":{"type":"string","description":"ISO currency code for amount","example":"USD","uniqueKey":"events.items.[INDEX].oneOf.2.currency","typeLabel":"string"},"stage":{"type":"string","description":"Deal stage","example":"Qualification","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.stageCategory","typeLabel":"enum\u003cstring>"},"crmPipelineId":{"type":"string","description":"Pipeline/record-type ID the deal belongs to","uniqueKey":"events.items.[INDEX].oneOf.2.crmPipelineId","typeLabel":"string"},"crmPipelineName":{"type":"string","description":"Human-readable pipeline name","example":"Sales","uniqueKey":"events.items.[INDEX].oneOf.2.crmPipelineName","typeLabel":"string"},"accountName":{"type":"string","description":"Account/company name","example":"Acme Corp","uniqueKey":"events.items.[INDEX].oneOf.2.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":"events.items.[INDEX].oneOf.2.crmAccountId","typeLabel":"string"},"crmAccountDomain":{"type":"string","description":"Account domain, used to link events by company","example":"acme.com","uniqueKey":"events.items.[INDEX].oneOf.2.crmAccountDomain","typeLabel":"string"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email","example":"john@acme.com","uniqueKey":"events.items.[INDEX].oneOf.2.contactEmail","typeLabel":"string\u003cemail>"},"contactEmails":{"type":"array","items":{"type":"string","format":"email","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.contactEmails","typeLabel":"string\u003cemail>[]"},"ownerName":{"type":"string","description":"Deal owner's display name","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.ownerEmail","typeLabel":"string\u003cemail>"},"crmOwnerId":{"type":"string","description":"Your system's owner/user ID, joinable against your own tables","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.lossReason","typeLabel":"string"},"mergedOpportunityIds":{"type":"array","items":{"type":"string","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.mergedOpportunityIds","typeLabel":"string[]"},"contactName":{"type":"string","description":"Primary contact name","example":"John Smith","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.closeDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.createdDate.oneOf.1","typeLabel":"number"}],"uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.2.crmLastModifiedAt.oneOf.1","typeLabel":"number"}],"uniqueKey":"events.items.[INDEX].oneOf.2.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":"events.items.[INDEX].oneOf.2.sourceProviderName","typeLabel":"string"},"customMetadata":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"events.items.[INDEX].oneOf.2.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"events.items.[INDEX].oneOf.2.customMetadata.additionalProperties","typeLabel":"null"},"description":"Arbitrary key-value metadata","uniqueKey":"events.items.[INDEX].oneOf.2.customMetadata","typeLabel":"object"}},"uniqueKey":"events.items.[INDEX].oneOf.2","typeLabel":"CRM Event · object"},{"type":"object","title":"Social Event","required":["eventTimestamp","eventType","body","from","to","type"],"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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.3.eventTimestamp.oneOf.1","typeLabel":"number"}],"isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.eventTimestamp","typeLabel":"string | number"},"eventType":{"type":"string","enum":["connection_sent","connection_accepted","message_sent","message_received"],"description":"Type of social event (LinkedIn/social outreach). All types are processed for analytics.","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.eventType","typeLabel":"enum\u003cstring>"},"body":{"type":"object","properties":{"text":{"type":"string","description":"Plain text body","uniqueKey":"events.items.[INDEX].oneOf.3.body.text","typeLabel":"string"},"html":{"type":"string","description":"HTML body","uniqueKey":"events.items.[INDEX].oneOf.3.body.html","typeLabel":"string"}},"description":"Message body. At least one of text or html must be provided.","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.body","typeLabel":"object"},"from":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"sender@company.com","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.from.email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"Sarah Johnson","uniqueKey":"events.items.[INDEX].oneOf.3.from.name","typeLabel":"string"}},"required":["email"],"description":"Sender","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.from","typeLabel":"object"},"to":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"recipient@prospect.com","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.to.items.[INDEX].email","typeLabel":"string\u003cemail>"},"name":{"type":"string","example":"John Smith","uniqueKey":"events.items.[INDEX].oneOf.3.to.items.[INDEX].name","typeLabel":"string"}},"required":["email"],"uniqueKey":"events.items.[INDEX].oneOf.3.to.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"Recipients (at least one required)","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.to","typeLabel":"object[]"},"type":{"type":"string","enum":["social"],"description":"Event type discriminator","isRequired":true,"uniqueKey":"events.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"subject":{"type":"string","description":"Subject or topic of the message","uniqueKey":"events.items.[INDEX].oneOf.3.subject","typeLabel":"string"},"eventId":{"type":"string","maxLength":255,"description":"Explicit event ID for deduplication (max 255 characters). Set it from your row's stable primary key so a re-run of the same batch comes back as `preSkipped` instead of duplicating; a corrected re-send under the same ID is skipped too, so a fix to an already-ingested event needs Octave to erase it first or a new ID. IDs are unique across every event type in the workspace. When omitted, an ID is derived from the event's content using the same rules as the single-event webhook.","example":"deal_12345_created","uniqueKey":"events.items.[INDEX].oneOf.3.eventId","typeLabel":"string"},"conversationId":{"type":"string","description":"Conversation/thread ID for grouping related messages","uniqueKey":"events.items.[INDEX].oneOf.3.conversationId","typeLabel":"string"},"campaignId":{"type":"string","description":"Campaign ID for grouping","uniqueKey":"events.items.[INDEX].oneOf.3.campaignId","typeLabel":"string"},"messageType":{"type":"string","description":"Message type (e.g. message, inmail, connection_request)","uniqueKey":"events.items.[INDEX].oneOf.3.messageType","typeLabel":"string"},"campaignName":{"type":"string","description":"Campaign name","uniqueKey":"events.items.[INDEX].oneOf.3.campaignName","typeLabel":"string"},"octaveRequestId":{"type":"string","description":"Octave request ID for tracking","uniqueKey":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].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":"events.items.[INDEX].oneOf.3.crmAccountDomain","typeLabel":"string"},"customMetadata":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"events.items.[INDEX].oneOf.3.customMetadata.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"events.items.[INDEX].oneOf.3.customMetadata.additionalProperties","typeLabel":"null"},"description":"Arbitrary key-value metadata","uniqueKey":"events.items.[INDEX].oneOf.3.customMetadata","typeLabel":"object"}},"uniqueKey":"events.items.[INDEX].oneOf.3","typeLabel":"Social Event · object"}],"uniqueKey":"events.items.[INDEX]","typeLabel":"Email Event · object | Call Event · object | CRM Event · object | Social Event · object"},"minItems":1,"maxItems":1000,"description":"1 to 1000 events. Types can be mixed in one request; each event carries a `type` discriminator (`email` | `call` | `crm` | `social`) and otherwise follows the same structure as the single-event webhook for that type. Each serialized event must be under 1,000,000 bytes.","isRequired":true,"uniqueKey":"events","typeLabel":"(Email Event · object | Call Event · object | CRM Event · object | Social Event · object)[]"},"callbackUrl":{"type":"string","format":"uri","description":"HTTPS URL to POST each job's final counts to on completion. Public hosts only — localhost, private ranges and cloud metadata endpoints are rejected.","example":"https://example.com/octave/import-complete","uniqueKey":"callbackUrl","typeLabel":"string\u003curi>"}},"required":["events"],"example":{"events":[{"type":"crm","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","contactEmails":["john@acme.com","priya@acme.com"],"ownerEmail":"rep@yourcompany.com","closeDate":"2024-03-31T00:00:00Z","crmLastModifiedAt":"2024-02-03T16:00:00Z","eventId":"deal_12345_created"},{"type":"email","eventTimestamp":"2024-02-03T10:30:00Z","eventType":"sent","subject":"Follow up on our conversation","body":{"text":"Hi John, just wanted to follow up..."},"from":{"email":"rep@yourcompany.com","name":"Sarah Johnson","title":"Account Executive","linkedInUrl":"https://www.linkedin.com/in/sarah-johnson"},"to":[{"email":"john@acme.com","name":"John Smith","title":"VP of Revenue Operations","linkedInUrl":"https://www.linkedin.com/in/john-smith"}],"crmOpportunityId":"opp_12345","eventId":"email_98765"},{"type":"call","eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":[{"speaker":{"name":"Sarah Johnson","email":"rep@yourcompany.com","role":"internal"},"text":"Thanks for making the time. What pushed you to look at this now?"},{"speaker":{"name":"John Smith","email":"john@acme.com","role":"external"},"text":"Our current process breaks down past about fifty reps."}],"participants":[{"name":"Sarah Johnson","email":"rep@yourcompany.com","role":"internal","title":"Account Executive","linkedInUrl":"https://www.linkedin.com/in/sarah-johnson"},{"name":"John Smith","email":"john@acme.com","role":"external","title":"VP of Revenue Operations","linkedInUrl":"https://www.linkedin.com/in/john-smith"}],"crmOpportunityId":"opp_12345","eventId":"call_55501"}]},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"events":[{"type":"crm","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","contactEmails":["john@acme.com","priya@acme.com"],"ownerEmail":"rep@yourcompany.com","closeDate":"2024-03-31T00:00:00Z","crmLastModifiedAt":"2024-02-03T16:00:00Z","eventId":"deal_12345_created"},{"type":"email","eventTimestamp":"2024-02-03T10:30:00Z","eventType":"sent","subject":"Follow up on our conversation","body":{"text":"Hi John, just wanted to follow up..."},"from":{"email":"rep@yourcompany.com","name":"Sarah Johnson","title":"Account Executive","linkedInUrl":"https://www.linkedin.com/in/sarah-johnson"},"to":[{"email":"john@acme.com","name":"John Smith","title":"VP of Revenue Operations","linkedInUrl":"https://www.linkedin.com/in/john-smith"}],"crmOpportunityId":"opp_12345","eventId":"email_98765"},{"type":"call","eventTimestamp":"2024-02-03T14:00:00Z","eventType":"transcript","title":"Discovery Call - Acme Corp","transcript":[{"speaker":{"name":"Sarah Johnson","email":"rep@yourcompany.com","role":"internal"},"text":"Thanks for making the time. What pushed you to look at this now?"},{"speaker":{"name":"John Smith","email":"john@acme.com","role":"external"},"text":"Our current process breaks down past about fifty reps."}],"participants":[{"name":"Sarah Johnson","email":"rep@yourcompany.com","role":"internal","title":"Account Executive","linkedInUrl":"https://www.linkedin.com/in/sarah-johnson"},{"name":"John Smith","email":"john@acme.com","role":"external","title":"VP of Revenue Operations","linkedInUrl":"https://www.linkedin.com/in/john-smith"}],"crmOpportunityId":"opp_12345","eventId":"call_55501"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"b218d25e-e581-4d51-a501-a49fd95b2314":{"description":"Import jobs created","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"},"jobs":{"type":"array","items":{"type":"object","properties":{"eventType":{"type":"string","enum":["email","call","crm","social"],"description":"The event type this job covers","isRequired":true,"uniqueKey":"jobs.items.[INDEX].eventType","typeLabel":"enum\u003cstring>"},"provider":{"type":"string","description":"The generic provider the events were imported under","example":"OCTAVE_GENERIC_CALL","isRequired":true,"uniqueKey":"jobs.items.[INDEX].provider","typeLabel":"string"},"jobOId":{"type":"string","description":"The import job OId — poll GET /event/import/status with this value","example":"pbj_3rgkoHhR00cEdE9DjKeIK","isRequired":true,"uniqueKey":"jobs.items.[INDEX].jobOId","typeLabel":"string"},"accepted":{"type":"integer","description":"Events queued for ingestion","isRequired":true,"uniqueKey":"jobs.items.[INDEX].accepted","typeLabel":"integer"},"preSkipped":{"type":"integer","description":"Events skipped immediately because the workspace already has an event with the same ID","isRequired":true,"uniqueKey":"jobs.items.[INDEX].preSkipped","typeLabel":"integer"},"duplicatesInBatch":{"type":"array","items":{"type":"integer","uniqueKey":"jobs.items.[INDEX].duplicatesInBatch.items.[INDEX]","typeLabel":"integer"},"description":"Zero-based request indices of events dropped because an earlier event in this request had the same ID","isRequired":true,"uniqueKey":"jobs.items.[INDEX].duplicatesInBatch","typeLabel":"integer[]"}},"required":["eventType","provider","jobOId","accepted","preSkipped","duplicatesInBatch"],"uniqueKey":"jobs.items.[INDEX]","typeLabel":"object"},"description":"One import job per event type present in the request","isRequired":true,"uniqueKey":"jobs","typeLabel":"object[]"},"totalAccepted":{"type":"integer","description":"Sum of accepted events across all jobs","isRequired":true,"uniqueKey":"totalAccepted","typeLabel":"integer"},"totalPreSkipped":{"type":"integer","description":"Sum of pre-skipped events across all jobs","isRequired":true,"uniqueKey":"totalPreSkipped","typeLabel":"integer"}},"required":["_metadata","jobs","totalAccepted","totalPreSkipped"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"_metadata":{"requestId":"requestId","timestamp":"2021-01-01T00:00:00.000Z","usage":0,"message":"message"},"jobs":[{"eventType":"email","provider":"OCTAVE_GENERIC_CALL","jobOId":"pbj_3rgkoHhR00cEdE9DjKeIK","accepted":123,"preSkipped":123,"duplicatesInBatch":[123]}],"totalAccepted":123,"totalPreSkipped":123}}},"exampleType":"generated"}},"exampleType":"generated"},"adae1129-b2c0-4443-b5fb-86ba1ae0aefd":{"description":"Validation failed — no events were imported. The message lists the offending event indices.","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":"Bulk import events - Octave API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-02T23:52:22.270Z","originalFileLocation":"v2-api-reference/events/bulk-import-events.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=\"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously. One import job is created per event type present in the request; each job is tracked independently via GET /event/import/status. Deduplication: supply eventId on each event for predictable dedupe, otherwise a deterministic ID is derived from the event\u0026#x27;s content. Events whose ID matches an existing event in the workspace are skipped (reported as preSkipped); duplicate IDs within one request keep the first occurrence (later indices reported in duplicatesInBatch). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job\u0026#x27;s skipped count, never as a second event. Skipped vs failed: only processable event types produce analytics events (email sent/reply, call transcript, all CRM types, all social types) — other event types are accepted but land in the job\u0026#x27;s skipped count, alongside duplicates and internal-only events. ingested is the authoritative success count. Callback: if callbackUrl is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is { jobOId, provider, status, counts, completedAt } with the same counts object the status endpoint returns, sent with an X-Request-Id header. Limits: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued). Validation is all-or-nothing: a 400 means nothing in the request was imported; the message lists the offending zero-based indices. Authentication: api_key header. Requires the analytics and write-API entitlements.\">\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=\"Bulk import events - Octave API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously. One import job is created per event type present in the request; each job is tracked independently via GET /event/import/status. Deduplication: supply eventId on each event for predictable dedupe, otherwise a deterministic ID is derived from the event\u0026#x27;s content. Events whose ID matches an existing event in the workspace are skipped (reported as preSkipped); duplicate IDs within one request keep the first occurrence (later indices reported in duplicatesInBatch). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job\u0026#x27;s skipped count, never as a second event. Skipped vs failed: only processable event types produce analytics events (email sent/reply, call transcript, all CRM types, all social types) — other event types are accepted but land in the job\u0026#x27;s skipped count, alongside duplicates and internal-only events. ingested is the authoritative success count. Callback: if callbackUrl is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is { jobOId, provider, status, counts, completedAt } with the same counts object the status endpoint returns, sent with an X-Request-Id header. Limits: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued). Validation is all-or-nothing: a 400 means nothing in the request was imported; the message lists the offending zero-based indices. Authentication: api_key header. Requires the analytics and write-API entitlements.\">\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/bulk-import-events\">\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=Bulk+import+events\u0026amp;description=Imports+a+batch+of+events+%28calls%2C+emails%2C+CRM%2C+social%29+into+the+analytics+pipeline.+Accepts+up+to+1000+events+per+request%3B+events+are+ingested+asynchronously.%0A%0A\u0026amp;theme=7aca23396e4d7872f604e192\u0026amp;signature=4c9cbd2a8fbe8939ae062fa3605a6f408d8002bc11ef1faed18ab2fd38c23610\">\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=\"Bulk import events - Octave API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously. One import job is created per event type present in the request; each job is tracked independently via GET /event/import/status. Deduplication: supply eventId on each event for predictable dedupe, otherwise a deterministic ID is derived from the event\u0026#x27;s content. Events whose ID matches an existing event in the workspace are skipped (reported as preSkipped); duplicate IDs within one request keep the first occurrence (later indices reported in duplicatesInBatch). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job\u0026#x27;s skipped count, never as a second event. Skipped vs failed: only processable event types produce analytics events (email sent/reply, call transcript, all CRM types, all social types) — other event types are accepted but land in the job\u0026#x27;s skipped count, alongside duplicates and internal-only events. ingested is the authoritative success count. Callback: if callbackUrl is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is { jobOId, provider, status, counts, completedAt } with the same counts object the status endpoint returns, sent with an X-Request-Id header. Limits: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued). Validation is all-or-nothing: a 400 means nothing in the request was imported; the message lists the offending zero-based indices. Authentication: api_key header. Requires the analytics and write-API entitlements.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://octave.mintlify.app/_mintlify/api/og/v2?division=Events\u0026amp;title=Bulk+import+events\u0026amp;description=Imports+a+batch+of+events+%28calls%2C+emails%2C+CRM%2C+social%29+into+the+analytics+pipeline.+Accepts+up+to+1000+events+per+request%3B+events+are+ingested+asynchronously.%0A%0A\u0026amp;theme=7aca23396e4d7872f604e192\u0026amp;signature=4c9cbd2a8fbe8939ae062fa3605a6f408d8002bc11ef1faed18ab2fd38c23610\">\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/bulk-import-events\">\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/bulk-import-events.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/bulk-import-events#webpage\",\"url\":\"https://docs.octavehq.com/v2-api-reference/events/bulk-import-events\",\"name\":\"Bulk import events\",\"description\":\"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously. One import job is created per event type present in the request; each job is tracked independently via GET /event/import/status. Deduplication: supply eventId on each event for predictable dedupe, otherwise a deterministic ID is derived from the event's content. Events whose ID matches an existing event in the workspace are skipped (reported as preSkipped); duplicate IDs within one request keep the first occurrence (later indices reported in duplicatesInBatch). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job's skipped count, never as a second event. Skipped vs failed: only processable event types produce analytics events (email sent/reply, call transcript, all CRM types, all social types) — other event types are accepted but land in the job's skipped count, alongside duplicates and internal-only events. ingested is the authoritative success count. Callback: if callbackUrl is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is { jobOId, provider, status, counts, completedAt } with the same counts object the status endpoint returns, sent with an X-Request-Id header. Limits: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued). Validation is all-or-nothing: a 400 means nothing in the request was imported; the message lists the offending zero-based indices. Authentication: api_key header. Requires the analytics and write-API entitlements.\",\"dateModified\":\"2026-09-02T23:52:22.270Z\",\"isPartOf\":{\"@id\":\"https://docs.octavehq.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/bulk-import-events#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/bulk-import-events#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Events\",\"item\":\"https://docs.octavehq.com/v2-api-reference/events/list-events\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bulk import events\",\"item\":\"https://docs.octavehq.com/v2-api-reference/events/bulk-import-events\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/bulk-import-events#apireference\",\"headline\":\"Bulk import events\",\"name\":\"Bulk import events\",\"description\":\"Imports a batch of events (calls, emails, CRM, social) into the analytics pipeline. Accepts up to 1000 events per request; events are ingested asynchronously. One import job is created per event type present in the request; each job is tracked independently via GET /event/import/status. Deduplication: supply eventId on each event for predictable dedupe, otherwise a deterministic ID is derived from the event's content. Events whose ID matches an existing event in the workspace are skipped (reported as preSkipped); duplicate IDs within one request keep the first occurrence (later indices reported in duplicatesInBatch). An event re-sent while its first copy is still being ingested is accepted again and de-duplicated at ingest instead — it lands in that job's skipped count, never as a second event. Skipped vs failed: only processable event types produce analytics events (email sent/reply, call transcript, all CRM types, all social types) — other event types are accepted but land in the job's skipped count, alongside duplicates and internal-only events. ingested is the authoritative success count. Callback: if callbackUrl is provided, each job POSTs its final counts to that URL once on completion (one callback per job; delivery is best-effort — poll the status endpoint as the source of truth). The callback body is { jobOId, provider, status, counts, completedAt } with the same counts object the status endpoint returns, sent with an X-Request-Id header. Limits: 30 requests per minute per API key; request body up to 30 MB; each serialized event under 1,000,000 bytes (oversized indices are rejected with a 400 before anything is queued). Validation is all-or-nothing: a 400 means nothing in the request was imported; the message lists the offending zero-based indices. Authentication: api_key header. Requires the analytics and write-API entitlements.\",\"url\":\"https://docs.octavehq.com/v2-api-reference/events/bulk-import-events\",\"mainEntityOfPage\":{\"@id\":\"https://docs.octavehq.com/v2-api-reference/events/bulk-import-events#webpage\"},\"dateModified\":\"2026-09-02T23:52:22.270Z\",\"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","description":null,"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","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":"Bulk import events - 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"]}