К основному содержанию
скилл CX Codex

exa-contents — скилл для Claude Code: извлечение текста с URL

Скилл учит агента вызывать Exa Contents напрямую через cURL: отдаёт чистый текст, выдержки или сводки по известным адресам без нового поиска.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add exa-labs/agent-skills --skill exa-contents -a claude-code
Открыть на GitHub

Что делает exa-contents

Когда ссылки уже собраны, искать заново не нужно. Скилл показывает агенту, как отправить POST на https://api.exa.ai/contents с заголовком x-api-key и забрать содержимое страниц в виде, пригодном для модели: полный текст, выдержки по запросу или краткую сводку. Для контекста агента советует highlights — это дешевле по токенам, чем тянуть страницу целиком.

Свежесть страницы задаётся параметром maxAgeHours: 0 всегда идёт в живой обход, -1 берёт только кэш, положительное число — кэш не старше стольких часов. Таймаут обхода ограничивает livecrawlTimeout в миллисекундах. Отдельно можно дотянуть связанные страницы через subpages и subpageTarget, а из самой страницы вытащить ссылки и картинки через extras.

Понадобится ключ Exa в переменной EXA_API_KEY. Ключевое место — разбор ответа: запрос возвращает HTTP 200, даже если часть адресов не поднялась, поэтому статусы по каждому URL надо смотреть отдельно. Без ключа любой вызов вернёт ошибку авторизации, и агент об этом должен знать заранее.

Какие задачи решает

  • вытащить чистый текст страниц, которые агент уже нашёл
  • получить короткие выдержки по теме без чтения целой статьи
  • сжать страницу в сводку на стороне Exa
  • управлять свежестью: обойти кэш или настоять на живой загрузке
  • разобрать, какие адреса в пачке не открылись

Примеры запросов агенту

  • Забери выдержки по методологии и результатам с https://arxiv.org/abs/2307.06435, кэш не старше 24 часов
  • Вытащи текст с этих трёх URL и покажи, какие статусы вернулись
  • Обойди страницу заново, возьми только кэш и добавь пять подстраниц по слову reference

Как установить exa-contents

1Через Skills CLI (Vercel)

npx skills add exa-labs/agent-skills --skill exa-contents -a claude-code

2Вручную: положить файлы

~/.claude/skills/exa-contents/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/exa-contents/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о exa-contents

Как установить exa-contents в Claude Code?

Выполните npx skills add exa-labs/agent-skills --skill exa-contents -a claude-code. После этого файл скилла лежит по пути ~/.claude/skills/exa-contents/SKILL.md.

Что делает exa-contents?

Показывает агенту вызовы POST /contents в Exa через cURL: извлечение текста, выдержки, сводки, ссылки, подстраницы и контроль свежести по известным URL.

Чем отличается от поиска в Exa?

Этот скилл работает с уже известными адресами. Если агенту нужно сначала найти или отранжировать страницы, используется POST /search.

Исходный текст

SKILL.md · MIT
---
name: exa-contents
description: "Call Exa Contents directly with cURL or raw HTTP. Use when an agent already has URLs and needs POST /contents without an SDK for extracted text, highlights, summaries, links, image links, subpages, freshness-controlled crawling, or per-URL status handling."
---

# Exa Contents

> Requires API key: Get one at https://dashboard.exa.ai/api-keys
>
> Header: `x-api-key: $EXA_API_KEY`

Use `POST https://api.exa.ai/contents` when the agent already knows the URLs and needs clean, LLM-ready extraction without running a new search. Start with one content mode: `highlights` for compact agent context, `text` for broad page context, or `summary` for Exa-side compression.

## Quick Start (cURL)

### Basic text extraction

```bash
curl -sS -X POST "https://api.exa.ai/contents" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $EXA_API_KEY" \
  -d '{
    "urls": ["https://example.com"],
    "text": true
  }'
```

### Highlights with freshness control

```bash
curl -sS -X POST "https://api.exa.ai/contents" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $EXA_API_KEY" \
  -d '{
    "urls": ["https://arxiv.org/abs/2307.06435"],
    "highlights": {
      "query": "methodology and results"
    },
    "maxAgeHours": 24,
    "livecrawlTimeout": 12000
  }'
```

## Endpoint

```text
POST https://api.exa.ai/contents
```

