Skip to content

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

Your AI asks

checks the price first
telipot run exa.web.page.text \
  --input-json '{"urls":["https://example.com"],"text":{"maxCharacters":1000}}' \
  --quote

Price

$0.001 / page
Priced· before it runs

exa.web.page.text

$0.001 / pageYour plan

Whose account it uses

1The person asking
not needed
2Your company’s Exa plan
Selected identity for this example
3Our account
not used

What 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
sourcedocs · exa.ai/docs/admin/pricing · checked 2026-10-05
confidencedocumented
settles onThe 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
}