Exa Search
curl --request POST \
--url https://api.novita.ai/v3/exa/search \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"query": "<string>",
"includeDomains": [
"<string>"
],
"excludeDomains": [
"<string>"
],
"startPublishedDate": "<string>",
"endPublishedDate": "<string>",
"numResults": 123,
"moderation": true,
"contents": {
"text": {
"maxCharacters": 123,
"includeHtmlTags": true,
"verbosity": "<string>",
"includeSections": [
"<string>"
],
"excludeSections": [
"<string>"
]
},
"highlights": {
"query": "<string>",
"maxCharacters": 123
},
"summary": {
"query": "<string>",
"schema": {}
},
"extras": {
"links": 123,
"imageLinks": 123,
"richImageLinks": 123,
"richLinks": 123,
"codeBlocks": 123
},
"livecrawlTimeout": 123,
"maxAgeHours": 123,
"subpages": 123,
"subpageTarget": [
"<string>"
]
},
"additionalQueries": [
"<string>"
],
"type": "<string>",
"category": "<string>",
"userLocation": "<string>",
"compliance": "<string>",
"outputSchema": {
"type": "<string>",
"description": "<string>",
"properties": {},
"required": [
"<string>"
],
"additionalProperties": {}
},
"systemPrompt": "<string>"
}
'import requests
url = "https://api.novita.ai/v3/exa/search"
payload = {
"query": "<string>",
"includeDomains": ["<string>"],
"excludeDomains": ["<string>"],
"startPublishedDate": "<string>",
"endPublishedDate": "<string>",
"numResults": 123,
"moderation": True,
"contents": {
"text": {
"maxCharacters": 123,
"includeHtmlTags": True,
"verbosity": "<string>",
"includeSections": ["<string>"],
"excludeSections": ["<string>"]
},
"highlights": {
"query": "<string>",
"maxCharacters": 123
},
"summary": {
"query": "<string>",
"schema": {}
},
"extras": {
"links": 123,
"imageLinks": 123,
"richImageLinks": 123,
"richLinks": 123,
"codeBlocks": 123
},
"livecrawlTimeout": 123,
"maxAgeHours": 123,
"subpages": 123,
"subpageTarget": ["<string>"]
},
"additionalQueries": ["<string>"],
"type": "<string>",
"category": "<string>",
"userLocation": "<string>",
"compliance": "<string>",
"outputSchema": {
"type": "<string>",
"description": "<string>",
"properties": {},
"required": ["<string>"],
"additionalProperties": {}
},
"systemPrompt": "<string>"
}
headers = {
"Content-Type": "<content-type>",
"Authorization": "<authorization>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': '<content-type>', Authorization: '<authorization>'},
body: JSON.stringify({
query: '<string>',
includeDomains: ['<string>'],
excludeDomains: ['<string>'],
startPublishedDate: '<string>',
endPublishedDate: '<string>',
numResults: 123,
moderation: true,
contents: {
text: {
maxCharacters: 123,
includeHtmlTags: true,
verbosity: '<string>',
includeSections: ['<string>'],
excludeSections: ['<string>']
},
highlights: {query: '<string>', maxCharacters: 123},
summary: {query: '<string>', schema: {}},
extras: {
links: 123,
imageLinks: 123,
richImageLinks: 123,
richLinks: 123,
codeBlocks: 123
},
livecrawlTimeout: 123,
maxAgeHours: 123,
subpages: 123,
subpageTarget: ['<string>']
},
additionalQueries: ['<string>'],
type: '<string>',
category: '<string>',
userLocation: '<string>',
compliance: '<string>',
outputSchema: {
type: '<string>',
description: '<string>',
properties: {},
required: ['<string>'],
additionalProperties: {}
},
systemPrompt: '<string>'
})
};
fetch('https://api.novita.ai/v3/exa/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.novita.ai/v3/exa/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' => '<string>',
'includeDomains' => [
'<string>'
],
'excludeDomains' => [
'<string>'
],
'startPublishedDate' => '<string>',
'endPublishedDate' => '<string>',
'numResults' => 123,
'moderation' => true,
'contents' => [
'text' => [
'maxCharacters' => 123,
'includeHtmlTags' => true,
'verbosity' => '<string>',
'includeSections' => [
'<string>'
],
'excludeSections' => [
'<string>'
]
],
'highlights' => [
'query' => '<string>',
'maxCharacters' => 123
],
'summary' => [
'query' => '<string>',
'schema' => [
]
],
'extras' => [
'links' => 123,
'imageLinks' => 123,
'richImageLinks' => 123,
'richLinks' => 123,
'codeBlocks' => 123
],
'livecrawlTimeout' => 123,
'maxAgeHours' => 123,
'subpages' => 123,
'subpageTarget' => [
'<string>'
]
],
'additionalQueries' => [
'<string>'
],
'type' => '<string>',
'category' => '<string>',
'userLocation' => '<string>',
'compliance' => '<string>',
'outputSchema' => [
'type' => '<string>',
'description' => '<string>',
'properties' => [
],
'required' => [
'<string>'
],
'additionalProperties' => [
]
],
'systemPrompt' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$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.novita.ai/v3/exa/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"includeDomains\": [\n \"<string>\"\n ],\n \"excludeDomains\": [\n \"<string>\"\n ],\n \"startPublishedDate\": \"<string>\",\n \"endPublishedDate\": \"<string>\",\n \"numResults\": 123,\n \"moderation\": true,\n \"contents\": {\n \"text\": {\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"<string>\",\n \"includeSections\": [\n \"<string>\"\n ],\n \"excludeSections\": [\n \"<string>\"\n ]\n },\n \"highlights\": {\n \"query\": \"<string>\",\n \"maxCharacters\": 123\n },\n \"summary\": {\n \"query\": \"<string>\",\n \"schema\": {}\n },\n \"extras\": {\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n },\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"<string>\"\n ]\n },\n \"additionalQueries\": [\n \"<string>\"\n ],\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"userLocation\": \"<string>\",\n \"compliance\": \"<string>\",\n \"outputSchema\": {\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ],\n \"additionalProperties\": {}\n },\n \"systemPrompt\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "<content-type>")
req.Header.Add("Authorization", "<authorization>")
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.novita.ai/v3/exa/search")
.header("Content-Type", "<content-type>")
.header("Authorization", "<authorization>")
.body("{\n \"query\": \"<string>\",\n \"includeDomains\": [\n \"<string>\"\n ],\n \"excludeDomains\": [\n \"<string>\"\n ],\n \"startPublishedDate\": \"<string>\",\n \"endPublishedDate\": \"<string>\",\n \"numResults\": 123,\n \"moderation\": true,\n \"contents\": {\n \"text\": {\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"<string>\",\n \"includeSections\": [\n \"<string>\"\n ],\n \"excludeSections\": [\n \"<string>\"\n ]\n },\n \"highlights\": {\n \"query\": \"<string>\",\n \"maxCharacters\": 123\n },\n \"summary\": {\n \"query\": \"<string>\",\n \"schema\": {}\n },\n \"extras\": {\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n },\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"<string>\"\n ]\n },\n \"additionalQueries\": [\n \"<string>\"\n ],\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"userLocation\": \"<string>\",\n \"compliance\": \"<string>\",\n \"outputSchema\": {\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ],\n \"additionalProperties\": {}\n },\n \"systemPrompt\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novita.ai/v3/exa/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = '<content-type>'
request["Authorization"] = '<authorization>'
request.body = "{\n \"query\": \"<string>\",\n \"includeDomains\": [\n \"<string>\"\n ],\n \"excludeDomains\": [\n \"<string>\"\n ],\n \"startPublishedDate\": \"<string>\",\n \"endPublishedDate\": \"<string>\",\n \"numResults\": 123,\n \"moderation\": true,\n \"contents\": {\n \"text\": {\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"<string>\",\n \"includeSections\": [\n \"<string>\"\n ],\n \"excludeSections\": [\n \"<string>\"\n ]\n },\n \"highlights\": {\n \"query\": \"<string>\",\n \"maxCharacters\": 123\n },\n \"summary\": {\n \"query\": \"<string>\",\n \"schema\": {}\n },\n \"extras\": {\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n },\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"<string>\"\n ]\n },\n \"additionalQueries\": [\n \"<string>\"\n ],\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"userLocation\": \"<string>\",\n \"compliance\": \"<string>\",\n \"outputSchema\": {\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ],\n \"additionalProperties\": {}\n },\n \"systemPrompt\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"requestId": "string",
"results": [
{
"id": "string",
"title": "string",
"url": "string",
"publishedDate": "string",
"author": "string",
"image": "string",
"favicon": "string",
"text": "string",
"highlights": ["string"],
"summary": "string",
"subpages": [
{
"title": "string",
"url": "string",
"publishedDate": "string",
"author": "string",
"id": "string",
"image": "string",
"favicon": "string"
}
],
"extras": {
"links": ["string"],
"imageLinks": ["string"],
"richImageLinks": [{}],
"richLinks": [{}],
"codeBlocks": [{"text": "string", "source": "string"}]
},
"entities": [
{
"id": "string",
"type": "string",
"version": 0,
"properties": {}
}
]
}
],
"output": {
"content": "string",
"grounding": [
{
"field": "string",
"citations": [
{
"url": "string",
"title": "string"
}
],
"confidence": "string"
}
]
},
"searchTime": 0
}
{
"code": 400,
"reason": "INVALID_REQUEST_BODY",
"message": "Invalid request body | Validation error: expected string, received undefined at \"query\"",
"metadata": {
"trace_id": "d1fbd8a046d4eb0d46f93c77c1ac59b4"
}
}
{
"code": 403,
"reason": "INVALID_API_KEY",
"message": "invalid api-key",
"metadata": {}
}
{
"code": 404,
"reason": "PATH_NOT_FOUND",
"message": "path not found for model",
"metadata": {
"trace_id": "3c3433f0cb475a04f9a4969b8c6ed903"
}
}
{
"code": 429,
"reason": "RATE_LIMIT_EXCEEDED",
"message": "rate limit exceeded, please retry later",
"metadata": {
"trace_id": "5f2a9c7e41b8d0a36e9f4c2b7d81a0e5"
}
}
{
"code": 500,
"reason": "TASK_FAILED",
"message": "upstream provider temporarily unavailable, please retry",
"metadata": {
"trace_id": "8846379c692d7218173460afe95640f1"
}
}
{
"code": 503,
"reason": "SERVICE_UNAVAILABLE",
"message": "service temporarily unavailable",
"metadata": {
"trace_id": "b7e3f1a9d24c05e8f63a1b9c7e05d2f4"
}
}
Exa
Exa Search
POST
/
v3
/
exa
/
search
Exa Search
curl --request POST \
--url https://api.novita.ai/v3/exa/search \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"query": "<string>",
"includeDomains": [
"<string>"
],
"excludeDomains": [
"<string>"
],
"startPublishedDate": "<string>",
"endPublishedDate": "<string>",
"numResults": 123,
"moderation": true,
"contents": {
"text": {
"maxCharacters": 123,
"includeHtmlTags": true,
"verbosity": "<string>",
"includeSections": [
"<string>"
],
"excludeSections": [
"<string>"
]
},
"highlights": {
"query": "<string>",
"maxCharacters": 123
},
"summary": {
"query": "<string>",
"schema": {}
},
"extras": {
"links": 123,
"imageLinks": 123,
"richImageLinks": 123,
"richLinks": 123,
"codeBlocks": 123
},
"livecrawlTimeout": 123,
"maxAgeHours": 123,
"subpages": 123,
"subpageTarget": [
"<string>"
]
},
"additionalQueries": [
"<string>"
],
"type": "<string>",
"category": "<string>",
"userLocation": "<string>",
"compliance": "<string>",
"outputSchema": {
"type": "<string>",
"description": "<string>",
"properties": {},
"required": [
"<string>"
],
"additionalProperties": {}
},
"systemPrompt": "<string>"
}
'import requests
url = "https://api.novita.ai/v3/exa/search"
payload = {
"query": "<string>",
"includeDomains": ["<string>"],
"excludeDomains": ["<string>"],
"startPublishedDate": "<string>",
"endPublishedDate": "<string>",
"numResults": 123,
"moderation": True,
"contents": {
"text": {
"maxCharacters": 123,
"includeHtmlTags": True,
"verbosity": "<string>",
"includeSections": ["<string>"],
"excludeSections": ["<string>"]
},
"highlights": {
"query": "<string>",
"maxCharacters": 123
},
"summary": {
"query": "<string>",
"schema": {}
},
"extras": {
"links": 123,
"imageLinks": 123,
"richImageLinks": 123,
"richLinks": 123,
"codeBlocks": 123
},
"livecrawlTimeout": 123,
"maxAgeHours": 123,
"subpages": 123,
"subpageTarget": ["<string>"]
},
"additionalQueries": ["<string>"],
"type": "<string>",
"category": "<string>",
"userLocation": "<string>",
"compliance": "<string>",
"outputSchema": {
"type": "<string>",
"description": "<string>",
"properties": {},
"required": ["<string>"],
"additionalProperties": {}
},
"systemPrompt": "<string>"
}
headers = {
"Content-Type": "<content-type>",
"Authorization": "<authorization>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': '<content-type>', Authorization: '<authorization>'},
body: JSON.stringify({
query: '<string>',
includeDomains: ['<string>'],
excludeDomains: ['<string>'],
startPublishedDate: '<string>',
endPublishedDate: '<string>',
numResults: 123,
moderation: true,
contents: {
text: {
maxCharacters: 123,
includeHtmlTags: true,
verbosity: '<string>',
includeSections: ['<string>'],
excludeSections: ['<string>']
},
highlights: {query: '<string>', maxCharacters: 123},
summary: {query: '<string>', schema: {}},
extras: {
links: 123,
imageLinks: 123,
richImageLinks: 123,
richLinks: 123,
codeBlocks: 123
},
livecrawlTimeout: 123,
maxAgeHours: 123,
subpages: 123,
subpageTarget: ['<string>']
},
additionalQueries: ['<string>'],
type: '<string>',
category: '<string>',
userLocation: '<string>',
compliance: '<string>',
outputSchema: {
type: '<string>',
description: '<string>',
properties: {},
required: ['<string>'],
additionalProperties: {}
},
systemPrompt: '<string>'
})
};
fetch('https://api.novita.ai/v3/exa/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.novita.ai/v3/exa/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' => '<string>',
'includeDomains' => [
'<string>'
],
'excludeDomains' => [
'<string>'
],
'startPublishedDate' => '<string>',
'endPublishedDate' => '<string>',
'numResults' => 123,
'moderation' => true,
'contents' => [
'text' => [
'maxCharacters' => 123,
'includeHtmlTags' => true,
'verbosity' => '<string>',
'includeSections' => [
'<string>'
],
'excludeSections' => [
'<string>'
]
],
'highlights' => [
'query' => '<string>',
'maxCharacters' => 123
],
'summary' => [
'query' => '<string>',
'schema' => [
]
],
'extras' => [
'links' => 123,
'imageLinks' => 123,
'richImageLinks' => 123,
'richLinks' => 123,
'codeBlocks' => 123
],
'livecrawlTimeout' => 123,
'maxAgeHours' => 123,
'subpages' => 123,
'subpageTarget' => [
'<string>'
]
],
'additionalQueries' => [
'<string>'
],
'type' => '<string>',
'category' => '<string>',
'userLocation' => '<string>',
'compliance' => '<string>',
'outputSchema' => [
'type' => '<string>',
'description' => '<string>',
'properties' => [
],
'required' => [
'<string>'
],
'additionalProperties' => [
]
],
'systemPrompt' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$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.novita.ai/v3/exa/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"includeDomains\": [\n \"<string>\"\n ],\n \"excludeDomains\": [\n \"<string>\"\n ],\n \"startPublishedDate\": \"<string>\",\n \"endPublishedDate\": \"<string>\",\n \"numResults\": 123,\n \"moderation\": true,\n \"contents\": {\n \"text\": {\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"<string>\",\n \"includeSections\": [\n \"<string>\"\n ],\n \"excludeSections\": [\n \"<string>\"\n ]\n },\n \"highlights\": {\n \"query\": \"<string>\",\n \"maxCharacters\": 123\n },\n \"summary\": {\n \"query\": \"<string>\",\n \"schema\": {}\n },\n \"extras\": {\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n },\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"<string>\"\n ]\n },\n \"additionalQueries\": [\n \"<string>\"\n ],\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"userLocation\": \"<string>\",\n \"compliance\": \"<string>\",\n \"outputSchema\": {\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ],\n \"additionalProperties\": {}\n },\n \"systemPrompt\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "<content-type>")
req.Header.Add("Authorization", "<authorization>")
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.novita.ai/v3/exa/search")
.header("Content-Type", "<content-type>")
.header("Authorization", "<authorization>")
.body("{\n \"query\": \"<string>\",\n \"includeDomains\": [\n \"<string>\"\n ],\n \"excludeDomains\": [\n \"<string>\"\n ],\n \"startPublishedDate\": \"<string>\",\n \"endPublishedDate\": \"<string>\",\n \"numResults\": 123,\n \"moderation\": true,\n \"contents\": {\n \"text\": {\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"<string>\",\n \"includeSections\": [\n \"<string>\"\n ],\n \"excludeSections\": [\n \"<string>\"\n ]\n },\n \"highlights\": {\n \"query\": \"<string>\",\n \"maxCharacters\": 123\n },\n \"summary\": {\n \"query\": \"<string>\",\n \"schema\": {}\n },\n \"extras\": {\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n },\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"<string>\"\n ]\n },\n \"additionalQueries\": [\n \"<string>\"\n ],\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"userLocation\": \"<string>\",\n \"compliance\": \"<string>\",\n \"outputSchema\": {\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ],\n \"additionalProperties\": {}\n },\n \"systemPrompt\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novita.ai/v3/exa/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = '<content-type>'
request["Authorization"] = '<authorization>'
request.body = "{\n \"query\": \"<string>\",\n \"includeDomains\": [\n \"<string>\"\n ],\n \"excludeDomains\": [\n \"<string>\"\n ],\n \"startPublishedDate\": \"<string>\",\n \"endPublishedDate\": \"<string>\",\n \"numResults\": 123,\n \"moderation\": true,\n \"contents\": {\n \"text\": {\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"<string>\",\n \"includeSections\": [\n \"<string>\"\n ],\n \"excludeSections\": [\n \"<string>\"\n ]\n },\n \"highlights\": {\n \"query\": \"<string>\",\n \"maxCharacters\": 123\n },\n \"summary\": {\n \"query\": \"<string>\",\n \"schema\": {}\n },\n \"extras\": {\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n },\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"<string>\"\n ]\n },\n \"additionalQueries\": [\n \"<string>\"\n ],\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"userLocation\": \"<string>\",\n \"compliance\": \"<string>\",\n \"outputSchema\": {\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ],\n \"additionalProperties\": {}\n },\n \"systemPrompt\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"requestId": "string",
"results": [
{
"id": "string",
"title": "string",
"url": "string",
"publishedDate": "string",
"author": "string",
"image": "string",
"favicon": "string",
"text": "string",
"highlights": ["string"],
"summary": "string",
"subpages": [
{
"title": "string",
"url": "string",
"publishedDate": "string",
"author": "string",
"id": "string",
"image": "string",
"favicon": "string"
}
],
"extras": {
"links": ["string"],
"imageLinks": ["string"],
"richImageLinks": [{}],
"richLinks": [{}],
"codeBlocks": [{"text": "string", "source": "string"}]
},
"entities": [
{
"id": "string",
"type": "string",
"version": 0,
"properties": {}
}
]
}
],
"output": {
"content": "string",
"grounding": [
{
"field": "string",
"citations": [
{
"url": "string",
"title": "string"
}
],
"confidence": "string"
}
]
},
"searchTime": 0
}
{
"code": 400,
"reason": "INVALID_REQUEST_BODY",
"message": "Invalid request body | Validation error: expected string, received undefined at \"query\"",
"metadata": {
"trace_id": "d1fbd8a046d4eb0d46f93c77c1ac59b4"
}
}
{
"code": 403,
"reason": "INVALID_API_KEY",
"message": "invalid api-key",
"metadata": {}
}
{
"code": 404,
"reason": "PATH_NOT_FOUND",
"message": "path not found for model",
"metadata": {
"trace_id": "3c3433f0cb475a04f9a4969b8c6ed903"
}
}
{
"code": 429,
"reason": "RATE_LIMIT_EXCEEDED",
"message": "rate limit exceeded, please retry later",
"metadata": {
"trace_id": "5f2a9c7e41b8d0a36e9f4c2b7d81a0e5"
}
}
{
"code": 500,
"reason": "TASK_FAILED",
"message": "upstream provider temporarily unavailable, please retry",
"metadata": {
"trace_id": "8846379c692d7218173460afe95640f1"
}
}
{
"code": 503,
"reason": "SERVICE_UNAVAILABLE",
"message": "service temporarily unavailable",
"metadata": {
"trace_id": "b7e3f1a9d24c05e8f63a1b9c7e05d2f4"
}
}
Search the web and optionally extract content from returned results. This is a passthrough to Exa’s Search API, exposed through the Novita gateway with a platform route prefix.
To authenticate with your Novita API key, get one from the Novita dashboard. Base URL:
Running the quickstart above returns the following at the time of publishing. The default request returns up to 10 results; two are shown here.
For validation failures,
https://api.novita.ai.
Quickstart
curl -X POST 'https://api.novita.ai/v3/exa/search' \
-H 'Authorization: Bearer <api_key>' \
-H 'Content-Type: application/json' \
-d '{
"query": "what makes a good API design",
"contents": {"highlights": true}
}'
{
"requestId": "de41749e9680ea844f760e0ffacc0246",
"results": [
{
"id": "https://docs.cloud.google.com/apis/design",
"title": "API design guide | Cloud API Design Guide | Google Cloud Documentation",
"url": "https://docs.cloud.google.com/apis/design",
"highlights": [
"This is a general design guide for networked APIs. It has been used inside Google since 2014 and is the guide that Google follows when designing Cloud APIs and other Google APIs. This design guide is shared here to inform outside developers and to make it…"
],
"image": "https://docs.cloud.google.com/_static/cloud/images/social-icon-google-cloud-1200-630.png",
"favicon": "https://www.gstatic.com/devrel-devsite/prod/v544324a32f4e1e28baf5bd35dca83b6157fef32c5ffbe146b7ca395602e11426/clouddocs/images/favicons/onecloud/favicon.ico"
},
{
"id": "https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design",
"title": "Web API Design Best Practices - Azure Architecture Center | Microsoft Learn",
"url": "https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design",
"author": "claytonsiemens77",
"highlights": [
"A RESTful web API implementation is a web API that employs Representational State Transfer (REST) architectural principles to achieve a stateless, loosely coupled interface between a client and service. A web API that is RESTful supports the standard HTTP…"
],
"image": "https://learn.microsoft.com/en-us/media/open-graph-image.png"
}
],
"searchTime": 936.2
}
Request Headers
All endpoints require platform API authentication.string
required
Use
application/json.string
default:"Bearer YOUR_API_KEY"
required
Platform API key, formatted as
Bearer YOUR_API_KEY.Request Body
string
required
Search query. Minimum length is 1.
string[]
Restrict results to these domains. Maximum 1200 entries.
string[]
Exclude results from these domains. Maximum 1200 entries.
string
Include links published after this ISO 8601 date-time.
string
Include links published before this ISO 8601 date-time.
integer
Number of results to return. Default is
10; supported public range is 1 to 100.boolean
Enable content moderation to filter unsafe content from search results. Default is
false.object
Content extraction options for search results.
Show contents properties
Show contents properties
boolean | object
Return page text, or an object to configure text extraction.
Show text properties
Show text properties
integer
Maximum number of text characters to return. Range is
1 to 10000.boolean
Include lightweight HTML tags instead of plain text.
string
default:"compact"
Requested text verbosity. One of
compact, standard, or full.string[]
Semantic page sections to keep. Best-effort classification. Each entry is one of
header, navigation, banner, body, sidebar, footer, or metadata.string[]
Semantic page sections to drop. Best-effort classification. Each entry is one of
header, navigation, banner, body, sidebar, footer, or metadata.boolean | object
boolean | object
object
Return extra page data such as links, image links, rich links, or code blocks.
Show extras properties
Show extras properties
integer
default:10000
Timeout for live crawling in milliseconds. Must be greater than
0 and at most 90000. Default is 10000.integer
Maximum cache age in hours.
0 requests fresh content; -1 always uses cache. Range is -1 to 720.integer
Number of subpages to crawl. Range is
0 to 100.string | string[]
Term or terms used to find targeted subpages. Each string must be
1 to 100 characters.string[]
Additional query variants for deep-search modes. Range is
1 to 10 entries.string
Search mode. One of
instant, fast, auto, deep-lite, deep, or deep-reasoning.string
Data category hint. Known values include
company, research paper, news, personal site, financial report, publication, and people.Some values restrict which filters can be used:companydoes not supportstartPublishedDate,endPublishedDate,startCrawlDate,endCrawlDate, orexcludeDomains.peopledoes not supportstartPublishedDate,endPublishedDate,startCrawlDate,endCrawlDate, orexcludeDomains, andincludeDomainsis limited to supported profile domains.
string
Two-letter ISO country code, such as
US.string
Enterprise compliance mode. Only
hipaa is supported.object
JSON Schema object for structured synthesized output. Supported root types include
text and object; object schemas should describe the expected JSON object returned by Exa.Show outputSchema properties
Show outputSchema properties
string
Extra instructions that guide synthesized output.
Examples
Search with highlights
curl -X POST 'https://api.novita.ai/v3/exa/search' \
-H 'Authorization: Bearer <api_key>' \
-H 'Content-Type: application/json' \
-d '{
"query": "how do vector databases handle high-dimensional indexing",
"numResults": 10,
"type": "auto",
"contents": {
"highlights": true
}
}'
Restrict to trusted domains
UseincludeDomains to keep results within sources you trust.
curl -X POST 'https://api.novita.ai/v3/exa/search' \
-H 'Authorization: Bearer <api_key>' \
-H 'Content-Type: application/json' \
-d '{
"query": "postgres logical replication conflict handling",
"includeDomains": ["postgresql.org", "aws.amazon.com"],
"numResults": 5
}'
Recent results only
Combine thenews category with a published-date floor to filter out stale pages.
curl -X POST 'https://api.novita.ai/v3/exa/search' \
-H 'Authorization: Bearer <api_key>' \
-H 'Content-Type: application/json' \
-d '{
"query": "offshore wind farm capacity additions",
"category": "news",
"startPublishedDate": "2026-01-01T00:00:00.000Z"
}'
Structured output from a deep search
Usetype: deep with an outputSchema to get a synthesized, schema-shaped result.
curl -X POST 'https://api.novita.ai/v3/exa/search' \
-H 'Authorization: Bearer <api_key>' \
-H 'Content-Type: application/json' \
-d '{
"query": "which company acquired Instagram and in what year",
"type": "deep",
"outputSchema": {
"type": "object",
"properties": {
"acquirer": {"type": "string"},
"amountUsd": {"type": "string"},
"yearAnnounced": {"type": "integer"}
},
"required": ["acquirer"]
}
}'
Response
string
Unique request identifier.
object[]
Search results.
Show result properties
Show result properties
string
Result title.
string
Result URL.
string
Published date when available.
string
Author when available.
string
Exa document ID.
string
Associated image URL.
string
Site favicon URL.
string
Extracted page text when requested.
string[]
Highlight snippets when requested.
string
Generated summary when requested.
object[]
object
Container for extra page data. Each child field is present only when its matching
contents.extras count is requested, and may be an empty array when the page has no such data.Show extras properties
Show extras properties
string[]
Extracted links when
extras.links is requested.string[]
Image links when
extras.imageLinks is requested.object[]
Rich image links when
extras.richImageLinks is requested.object[]
Rich links when
extras.richLinks is requested.object[]
Structured entities extracted from the result, most often returned for the
company, people, and publication categories. It may be absent or empty depending on the query and page.Show entity properties
Show entity properties
string
Stable entity identifier.
string
Entity discriminator. One of
company, person, or publication.integer
Entity schema version.
object
Type-specific fields. The shape depends on
type.Show company properties
Show company properties
string
Company name.
integer
Year the company was founded.
string
Short company description.
object
object
object
Web traffic data.
Show webTraffic properties
Show webTraffic properties
object
Research output.
Show research properties
Show research properties
integer
Number of published works.
integer
Total citations.
string[]
Research areas.
object[]
Notable works.
Show person properties
Show person properties
string
Full name.
string
First name.
string
Last name.
string
Location.
object[]
object[]
object
Research output.
Show research properties
Show research properties
integer
Number of published works.
integer
Total citations.
integer
h-index.
integer
Year of first publication.
integer
Year of most recent publication.
string[]
Research areas.
object[]
Notable works.
Show publication properties
Show publication properties
string
Publication title.
integer
Publication year.
string
Publication date.
string
Publication type. One of
article, book, book-chapter, dataset, dissertation, preprint, report, or review.string
Language.
integer
Number of citations.
integer
Number of references.
string
Abstract text.
object
Structured or synthesized output when requested.
Show output properties
Show output properties
string | object
Generated content. It can be structured when
outputSchema is provided.object[]
Field-level grounding and citation metadata when returned.
number
Time taken to search in milliseconds.
Errors
Errors are returned as a JSON envelope withcode, reason, message, and metadata. The platform validates and authenticates the request before forwarding it to Exa, so some errors originate at the platform and others are surfaced from upstream.
| Status | reason | Meaning |
|---|---|---|
400 | MISSING_API_KEY | The Authorization header is absent. |
400 | INVALID_REQUEST_BODY | The body failed validation, such as a missing or malformed query. |
403 | INVALID_API_KEY | The API key is invalid or not authorized. |
404 | PATH_NOT_FOUND | The route does not exist. |
429 | RATE_LIMIT_EXCEEDED | Too many requests. Slow down and retry with backoff. |
500 | TASK_FAILED | Internal or upstream provider failure. Transient failures are safe to retry. |
503 | SERVICE_UNAVAILABLE | The service is temporarily overloaded or down. Retry with backoff. |
message is a JSON-encoded string carrying the detailed error and tag. The examples below show that inner detail decoded for readability.
{
"requestId": "string",
"results": [
{
"id": "string",
"title": "string",
"url": "string",
"publishedDate": "string",
"author": "string",
"image": "string",
"favicon": "string",
"text": "string",
"highlights": ["string"],
"summary": "string",
"subpages": [
{
"title": "string",
"url": "string",
"publishedDate": "string",
"author": "string",
"id": "string",
"image": "string",
"favicon": "string"
}
],
"extras": {
"links": ["string"],
"imageLinks": ["string"],
"richImageLinks": [{}],
"richLinks": [{}],
"codeBlocks": [{"text": "string", "source": "string"}]
},
"entities": [
{
"id": "string",
"type": "string",
"version": 0,
"properties": {}
}
]
}
],
"output": {
"content": "string",
"grounding": [
{
"field": "string",
"citations": [
{
"url": "string",
"title": "string"
}
],
"confidence": "string"
}
]
},
"searchTime": 0
}
{
"code": 400,
"reason": "INVALID_REQUEST_BODY",
"message": "Invalid request body | Validation error: expected string, received undefined at \"query\"",
"metadata": {
"trace_id": "d1fbd8a046d4eb0d46f93c77c1ac59b4"
}
}
{
"code": 403,
"reason": "INVALID_API_KEY",
"message": "invalid api-key",
"metadata": {}
}
{
"code": 404,
"reason": "PATH_NOT_FOUND",
"message": "path not found for model",
"metadata": {
"trace_id": "3c3433f0cb475a04f9a4969b8c6ed903"
}
}
{
"code": 429,
"reason": "RATE_LIMIT_EXCEEDED",
"message": "rate limit exceeded, please retry later",
"metadata": {
"trace_id": "5f2a9c7e41b8d0a36e9f4c2b7d81a0e5"
}
}
{
"code": 500,
"reason": "TASK_FAILED",
"message": "upstream provider temporarily unavailable, please retry",
"metadata": {
"trace_id": "8846379c692d7218173460afe95640f1"
}
}
{
"code": 503,
"reason": "SERVICE_UNAVAILABLE",
"message": "service temporarily unavailable",
"metadata": {
"trace_id": "b7e3f1a9d24c05e8f63a1b9c7e05d2f4"
}
}
Notes
- All request bodies are JSON.
- Extra Exa parameters not listed here may be passed through.
- Response shapes can vary depending on request options.
- This document intentionally omits billing-related fields.
References
For more details, see the Exa Search API reference.Last modified on July 30, 2026
Was this page helpful?
⌘I