Authentication: `x-api-key: <API_KEY>` header. Exa also accepts `Authorization: Bearer <API_KEY>`, but prefer `x-api-key` in cURL examples for consistency.

Use this endpoint for known-URL extraction. If the agent needs discovery or ranking first, use `POST /search`.

## Parameters

### Core request parameters

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `urls` | string[] | Yes | - | URLs to extract content from. Use this for known URLs. |
| `text` | boolean or object | No | - | Return full page text as markdown. Object form supports `maxCharacters`, `includeHtmlTags`, `verbosity`, `includeSections`, and `excludeSections`. |
| `highlights` | boolean or object | No | - | Return key excerpts. Prefer `true` for agent workflows unless a custom focus is needed. |
| `summary` | boolean or object | No | - | Return per-page LLM summaries. Use when the caller wants Exa-side compression or structured extraction. |
| `maxAgeHours` | integer | No | - | Freshness control. `0` always live crawls; `-1` uses cache only; omit for default cache-first behavior with crawl fallback. |
| `livecrawlTimeout` | integer | No | `10000` | Timeout for live crawling in milliseconds. Use `10000` to `15000` for most freshness-sensitive calls. |
| `subpages` | integer | No | `0` | Number of linked subpages to crawl from each URL. |
| `subpageTarget` | string or string[] | No | - | Terms used to prioritize which subpages matter, such as `["api", "reference", "pricing"]`. |
| `extras.links` | integer | No | `0` | Number of links to extract from each page. |
| `extras.imageLinks` | integer | No | `0` | Number of image URLs to extract from each page. |
| `compliance` | string | No | - | Enterprise-only compliance mode, such as `hipaa`, when enabled for the account. |

### Text object options

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `maxCharacters` | integer | - | Character limit for returned text. Use this instead of `tokensNum`. |
| `includeHtmlTags` | boolean | `false` | Preserve HTML tags in output. |
| `verbosity` | string | `compact` | `compact`, `standard`, or `full`. Pair fresh section-aware extraction with `maxAgeHours: 0`. |
| `includeSections` | string[] | - | Only include selected sections: `header`, `navigation`, `banner`, `body`, `sidebar`, `footer`, `metadata`. |
| `excludeSections` | string[] | - | Exclude selected sections from the same section list. |

### Highlights object options

Prefer `highlights: true` for the highest-quality default. Only use object form when the agent needs a custom focus or budget.

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `query` | string | - | Custom query guiding which excerpts are returned. |
| `maxCharacters` | integer | - | Cap highlight characters per URL. Omit unless the caller has a strict budget. |

### Summary object options

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `query` | string | - | Custom query for the summary. |
| `schema` | object | - | JSON Schema for structured per-page summaries. |

## Content Modes

On `/contents`, `text`, `highlights`, and `summary` are top-level request fields.

| Mode | Best for | Notes |
| --- | --- | --- |
| `text` | Deep analysis and broad page context | Use `maxCharacters` to keep payloads bounded. |
| `highlights` | Agent workflows and factual lookups | Most token-efficient default. Excerpts are grounded in the source page. |
| `summary` | Compression or structured per-page extraction | Adds Exa-side synthesis per page. |

Avoid requesting multiple modes unless the caller truly needs multiple views of the same page.

## Freshness and Crawling

Use `maxAgeHours` as the normative freshness control.

| Value | Behavior |
| --- | --- |
| omitted | Use default cache-first behavior with crawl fallback when needed. |
| positive integer | Use cache if it is less than N hours old, otherwise live crawl. |
| `0` | Always live crawl. Highest freshness, higher latency. |
| `-1` | Cache only. Fastest, but fails if no cached content exists. |

Set `livecrawlTimeout` when live crawling should not block past a fixed budget.

### Subpages and extras

Use `subpages` and `subpageTarget` when linked pages matter.

```bash
curl -sS -X POST "https://api.exa.ai/contents" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $EXA_API_KEY" \
  -d '{
    "urls": ["https://docs.example.com"],
    "text": {
      "maxCharacters": 5000
    },
    "subpages": 10,
    "subpageTarget": ["api", "reference", "guide"],
    "extras": {
      "links": 10,
      "imageLinks": 5
    }
  }'
```

Start with `subpages` around `5` to `10`, then increase only when the caller needs broader site coverage.

## Response Fields and Statuses

