Search Notes
curl --request POST \
--url https://api.opennous.cloud/v2/notes/search \
--header 'Content-Type: application/json' \
--data '
{
"question": "<string>",
"focus": "<string>",
"limit": 123
}
'import requests
url = "https://api.opennous.cloud/v2/notes/search"
payload = {
"question": "<string>",
"focus": "<string>",
"limit": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({question: '<string>', focus: '<string>', limit: 123})
};
fetch('https://api.opennous.cloud/v2/notes/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://api.opennous.cloud/v2/notes/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([
'question' => '<string>',
'focus' => '<string>',
'limit' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://api.opennous.cloud/v2/notes/search"
payload := strings.NewReader("{\n \"question\": \"<string>\",\n \"focus\": \"<string>\",\n \"limit\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.opennous.cloud/v2/notes/search")
.header("Content-Type", "application/json")
.body("{\n \"question\": \"<string>\",\n \"focus\": \"<string>\",\n \"limit\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opennous.cloud/v2/notes/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"question\": \"<string>\",\n \"focus\": \"<string>\",\n \"limit\": 123\n}"
response = http.request(request)
puts response.read_bodyNotes
Search Notes
Semantic search over the saved notes & documents kept on contacts. Pull the relevant passage instead of loading whole documents.
POST
/
v2
/
notes
/
search
Search Notes
curl --request POST \
--url https://api.opennous.cloud/v2/notes/search \
--header 'Content-Type: application/json' \
--data '
{
"question": "<string>",
"focus": "<string>",
"limit": 123
}
'import requests
url = "https://api.opennous.cloud/v2/notes/search"
payload = {
"question": "<string>",
"focus": "<string>",
"limit": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({question: '<string>', focus: '<string>', limit: 123})
};
fetch('https://api.opennous.cloud/v2/notes/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://api.opennous.cloud/v2/notes/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([
'question' => '<string>',
'focus' => '<string>',
'limit' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://api.opennous.cloud/v2/notes/search"
payload := strings.NewReader("{\n \"question\": \"<string>\",\n \"focus\": \"<string>\",\n \"limit\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.opennous.cloud/v2/notes/search")
.header("Content-Type", "application/json")
.body("{\n \"question\": \"<string>\",\n \"focus\": \"<string>\",\n \"limit\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opennous.cloud/v2/notes/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"question\": \"<string>\",\n \"focus\": \"<string>\",\n \"limit\": 123\n}"
response = http.request(request)
puts response.read_bodyThe retrieval counterpart to
POST /v2/notes. Semantically searches the meeting briefs, transcripts, meeting notes, and notes kept on contacts, and returns the matching documents with a snippet — so a workflow pulls the relevant passage rather than the whole document.
Pass focus to restrict to one person or company, or omit it to search across everyone in the workspace.
Request
curl -X POST https://api.opennous.cloud/v2/notes/search \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"question": "what did we discuss about pricing",
"focus": "sarah@acme.com",
"limit": 8
}'
Body
string
required
Natural-language query matched against document content.
string
Restrict to one person/company — entity UUID, email, domain, or LinkedIn URL. Omit to search across everyone. A focus that can’t be resolved falls back to a workspace-wide search (it never creates an entity).
number
default:"8"
Max documents to return. Cap 20.
Response
{
"documents": [
{
"entity_id": "a1b2c3d4-...",
"type": "meeting_notes",
"title": "Q3 renewal call",
"date": "2026-05-30",
"similarity": 0.88,
"snippet": "Sarah pushed back on per-seat — wants a flat platform fee. Maria (CFO) to…"
},
{
"entity_id": "a1b2c3d4-...",
"type": "meeting_brief",
"title": "Pre-meeting brief — renewal",
"date": "2026-06-01",
"similarity": 0.74,
"snippet": "Budget waiting on Q3 close; proposal at $12k/yr, expect a discount ask…"
}
],
"count": 2
}
snippet is truncated to ~400 characters. To read a document in full, fetch the contact with GET /v2/accounts/:id.
When to call it
- “What did we discuss about pricing?” — pull the relevant past notes
- “What objections came up in past meetings?” — across a contact’s record
- Comparing across a contact’s meetings — set
focusand read the snippets
Errors
| Status | Error | What to do |
|---|---|---|
| 400 | question required | A non-empty question is required |
| 401 | unauthorized | API key missing or invalid |