# Exa Contents - Documentation

> For the complete documentation index, see [llms.txt](/llms.txt). Markdown is available with `Accept: text/markdown` and `.md` URL variants.

Source: /docs/api-reference/model-apis-exa-contents

# Exa Contents

POST

/

v3

/

exa

/

contents

Try it

Exa Contents

cURL

```
curl --request POST \
--url https://api.novita.ai/v3/exa/contents \
--header 'Authorization: &#x3C;authorization>' \
--header 'Content-Type: &#x3C;content-type>' \
--data '
{
"urls": [
"&#x3C;string>"
],
"ids": [
"&#x3C;string>"
],
"compliance": "&#x3C;string>",
"text": {},
"highlights": {},
"summary": {},
"extras": {},
"livecrawlTimeout": 123,
"maxAgeHours": 123,
"subpages": 123,
"subpageTarget": [
"&#x3C;string>"
],
"maxCharacters": 123,
"includeHtmlTags": true,
"verbosity": "&#x3C;string>",
"includeSections": [
"&#x3C;string>"
],
"excludeSections": [
"&#x3C;string>"
],
"query": "&#x3C;string>",
"schema": {},
"links": 123,
"imageLinks": 123,
"richImageLinks": 123,
"richLinks": 123,
"codeBlocks": 123
}
'
```

```
import requestsurl = "https://api.novita.ai/v3/exa/contents"payload = { "urls": ["&#x3C;string>"], "ids": ["&#x3C;string>"], "compliance": "&#x3C;string>", "text": {}, "highlights": {}, "summary": {}, "extras": {}, "livecrawlTimeout": 123, "maxAgeHours": 123, "subpages": 123, "subpageTarget": ["&#x3C;string>"], "maxCharacters": 123, "includeHtmlTags": True, "verbosity": "&#x3C;string>", "includeSections": ["&#x3C;string>"], "excludeSections": ["&#x3C;string>"], "query": "&#x3C;string>", "schema": {}, "links": 123, "imageLinks": 123, "richImageLinks": 123, "richLinks": 123, "codeBlocks": 123}headers = { "Content-Type": "&#x3C;content-type>", "Authorization": "&#x3C;authorization>"}response = requests.post(url, json=payload, headers=headers)print(response.text)
```

```
const options = { method: 'POST', headers: {'Content-Type': '&#x3C;content-type>', Authorization: '&#x3C;authorization>'}, body: JSON.stringify({ urls: ['&#x3C;string>'], ids: ['&#x3C;string>'], compliance: '&#x3C;string>', text: {}, highlights: {}, summary: {}, extras: {}, livecrawlTimeout: 123, maxAgeHours: 123, subpages: 123, subpageTarget: ['&#x3C;string>'], maxCharacters: 123, includeHtmlTags: true, verbosity: '&#x3C;string>', includeSections: ['&#x3C;string>'], excludeSections: ['&#x3C;string>'], query: '&#x3C;string>', schema: {}, links: 123, imageLinks: 123, richImageLinks: 123, richLinks: 123, codeBlocks: 123 })};fetch('https://api.novita.ai/v3/exa/contents', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err));
```

```
&#x3C;?php$curl = curl_init();curl_setopt_array($curl, [ CURLOPT_URL => "https://api.novita.ai/v3/exa/contents", 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([ 'urls' => [ '&#x3C;string>' ], 'ids' => [ '&#x3C;string>' ], 'compliance' => '&#x3C;string>', 'text' => [ ], 'highlights' => [ ], 'summary' => [ ], 'extras' => [ ], 'livecrawlTimeout' => 123, 'maxAgeHours' => 123, 'subpages' => 123, 'subpageTarget' => [ '&#x3C;string>' ], 'maxCharacters' => 123, 'includeHtmlTags' => true, 'verbosity' => '&#x3C;string>', 'includeSections' => [ '&#x3C;string>' ], 'excludeSections' => [ '&#x3C;string>' ], 'query' => '&#x3C;string>', 'schema' => [ ], 'links' => 123, 'imageLinks' => 123, 'richImageLinks' => 123, 'richLinks' => 123, 'codeBlocks' => 123 ]), CURLOPT_HTTPHEADER => [ "Authorization: &#x3C;authorization>", "Content-Type: &#x3C;content-type>" ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;}
```