Inspect `statuses` even when the HTTP status is 200. The endpoint can succeed for one URL and fail for another in the same request.

```bash
curl -sS -X POST "https://api.exa.ai/contents" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $EXA_API_KEY" \
  -d '{
    "urls": ["https://example.com", "https://failed-url.example.com"],
    "highlights": true
  }' | jq '{results, statuses}'
```

| Field | Type | Description |
| --- | --- | --- |
| `requestId` | string | Unique request identifier. |
| `results` | array | Extracted content result objects. |
| `results[].title` | string | Page title. |
| `results[].url` | string | Page URL. |
| `results[].publishedDate` | string or null | Estimated publication date when available. |
| `results[].author` | string or null | Author when available. |
| `results[].text` | string | Returned when `text` is requested. |
| `results[].highlights` | string[] | Returned when `highlights` is requested. |
| `results[].highlightScores` | number[] | Similarity scores for highlights. |
| `results[].summary` | string | Returned when `summary` is requested. |
| `results[].subpages` | array | Nested result objects from subpage crawling. |
| `results[].extras.links` | string[] | Extracted links when requested. |
| `statuses` | array | Per-URL success or error states. Always inspect this field. |
| `statuses[].id` | string | Requested URL. |
| `statuses[].status` | string | `success` or `error`. |
| `statuses[].error.tag` | string | Error type for failed URLs. |
| `statuses[].error.httpStatusCode` | integer or null | HTTP code associated with a per-URL failure. |
| `costDollars.total` | number | Total request cost when returned. |

Common per-URL error tags include `CRAWL_NOT_FOUND`, `CRAWL_TIMEOUT`, `CRAWL_LIVECRAWL_TIMEOUT`, `SOURCE_NOT_AVAILABLE`, `UNSUPPORTED_URL`, and `CRAWL_UNKNOWN_ERROR`.

## Critical Pitfalls

- Keep `text`, `highlights`, and `summary` at the top level on `/contents`.
- Do not wrap extraction options in a `contents` object; that nesting belongs to `/search`.
- Do not assume HTTP 200 means every URL succeeded; inspect `statuses`.
- Do not send `stream: true`; `/contents` is not a streaming endpoint.
- Do not send `tokensNum`; use `text.maxCharacters` to cap extracted text.
- Do not use `useAutoprompt`, `numSentences`, `highlightsPerUrl`, or older `livecrawl` string values in new requests.
- Prefer `maxAgeHours` for freshness and pair it with `livecrawlTimeout` when crawl latency matters.
- Use `subpageTarget` with `subpages`; otherwise subpage selection is best effort.
- Pick one of `highlights`, `text`, or `summary` by default. Stack modes only when the caller truly needs multiple views of each page.

© exa-labs · MIT · exa-labs/agent-skills

Похожие скиллы

Все скиллы по теме «Настройка агента: память, контекст, субагенты» →
setup-matt-pocock-skills Matt Pocock Скилл настраивает репозиторий для инженерных скиллов Matt Pocock: задаёт трекер задач, метки триажа и расположение доменной документации. Запустите его перед первым использованием остальных скиллов. 1 052 851установок ask-matt Matt Pocock Помогает выбрать подходящий скилл или рабочий поток из набора Matt Pocock. Пригодится, когда непонятно, с чего начать задачу: от идеи до разбора бага. 766 587установок to-tickets Matt Pocock Разбивает план, спецификацию или переписку на небольшие сквозные задачи и отмечает, какие из них блокируют остальные. Пригодится, когда нужно согласовать порядок работы до публикации задач в трекере. 711 230установок writing-plans Jesse Vincent Скилл превращает требования к многошаговой задаче в подробный план реализации до начала работы с кодом. Пригодится, когда исполнителю нужно зафиксировать файлы, интерфейсы и проверки. CX Codex 282 859установок caveman-review JuliusBrussee Пишет замечания к коду одной строкой: место, проблема, исправление. Пригодится, когда ревью диффа или PR надо пройти быстро и без воды. CX Codex +1 411 800установок caveman-compress JuliusBrussee Сжимает CLAUDE.md, списки задач и другие текстовые файлы в краткий формат, сохраняя читаемую резервную копию. CX Codex +1 411 500установок

Из того же набора5

Спонсоры проекта

Компании, которые помогают держать аналитику открытой