# Exa page contents for URLs

Exa page contents (text, highlights, summary) for URLs. Takes ids, urls, text and more, all optional.

Exa page contents (text, highlights, summary) for URLs, by Exa. Contents Price: $0.001 per page for text, +$0.001 per page for highlights and for summary; subpages counted as pages. Billed at the cost Exa reports for the call (costDollars.total); the quote is the upper bound.

- Tool ID: `exa/contents`
- Name in the catalog: Exa page contents (text, highlights, summary) for URLs
- Provider: [Exa](/providers/exa.md)
- Capability: [Page to markdown](/tools/web-scraping/scrape.md)
- Price: usage based, the maximum is shown before a run
- Authentication: an authorised Agentik workspace is required for execution, including zero-price tools.

## Pricing contract

Billed at the cost the provider reports for the call, never above $2. Your agent sees the maximum before running.


```json
{
  "model": "reported",
  "costPath": "costDollars.total",
  "maxUsdDefault": 0,
  "maxUsdCap": 2,
  "multipliers": [
    {
      "addUsdPer": {
        "field": "urls",
        "usd": 0.001,
        "max": 100
      }
    },
    {
      "addUsdPer": {
        "field": "ids",
        "usd": 0.001,
        "max": 100
      }
    },
    {
      "when": {
        "field": "highlights",
        "truthy": true
      },
      "addUsdPer": {
        "field": "urls",
        "usd": 0.001,
        "max": 100
      }
    },
    {
      "when": {
        "field": "highlights",
        "truthy": true
      },
      "addUsdPer": {
        "field": "ids",
        "usd": 0.001,
        "max": 100
      }
    },
    {
      "when": {
        "field": "summary",
        "truthy": true
      },
      "addUsdPer": {
        "field": "urls",
        "usd": 0.001,
        "max": 100
      }
    },
    {
      "when": {
        "field": "summary",
        "truthy": true
      },
      "addUsdPer": {
        "field": "ids",
        "usd": 0.001,
        "max": 100
      }
    },
    {
      "when": {
        "field": "subpages",
        "gte": 1
      },
      "addUsdPer": {
        "field": "subpages",
        "usd": 0.003,
        "max": 100,
        "timesField": "urls",
        "timesDefault": 0,
        "timesMax": 100
      }
    },
    {
      "when": {
        "field": "subpages",
        "gte": 1
      },
      "addUsdPer": {
        "field": "subpages",
        "usd": 0.003,
        "max": 100,
        "timesField": "ids",
        "timesDefault": 0,
        "timesMax": 100
      }
    }
  ]
}
```