```
package mainimport (	"fmt"	"strings"	"net/http"	"io")func main() {	url := "https://api.novita.ai/v3/exa/contents"	payload := strings.NewReader("{\n \"urls\": [\n \"&#x3C;string>\"\n ],\n \"ids\": [\n \"&#x3C;string>\"\n ],\n \"compliance\": \"&#x3C;string>\",\n \"text\": {},\n \"highlights\": {},\n \"summary\": {},\n \"extras\": {},\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"&#x3C;string>\"\n ],\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"&#x3C;string>\",\n \"includeSections\": [\n \"&#x3C;string>\"\n ],\n \"excludeSections\": [\n \"&#x3C;string>\"\n ],\n \"query\": \"&#x3C;string>\",\n \"schema\": {},\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n}")	req, _ := http.NewRequest("POST", url, payload)	req.Header.Add("Content-Type", "&#x3C;content-type>")	req.Header.Add("Authorization", "&#x3C;authorization>")	res, _ := http.DefaultClient.Do(req)	defer res.Body.Close()	body, _ := io.ReadAll(res.Body)	fmt.Println(string(body))}
```

```
HttpResponse&#x3C;String> response = Unirest.post("https://api.novita.ai/v3/exa/contents") .header("Content-Type", "&#x3C;content-type>") .header("Authorization", "&#x3C;authorization>") .body("{\n \"urls\": [\n \"&#x3C;string>\"\n ],\n \"ids\": [\n \"&#x3C;string>\"\n ],\n \"compliance\": \"&#x3C;string>\",\n \"text\": {},\n \"highlights\": {},\n \"summary\": {},\n \"extras\": {},\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"&#x3C;string>\"\n ],\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"&#x3C;string>\",\n \"includeSections\": [\n \"&#x3C;string>\"\n ],\n \"excludeSections\": [\n \"&#x3C;string>\"\n ],\n \"query\": \"&#x3C;string>\",\n \"schema\": {},\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n}") .asString();
```

```
require 'uri'require 'net/http'url = URI("https://api.novita.ai/v3/exa/contents")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["Content-Type"] = '&#x3C;content-type>'request["Authorization"] = '&#x3C;authorization>'request.body = "{\n \"urls\": [\n \"&#x3C;string>\"\n ],\n \"ids\": [\n \"&#x3C;string>\"\n ],\n \"compliance\": \"&#x3C;string>\",\n \"text\": {},\n \"highlights\": {},\n \"summary\": {},\n \"extras\": {},\n \"livecrawlTimeout\": 123,\n \"maxAgeHours\": 123,\n \"subpages\": 123,\n \"subpageTarget\": [\n \"&#x3C;string>\"\n ],\n \"maxCharacters\": 123,\n \"includeHtmlTags\": true,\n \"verbosity\": \"&#x3C;string>\",\n \"includeSections\": [\n \"&#x3C;string>\"\n ],\n \"excludeSections\": [\n \"&#x3C;string>\"\n ],\n \"query\": \"&#x3C;string>\",\n \"schema\": {},\n \"links\": 123,\n \"imageLinks\": 123,\n \"richImageLinks\": 123,\n \"richLinks\": 123,\n \"codeBlocks\": 123\n}"response = http.request(request)puts response.read_body
```

200

```
{
"400": {},
"401": {},
"403": {},
"404": {},
"429": {},
"500": {},
"502": {},
"503": {},
"requestId": "&#x3C;string>",
"results": [
{}
],
"statuses": [
{}
],
"title": "&#x3C;string>",
"url": "&#x3C;string>",
"publishedDate": "&#x3C;string>",
"author": "&#x3C;string>",
"id": "&#x3C;string>",
"image": "&#x3C;string>",
"favicon": "&#x3C;string>",
"text": "&#x3C;string>",
"highlights": [
"&#x3C;string>"
],
"highlightScores": [
123
],
"summary": "&#x3C;string>",
"subpages": [
{}
],
"extras": {},
"links": [
{}
],
"imageLinks": [
{}
],
"richImageLinks": [
{}
],
"richLinks": [
{}
],
"codeBlocks": [
{}
],
"status": "&#x3C;string>",
"source": "&#x3C;string>",
"error": {},
"tag": "&#x3C;string>",
"httpStatusCode": {}
}
```

