API

Извлечение по схеме

Читает страницу и возвращает готовый JSON строго по вашей схеме: только те поля, которые вы описали, без текста страницы. Нужно, когда от страницы требуются конкретные значения — цена, характеристики, автор и дата, список вакансий, — а не содержание целиком.

POSThttps://srezai.ru/api/v1/extract

Зачем это агенту

Обычный путь — прочитать страницу через /api/v1/read и разобрать текст своей моделью. Тогда все 20 000 символов страницы попадают в контекст агента и оплачиваются как его токены. Здесь страница читается и разбирается на нашей стороне, а наружу уходят только запрошенные поля — обычно в сотни раз меньше. Стоимость: 4 кредита за страницу.

Когда использовать#

  • Карточка товара или объявления: название, цена, наличие, характеристики.
  • Списки: вакансии, тарифы, участники, объекты каталога — схемой type: "array".
  • Метаданные статьи для индекса: автор, дата публикации, теги, заголовки разделов.
  • Мониторинг одного значения на нескольких страницах — батчем urls с одной схемой.

Если нужен весь текст страницы, а разбор вы делаете сами — берите чтение страницы: это 1 кредит вместо 4. Если нужно найти страницы по теме — веб-поиск.

Пример запроса#

curl -X POST https://srezai.ru/api/v1/extract \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer srz_live_ВАШ_КЛЮЧ" \
  -d '{
    "url": "https://example.com/product/42",
    "schema": {
      "type": "object",
      "properties": {
        "name":    { "type": "string",  "description": "название товара" },
        "price":   { "type": "number",  "description": "цена в рублях" },
        "inStock": { "type": "boolean", "description": "есть в наличии" }
      },
      "required": ["name", "price"]
    }
  }'

Параметры тела#

urlstringrequired

Полный адрес страницы, http или https. Не нужен, если передан urls.

urlsstring[]optional

До 5 адресов вместо url: одна схема применяется ко всем. Ответ приходит массивом pages.

schemaobjectrequired

Схема результата: сокращённая форма ({"title":"string"}) или полный JSON Schema. Без схемы запрос вернёт 400 с кодом schema_invalid: без неё это было бы обычное чтение страницы.

instructionstringoptional

Уточнение на случай, когда из схемы неочевидно, что именно брать: «цену со скидкой», «только вакансии удалённо». До 1000 символов.

enginestringoptional

Как забирать страницу: auto (по умолчанию), fast, dynamic, stealth — та же лестница, что у чтения страницы.

Сокращённая форма#

Полный JSON Schema писать не обязательно. Схему можно задать словарём «поле → тип» — это короче и заметно устойчивее, когда схему составляет модель:

json
{
  "url": "https://example.com/product/42",
  "schema": {
    "name": "string",
    "price": "number",
    "inStock": "boolean?",
    "tags": "string[]"
  }
}
string | number | integer | booleanтип поляoptional

Имя типа строкой. Поле по умолчанию обязательное: если значения на странице не нашлось, путь придёт в missing.

?необязательное полеoptional

Суффикс ? ("price": "number?") снимает поле с обязательных — отсутствующее значение придёт как null и в missing не попадёт.

[]массив значенийoptional

Суффикс [] ("tags": "string[]") — список значений этого типа. Суффиксы комбинируются: "string[]?".

{ … }вложенный объектoptional

Вложенный объект пишется вложенным объектом, с теми же правилами внутри.

[ { … } ]список объектовoptional

Массив из одного объекта — «собери список вот таких объектов», эквивалент { "type": "array", "items": { … } }.

json
{
  "schema": {
    "title": "string",
    "author": { "name": "string", "url": "string?" },
    "tags": "string[]"
  }
}

Обе формы можно смешивать: как только у узла есть поле type, он читается как обычный JSON Schema. Так что сокращённую схему всегда можно дополнить в нужном месте полным описанием поля с description и enum.

Полная форма#

Поддерживается практичное подмножество JSON Schema:

  • type: object, array, string, number, integer, boolean. Корень схемы — object или array.
  • properties и required — для объектов, items — для массивов.
  • description — короткое пояснение к полю. Заметно повышает точность: «цена в рублях без скидки» отрабатывает лучше, чем просто price.
  • enum — список допустимых значений для поля.

Ограничения: до 40 полей и до 4 уровней вложенности, до 100 элементов в массиве результата. Конструкции вне подмножества ($ref, oneOf, pattern, условные схемы) вернут 400 с кодом schema_invalid и указанием проблемного пути в схеме — например schema.properties.price.type.

Схема с корнем array — типовой случай «собери список»:

json
{
  "url": "https://example.com/jobs",
  "schema": {
    "type": "array",
    "items": {
      "type": "object",
      "properties": {
        "title":  { "type": "string" },
        "city":   { "type": "string" },
        "salary": { "type": "integer", "description": "верхняя граница, ₽/мес" },
        "remote": { "type": "boolean" }
      },
      "required": ["title"]
    }
  },
  "instruction": "только вакансии для инженеров"
}

Ответ#

json
{
  "url": "https://example.com/product/42",
  "title": "Кофемолка X200 — купить в магазине",
  "data": {
    "name": "Кофемолка X200",
    "price": 7490,
    "inStock": true
  },
  "missing": [],
  "truncated": false,
  "meta": {
    "tookMs": 6120,
    "sourceChars": 8213,
    "model": "gemini-3-flash-lite",
    "inputTokens": 2480,
    "outputTokens": 64
  }
}
dataobject | arrayoptional

Извлечённые данные ровно в форме вашей схемы. Полей, которых в схеме нет, в ответе не будет, даже если модель их придумала.

missingstring[]optional

Пути обязательных полей, значения которых на странице не нашлись — они пришли как null. Пустой массив означает, что схема заполнена целиком.

truncatedbooleanoptional

Текст страницы не поместился в лимит разбора (24 000 символов), и часть данных могла остаться за границей. Для очень длинных страниц имеет смысл сузить схему или указать раздел в instruction.

metaobjectoptional

tookMs, sourceChars (из скольких символов текста извлекали), model, inputTokens, outputTokens.

null — это ответ, а не ошибка

Мы не достраиваем данные по общим знаниям модели: чего на странице нет, приходит как null. Это сделано намеренно — выдуманная цена хуже отсутствующей. Проверяйте missing, прежде чем считать результат полным.

Несколько страниц за раз#

Вместо url можно передать urls — до 5 ссылок с одной схемой. Страницы обрабатываются параллельно.

json
{
  "urls": [
    "https://example.com/product/42",
    "https://example.com/product/43"
  ],
  "schema": {
    "type": "object",
    "properties": {
      "name":  { "type": "string" },
      "price": { "type": "number" }
    },
    "required": ["price"]
  }
}

Ответ — массив pages в порядке переданных ссылок: успешные с полями data/missing/meta, неудачные — с error и code (ssrf_blocked, read_failed, extract_failed). Одна упавшая ссылка не отменяет остальные: статус остаётся 200. Каждая страница тарифицируется отдельно и отдельной строкой попадает в историю запросов.

Через MCP: extract#

Тот же функционал доступен агенту как инструмент extract MCP-сервера — с теми же параметрами url/urls, schema, instruction, engine. Результат приходит блоком json; ненайденные обязательные поля перечисляются отдельной строкой, чтобы агент не принял null за факт со страницы.

Только публичные адреса

Как и чтение страницы, извлечение идёт с нашего сервера: приватные диапазоны, нестандартные порты и локальные имена отклоняются с 400 и кодом ssrf_blocked.

Только POST

Эндпоинт принимает только POST. GET вернёт 405 Method Not Allowed.