Read the text of any web page.
Give it links. Get back each page’s text and title, on your own Exa plan.
Job web.page.text
telipot run exa.web.page.text \
--input-json '{"urls":["https://example.com"],"text":{"maxCharacters":1000}}' \
--quotePrice
$0.001 / pagePriced· before it runs
exa.web.page.text
$0.001 / pageYour plan
Whose account it uses
1The person asking
not needed2Your company’s Exa plan
Selected identity for this example3Our account
not usedWhat it sends
{
"urls": ["https://example.com"],
"text": {"maxCharacters":1000}
}Your Exa login is added for you. Your AI never sees it.
What it costs
$0.001
per page · billed per result
| rate | $1 per 1,000 pages, billed per result |
| source | docs · exa.ai/docs/admin/pricing · checked 2026-10-05 |
| confidence | documented |
| settles on | The charge Exa reports in costDollars.total |
| note | $1 per 1,000 pages for each content type; a page returned with text and with highlights counts twice, and AI page summaries add $1 per 1,000 pages. |
Preview the price first. --quote runs nothing.
For developers · run it
Shell · runs the task on the named account
telipot run exa.web.page.text \
--input-json '{"urls":["https://example.com"],"text":{"maxCharacters":1000}}'urls array · required · 1 to 100 | URLs to crawl. Up to 100 per request. |
text object · required | Options for the text returned for each URL, such as { maxCharacters: 2000 } to limit the text per page; includeHtmlTags, verbosity (compact, standard or full), includeSections and excludeSections are also accepted. The vendor's schema also accepts true for the default settings, which this typed field cannot express, so pass an options object. Text is billed at $1 per 1,000 pages. |
maxAgeHours integer · -1 to 720 | Maximum age of cached content in hours. Positive values use cached content if it is less than this many hours old; 0 fetches fresh content; -1 always uses the cache; omitted uses fallback fetching when cached content is unavailable. |
livecrawlTimeout integer · 1 to 90000 · default 10000 | The timeout for livecrawling in milliseconds. |
requestId string | |
results object[] | |
statuses object[] | One entry per requested URL; a URL that failed is reported here, in a 200 response |
searchTime number | |
costDollars object | Estimated dollar cost of the completed request; billing is computed from usage counters, not from this object. |
Full output schema · JSONNested fields and constraints
Output JSON Schema
{
"type": "object",
"properties": {
"requestId": {
"type": "string"
},
"results": {
"type": "array",
"items": {
"type": "object",
"required": [
"title",
"url"
],
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"id": {
"type": "string",
"description": "Temporary document id, accepted by the contents route"
},
"publishedDate": {
"type": "string",
"description": "Estimated creation date parsed from the page"
},
"author": {
"type": [
"string",
"null"
]
},
"image": {
"type": "string"
},
"favicon": {
"type": "string"
},
"text": {
"type": "string",
"description": "Full page text, present only when requested"
},
"highlights": {
"type": "array",
"items": {
"type": "string"
}
},
"summary": {
"type": "string"
},
"subpages": {
"type": "array",
"items": {
"type": "object"
}
},
"entities": {
"type": "array",
"items": {
"type": "object"
}
},
"extras": {
"type": "object"
}
}
}
},
"statuses": {
"type": "array",
"description": "One entry per requested URL; a URL that failed is reported here, in a 200 response",
"items": {
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"description": "The URL or document id that was requested"
},
"status": {
"type": "string",
"enum": [
"success",
"error"
]
},
"source": {
"type": "string",
"enum": [
"cached",
"crawled"
]
},
"error": {
"anyOf": [
{
"type": "object",
"properties": {
"tag": {
"type": "string",
"description": "Specific error type, such as CRAWL_NOT_FOUND"
},
"httpStatusCode": {
"type": [
"integer",
"null"
],
"description": "The status the target page returned"
}
}
},
{
"type": "null"
}
]
}
}
}
},
"searchTime": {
"type": "number"
},
"costDollars": {
"type": "object",
"description": "Estimated dollar cost of the completed request; billing is computed from usage counters, not from this object.",
"properties": {
"total": {
"type": "number"
},
"search": {
"type": "object",
"properties": {
"neural": {
"type": "number"
},
"keyword": {
"type": "number"
}
}
},
"summary": {
"type": "number"
},
"contents": {
"type": "object",
"properties": {
"text": {
"type": "number"
},
"highlights": {
"type": "number"
},
"summary": {
"type": "number"
}
}
}
}
}
}
}A real answer
examples/exa.web.page.text.json
{
"requestId": "ec0c917e43b5c249b30a1839ea761835",
"results": [
{
"id": "https://example.com",
"title": "Example Domain",
"url": "https://example.com",
"author": null,
"text": "Example Domain\n\nThis domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.\n\nهذا النطاق مُخصص للاستخدام…",
"entities": [
{}
]
}
],
"statuses": [
{
"id": "https://example.com",
"status": "success",
"source": "cached"
}
],
"costDollars": {
"total": 0.001,
"contents": {
"text": 0.001
}
},
"searchTime": 6.0309359999373555
}
