На этой странице

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

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

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

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

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

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

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

bash
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"]
    }
  }'

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

urlstringобязательный

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

urlsstring[]необязательный

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

schemaobjectобязательный

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

instructionstringнеобязательный

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

enginestringнеобязательный

Как забирать страницу: 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тип полянеобязательный

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

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

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

[]массив значенийнеобязательный

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

{ … }вложенный объектнеобязательный

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

[ { … } ]список объектовнеобязательный

Массив из одного объекта - «собери список вот таких объектов», эквивалент { "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 | arrayнеобязательный

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

missingstring[]необязательный

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

truncatedbooleanнеобязательный

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

metaobjectнеобязательный

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

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

Вместо url можно передать urls - до 5 ссылок на бесплатном тарифе и до 10 на подписке PRO, с одной схемой на все страницы. Страницы обрабатываются параллельно, лишние адреса отбрасываются и попадают в meta.skipped.

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 за факт со страницы.