Справка по API
Отправьте URL, HTML или Markdown. Site2image вернёт PNG, JPG, WebP, PDF, HTML или Markdown. Создание ставит задачу в очередь. Опросите подписанный URL файла или задайте вебхук и получите результат, когда он будет готов.
Примеры на этой странице используют https://site2image.ru. Токен работает только на сайте, который его выдал.
Передайте токен доступа со страницы аккаунта в заголовке Authorization:
Authorization: Bearer <access_token>
Токен обязателен в каждом запросе. Отсутствующий, неверный или неизвестный токен возвращает 401:
{ "error": "Unauthorized" }
Параметры запроса и JSON-поля с именем access_token игнорируются. Храните токен как пароль. Тот, у кого он есть, может читать снимки этого аккаунта.
POST /api/v1/screenshots
Отправьте ровно одно из url, html или markdown. format по умолчанию PNG и также принимает JPG, JPEG, WEBP, PDF, HTML, MD и MARKDOWN. JPEG сохраняется как JPG. MARKDOWN сохраняется как MD. callback_url необязателен.
curl -X POST https://site2image.ru/api/v1/screenshots \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"format": "PNG",
"viewport_device": "iphone_14",
"block_cookie_banners": true,
"callback_url": "https://client.example.com/hooks/screenshots"
}'
Новая задача возвращает 202 Accepted. Идентификатор — UUID. image_url отсутствует, пока вы не запросите снимок и статус не станет ready.
{
"id": "3f1c0a6e-8b24-4d5a-9c17-2e6b0d4a8f31",
"status": "pending",
"url": "https://example.com",
"format": "PNG",
"created_at": "2026-01-01T12:00:00Z"
}
Отправленные параметры возвращаются в задаче после применения пресета устройства. Снимок с viewport_device равным iphone_14 также сохраняет ширину, высоту, масштаб и user agent этого устройства.
HTML ограничен 500 000 байтами. Markdown ограничен 200 000 байтами. url или callback_url должен быть абсолютным http- или https-адресом публичного интернета длиной не более 2048 символов. Localhost, имена .local и частные, loopback или link-local адреса возвращают 422 с подробностью "is not allowed".
Снимок ждёт, пока сеть утихнет, и затем снимает всю страницу в 1440×900, если параметр ниже не говорит иначе.
GET /api/v1/screenshots/:id
curl https://site2image.ru/api/v1/screenshots/3f1c0a6e-8b24-4d5a-9c17-2e6b0d4a8f31 \ -H "Authorization: Bearer <access_token>"
Снимок должен принадлежать аутентифицированному аккаунту. Идентификатор другого аккаунта или идентификатор, который не является UUID, возвращает 404 с { "error": "Not Found" }.
status переходит из pending в processing, затем в ready или failed. image_url остаётся null, пока статус не станет ready. Готовый снимок содержит подписанный URL запрошенного формата. Этот URL истекает через 300 секунд. Запросите снимок снова, когда нужна новая ссылка.
{
"id": "3f1c0a6e-8b24-4d5a-9c17-2e6b0d4a8f31",
"status": "ready",
"url": "https://example.com",
"format": "PNG",
"created_at": "2026-01-01T12:00:00Z",
"image_url": "https://signed.example/screenshot.png",
"error_message": null,
"updated_at": "2026-01-01T12:00:08Z"
}
Неудачный снимок содержит error_message со значением "The page could not be captured.", а image_url равен null. Если вы просили метаданные или срезы, эти поля появляются в ответе, когда снимок завершён.
GET /api/v1/screenshots/:id/download
Когда снимок ready, этот маршрут перенаправляет на короткоживущий подписанный URL. Тот же запрос до готовности файла или идентификатор другого аккаунта возвращает 404.
GET /api/v1/devices
Передайте id как viewport_device. Пресет задаёт окно, плотность пикселей, касание и user agent. viewport_width, viewport_height и device_scale_factor по-прежнему можно заменить.
| Идентификатор | Экран |
|---|---|
iphone_se |
iPhone SE · 375×667 · масштаб 2 |
iphone_13 |
iPhone 13 · 390×844 · масштаб 3 |
iphone_13_landscape |
iPhone 13 landscape · 844×390 · масштаб 3 |
iphone_13_pro_max |
iPhone 13 Pro Max · 428×926 · масштаб 3 |
iphone_13_pro_max_landscape |
iPhone 13 Pro Max landscape · 926×428 · масштаб 3 |
iphone_14 |
iPhone 14 · 390×844 · масштаб 3 |
iphone_14_landscape |
iPhone 14 landscape · 844×390 · масштаб 3 |
iphone_14_pro_max |
iPhone 14 Pro Max · 430×932 · масштаб 3 |
iphone_14_pro_max_landscape |
iPhone 14 Pro Max landscape · 932×430 · масштаб 3 |
pixel_7 |
Pixel 7 · 412×915 · масштаб 2.625 |
pixel_7_landscape |
Pixel 7 landscape · 915×412 · масштаб 2.625 |
galaxy_s9+ |
Galaxy S9+ · 360×740 · масштаб 3 |
galaxy_s9+_landscape |
Galaxy S9+ landscape · 740×360 · масштаб 3 |
ipad |
iPad · 768×1024 · масштаб 2 |
ipad_landscape |
iPad landscape · 1024×768 · масштаб 2 |
ipad_pro |
iPad Pro · 1024×1366 · масштаб 2 |
ipad_pro_landscape |
iPad Pro landscape · 1366×1024 · масштаб 2 |
Параметры — это JSON-поля запроса POST /api/v1/screenshots. Неизвестное поле возвращает 422. Логические значения — true или false.
Cookie — это объекты с name, value, domain, path, secure, http_only и same_site либо строки вроде name=value; Domain=example.com; Secure. Домен должен быть целевым хостом, поэтому для cookie нужен url. same_site равен Lax, Strict или None. Заголовки — это словарь или список строк "Name: value". Host, Connection и другие межузловые имена отклоняются.
html |
строка · до 500 000 байт HTML вместо URL. Не больше 500 КБ. Отправьте одно из url, html или markdown. |
|---|---|
markdown |
строка · до 200 000 байт Markdown вместо URL. Не больше 200 КБ. Отправьте одно из url, html или markdown. |
full_page |
логический · по умолчанию true Снимает всю страницу. false снимает только окно. |
|---|---|
full_page_scroll |
логический · по умолчанию как у full_page Прокручивает вниз, чтобы подгрузился отложенный контент. Следует значению full_page. |
full_page_scroll_delay |
целое · 0–10000 Пауза между шагами прокрутки, в миллисекундах. |
full_page_scroll_by |
целое · 50–5000 Шаг прокрутки в пикселях. |
full_page_max_height |
целое · 1–30000 Максимальная высота всей страницы в пикселях. |
full_page_algorithm |
строка default или by_sections, если доступен libvips. |
full_page_slices |
логический · по умолчанию false Также сохраняет вертикальные срезы полностраничного PNG, JPG или WebP. |
full_page_slice_height |
целое · по умолчанию 4000 · 100–16000 Высота среза в пикселях. |
full_page_slice_overlap_height |
целое · по умолчанию 0 · 0–16000 Перекрытие срезов в пикселях. |
capture_beyond_viewport |
логический · по умолчанию true Включает содержимое за пределами окна при полном снимке. |
viewport_device |
строка Пресет устройства. Вызовите list_devices, чтобы увидеть идентификаторы. |
|---|---|
viewport_width |
целое · по умолчанию 1440 · 1–3840 Ширина CSS-окна в пикселях. |
viewport_height |
целое · по умолчанию 900 · 1–16384 Высота CSS-окна в пикселях. |
device_scale_factor |
число · по умолчанию 1 · 1.0–5.0 Плотность пикселей устройства, от 1 до 5. |
viewport_mobile |
логический Эмулирует мобильное окно. |
viewport_has_touch |
логический Эмулирует сенсорный экран. |
viewport_landscape |
логический Меняет ширину и высоту местами, когда окно портретное. |
dark_mode |
логический Ставит prefers-color-scheme в тёмную тему при true и в светлую при false. |
reduced_motion |
логический Эмулирует prefers-reduced-motion. |
reduce_motion |
логический Эмулирует prefers-reduced-motion и останавливает анимации. |
media_type |
строка Эмулируемый тип носителя: screen или print. |
selector |
строка · до 500 байт CSS-селектор, который снимается. |
|---|---|
selector_algorithm |
строка default или clip, чтобы снять элемент как прямоугольник. |
selector_scroll_into_view |
логический · по умолчанию true Прокручивает селектор в видимую область перед снимком. |
error_on_selector_not_found |
логический · по умолчанию true, если задан selector Завершается ошибкой, если selector ничего не находит. |
clip_x |
целое · 0–20000 Левый край прямоугольника обрезки, в пикселях. |
clip_y |
целое · 0–30000 Верхний край прямоугольника обрезки, в пикселях. |
clip_width |
целое · 1–20000 Ширина обрезки в пикселях. Отправьте все четыре поля обрезки вместе. |
clip_height |
целое · 1–30000 Высота обрезки в пикселях. Отправьте все четыре поля обрезки вместе. |
wait_until |
список строк · load, domcontentloaded, networkidle0, networkidle2 События навигации, которых нужно дождаться, например load или networkidle0. |
|---|---|
wait_for_selector |
строка · до 500 байт CSS-селектор, которого нужно дождаться. |
wait_for_selector_algorithm |
строка at_least_one или at_least_by_count. |
delay |
число · 0.0–60.0 Сколько секунд ждать после готовности страницы. |
timeout |
целое · 1–120 Сколько секунд ждать страницу и селекторы. |
navigation_timeout |
целое · 1–60 Сколько секунд ждать навигацию. |
click |
строка · до 500 байт CSS-селектор, по которому выполняется щелчок перед снимком. |
hover |
строка · до 500 байт CSS-селектор, на который наводится указатель перед снимком. |
scroll_into_view |
строка · до 500 байт CSS-селектор, который прокручивается в видимую область. |
scroll_into_view_adjust_top |
целое · по умолчанию 0 · -2000–2000 Сдвиг в пикселях после прокрутки элемента в видимую область. |
error_on_click_selector_not_found |
логический · по умолчанию true Завершается ошибкой, если click ничего не находит. |
error_on_hover_selector_not_found |
логический · по умолчанию true Завершается ошибкой, если hover ничего не находит. |
block_cookie_banners |
логический Скрывает обычные баннеры cookie. |
|---|---|
block_banners_by_heuristics |
логический Скрывает баннеры, найденные эвристикой. |
block_ads |
логический Блокирует обычные рекламные запросы. |
block_trackers |
логический Блокирует обычные запросы трекеров. |
block_chats |
логический Блокирует виджеты чата. |
block_requests |
список строк Шаблоны URL, которые блокируются. |
block_resources |
список строк · document, stylesheet, image, media, font, script, texttrack, xhr, fetch, eventsource, websocket, manifest, other Типы ресурсов, которые блокируются, например image или script. |
hide_selectors |
список строк CSS-селекторы, которые скрываются. |
user_agent |
строка · до 500 байт User agent браузера. |
|---|---|
headers |
объект или список Дополнительные заголовки запроса. Словарь имени и значения или список строк "Name: value". |
cookies |
список Cookie целевого хоста. Объекты с name и value или строки name=value; Domain=host. |
authorization |
строка · до 1 024 байт Значение заголовка Authorization, отправляемого странице. |
time_zone |
строка Часовой пояс IANA, например America/New_York. |
bypass_csp |
логический Обходит Content-Security-Policy страницы. |
geolocation_latitude |
число · -90.0–90.0 Широта, видимая странице. Отправьте и долготу. |
geolocation_longitude |
число · -180.0–180.0 Долгота, видимая странице. Отправьте и широту. |
geolocation_accuracy |
число · по умолчанию 100, если задана геолокация · 0.0–100000.0 Точность геолокации в метрах. |
ignore_host_errors |
логический Продолжает, если основная навигация вернула ошибочный HTTP-статус. |
styles |
строка · до 100 000 байт CSS, который добавляется на страницу. |
|---|---|
scripts |
строка · до 50 000 байт JavaScript, который выполняется перед снимком. |
scripts_wait_until |
список строк · load, domcontentloaded, networkidle0, networkidle2 События, которых нужно дождаться после скриптов. Обязательно, если скрипт меняет location. |
image_quality |
целое · 0–100 Качество JPEG или WebP от 0 до 100. |
|---|---|
image_width |
целое · 1–10000 Масштабирует PNG, JPG или WebP до этой ширины. |
image_height |
целое · 1–10000 Масштабирует PNG, JPG или WebP до этой высоты. |
omit_background |
логический Прозрачный фон. Только PNG. |
pdf_paper_format |
строка · letter, legal, tabloid, ledger, a0, a1, a2, a3, a4, a5, a6 Размер страницы PDF, например a4 или letter. |
|---|---|
pdf_landscape |
логический Использует альбомную страницу PDF. |
pdf_fit_one_page |
логический Умещает снимок на одну страницу PDF. |
pdf_print_background |
логический · по умолчанию true Печатает фоны CSS. Для PDF по умолчанию true. |
pdf_margin |
строка Поле со всех сторон, например 0, 20px, 10mm или 0.5in. |
pdf_margin_top |
строка Верхнее поле PDF, например 20px, 10mm или 0.5in. |
pdf_margin_right |
строка Правое поле PDF, например 20px, 10mm или 0.5in. |
pdf_margin_bottom |
строка Нижнее поле PDF, например 20px, 10mm или 0.5in. |
pdf_margin_left |
строка Левое поле PDF, например 20px, 10mm или 0.5in. |
metadata_page_title |
логический Добавляет заголовок страницы в метаданные. |
|---|---|
metadata_image_size |
логический Добавляет размер изображения в метаданные. |
metadata_http_response_status_code |
логический Добавляет HTTP-статус в метаданные. |
metadata_fonts |
логический Добавляет шрифты в метаданные. |
metadata_open_graph |
логический Добавляет теги Open Graph в метаданные. |
metadata_icon |
логический Добавляет значок страницы в метаданные. |
metadata_content |
логический Добавляет содержимое страницы в метаданные. |
metadata_content_format |
строка Формат содержимого в метаданных: html, text или markdown. |
fail_if_content_contains |
список строк Завершается ошибкой, если текст страницы содержит любую из этих строк. |
fail_if_content_missing |
список строк Завершается ошибкой, если в тексте страницы нет любой из этих строк. |
cache |
логический Возвращает недавний готовый снимок с тем же URL, форматом и параметрами. |
|---|---|
cache_ttl |
целое · по умолчанию 14400 секунд · 60–2592000 Сколько секунд кэшированный снимок можно использовать снова. |
cache_key |
строка · до 200 байт Ваш ключ кэша, сохраняемый вместе с запросом. |
external_identifier |
строка · до 128 байт Ваш идентификатор, сохраняемый вместе с запросом. |
webhook_sign |
логический Подписывает тело вебхука как HMAC-SHA256 токеном доступа. |
| Статус | Когда |
|---|---|
401 |
{ "error": "Unauthorized" }, если bearer-токен отсутствует или неизвестен. |
404 |
{ "error": "Not Found" }, если идентификатор неизвестен, принадлежит другому аккаунту или файл ещё не готов к скачиванию. |
422 |
Проверка не прошла. details сопоставляет каждому полю список сообщений. |
500 |
{ "error": "Internal Server Error" }. Ответ не содержит текст исключения. |
{
"error": "Validation failed",
"details": {
"url": ["must be a valid HTTP or HTTPS URL"]
}
}
Если задан callback_url, готовый снимок доставляется методом POST с Content-Type: application/json. Ответ 2xx завершает доставку. Сбои сети и HTTP 5xx повторяются. Неудачный вебхук оставляет снимок ready без изменений.
{
"id": "3f1c0a6e-8b24-4d5a-9c17-2e6b0d4a8f31",
"status": "ready",
"url": "https://example.com",
"format": "PNG",
"image_url": "https://signed.example/screenshot.png"
}
Установите webhook_sign в true, и запрос будет содержать X-Site2image-Signature: sha256=.... Значение — HMAC-SHA256 исходного тела, ключ — ваш токен доступа.
Отправьте "cache": true, чтобы повторно использовать последний снимок ready с тем же URL, форматом и параметрами за последние секунды cache_ttl. Окно по умолчанию — 4 часа. Попадание возвращает 200 OK и готовый снимок, включая image_url, и не ставит новую задачу в очередь.
Ассистенты используют тот же API снимков по Streamable HTTP.
POST https://site2image.ru/mcp Authorization: Bearer <access_token> Content-Type: application/json Accept: application/json, text/event-stream
Cursor и другие удалённые клиенты MCP принимают URL и заголовок bearer:
{
"mcpServers": {
"site2image": {
"url": "https://site2image.ru/mcp",
"headers": {
"Authorization": "Bearer <access_token>"
}
}
}
}
tools/list возвращает list_devices, create_screenshot и get_screenshot. create_screenshot принимает те же поля, что POST /api/v1/screenshots, плюс wait_seconds. Ожидание по умолчанию — 25 секунд и не может быть больше 45. 0 возвращает задачу, как только она поставлена в очередь. Снимок из кэша возвращается сразу.
Оба инструмента снимка возвращают тот же JSON, что GET /api/v1/screenshots/:id. Готовые PNG, JPG или WebP размером не более 1 МБ также возвращаются как изображение. HTML и Markdown размером не более 100 КБ также возвращаются как текст. PDF и более крупные файлы остаются в image_url.
GET, PUT, PATCH и DELETE на /mcp возвращают 405. Уведомление вроде notifications/initialized возвращает 202 с пустым телом.