curl --request POST \
--url https://app.octavehq.com/api/v2/finding/search \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"query": "objections from prospects",
"customExtractorOIds": [
"<string>"
],
"findingOIds": [
"ex_PJkptnXMSRSuoUyYH2nBk"
],
"searchTerms": [
"<string>"
],
"startDate": "2026-08-01T00:00:00Z",
"endDate": "2023-11-07T05:31:56Z",
"eventFilters": {
"eventTypes": [],
"eventCategories": [],
"companyDomains": [
"<string>"
],
"opportunityIds": [
"<string>"
],
"contactEmails": [
"<string>"
],
"opportunityStatuses": [],
"minDealValue": 123,
"maxDealValue": 123,
"replyOutcomes": [],
"sentiments": [],
"callPurposes": [],
"personas": [
"<string>"
],
"playbooks": [
"<string>"
],
"competitors": [
"<string>"
],
"segments": [
"<string>"
],
"useCases": [
"<string>"
],
"references": [
"<string>"
],
"proofPoints": [
"<string>"
],
"outcomeFilters": "<unknown>",
"minDealAmount": "<unknown>",
"maxDealAmount": "<unknown>"
},
"speakerSide": "external",
"attributedPersonaOIds": [
"<string>"
],
"insightOId": "rcfg_XVPcS3dLZFqzfQIfSeCpk",
"limit": 100,
"offset": 0
}
'import requests
url = "https://app.octavehq.com/api/v2/finding/search"
payload = {
"query": "objections from prospects",
"customExtractorOIds": ["<string>"],
"findingOIds": ["ex_PJkptnXMSRSuoUyYH2nBk"],
"searchTerms": ["<string>"],
"startDate": "2026-08-01T00:00:00Z",
"endDate": "2023-11-07T05:31:56Z",
"eventFilters": {
"eventTypes": [],
"eventCategories": [],
"companyDomains": ["<string>"],
"opportunityIds": ["<string>"],
"contactEmails": ["<string>"],
"opportunityStatuses": [],
"minDealValue": 123,
"maxDealValue": 123,
"replyOutcomes": [],
"sentiments": [],
"callPurposes": [],
"personas": ["<string>"],
"playbooks": ["<string>"],
"competitors": ["<string>"],
"segments": ["<string>"],
"useCases": ["<string>"],
"references": ["<string>"],
"proofPoints": ["<string>"],
"outcomeFilters": "<unknown>",
"minDealAmount": "<unknown>",
"maxDealAmount": "<unknown>"
},
"speakerSide": "external",
"attributedPersonaOIds": ["<string>"],
"insightOId": "rcfg_XVPcS3dLZFqzfQIfSeCpk",
"limit": 100,
"offset": 0
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'objections from prospects',
customExtractorOIds: ['<string>'],
findingOIds: ['ex_PJkptnXMSRSuoUyYH2nBk'],
searchTerms: ['<string>'],
startDate: '2026-08-01T00:00:00Z',
endDate: '2023-11-07T05:31:56Z',
eventFilters: {
eventTypes: [],
eventCategories: [],
companyDomains: ['<string>'],
opportunityIds: ['<string>'],
contactEmails: ['<string>'],
opportunityStatuses: [],
minDealValue: 123,
maxDealValue: 123,
replyOutcomes: [],
sentiments: [],
callPurposes: [],
personas: ['<string>'],
playbooks: ['<string>'],
competitors: ['<string>'],
segments: ['<string>'],
useCases: ['<string>'],
references: ['<string>'],
proofPoints: ['<string>'],
outcomeFilters: '<unknown>',
minDealAmount: '<unknown>',
maxDealAmount: '<unknown>'
},
speakerSide: 'external',
attributedPersonaOIds: ['<string>'],
insightOId: 'rcfg_XVPcS3dLZFqzfQIfSeCpk',
limit: 100,
offset: 0
})
};
fetch('https://app.octavehq.com/api/v2/finding/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.octavehq.com/api/v2/finding/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'objections from prospects',
'customExtractorOIds' => [
'<string>'
],
'findingOIds' => [
'ex_PJkptnXMSRSuoUyYH2nBk'
],
'searchTerms' => [
'<string>'
],
'startDate' => '2026-08-01T00:00:00Z',
'endDate' => '2023-11-07T05:31:56Z',
'eventFilters' => [
'eventTypes' => [
],
'eventCategories' => [
],
'companyDomains' => [
'<string>'
],
'opportunityIds' => [
'<string>'
],
'contactEmails' => [
'<string>'
],
'opportunityStatuses' => [
],
'minDealValue' => 123,
'maxDealValue' => 123,
'replyOutcomes' => [
],
'sentiments' => [
],
'callPurposes' => [
],
'personas' => [
'<string>'
],
'playbooks' => [
'<string>'
],
'competitors' => [
'<string>'
],
'segments' => [
'<string>'
],
'useCases' => [
'<string>'
],
'references' => [
'<string>'
],
'proofPoints' => [
'<string>'
],
'outcomeFilters' => '<unknown>',
'minDealAmount' => '<unknown>',
'maxDealAmount' => '<unknown>'
],
'speakerSide' => 'external',
'attributedPersonaOIds' => [
'<string>'
],
'insightOId' => 'rcfg_XVPcS3dLZFqzfQIfSeCpk',
'limit' => 100,
'offset' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api_key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.octavehq.com/api/v2/finding/search"
payload := strings.NewReader("{\n \"query\": \"objections from prospects\",\n \"customExtractorOIds\": [\n \"<string>\"\n ],\n \"findingOIds\": [\n \"ex_PJkptnXMSRSuoUyYH2nBk\"\n ],\n \"searchTerms\": [\n \"<string>\"\n ],\n \"startDate\": \"2026-08-01T00:00:00Z\",\n \"endDate\": \"2023-11-07T05:31:56Z\",\n \"eventFilters\": {\n \"eventTypes\": [],\n \"eventCategories\": [],\n \"companyDomains\": [\n \"<string>\"\n ],\n \"opportunityIds\": [\n \"<string>\"\n ],\n \"contactEmails\": [\n \"<string>\"\n ],\n \"opportunityStatuses\": [],\n \"minDealValue\": 123,\n \"maxDealValue\": 123,\n \"replyOutcomes\": [],\n \"sentiments\": [],\n \"callPurposes\": [],\n \"personas\": [\n \"<string>\"\n ],\n \"playbooks\": [\n \"<string>\"\n ],\n \"competitors\": [\n \"<string>\"\n ],\n \"segments\": [\n \"<string>\"\n ],\n \"useCases\": [\n \"<string>\"\n ],\n \"references\": [\n \"<string>\"\n ],\n \"proofPoints\": [\n \"<string>\"\n ],\n \"outcomeFilters\": \"<unknown>\",\n \"minDealAmount\": \"<unknown>\",\n \"maxDealAmount\": \"<unknown>\"\n },\n \"speakerSide\": \"external\",\n \"attributedPersonaOIds\": [\n \"<string>\"\n ],\n \"insightOId\": \"rcfg_XVPcS3dLZFqzfQIfSeCpk\",\n \"limit\": 100,\n \"offset\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api_key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.octavehq.com/api/v2/finding/search")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"objections from prospects\",\n \"customExtractorOIds\": [\n \"<string>\"\n ],\n \"findingOIds\": [\n \"ex_PJkptnXMSRSuoUyYH2nBk\"\n ],\n \"searchTerms\": [\n \"<string>\"\n ],\n \"startDate\": \"2026-08-01T00:00:00Z\",\n \"endDate\": \"2023-11-07T05:31:56Z\",\n \"eventFilters\": {\n \"eventTypes\": [],\n \"eventCategories\": [],\n \"companyDomains\": [\n \"<string>\"\n ],\n \"opportunityIds\": [\n \"<string>\"\n ],\n \"contactEmails\": [\n \"<string>\"\n ],\n \"opportunityStatuses\": [],\n \"minDealValue\": 123,\n \"maxDealValue\": 123,\n \"replyOutcomes\": [],\n \"sentiments\": [],\n \"callPurposes\": [],\n \"personas\": [\n \"<string>\"\n ],\n \"playbooks\": [\n \"<string>\"\n ],\n \"competitors\": [\n \"<string>\"\n ],\n \"segments\": [\n \"<string>\"\n ],\n \"useCases\": [\n \"<string>\"\n ],\n \"references\": [\n \"<string>\"\n ],\n \"proofPoints\": [\n \"<string>\"\n ],\n \"outcomeFilters\": \"<unknown>\",\n \"minDealAmount\": \"<unknown>\",\n \"maxDealAmount\": \"<unknown>\"\n },\n \"speakerSide\": \"external\",\n \"attributedPersonaOIds\": [\n \"<string>\"\n ],\n \"insightOId\": \"rcfg_XVPcS3dLZFqzfQIfSeCpk\",\n \"limit\": 100,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.octavehq.com/api/v2/finding/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"objections from prospects\",\n \"customExtractorOIds\": [\n \"<string>\"\n ],\n \"findingOIds\": [\n \"ex_PJkptnXMSRSuoUyYH2nBk\"\n ],\n \"searchTerms\": [\n \"<string>\"\n ],\n \"startDate\": \"2026-08-01T00:00:00Z\",\n \"endDate\": \"2023-11-07T05:31:56Z\",\n \"eventFilters\": {\n \"eventTypes\": [],\n \"eventCategories\": [],\n \"companyDomains\": [\n \"<string>\"\n ],\n \"opportunityIds\": [\n \"<string>\"\n ],\n \"contactEmails\": [\n \"<string>\"\n ],\n \"opportunityStatuses\": [],\n \"minDealValue\": 123,\n \"maxDealValue\": 123,\n \"replyOutcomes\": [],\n \"sentiments\": [],\n \"callPurposes\": [],\n \"personas\": [\n \"<string>\"\n ],\n \"playbooks\": [\n \"<string>\"\n ],\n \"competitors\": [\n \"<string>\"\n ],\n \"segments\": [\n \"<string>\"\n ],\n \"useCases\": [\n \"<string>\"\n ],\n \"references\": [\n \"<string>\"\n ],\n \"proofPoints\": [\n \"<string>\"\n ],\n \"outcomeFilters\": \"<unknown>\",\n \"minDealAmount\": \"<unknown>\",\n \"maxDealAmount\": \"<unknown>\"\n },\n \"speakerSide\": \"external\",\n \"attributedPersonaOIds\": [\n \"<string>\"\n ],\n \"insightOId\": \"rcfg_XVPcS3dLZFqzfQIfSeCpk\",\n \"limit\": 100,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"findings": [
{
"oId": "<string>",
"snippetText": "<string>",
"extractionType": "EMAIL_INTERNAL_USE_CASE",
"structuredValue": {},
"eventOId": "<string>",
"sourceProviderEventId": "<string>",
"providerName": "INSTANTLY",
"recordingUrl": "<string>",
"eventType": "EMAIL_SENT",
"eventTimestamp": "2023-11-07T05:31:56Z",
"callPurpose": "DISCOVERY",
"company": {
"name": "<string>",
"domain": "<string>"
},
"evidence": {
"quote": "<string>",
"reasoning": "<string>",
"speakerLabel": "<string>"
},
"speaker": "internal",
"attributedParticipant": {
"participantOId": "<string>",
"contactOId": "<string>",
"name": "<string>",
"email": "<string>",
"confidence": "<string>",
"personaOId": "<string>",
"personaName": "<string>"
},
"customExtractor": {
"oId": "<string>",
"name": "<string>",
"promptVersion": 1,
"modelTier": "NOTE",
"model": "<string>"
},
"sentimentScore": 123,
"linkedEntities": {
"personas": [
"<string>"
],
"competitors": [
"<string>"
],
"playbooks": [
"<string>"
],
"segments": [
"<string>"
],
"useCases": [
"<string>"
],
"references": [
"<string>"
],
"proofPoints": [
"<string>"
],
"coreFeatures": [
"<string>"
],
"alternatives": [
"<string>"
],
"buyingTriggers": [
"<string>"
]
},
"deal": {
"oId": "<string>",
"name": "<string>",
"stageCategory": "open",
"stageName": "<string>",
"amount": 123
}
}
],
"total": 123,
"hasMore": true,
"dataWindow": {
"kind": "event_range",
"startDate": "<string>",
"endDate": "<string>",
"isDefault": true,
"periodType": "week"
},
"rankedBy": "relevance",
"search": {
"terms": {
"names": [
"<string>"
],
"topics": [
"<string>"
]
},
"termsFrom": "query",
"textMatches": 123,
"candidates": 123
},
"notFound": [
"<string>"
]
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}Search Findings
Search extracted findings from sales conversations using natural language. Findings are insights extracted from calls, emails, and other events — objections, pain points, competitor mentions, value props, and more. Describe what you’re looking for (the query is translated to finding types), or pass customExtractorOIds for an exact filter on workspace-defined extractors. Optionally narrow by event type, company, deal outcome, call purpose, linked entities, or the persona cohort that SPOKE the finding. Each row carries its event/company linkage, compact persisted evidence (quote, reasoning, speaker label), and the resolved attributed participant — use /event/get to pull a finding’s full transcript or email.
curl --request POST \
--url https://app.octavehq.com/api/v2/finding/search \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"query": "objections from prospects",
"customExtractorOIds": [
"<string>"
],
"findingOIds": [
"ex_PJkptnXMSRSuoUyYH2nBk"
],
"searchTerms": [
"<string>"
],
"startDate": "2026-08-01T00:00:00Z",
"endDate": "2023-11-07T05:31:56Z",
"eventFilters": {
"eventTypes": [],
"eventCategories": [],
"companyDomains": [
"<string>"
],
"opportunityIds": [
"<string>"
],
"contactEmails": [
"<string>"
],
"opportunityStatuses": [],
"minDealValue": 123,
"maxDealValue": 123,
"replyOutcomes": [],
"sentiments": [],
"callPurposes": [],
"personas": [
"<string>"
],
"playbooks": [
"<string>"
],
"competitors": [
"<string>"
],
"segments": [
"<string>"
],
"useCases": [
"<string>"
],
"references": [
"<string>"
],
"proofPoints": [
"<string>"
],
"outcomeFilters": "<unknown>",
"minDealAmount": "<unknown>",
"maxDealAmount": "<unknown>"
},
"speakerSide": "external",
"attributedPersonaOIds": [
"<string>"
],
"insightOId": "rcfg_XVPcS3dLZFqzfQIfSeCpk",
"limit": 100,
"offset": 0
}
'import requests
url = "https://app.octavehq.com/api/v2/finding/search"
payload = {
"query": "objections from prospects",
"customExtractorOIds": ["<string>"],
"findingOIds": ["ex_PJkptnXMSRSuoUyYH2nBk"],
"searchTerms": ["<string>"],
"startDate": "2026-08-01T00:00:00Z",
"endDate": "2023-11-07T05:31:56Z",
"eventFilters": {
"eventTypes": [],
"eventCategories": [],
"companyDomains": ["<string>"],
"opportunityIds": ["<string>"],
"contactEmails": ["<string>"],
"opportunityStatuses": [],
"minDealValue": 123,
"maxDealValue": 123,
"replyOutcomes": [],
"sentiments": [],
"callPurposes": [],
"personas": ["<string>"],
"playbooks": ["<string>"],
"competitors": ["<string>"],
"segments": ["<string>"],
"useCases": ["<string>"],
"references": ["<string>"],
"proofPoints": ["<string>"],
"outcomeFilters": "<unknown>",
"minDealAmount": "<unknown>",
"maxDealAmount": "<unknown>"
},
"speakerSide": "external",
"attributedPersonaOIds": ["<string>"],
"insightOId": "rcfg_XVPcS3dLZFqzfQIfSeCpk",
"limit": 100,
"offset": 0
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'objections from prospects',
customExtractorOIds: ['<string>'],
findingOIds: ['ex_PJkptnXMSRSuoUyYH2nBk'],
searchTerms: ['<string>'],
startDate: '2026-08-01T00:00:00Z',
endDate: '2023-11-07T05:31:56Z',
eventFilters: {
eventTypes: [],
eventCategories: [],
companyDomains: ['<string>'],
opportunityIds: ['<string>'],
contactEmails: ['<string>'],
opportunityStatuses: [],
minDealValue: 123,
maxDealValue: 123,
replyOutcomes: [],
sentiments: [],
callPurposes: [],
personas: ['<string>'],
playbooks: ['<string>'],
competitors: ['<string>'],
segments: ['<string>'],
useCases: ['<string>'],
references: ['<string>'],
proofPoints: ['<string>'],
outcomeFilters: '<unknown>',
minDealAmount: '<unknown>',
maxDealAmount: '<unknown>'
},
speakerSide: 'external',
attributedPersonaOIds: ['<string>'],
insightOId: 'rcfg_XVPcS3dLZFqzfQIfSeCpk',
limit: 100,
offset: 0
})
};
fetch('https://app.octavehq.com/api/v2/finding/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.octavehq.com/api/v2/finding/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'objections from prospects',
'customExtractorOIds' => [
'<string>'
],
'findingOIds' => [
'ex_PJkptnXMSRSuoUyYH2nBk'
],
'searchTerms' => [
'<string>'
],
'startDate' => '2026-08-01T00:00:00Z',
'endDate' => '2023-11-07T05:31:56Z',
'eventFilters' => [
'eventTypes' => [
],
'eventCategories' => [
],
'companyDomains' => [
'<string>'
],
'opportunityIds' => [
'<string>'
],
'contactEmails' => [
'<string>'
],
'opportunityStatuses' => [
],
'minDealValue' => 123,
'maxDealValue' => 123,
'replyOutcomes' => [
],
'sentiments' => [
],
'callPurposes' => [
],
'personas' => [
'<string>'
],
'playbooks' => [
'<string>'
],
'competitors' => [
'<string>'
],
'segments' => [
'<string>'
],
'useCases' => [
'<string>'
],
'references' => [
'<string>'
],
'proofPoints' => [
'<string>'
],
'outcomeFilters' => '<unknown>',
'minDealAmount' => '<unknown>',
'maxDealAmount' => '<unknown>'
],
'speakerSide' => 'external',
'attributedPersonaOIds' => [
'<string>'
],
'insightOId' => 'rcfg_XVPcS3dLZFqzfQIfSeCpk',
'limit' => 100,
'offset' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api_key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.octavehq.com/api/v2/finding/search"
payload := strings.NewReader("{\n \"query\": \"objections from prospects\",\n \"customExtractorOIds\": [\n \"<string>\"\n ],\n \"findingOIds\": [\n \"ex_PJkptnXMSRSuoUyYH2nBk\"\n ],\n \"searchTerms\": [\n \"<string>\"\n ],\n \"startDate\": \"2026-08-01T00:00:00Z\",\n \"endDate\": \"2023-11-07T05:31:56Z\",\n \"eventFilters\": {\n \"eventTypes\": [],\n \"eventCategories\": [],\n \"companyDomains\": [\n \"<string>\"\n ],\n \"opportunityIds\": [\n \"<string>\"\n ],\n \"contactEmails\": [\n \"<string>\"\n ],\n \"opportunityStatuses\": [],\n \"minDealValue\": 123,\n \"maxDealValue\": 123,\n \"replyOutcomes\": [],\n \"sentiments\": [],\n \"callPurposes\": [],\n \"personas\": [\n \"<string>\"\n ],\n \"playbooks\": [\n \"<string>\"\n ],\n \"competitors\": [\n \"<string>\"\n ],\n \"segments\": [\n \"<string>\"\n ],\n \"useCases\": [\n \"<string>\"\n ],\n \"references\": [\n \"<string>\"\n ],\n \"proofPoints\": [\n \"<string>\"\n ],\n \"outcomeFilters\": \"<unknown>\",\n \"minDealAmount\": \"<unknown>\",\n \"maxDealAmount\": \"<unknown>\"\n },\n \"speakerSide\": \"external\",\n \"attributedPersonaOIds\": [\n \"<string>\"\n ],\n \"insightOId\": \"rcfg_XVPcS3dLZFqzfQIfSeCpk\",\n \"limit\": 100,\n \"offset\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api_key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.octavehq.com/api/v2/finding/search")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"objections from prospects\",\n \"customExtractorOIds\": [\n \"<string>\"\n ],\n \"findingOIds\": [\n \"ex_PJkptnXMSRSuoUyYH2nBk\"\n ],\n \"searchTerms\": [\n \"<string>\"\n ],\n \"startDate\": \"2026-08-01T00:00:00Z\",\n \"endDate\": \"2023-11-07T05:31:56Z\",\n \"eventFilters\": {\n \"eventTypes\": [],\n \"eventCategories\": [],\n \"companyDomains\": [\n \"<string>\"\n ],\n \"opportunityIds\": [\n \"<string>\"\n ],\n \"contactEmails\": [\n \"<string>\"\n ],\n \"opportunityStatuses\": [],\n \"minDealValue\": 123,\n \"maxDealValue\": 123,\n \"replyOutcomes\": [],\n \"sentiments\": [],\n \"callPurposes\": [],\n \"personas\": [\n \"<string>\"\n ],\n \"playbooks\": [\n \"<string>\"\n ],\n \"competitors\": [\n \"<string>\"\n ],\n \"segments\": [\n \"<string>\"\n ],\n \"useCases\": [\n \"<string>\"\n ],\n \"references\": [\n \"<string>\"\n ],\n \"proofPoints\": [\n \"<string>\"\n ],\n \"outcomeFilters\": \"<unknown>\",\n \"minDealAmount\": \"<unknown>\",\n \"maxDealAmount\": \"<unknown>\"\n },\n \"speakerSide\": \"external\",\n \"attributedPersonaOIds\": [\n \"<string>\"\n ],\n \"insightOId\": \"rcfg_XVPcS3dLZFqzfQIfSeCpk\",\n \"limit\": 100,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.octavehq.com/api/v2/finding/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"objections from prospects\",\n \"customExtractorOIds\": [\n \"<string>\"\n ],\n \"findingOIds\": [\n \"ex_PJkptnXMSRSuoUyYH2nBk\"\n ],\n \"searchTerms\": [\n \"<string>\"\n ],\n \"startDate\": \"2026-08-01T00:00:00Z\",\n \"endDate\": \"2023-11-07T05:31:56Z\",\n \"eventFilters\": {\n \"eventTypes\": [],\n \"eventCategories\": [],\n \"companyDomains\": [\n \"<string>\"\n ],\n \"opportunityIds\": [\n \"<string>\"\n ],\n \"contactEmails\": [\n \"<string>\"\n ],\n \"opportunityStatuses\": [],\n \"minDealValue\": 123,\n \"maxDealValue\": 123,\n \"replyOutcomes\": [],\n \"sentiments\": [],\n \"callPurposes\": [],\n \"personas\": [\n \"<string>\"\n ],\n \"playbooks\": [\n \"<string>\"\n ],\n \"competitors\": [\n \"<string>\"\n ],\n \"segments\": [\n \"<string>\"\n ],\n \"useCases\": [\n \"<string>\"\n ],\n \"references\": [\n \"<string>\"\n ],\n \"proofPoints\": [\n \"<string>\"\n ],\n \"outcomeFilters\": \"<unknown>\",\n \"minDealAmount\": \"<unknown>\",\n \"maxDealAmount\": \"<unknown>\"\n },\n \"speakerSide\": \"external\",\n \"attributedPersonaOIds\": [\n \"<string>\"\n ],\n \"insightOId\": \"rcfg_XVPcS3dLZFqzfQIfSeCpk\",\n \"limit\": 100,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"findings": [
{
"oId": "<string>",
"snippetText": "<string>",
"extractionType": "EMAIL_INTERNAL_USE_CASE",
"structuredValue": {},
"eventOId": "<string>",
"sourceProviderEventId": "<string>",
"providerName": "INSTANTLY",
"recordingUrl": "<string>",
"eventType": "EMAIL_SENT",
"eventTimestamp": "2023-11-07T05:31:56Z",
"callPurpose": "DISCOVERY",
"company": {
"name": "<string>",
"domain": "<string>"
},
"evidence": {
"quote": "<string>",
"reasoning": "<string>",
"speakerLabel": "<string>"
},
"speaker": "internal",
"attributedParticipant": {
"participantOId": "<string>",
"contactOId": "<string>",
"name": "<string>",
"email": "<string>",
"confidence": "<string>",
"personaOId": "<string>",
"personaName": "<string>"
},
"customExtractor": {
"oId": "<string>",
"name": "<string>",
"promptVersion": 1,
"modelTier": "NOTE",
"model": "<string>"
},
"sentimentScore": 123,
"linkedEntities": {
"personas": [
"<string>"
],
"competitors": [
"<string>"
],
"playbooks": [
"<string>"
],
"segments": [
"<string>"
],
"useCases": [
"<string>"
],
"references": [
"<string>"
],
"proofPoints": [
"<string>"
],
"coreFeatures": [
"<string>"
],
"alternatives": [
"<string>"
],
"buyingTriggers": [
"<string>"
]
},
"deal": {
"oId": "<string>",
"name": "<string>",
"stageCategory": "open",
"stageName": "<string>",
"amount": 123
}
}
],
"total": 123,
"hasMore": true,
"dataWindow": {
"kind": "event_range",
"startDate": "<string>",
"endDate": "<string>",
"isDefault": true,
"periodType": "week"
},
"rankedBy": "relevance",
"search": {
"terms": {
"names": [
"<string>"
],
"topics": [
"<string>"
]
},
"termsFrom": "query",
"textMatches": 123,
"candidates": 123
},
"notFound": [
"<string>"
]
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}Body
Findings search query and filters
What was said, in plain words: the content you want (e.g. 'worried the output is too much to act on', 'pricing objections'). The query picks the finding types and ranks results by how directly they answer it; it never filters events. Use eventFilters and startDate/endDate for that: for 'pricing objections from lost deals', query 'pricing objections' with eventFilters.opportunityStatuses ['LOST']. Required unless customExtractorOIds is provided.
"objections from prospects"
Fetch these exact findings by oId (ex_*). Every named finding comes back whatever its date (no 14-day default; startDate/endDate still narrow if given), limit and offset do not apply, and ids with no row are listed in notFound. Cannot be combined with query, customExtractorOIds or insightOId; the other filters still narrow.
1 - 100 elements["ex_PJkptnXMSRSuoUyYH2nBk"]
With query: the names and words a matching finding would contain (a competitor, product, account or phrase, with its spelling variants). Findings whose text, or whose account's name, contains one are ranked alongside the newest findings. Omit to have them derived from the query.
151 - 80Who said it: 'external' is the buyer's side, 'internal' the workspace's own people. Narrows a query to that side, or, given alone, returns every finding type from that side. The side is read per finding (its recorded speaker, a custom extractor's perspective, the participant it was attributed to), so it combines with customExtractorOIds. Findings nothing attributes to a speaker, and document findings, match neither side.
internal, external "external"
Scope results to one Insight: only findings from the events that Insight covers, resolved the same way the Insight's own run resolves them. Given alone, it also selects the finding types and custom extractors the Insight reads. Combined with query or customExtractorOIds, it narrows the events only and your own source selection is kept.
"rcfg_XVPcS3dLZFqzfQIfSeCpk"
Response
Matching findings with pagination info
With query: how this page was ordered. 'relevance': the candidates (the best text matches for the search terms, in any conversation finding type, and the newest findings) were scored for how directly they answer the query. 'text_match': scoring was unavailable, so text matches lead, best match first. 'recency': asked for, past the ranked candidates, or nothing could be scored.
relevance, text_match, recency