API
Извлечение по схеме
Читает страницу и возвращает готовый JSON строго по вашей схеме: только те поля, которые вы описали, без текста страницы. Нужно, когда от страницы требуются конкретные значения — цена, характеристики, автор и дата, список вакансий, — а не содержание целиком.
https://srezai.ru/api/v1/extractЗачем это агенту
Когда использовать#
- Карточка товара или объявления: название, цена, наличие, характеристики.
- Списки: вакансии, тарифы, участники, объекты каталога — схемой
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 писать не обязательно. Схему можно задать словарём «поле → тип» — это короче и заметно устойчивее, когда схему составляет модель:
{
"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": { … } }.
{
"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 — типовой случай «собери список»:
{
"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": "только вакансии для инженеров"
}Ответ#
{
"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.
metaobjectoptionaltookMs, sourceChars (из скольких символов текста извлекали), model, inputTokens, outputTokens.
null — это ответ, а не ошибка
null. Это сделано намеренно — выдуманная цена хуже отсутствующей. Проверяйте missing, прежде чем считать результат полным.Несколько страниц за раз#
Вместо url можно передать urls — до 5 ссылок с одной схемой. Страницы обрабатываются параллельно.
{
"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.