> ## Documentation Index
> Fetch the complete documentation index at: https://speshu.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Загрузка страницы

> POST /api/v1/tools/fetch — текст страницы по ссылке

Эндпоинт загружает страницу по ссылке и возвращает её заголовок и текст в Markdown. Типичное применение — второй этап поиска: вы нашли страницу в выдаче и хотите прочитать её целиком, а не по выдержке.

## Минимальный запрос

```bash cURL theme={null} theme={null}
curl https://speshu.ai/api/v1/tools/fetch \
  -H "Authorization: Bearer $SPESHU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/article"}'
```

> [!NOTE]
>
> Ключ передаётся заголовком `Authorization: Bearer sk-...`. Он создаётся в личном кабинете и показывается один раз — подробности на странице [Аутентификация](https://speshu.ai/docs/authentication.md).

## Поля запроса

| Поле | Тип | Описание |
| - | - | - |
| `url` | string | Адрес страницы. Обязательно; до 8192 символов |

## Какие адреса принимаются

* Схема адреса — `http` или `https`. Другие схемы отклоняются.
* Адрес должен быть абсолютным и содержать хост.
* Логин и пароль в адресе не допускаются.
* Адрес не должен вести во внутреннюю сеть: приватный диапазон, loopback и link-local отклоняются с `403 url_not_allowed`.

Публичный адрес по `http` допускается.

> [!WARNING]
>
> Внутренние адреса отклоняются всегда, в том числе `127.0.0.1` и `localhost`. Через эндпоинт нельзя достать до внутренних адресов платформы.

## Ответ

`200 OK`:

```json theme={null} theme={null}
{
  "title": "Возврат товара",
  "content": "# Возврат товара\n\nВернуть товар можно в течение 14 дней...",
  "usage": {
    "cost": 0.0002
  }
}
```

| Поле | Тип | Описание |
| - | - | - |
| `title` | string | Заголовок страницы |
| `content` | string | Текст страницы в Markdown |
| `usage` | object | Расход по вызову. Объект есть всегда, в каждом ответе |
| `usage.cost` | number | Сумма, списанная с вашего баланса за вызов. Поле отсутствует, если списание не зафиксировано |

Текст приходит в Markdown: заголовки, списки и таблицы сохраняются. Если у страницы нет пригодного содержимого, придёт `404 not_found`.

### Стоимость

Стоимость зависит от объёма загрузки. Поле `usage.cost` — сумма, списанная с вашего баланса; оно отсутствует, если списание не зафиксировано.

Фактический остаток после вызова проверяйте через `GET /api/v1/balance`.

## Проверки перед вызовом

| Ситуация | Ответ |
| - | - |
| Нет ключа или ключ недействителен | `401 invalid_api_key` |
| Не хватает денег | `402 insufficient_quota` |
| Нет `url`, пустой `url`, `url` длиннее 8192 символов, схема адреса не `http` и не `https`, нет хоста, в адресе есть логин и пароль | `400 invalid_request` |
| Адрес ведёт на приватный, loopback или link-local адрес | `403 url_not_allowed` |
| На странице нет пригодного текста | `404 not_found` |
| Превышен лимит запросов в минуту | `429 rate_limit_exceeded` |
| Превышен лимит потребления в минуту | `429 token_limit_exceeded` |
| Загрузка недоступна | `503 service_unavailable` |
| Загрузка страницы вернула ошибку | `502 upstream_error` |

Ошибки приходят в конверте OpenAI — объект `error` с полями `message`, `type`, `param` и `code`. Полная таблица кодов — на странице [Ошибки](https://speshu.ai/docs/errors.md).

## Что дальше

> **[Поиск в интернете](https://speshu.ai/docs/api-reference/tools/search.md)**
>
> Поиск страниц по текстовому запросу

> **[Баланс](https://speshu.ai/docs/api-reference/other/balance.md)**
>
> Остаток кошелька по валютам

> **[Ошибки](https://speshu.ai/docs/errors.md)**
>
> Полная таблица кодов

> **[Ранжирование](https://speshu.ai/docs/api-reference/rerank/create.md)**
>
> Второй этап отбора документов


## OpenAPI

````yaml api-reference/openapi.json POST /api/v1/tools/fetch
openapi: 3.1.0
info:
  title: SpeShu.AI API
  version: 1.0.0
  description: >-
    Единый OpenAI-совместимый API для текстовых моделей, генерации изображений,
    видео, аудио и музыки.


    ## Аутентификация


    Все запросы, кроме `GET /api/v1/models` и `GET /api/v1/media/models`,
    требуют API-ключ. Ключ передаётся в заголовке `Authorization: Bearer <ключ>`
    или `X-Api-Key: <ключ>`.


    ## Ошибки


    Текстовые эндпоинты (`/chat/completions`, `/responses`, `/messages`) и
    `/balance` возвращают ошибки в формате OpenAI:


    ```json

    { "error": { "message": "...", "type": "invalid_request_error", "param":
    null, "code": "invalid_request" } }

    ```


    Эндпоинты медиа используют собственный конверт:


    ```json

    { "code": 422, "msg": "...", "data": null }

    ```


    Подробности — на странице [Ошибки](/errors).
servers:
  - url: https://speshu.ai
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Текст
    description: Генерация текста и диалог
  - name: Медиа
    description: Асинхронные задачи генерации изображений, видео, аудио и музыки
  - name: Хранилище
    description: Файлы пользователя
  - name: Справочник
    description: Каталог моделей и баланс
  - name: Аудио
    description: Синтез и распознавание речи
  - name: Инструменты
    description: Поиск в интернете и загрузка страниц
paths:
  /api/v1/tools/fetch:
    post:
      tags:
        - Инструменты
      summary: Загрузка страницы
      description: >-
        Загружает страницу по ссылке и возвращает её заголовок и текст в
        Markdown. Адрес должен быть абсолютным http или https адресом с хостом и
        без логина с паролем. Адреса приватных, loopback и link-local диапазонов
        отклоняются. Списание зависит от объёма загрузки.
      operationId: createFetch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - url
              properties:
                url:
                  type: string
                  maxLength: 8192
                  description: >-
                    Адрес страницы. Обязательно; до 8192 символов. Схема — http
                    или https, хост обязателен, логин и пароль в адресе не
                    допускаются.
      responses:
        '200':
          description: Заголовок и текст страницы.
          content:
            application/json:
              schema:
                type: object
                required:
                  - title
                  - content
                  - usage
                properties:
                  title:
                    type: string
                    description: Заголовок страницы.
                  content:
                    type: string
                    description: Текст страницы в Markdown.
                  usage:
                    type: object
                    description: Расход по вызову. Объект есть всегда, в каждом ответе.
                    properties:
                      cost:
                        type: number
                        description: >-
                          Сумма, списанная с вашего баланса за вызов.
                          Отсутствует, если списание не зафиксировано.
        '400':
          $ref: '#/components/responses/OpenAIError'
        '401':
          $ref: '#/components/responses/OpenAIError'
        '402':
          $ref: '#/components/responses/OpenAIError'
        '403':
          $ref: '#/components/responses/OpenAIError'
        '404':
          $ref: '#/components/responses/OpenAIError'
        '429':
          $ref: '#/components/responses/OpenAIError'
        '499':
          $ref: '#/components/responses/OpenAIError'
        '500':
          $ref: '#/components/responses/OpenAIError'
        '502':
          $ref: '#/components/responses/OpenAIError'
        '503':
          $ref: '#/components/responses/OpenAIError'
        '504':
          $ref: '#/components/responses/OpenAIError'
components:
  responses:
    OpenAIError:
      description: Ошибка в формате OpenAI.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/OpenAIError'
  schemas:
    OpenAIError:
      type: object
      properties:
        error:
          type: object
          properties:
            message:
              type: string
            type:
              type: string
              examples:
                - invalid_request_error
              description: >-
                `authentication_error` при 401, `rate_limit_error` при 429,
                `permission_error` при 403, в остальных случаях
                `invalid_request_error`, `api_error` или `internal_error`.
            param:
              type:
                - string
                - 'null'
            code:
              type:
                - string
                - 'null'
              examples:
                - invalid_request
              description: >-
                Машиночитаемый код: `invalid_api_key`, `unauthorized`,
                `insufficient_quota`, `rate_limit_exceeded`,
                `token_limit_exceeded`, `content_too_large`, `limit_exceeded`,
                `model_not_found`, `no_providers`, `service_unavailable`,
                `provider_error`, `invalid_request`, `context_length_exceeded`,
                `internal_error`.
          required:
            - message
            - type
      required:
        - error
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        API-ключ в формате `sk-...`. Альтернативно — заголовок `X-Api-Key:
        sk-...` (совместимо с Anthropic SDK).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.