Provided by Exa
Page Text, Highlights and Summary for Multiple URLs
Body text plus key highlights and a short summary for up to 10 web pages given their URLs via Exa: each delivered page returns title, author, published date, its text, the passages that matter most and a brief summary, optionally steered by a question. Optional freshness controls take a cached copy up to a given age or force a fresh fetch. URLs that cannot be retrieved are reported per URL and not charged; three content types are billed per page.
Contract snapshot: 2026-09-29. Inspect in Glasser for current terms.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"urls"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string",
"pattern": "^https?:\\/\\/",
"maxLength": 2048,
"minLength": 8
},
"maxItems": 10,
"minItems": 1
},
"summary": {
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"minLength": 1
}
},
"additionalProperties": false
},
"highlights": {
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"maxCharacters": {
"type": "integer",
"maximum": 10000,
"minimum": 1
}
},
"additionalProperties": false
},
"maxAgeHours": {
"type": "integer",
"maximum": 720,
"minimum": -1
},
"maxCharacters": {
"type": "integer",
"maximum": 10000,
"minimum": 1
},
"livecrawlTimeout": {
"type": "integer",
"maximum": 12000,
"minimum": 1000
}
},
"additionalProperties": false
}{
"urls": [
"https://en.wikipedia.org/wiki/Battery_recycling"
],
"summary": {
"query": "How are lithium-ion batteries recycled?"
},
"maxCharacters": 2000
}This Endpoint publishes no output schema. You get the Provider's own response body, unchanged — we do not warrant a shape we cannot guarantee.
How to run it
Two fields identify it: the Provider and the endpoint key. The key looks like a path because it usually mirrors the Provider's own, but it is an opaque identifier — not a URL you can open. The same provider:endpoint pair is what your Policy lists.
Once: paste this into your agent's chat. The Skill installs the CLI and logs in by itself. For an agent that cannot use a shell, connect it over MCP instead.
set up https://glasser.ai/SKILL.mdThen ask for this Endpoint:
Run the Exa Endpoint /contents?highlights=true&summary=true on Glasser with input {"urls":["https://en.wikipedia.org/wiki/Battery_recycling"],"summary":{"query":"How are lithium-ion batteries recycled?"},"maxCharacters":2000}glasser run -p exa -e '/contents?highlights=true&summary=true' -i '{"urls":["https://en.wikipedia.org/wiki/Battery_recycling"],"summary":{"query":"How are lithium-ion batteries recycled?"},"maxCharacters":2000}' --endpoint-version 1Pinned to version 1, the one this page shows: if a newer version is published first, the Run is refused instead of charged under new terms. Install and log in first on Get Started.
Once per Run:
IDEMPOTENCY_KEY=$(uuidgen)Run it, and copy this same block to send it again:
curl -X POST https://api.glasser.ai/v1/runs \
-H "Authorization: Bearer gl_..." \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
-d '{"provider":"exa","endpoint":"/contents?highlights=true&summary=true","input":{"urls":["https://en.wikipedia.org/wiki/Battery_recycling"],"summary":{"query":"How are lithium-ion batteries recycled?"},"maxCharacters":2000},"endpoint_version":1}'Reuse the same Idempotency-Key to send it again: the second send is a read of the first Run. A new key is a new Run and a new Charge. Pinned to version 1 for the same reason as the CLI.
What each outcome charges
| No result | The Provider answered: nothing matched. | $0.00 |
|---|---|---|
| Provider error | The Provider failed to answer. | $0.00 |
| Timed out | The deadline won. | $0.00 |
| Internal failure | Our defect. | $0.00 |