Hybrid search across uploaded content
curl --request POST \
--url https://api.indoralabs.com/search/semantic \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"q": "suspect red sedan",
"caseId": "c0a80101-0000-0000-0000-000000000001",
"limit": 20
}
'import requests
url = "https://api.indoralabs.com/search/semantic"
payload = {
"q": "suspect red sedan",
"caseId": "c0a80101-0000-0000-0000-000000000001",
"limit": 20
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
q: 'suspect red sedan',
caseId: 'c0a80101-0000-0000-0000-000000000001',
limit: 20
})
};
fetch('https://api.indoralabs.com/search/semantic', 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.indoralabs.com/search/semantic",
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([
'q' => 'suspect red sedan',
'caseId' => 'c0a80101-0000-0000-0000-000000000001',
'limit' => 20
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-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://api.indoralabs.com/search/semantic"
payload := strings.NewReader("{\n \"q\": \"suspect red sedan\",\n \"caseId\": \"c0a80101-0000-0000-0000-000000000001\",\n \"limit\": 20\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-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://api.indoralabs.com/search/semantic")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"q\": \"suspect red sedan\",\n \"caseId\": \"c0a80101-0000-0000-0000-000000000001\",\n \"limit\": 20\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.indoralabs.com/search/semantic")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"q\": \"suspect red sedan\",\n \"caseId\": \"c0a80101-0000-0000-0000-000000000001\",\n \"limit\": 20\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"fileId": "f2a1...",
"snippet": "...",
"score": 0.83
}
]
}{
"error": "BadRequest",
"message": "Missing required parameter 'fileId'.",
"details": {
"param": "fileId"
}
}Search
Search Semantic
Perform a hybrid semantic + keyword search across uploaded files. This endpoint allows you to query text extracted from video transcripts, audio transcriptions, and documents. It blends semantic embeddings with BM25 keyword scoring to return results that are both contextually relevant and textually precise. You can optionally restrict results by case, file, or date range. Ideal for investigations, discovery, and compliance queries.
POST
/
search
/
semantic
Hybrid search across uploaded content
curl --request POST \
--url https://api.indoralabs.com/search/semantic \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"q": "suspect red sedan",
"caseId": "c0a80101-0000-0000-0000-000000000001",
"limit": 20
}
'import requests
url = "https://api.indoralabs.com/search/semantic"
payload = {
"q": "suspect red sedan",
"caseId": "c0a80101-0000-0000-0000-000000000001",
"limit": 20
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
q: 'suspect red sedan',
caseId: 'c0a80101-0000-0000-0000-000000000001',
limit: 20
})
};
fetch('https://api.indoralabs.com/search/semantic', 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.indoralabs.com/search/semantic",
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([
'q' => 'suspect red sedan',
'caseId' => 'c0a80101-0000-0000-0000-000000000001',
'limit' => 20
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-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://api.indoralabs.com/search/semantic"
payload := strings.NewReader("{\n \"q\": \"suspect red sedan\",\n \"caseId\": \"c0a80101-0000-0000-0000-000000000001\",\n \"limit\": 20\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-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://api.indoralabs.com/search/semantic")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"q\": \"suspect red sedan\",\n \"caseId\": \"c0a80101-0000-0000-0000-000000000001\",\n \"limit\": 20\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.indoralabs.com/search/semantic")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"q\": \"suspect red sedan\",\n \"caseId\": \"c0a80101-0000-0000-0000-000000000001\",\n \"limit\": 20\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"fileId": "f2a1...",
"snippet": "...",
"score": 0.83
}
]
}{
"error": "BadRequest",
"message": "Missing required parameter 'fileId'.",
"details": {
"param": "fileId"
}
}Authorizations
Body
application/json
Query string. Supports hybrid semantic + keyword search.
Filter results to a specific case.
Filter to a single file.
Number of results to return.
Required range:
1 <= x <= 100Lower bound for file create/update timestamps.
Upper bound for file create/update timestamps.
Response
Search results
Ordered search results.
Show child attributes
Show child attributes
⌘I