Retrieve page content, summaries, metadata, and fetch statuses for URLs or Exa document IDs. This is a passthrough to Exa’s Get Contents API, exposed through the Novita gateway with a platform route prefix.
To authenticate with your Novita API key, get one from the [Novita dashboard](https://novita.ai/settings/key-management). Base URL: `https://api.novita.ai`.

##

[​](#quickstart)

Quickstart

```
curl -X POST 'https://api.novita.ai/v3/exa/contents' \
-H 'Authorization: Bearer ' \
-H 'Content-Type: application/json' \
-d '{
"urls": ["https://arxiv.org/abs/2307.06435"],
"text": true
}'
```

##

[​](#request-headers)

Request Headers

All endpoints require platform API authentication.

[​](#param-content-type)

Content-Type

string

required

Use `application/json`.

[​](#param-authorization)

Authorization

string

required

Platform API key, formatted as `Bearer <api_key>`.

##

[​](#request-body)

Request Body

[​](#param-urls)

urls

string[]

required

URLs to retrieve. This field is also backwards compatible with values previously supplied through `ids`. Range is `1` to `100` entries; each URL may be up to 2048 characters.

[​](#param-ids)

ids

string[]

Exa document IDs to retrieve. Range is `1` to `100` entries; each ID may be up to 2048 characters.

[​](#param-compliance)

compliance

string

Enterprise compliance mode, such as `hipaa`.

[​](#param-text)

text

boolean | object

Text extraction options. See [Contents Text Options](#contents-text-options). Default is `false`.

[​](#param-highlights)

highlights

boolean | object

Highlight extraction options. See [Contents Highlight Options](#contents-highlight-options). Default is `false`.

[​](#param-summary)

summary

object

Summary generation options. See [Contents Summary Options](#contents-summary-options).

[​](#param-extras)

extras

object

Extra outputs to return from each page. See [Contents Extras Options](#contents-extras-options).

[​](#param-livecrawl-timeout)

livecrawlTimeout

integer

Live crawl timeout in milliseconds. Range is greater than `0` and up to `90000`; default is `10000`.

[​](#param-max-age-hours)

maxAgeHours

integer

Maximum cache age in hours. Use `0` for fresh content and `-1` to always use cache. Range is `-1` to `720`.

[​](#param-subpages)

subpages

integer

Number of subpages to crawl. Range is `0` to `100`; default is `0`.

[​](#param-subpage-target)

subpageTarget

string | string[]

Term or terms used to find targeted subpages. String values are limited to 100 characters.

###

[​](#contents-text-options)

Contents Text Options

[​](#param-max-characters)

maxCharacters

integer

Maximum number of text characters to return. Range is `1` to `10000`.

[​](#param-include-html-tags)

includeHtmlTags

boolean

Include lightweight HTML tags instead of plain text.

[​](#param-verbosity)

verbosity

string

Requested text verbosity.

[​](#param-include-sections)

includeSections

string[]

Semantic page sections to include.

[​](#param-exclude-sections)

excludeSections

string[]

Semantic page sections to exclude.

###

[​](#contents-highlight-options)

Contents Highlight Options

[​](#param-query)

query

string

Custom query used to select highlights.

[​](#param-max-characters-1)

maxCharacters

integer

Maximum characters to return for highlights. Range is `1` to `10000`.

###

[​](#contents-summary-options)

Contents Summary Options

[​](#param-query-1)

query

string

Custom instruction for summary generation.

[​](#param-schema)

schema

object

Optional JSON schema for structured summary output.

###

[​](#contents-extras-options)

Contents Extras Options

[​](#param-links)

links

integer

Number of links to return. Range is `0` to `1000`.

[​](#param-image-links)

imageLinks

integer

Number of image links to return. Range is `0` to `1000`.

[​](#param-rich-image-links)

richImageLinks

integer

Number of rich image links to return. Range is `0` to `1000`.

[​](#param-rich-links)

richLinks

integer

Number of rich links to return. Range is `0` to `1000`.

[​](#param-code-blocks)

codeBlocks

integer

Number of code blocks to return. Range is `0` to `1000`.

##

[​](#examples)

Examples

###

[​](#extract-text-and-highlights)

Extract text and highlights

```
curl -X POST 'https://api.novita.ai/v3/exa/contents' \
-H 'Authorization: Bearer ' \
-H 'Content-Type: application/json' \
-d '{
"urls": ["https://arxiv.org/abs/2307.06435"],
"text": {
"maxCharacters": 4000
},
"highlights": {
"query": "key findings"
}
}'
```

###

[​](#summarize-a-page)

Summarize a page

Use `summary` with a query to get a focused summary instead of raw text.

```
curl -X POST 'https://api.novita.ai/v3/exa/contents' \
-H 'Authorization: Bearer ' \
-H 'Content-Type: application/json' \
-d '{
"urls": ["https://arxiv.org/abs/2307.06435"],
"summary": {
"query": "What problem does this paper solve?"
}
}'
```

###

[​](#include-linked-subpages)

Include linked subpages

Use `subpages` with `subpageTarget` to also pull related pages the URL links to.

```
curl -X POST 'https://api.novita.ai/v3/exa/contents' \
-H 'Authorization: Bearer ' \
-H 'Content-Type: application/json' \
-d '{
"urls": ["https://example.com/docs"],
"text": true,
"subpages": 3,
"subpageTarget": "installation"
}'
```

###

[​](#force-fresh-content)

Force fresh content

Set `maxAgeHours` to `0` to bypass the cache and live-crawl the page.

```
curl -X POST 'https://api.novita.ai/v3/exa/contents' \
-H 'Authorization: Bearer ' \
-H 'Content-Type: application/json' \
-d '{
"urls": ["https://status.example.com"],
"text": true,
"maxAgeHours": 0
}'
```

##

[​](#response)

Response

[​](#param-request-id)

requestId

string

Unique request identifier.

[​](#param-results)

results

object[]

Content results.

[​](#param-statuses)

statuses

object[]

Fetch status for each requested URL or document ID.

###

[​](#content-result-object)

Content Result Object

[​](#param-title)

title

string

Page title.

[​](#param-url)

url

string

Page URL.

[​](#param-published-date)

publishedDate

string

Published date when available.

[​](#param-author)

author

string

Author when available.

[​](#param-id)

id

string

Exa document ID.

[​](#param-image)

image

string

Associated image URL.

[​](#param-favicon)

favicon

string

Site favicon URL.

[​](#param-text-1)

text

string

Extracted text when requested.

[​](#param-highlights-1)

highlights

string[]

Highlight snippets when requested.

[​](#param-highlight-scores)

highlightScores

number[]

Scores for returned highlights.

[​](#param-summary-1)

summary

string

Generated summary when requested.

[​](#param-subpages-1)

subpages

object[]

Subpage results when requested. See [Contents Subpage Object](#contents-subpage-object).

[​](#param-extras-1)

extras

object

Extra outputs when requested. See [Contents Response Extras Object](#contents-response-extras-object).

###

[​](#contents-subpage-object)

Contents Subpage Object

[​](#param-title-1)

title

string

Subpage title.

[​](#param-url-1)

url

string

Subpage URL.

[​](#param-id-1)

id

string

Exa document ID when available.

[​](#param-text-2)

text

string

Extracted text when requested.

[​](#param-summary-2)

summary

string

Generated summary when requested.

[​](#param-highlights-2)

highlights

string[]

Highlight snippets when requested.

###

[​](#contents-response-extras-object)

Contents Response Extras Object

[​](#param-links-1)

links

string[] | object[]

Links found on the page.

[​](#param-image-links-1)

imageLinks

string[] | object[]

Image links found on the page.

[​](#param-rich-image-links-1)

richImageLinks

object[]

Image links with additional metadata.

[​](#param-rich-links-1)

richLinks

object[]

Links with additional metadata.

[​](#param-code-blocks-1)

codeBlocks

object[]

Code blocks found on the page.

###

[​](#status-object)

Status Object

[​](#param-id-2)

id

string

Requested URL or document ID.

[​](#param-status)

status

string

Fetch status, such as `success` or `error`.

[​](#param-source)

source

string

Content source, such as `cached` or `crawled`.

[​](#param-error)

error

object

Error details when retrieval fails. See [Contents Error Detail Object](#contents-error-detail-object).

###

[​](#contents-error-detail-object)

Contents Error Detail Object

[​](#param-tag)

tag

string

Error tag, such as `CRAWL_NOT_FOUND`.

[​](#param-http-status-code)

httpStatusCode

integer | null

HTTP-like status code, such as `404`.

##

[​](#errors)

Errors

The platform may return standard HTTP errors before forwarding the request, and Exa may return upstream errors after forwarding.

[​](#param-400)

400

status

Invalid request body or unsupported parameter value.

[​](#param-401)

401

status

Missing or invalid API key.

[​](#param-403)

403

status

Access denied by platform or upstream provider.

[​](#param-404)

404

status

Route or requested resource not found.

[​](#param-429)

429

status

Rate limit exceeded.

[​](#param-500)

500

status

Internal server error.

[​](#param-502)

502

status

Upstream provider error.

[​](#param-503)

503

status

Service unavailable.

##

[​](#notes)

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)

References

For more details, see the [Exa Contents API reference](https://exa.ai/docs/reference/get-contents).

Last modified on July 15, 2026
