curl --request POST \
--url https://app.octavehq.com/api/v2/transcript/entity-evidence \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"entityOId": "<string>",
"angle": "pricing concerns",
"limit": 6,
"callPurposes": []
}
'import requests
url = "https://app.octavehq.com/api/v2/transcript/entity-evidence"
payload = {
"entityOId": "<string>",
"angle": "pricing concerns",
"limit": 6,
"callPurposes": []
}
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({entityOId: '<string>', angle: 'pricing concerns', limit: 6, callPurposes: []})
};
fetch('https://app.octavehq.com/api/v2/transcript/entity-evidence', 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/transcript/entity-evidence",
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([
'entityOId' => '<string>',
'angle' => 'pricing concerns',
'limit' => 6,
'callPurposes' => [
]
]),
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/transcript/entity-evidence"
payload := strings.NewReader("{\n \"entityOId\": \"<string>\",\n \"angle\": \"pricing concerns\",\n \"limit\": 6,\n \"callPurposes\": []\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/transcript/entity-evidence")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"entityOId\": \"<string>\",\n \"angle\": \"pricing concerns\",\n \"limit\": 6,\n \"callPurposes\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.octavehq.com/api/v2/transcript/entity-evidence")
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 \"entityOId\": \"<string>\",\n \"angle\": \"pricing concerns\",\n \"limit\": 6,\n \"callPurposes\": []\n}"
response = http.request(request)
puts response.read_body{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"entityOId": "<string>",
"entityName": "<string>",
"linkFiltered": true,
"calls": [
{
"eventOId": "<string>",
"moments": [
{
"quote": "<string>",
"speakerNames": [
"<string>"
],
"extractionTypes": [
"<string>"
],
"startSec": 123
}
],
"callTitle": "<string>",
"companyName": "<string>",
"callDate": "<string>",
"recordingUrl": "<string>"
}
],
"totalMoments": 123
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}Get Entity Evidence
Returns the best verbatim customer-call quotes evidencing a library entity, with speaker attribution, call context, and recording time anchors. Prefers moments the analytics pipeline explicitly linked to the entity; falls back to semantic search. Use to back up a persona pain, competitor claim, objection, or proof point with real customer language.
curl --request POST \
--url https://app.octavehq.com/api/v2/transcript/entity-evidence \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"entityOId": "<string>",
"angle": "pricing concerns",
"limit": 6,
"callPurposes": []
}
'import requests
url = "https://app.octavehq.com/api/v2/transcript/entity-evidence"
payload = {
"entityOId": "<string>",
"angle": "pricing concerns",
"limit": 6,
"callPurposes": []
}
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({entityOId: '<string>', angle: 'pricing concerns', limit: 6, callPurposes: []})
};
fetch('https://app.octavehq.com/api/v2/transcript/entity-evidence', 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/transcript/entity-evidence",
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([
'entityOId' => '<string>',
'angle' => 'pricing concerns',
'limit' => 6,
'callPurposes' => [
]
]),
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/transcript/entity-evidence"
payload := strings.NewReader("{\n \"entityOId\": \"<string>\",\n \"angle\": \"pricing concerns\",\n \"limit\": 6,\n \"callPurposes\": []\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/transcript/entity-evidence")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"entityOId\": \"<string>\",\n \"angle\": \"pricing concerns\",\n \"limit\": 6,\n \"callPurposes\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.octavehq.com/api/v2/transcript/entity-evidence")
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 \"entityOId\": \"<string>\",\n \"angle\": \"pricing concerns\",\n \"limit\": 6,\n \"callPurposes\": []\n}"
response = http.request(request)
puts response.read_body{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"entityOId": "<string>",
"entityName": "<string>",
"linkFiltered": true,
"calls": [
{
"eventOId": "<string>",
"moments": [
{
"quote": "<string>",
"speakerNames": [
"<string>"
],
"extractionTypes": [
"<string>"
],
"startSec": 123
}
],
"callTitle": "<string>",
"companyName": "<string>",
"callDate": "<string>",
"recordingUrl": "<string>"
}
],
"totalMoments": 123
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}Authorizations
Body
Entity to gather call evidence for
Library entity oId to gather evidence for (persona, competitor, objection, use case, proof point, etc.)
1Optional focus, e.g. 'pricing concerns' to narrow which aspect of the entity to evidence
"pricing concerns"
Maximum number of evidence moments (default: 6, max: 25)
1 <= x <= 256
Only evidence from calls classified with any of these purposes (OR), e.g. ['DISCOVERY','DEMO'] for early-funnel voice or ['ESCALATION_CHURN_RISK'] for save-attempt voice
DISCOVERY, DEMO, TECHNICAL_EVALUATION, WORKING_SESSION, NEGOTIATION_PRICING, ONBOARDING, CHECK_IN_SUCCESS, QBR_RENEWAL, EXPANSION_UPSELL, ESCALATION_CHURN_RISK, SUPPORT, INTERNAL_SYNC, OTHER Response
Evidence moments grouped per call