Pricing source: [https://exa.ai/pricing](https://exa.ai/pricing). $0.001 per page for text, +$0.001 per page for highlights and for summary; subpages counted as pages..

Price verification date: 2026-10-08.

## Complete input schema


```json
{
  "type": "object",
  "properties": {
    "ids": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 2048
      },
      "description": "Document IDs obtained from searches."
    },
    "urls": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 2048
      },
      "description": "URLs to crawl (backwards compatible with the `ids` parameter)."
    },
    "text": {
      "anyOf": [
        {
          "description": "Text extraction options for each result.",
          "oneOf": [
            {
              "type": "boolean",
              "title": "Simple text retrieval",
              "description": "If true, returns full page text with default settings. If false, disables text return.",
              "default": false
            },
            {
              "type": "object",
              "properties": {
                "maxCharacters": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 1000000,
                      "description": "Maximum character limit for the full page text. Useful for controlling response size and API costs."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "includeHtmlTags": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "If true, include lightweight HTML tags in returned text instead of plain markdown-style text. Use maxAgeHours: 0 when you need this applied to freshly fetched content.",
                      "default": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "verbosity": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "compact",
                        "standard",
                        "full"
                      ],
                      "description": "Controls text rendering verbosity. compact focuses on main content, standard includes more surrounding page context, and full requests the most complete rendered text. Some pages may produce identical standard and full output. Use maxAgeHours: 0 when you need this applied to freshly fetched content.",
                      "default": "compact"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "includeSections": {
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "header",
                          "navigation",
                          "banner",
                          "body",
                          "sidebar",
                          "footer",
                          "metadata"
                        ]
                      },
                      "description": "Best-effort. Only include content classified into these semantic page sections. Section classification may be unavailable or incomplete for some pages; validate output if strict filtering is required. Use maxAgeHours: 0 when you need this applied to freshly fetched content."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "excludeSections": {
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "header",
                          "navigation",
                          "banner",
                          "body",
                          "sidebar",
                          "footer",
                          "metadata"
                        ]
                      },
                      "description": "Exclude content classified into these semantic page sections. Section classification is best-effort. Use maxAgeHours: 0 when you need this applied to freshly fetched content."
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "title": "Advanced text options",
              "description": "Advanced options for controlling text extraction. Use this when you need to limit text length or include HTML structure."
            }
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "highlights": {
      "anyOf": [
        {
          "description": "Text snippets the LLM identifies as most relevant from each page.",
          "oneOf": [
            {
              "type": "boolean",
              "title": "Simple highlights retrieval",
              "description": "If true, returns highlights with default settings. If false, disables highlights.",
              "default": false
            },
            {
              "type": "object",
              "properties": {
                "query": {
                  "anyOf": [
                    {
                      "type": "string",
                      "description": "Custom query that guides which highlights the LLM picks."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "verbosity": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "low",
                        "medium",
                        "high"
                      ],
                      "description": "Preset highlight length: `low`, `medium`, and `high` allocate progressively larger token budgets for the returned highlights. With highlights.dynamic, the preset sets a single shared budget across the whole result set instead of a per-URL budget. Exact budgets are tuned by Exa and may change. Not compatible with maxCharacters or numSentences. Beta: requires the `Exa-Beta: dynamic-highlights-2026-08-28` request header; requests setting `verbosity` without it are rejected.",
                      "x-exa-lifecycle": "beta",
                      "x-exa-beta-flag": "dynamic-highlights-2026-08-28",
                      "x-mint": {
                        "post": [
                          "Beta"
                        ]
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "dynamic": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Enable Dynamic Highlights (research preview): considers all results together and allocates a single shared context budget across the result set instead of a per-document budget. Not compatible with maxCharacters. Beta: requires the `Exa-Beta: dynamic-highlights-2026-08-28` request header; requests setting `dynamic` without it are rejected.",
                      "x-exa-lifecycle": "beta",
                      "x-exa-beta-flag": "dynamic-highlights-2026-08-28",
                      "x-mint": {
                        "post": [
                          "Beta"
                        ]
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "maxCharacters": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 1000000,
                      "description": "Maximum number of characters to return for highlights. Controls the total length of highlight text returned per URL. Not compatible with highlights.dynamic."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "numSentences": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "description": "Deprecated. Use `maxCharacters` instead. Currently mapped to a character budget of about 1333 characters per sentence. Pass highlights: true for default highlights, or { query } to guide selection with your own query.",
                      "x-exa-lifecycle": "deprecated",
                      "x-exa-replacement": "maxCharacters"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "highlightsPerUrl": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "description": "Deprecated. Currently ignored. Pass highlights: true for default highlights, or { query } to guide selection with your own query.",
                      "x-exa-lifecycle": "deprecated"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "title": "Advanced highlights options",
              "description": "Advanced options for steering highlight extraction. Pass highlights: true for the highest-quality default; supply this object only when you need to guide selection with your own query."
            }
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "summary": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "query": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Custom query for the LLM-generated summary."
                },
                {
                  "type": "null"
                }
              ]
            },
            "schema": {
              "anyOf": [
                {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "description": "Any JSON value.",
                    "oneOf": [
                      {
                        "type": "null"
                      },
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {}
                      },
                      {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      }
                    ]
                  },
                  "description": "JSON schema for structured output from summary. See https://json-schema.org/overview/what-is-jsonschema for JSON Schema documentation."
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Summary of the webpage."
        },
        {
          "type": "null"
        }
      ]
    },
    "extras": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "links": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000,
                  "description": "Number of URLs to return from each webpage.",
                  "default": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "imageLinks": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000,
                  "description": "Number of images to return for each result.",
                  "default": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "richImageLinks": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000,
                  "description": "Number of rich image links to return for each result.",
                  "default": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "richLinks": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000,
                  "description": "Number of rich links to return for each result.",
                  "default": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "codeBlocks": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000,
                  "description": "Number of code blocks to return for each result.",
                  "default": 0
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Extra parameters to pass."
        },
        {
          "type": "null"
        }
      ]
    },
    "livecrawlTimeout": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 90000,
          "description": "The timeout for livecrawling in milliseconds.",
          "default": 10000
        },
        {
          "type": "null"
        }
      ]
    },
    "maxAgeHours": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -1,
          "maximum": 720,
          "description": "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 and is the supported way to apply text rendering options to newly fetched pages; -1 always uses cache; omitted uses fallback fetching when cached content is unavailable. Maximum supported value is 720 hours."
        },
        {
          "type": "null"
        }
      ]
    },
    "snapshotAsOf": {
      "anyOf": [
        {
          "description": "Return the newest stored version of each page as of this instant. Accepts an ISO 8601 date-time (`2026-01-15T00:00:00Z`) or a date-only value (`2026-01-15`), which is interpreted as midnight UTC. Historical requests are served from stored versions only and never fetch the live page.",
          "oneOf": [
            {
              "type": "string",
              "description": "ISO 8601 date-time.",
              "format": "date-time"
            },
            {
              "type": "string",
              "description": "ISO 8601 date (`YYYY-MM-DD`), interpreted as midnight UTC.",
              "format": "date"
            }
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "subpages": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "description": "The number of subpages to crawl. The actual number crawled may be limited by system constraints.",
          "default": 0
        },
        {
          "type": "null"
        }
      ]
    },
    "subpageTarget": {
      "anyOf": [
        {
          "description": "Term to find specific subpages of search results. Can be a single string or an array of strings.",
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            {
              "minItems": 0,
              "maxItems": 100,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            }
          ]
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "additionalProperties": false
}
```

## Published example

This is the provider tool’s published example. Replace example values with the user’s requested inputs, respecting the schema; do not execute an example merely to test a connection.


```json
{
  "tool_id": "exa/contents",
  "input": {
    "urls": [
      "https://en.wikipedia.org/wiki/Lisbon"
    ],
    "text": true
  }
}
```

## Execute and retrieve

Inspect again before execution, explain the price and obtain the required authority. Use MCP run_tool or POST /v1/run with this tool ID, valid input and an idempotency key. Save the returned run ID and follow the actual state. If Agentik answers that the tool is temporarily unavailable, do not retry it blindly; use discovery to propose an alternative.

A partial or uncertain result can still have consumed provider resources. Consult [billing](/docs/billing.md), [idempotency](/docs/idempotency.md) and [asynchronous results](/docs/async.md).

[Provider documentation](https://exa.ai/docs/reference/get-contents)

[REST inspection](https://api.agentik.cc/v1/tools/exa/contents) · [OpenAPI](/openapi.json) · [Connection guide](/connect.md)

---

[HTML page](/providers/exa/contents) · [Agent index](/llms.txt)
