API знімків екрана

Робіть знімки екрана, генеруйте PDF та відстежуйте візуальні зміни для будь-якої URL-адреси — з емуляцією пристроїв, блокуванням реклами та водяними знаками.

Що ви можете зробити?
Знімки URL та HTML

Захоплюйте будь-яку URL або користувацький HTML як PNG, JPG, WebP з емуляцією пристроїв, повносторінковим режимом та підтримкою Retina.

Генерація PDF

Генеруйте PDF з користувацьким форматом сторінки, орієнтацією, полями, колонтитулами.

Масове та заплановане захоплення

Обробляйте до 50 URL за один запит. Плануйте повторювані захоплення з cron-виразами та виявленням змін.

Візуальне порівняння та моніторинг

Порівнюйте знімки екрана піксель за пікселем. Отримуйте відсоток відмінностей, змінені області та сповіщення електронною поштою про візуальні зміни.

Блокування реклами та cookie

Блокуйте рекламу, банери згоди cookie, віджети чату та скрипти відстеження. Впроваджуйте користувацькі CSS/JS для чистих захоплень.

Метрики продуктивності

Захоплюйте Core Web Vitals — LCP, FCP, CLS, TTI, TTFB та розбивку ресурсів.

99.9 % Час роботи
4164.3ms Відповідь
20 req/s
0.05 Кредити / запит

URL Screenshot

POST https://ailyrics.yeb.to/v1/screenshot/capture

Capture a screenshot of any URL. Supports device emulation, full-page capture, element targeting, ad/cookie blocking, CSS/JS injection, watermarks, and more. Use async=true to queue the job and poll via /status.

Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
urlstringтакURL to capture (max 2000 chars)
viewport_widthintegerнеобов'язковийViewport width (320-3840, default: 1920)
viewport_heightintegerнеобов'язковийViewport height (200-2160, default: 1080)
full_pagebooleanнеобов'язковийCapture full scrollable page (+0.03 credits)
retinabooleanнеобов'язковий2x pixel density (+0.03 credits)
devicestringнеобов'язковийDevice preset (e.g. iphone-15, ipad-pro-12.9). Overrides viewport.
formatstringнеобов'язковийpng (default) | jpg | webp
qualityintegerнеобов'язковийJPG/WebP quality 1-100 (default: 80)
delay_msintegerнеобов'язковийWait before capture in ms (0-30000)
timeout_msintegerнеобов'язковийNavigation timeout (default: 30000)
selectorstringнеобов'язковийCSS selector to capture specific element
click_selectorsarrayнеобов'язковийElements to click before capture (max 10)
blur_selectorsarrayнеобов'язковийElements to blur (max 20)
remove_selectorsarrayнеобов'язковийElements to remove from DOM (max 20)
block_adsbooleanнеобов'язковийBlock ad networks
block_cookie_bannersbooleanнеобов'язковийRemove cookie consent banners
block_chat_widgetsbooleanнеобов'язковийRemove chat widgets
block_trackingbooleanнеобов'язковийBlock tracking scripts
dark_modebooleanнеобов'язковийEmulate dark mode
inject_cssstringнеобов'язковийCustom CSS to inject
inject_jsstringнеобов'язковийCustom JavaScript to inject
user_agentstringнеобов'язковийCustom User-Agent
headersobjectнеобов'язковийCustom HTTP headers
cookiesarrayнеобов'язковийBrowser cookies
thumbnail_widthintegerнеобов'язковийGenerate thumbnail (50-800px)
watermarkobjectнеобов'язковий{text, position, opacity}
asyncbooleanнеобов'язковийQueue job and return immediately
return_base64booleanнеобов'язковийInclude base64 image in response
webhook_urlstringнеобов'язковийWebhook URL for completion notification

Приклади запитів

# Basic screenshot
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&format=png"
# Full page with device preset and blocking
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&device=iphone-15&full_page=true&block_ads=true&block_cookie_banners=true"

Інтеграції API

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&format=png&full_page=true&block_ads=true"
use Illuminate\Support\Facades\Http;

$response = Http::asForm()->post('https://ailyrics.yeb.to/v1/screenshot/capture', [
    'api_key'              => config('services.yeb.key'),
    'url'                  => 'https://example.com',
    'format'               => 'png',
    'full_page'            => true,
    'block_ads'            => true,
    'block_cookie_banners' => true,
    'device'               => 'iphone-15',
]);

$data = $response->json();
// $data['url'] => screenshot URL
$ch = curl_init('https://ailyrics.yeb.to/v1/screenshot/capture');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'api_key'   => 'YOUR_KEY',
    'url'       => 'https://example.com',
    'format'    => 'png',
    'full_page' => true,
    'block_ads' => true,
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
const params = new URLSearchParams({
  api_key: 'YOUR_KEY',
  url: 'https://example.com',
  format: 'png',
  full_page: 'true',
  block_ads: 'true',
  device: 'iphone-15'
});

const res = await fetch('https://ailyrics.yeb.to/v1/screenshot/capture', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: params.toString()
});
const data = await res.json();
console.log(data.url); // screenshot URL
import requests

r = requests.post('https://ailyrics.yeb.to/v1/screenshot/capture', data={
    'api_key': 'YOUR_KEY',
    'url': 'https://example.com',
    'format': 'png',
    'full_page': True,
    'block_ads': True,
    'device': 'iphone-15',
})
data = r.json()
print(data['url'])  # screenshot URL

Response Example

{
  "success": true,
  "job_id": 12345,
  "url": "https://cdn.yeb.to/.../ss_abc.png",
  "thumbnail_url": "https://cdn.yeb.to/.../thumb.jpg",
  "width": 1920,
  "height": 1080,
  "format": "png",
  "file_size": 245678,
  "response_code": 200,
  "response_time_ms": 2340
}
{
  "success": true,
  "job_id": 12345,
  "status": "queued",
  "message": "Screenshot job queued",
  "response_code": 200
}
{
  "error": "The url field is required.",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 5
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

URL Screenshot

screenshot-capture 0.0500 credits

Parameters

API Key
body · string · required
URL
body · string · required
Viewport Width
body · string
Viewport Height
body · string
Full Page
body · string
Retina
body · string
Device
body · string
Format
body · string
Quality
body · string
Delay
body · string
Timeout
body · string
Selector
body · string
Click Selectors
body · string
Blur Selectors
body · string
Remove Selectors
body · string
Block Ads
body · string
Block Cookies
body · string
Block Chat
body · string
Block Tracking
body · string
Dark Mode
body · string
Inject CSS
body · string
Inject JS
body · string
User Agent
body · string
Headers
body · string
Cookies
body · string
Thumbnail Width
body · string
Watermark
body · string
Async
body · string
Return Base64
body · string
Webhook URL
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

HTML Screenshot

POST https://ailyrics.yeb.to/v1/screenshot/capture-html

Render custom HTML/CSS into a screenshot. Ideal for generating images from templates, invoices, social media cards, or any custom markup. No external URL needed.

Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
htmlstringтакHTML content to render (max 500 KB)
viewport_widthintegerнеобов'язковийViewport width (320-3840, default: 800)
viewport_heightintegerнеобов'язковийViewport height (200-2160, default: 600)
full_pagebooleanнеобов'язковийCapture full scrollable page
formatstringнеобов'язковийpng (default) | jpg | webp
qualityintegerнеобов'язковийJPG/WebP quality 1-100 (default: 80)
transparent_bgbooleanнеобов'язковийTransparent background (PNG only)
selectorstringнеобов'язковийCSS selector to capture specific element
dark_modebooleanнеобов'язковийEmulate dark mode
inject_cssstringнеобов'язковийAdditional CSS to inject
thumbnail_widthintegerнеобов'язковийGenerate thumbnail (50-800px)
asyncbooleanнеобов'язковийQueue job and return immediately
return_base64booleanнеобов'язковийInclude base64 image in response

Приклади запитів

# Render custom HTML
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-html" \
  -H "X-API-Key: YOUR_KEY" \
  -d "html=<h1 style='color:blue'>Hello World</h1>&format=png"
# Social card with transparent background
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-html" \
  -H "X-API-Key: YOUR_KEY" \
  -d "html=<div class='card'>...</div>&transparent_bg=true&viewport_width=1200&viewport_height=630"

Інтеграції API

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-html" \
  -H "X-API-Key: YOUR_KEY" \
  -d "html=<html><body><h1>Hello</h1></body></html>&format=png&transparent_bg=true"
use Illuminate\Support\Facades\Http;

$html = view('emails.invoice', $data)->render();

$response = Http::asForm()->post('https://ailyrics.yeb.to/v1/screenshot/capture-html', [
    'api_key'        => config('services.yeb.key'),
    'html'           => $html,
    'viewport_width' => 800,
    'viewport_height'=> 600,
    'format'         => 'png',
]);

$data = $response->json();
// $data['url'] => screenshot URL
$ch = curl_init('https://ailyrics.yeb.to/v1/screenshot/capture-html');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'api_key'        => 'YOUR_KEY',
    'html'           => '<h1>Hello World</h1>',
    'format'         => 'png',
    'transparent_bg' => true,
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
const params = new URLSearchParams({
  api_key: 'YOUR_KEY',
  html: '<div style="padding:20px"><h1>Hello</h1></div>',
  format: 'png',
  transparent_bg: 'true'
});

const res = await fetch('https://ailyrics.yeb.to/v1/screenshot/capture-html', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: params.toString()
});
const data = await res.json();
console.log(data.url);
import requests

r = requests.post('https://ailyrics.yeb.to/v1/screenshot/capture-html', data={
    'api_key': 'YOUR_KEY',
    'html': '<h1 style="color:red">Hello World</h1>',
    'format': 'png',
    'transparent_bg': True,
})
data = r.json()
print(data['url'])

Response Example

{
  "success": true,
  "job_id": 12346,
  "url": "https://cdn.yeb.to/.../ss_abc.png",
  "thumbnail_url": "https://cdn.yeb.to/.../thumb.jpg",
  "width": 800,
  "height": 600,
  "format": "png",
  "file_size": 54321,
  "response_code": 200,
  "response_time_ms": 1230
}
{
  "error": "The html field is required.",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 3
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

HTML Screenshot

screenshot-capture-html 0.0300 credits

Parameters

API Key
body · string · required
HTML
body · string · required
Viewport Width
body · string
Viewport Height
body · string
Format
body · string
Quality
body · string
Transparent BG
body · string
Selector
body · string
Dark Mode
body · string
Inject CSS
body · string
Thumbnail Width
body · string
Async
body · string
Return Base64
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

PDF Generation

POST https://ailyrics.yeb.to/v1/screenshot/capture-pdf

Generate a PDF from any URL or HTML content. Supports page format, orientation, custom margins, headers/footers, and background printing.

Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
urlstringтакURL to convert to PDF (or use html)
htmlstringнеобов'язковийHTML content (alternative to url)
pdf_formatstringнеобов'язковийA4 (default) | A3 | Letter | Legal
pdf_orientationstringнеобов'язковийportrait (default) | landscape
pdf_marginsobjectнеобов'язковий{top, right, bottom, left} in mm
pdf_print_backgroundbooleanнеобов'язковийPrint background colors/images (default: true)
pdf_headerstringнеобов'язковийCustom header HTML template
pdf_footerstringнеобов'язковийCustom footer HTML (use .pageNumber, .totalPages)
viewport_widthintegerнеобов'язковийViewport width for rendering (default: 1920)
delay_msintegerнеобов'язковийWait before capture in ms (0-30000)
timeout_msintegerнеобов'язковийNavigation timeout (default: 30000)
block_adsbooleanнеобов'язковийBlock ad networks
block_cookie_bannersbooleanнеобов'язковийRemove cookie consent banners
inject_cssstringнеобов'язковийCustom CSS to inject
asyncbooleanнеобов'язковийQueue job and return immediately
webhook_urlstringнеобов'язковийWebhook URL for completion notification

Приклади запитів

# Basic PDF from URL
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-pdf" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&pdf_format=A4"
# Landscape PDF with custom margins and footer
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-pdf" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/report","pdf_format":"A4","pdf_orientation":"landscape","pdf_margins":{"top":"20mm","right":"15mm","bottom":"20mm","left":"15mm"},"pdf_footer":"<div style=\"text-align:center;font-size:10px\">Page <span class=\"pageNumber\"></span></div>"}'

Інтеграції API

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-pdf" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com/report&pdf_format=A4&pdf_orientation=portrait&pdf_print_background=true"
use Illuminate\Support\Facades\Http;

$response = Http::asForm()->post('https://ailyrics.yeb.to/v1/screenshot/capture-pdf', [
    'api_key'              => config('services.yeb.key'),
    'url'                  => 'https://example.com/invoice',
    'pdf_format'           => 'A4',
    'pdf_orientation'      => 'portrait',
    'pdf_print_background' => true,
    'pdf_margins'          => ['top' => '20mm', 'bottom' => '20mm'],
]);

$data = $response->json();
// $data['url'] => PDF download URL
$ch = curl_init('https://ailyrics.yeb.to/v1/screenshot/capture-pdf');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'api_key'              => 'YOUR_KEY',
    'url'                  => 'https://example.com/invoice',
    'pdf_format'           => 'A4',
    'pdf_print_background' => true,
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch('https://ailyrics.yeb.to/v1/screenshot/capture-pdf', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    api_key: 'YOUR_KEY',
    url: 'https://example.com/invoice',
    pdf_format: 'A4',
    pdf_print_background: true,
    pdf_margins: { top: '20mm', bottom: '20mm' }
  })
});
const data = await res.json();
console.log(data.url);
import requests

r = requests.post('https://ailyrics.yeb.to/v1/screenshot/capture-pdf', json={
    'api_key': 'YOUR_KEY',
    'url': 'https://example.com/invoice',
    'pdf_format': 'A4',
    'pdf_orientation': 'portrait',
    'pdf_print_background': True,
    'pdf_margins': {'top': '20mm', 'bottom': '20mm'},
})
data = r.json()
print(data['url'])

Response Example

{
  "success": true,
  "job_id": 12347,
  "url": "https://cdn.yeb.to/.../doc_abc.pdf",
  "format": "pdf",
  "file_size": 385210,
  "pages": 3,
  "response_code": 200,
  "response_time_ms": 4120
}
{
  "error": "Invalid pdf_format. Allowed: A4, A3, Letter, Legal.",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 4
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

PDF Generation

screenshot-capture-pdf 0.1000 credits

Parameters

API Key
body · string · required
URL
body · string
HTML
body · string
PDF Format
body · string
Orientation
body · string
Margins
body · string
Print Background
body · string
Header
body · string
Footer
body · string
Delay
body · string
Block Ads
body · string
Inject CSS
body · string
Async
body · string
Webhook URL
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Scrolling Video / GIF

POST https://ailyrics.yeb.to/v1/screenshot/capture-video

Generate a scrolling video or animated GIF of a webpage. The browser automatically scrolls through the page content, capturing each frame. Supports MP4, WebM, and GIF formats.

Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
urlstringтакURL to capture
formatstringнеобов'язковийmp4 (default) | webm | gif
viewport_widthintegerнеобов'язковийViewport width (default: 1280)
viewport_heightintegerнеобов'язковийViewport height (default: 720)
scroll_speedstringнеобов'язковийslow | normal (default) | fast
video_duration_msintegerнеобов'язковийMax duration in ms (default: 10000, max: 60000)
video_fpsintegerнеобов'язковийFrames per second (default: 30)
scroll_backbooleanнеобов'язковийScroll back to top at end
delay_msintegerнеобов'язковийWait before capture begins
block_adsbooleanнеобов'язковийBlock ad networks
block_cookie_bannersbooleanнеобов'язковийRemove cookie consent banners
devicestringнеобов'язковийDevice preset (overrides viewport)
asyncbooleanнеобов'язковийQueue job (recommended for videos)
webhook_urlstringнеобов'язковийWebhook URL for completion

Приклади запитів

# Scrolling MP4 video
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-video" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&format=mp4&scroll_speed=normal&async=true"
# Animated GIF (shorter)
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-video" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&format=gif&video_duration_ms=5000&video_fps=15"

Інтеграції API

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture-video" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&format=mp4&scroll_speed=normal&async=true"
const res = await fetch('https://ailyrics.yeb.to/v1/screenshot/capture-video', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    api_key: 'YOUR_KEY',
    url: 'https://example.com',
    format: 'mp4',
    scroll_speed: 'normal',
    video_fps: 30,
    async: true
  })
});
const { job_id } = await res.json();
// Poll /status with job_id
import requests, time

r = requests.post('https://ailyrics.yeb.to/v1/screenshot/capture-video', data={
    'api_key': 'YOUR_KEY',
    'url': 'https://example.com',
    'format': 'mp4',
    'scroll_speed': 'normal',
    'async': True,
})
job_id = r.json()['job_id']

# Poll for completion
while True:
    s = requests.post('https://ailyrics.yeb.to/v1/screenshot/status',
        data={'api_key': 'YOUR_KEY', 'job_id': job_id})
    if s.json()['status'] == 'completed':
        print(s.json()['url'])
        break
    time.sleep(2)

Response Example

{
  "success": true,
  "job_id": 12348,
  "status": "queued",
  "message": "Video capture job queued",
  "response_code": 200
}
{
  "success": true,
  "job_id": 12348,
  "url": "https://cdn.yeb.to/.../vid_abc.mp4",
  "format": "mp4",
  "file_size": 2456789,
  "duration_ms": 10000,
  "frame_count": 300,
  "response_code": 200,
  "response_time_ms": 15400
}
{
  "error": "Video duration exceeds maximum (60000 ms).",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 5
}
Video capture is resource-intensive. Use async=true and poll via /status or set a webhook_url.

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

Scrolling Video / GIF

screenshot-capture-video 0.5000 credits

Parameters

API Key
body · string · required
URL
body · string · required
Format
body · string
Viewport Width
body · string
Viewport Height
body · string
Scroll Speed
body · string
Duration
body · string
FPS
body · string
Scroll Back
body · string
Device
body · string
Block Ads
body · string
Block Cookies
body · string
Async
body · string
Webhook URL
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Bulk Screenshots

POST https://ailyrics.yeb.to/v1/screenshot/bulk
POST https://ailyrics.yeb.to/v1/screenshot/bulk-status

Capture screenshots of multiple URLs in a single request (up to 50). Each URL is processed in parallel. Use bulk-status to poll progress or set a webhook_url.

Bulk Create
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
urlsarrayтакArray of URL objects (max 50). Each: {url, format?, viewport_width?, device?}
default_settingsobjectнеобов'язковийDefault settings applied to all URLs
webhook_urlstringнеобов'язковийWebhook URL when all items complete
Bulk Status
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
bulk_job_idintegerтакBulk job ID from the create response

Приклади запитів

# Create bulk job
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/bulk" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"urls":[{"url":"https://site1.com"},{"url":"https://site2.com"},{"url":"https://site3.com"}],"default_settings":{"block_ads":true,"format":"png"}}'
# Check bulk status
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/bulk-status" \
  -H "X-API-Key: YOUR_KEY" \
  -d "bulk_job_id=789"

Інтеграції API

const res = await fetch('https://ailyrics.yeb.to/v1/screenshot/bulk', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    api_key: 'YOUR_KEY',
    urls: [
      { url: 'https://site1.com', format: 'png' },
      { url: 'https://site2.com', device: 'iphone-15' },
    ],
    default_settings: { block_ads: true }
  })
});
const { bulk_job_id } = await res.json();

// Poll status
const status = await fetch('https://ailyrics.yeb.to/v1/screenshot/bulk-status', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: `api_key=YOUR_KEY&bulk_job_id=${bulk_job_id}`
}).then(r => r.json());
import requests, time

# Create bulk job
r = requests.post('https://ailyrics.yeb.to/v1/screenshot/bulk', json={
    'api_key': 'YOUR_KEY',
    'urls': [
        {'url': 'https://site1.com'},
        {'url': 'https://site2.com'},
        {'url': 'https://site3.com'},
    ],
    'default_settings': {'block_ads': True, 'format': 'png'},
})
bulk_id = r.json()['bulk_job_id']

# Poll until done
while True:
    s = requests.post('https://ailyrics.yeb.to/v1/screenshot/bulk-status',
        data={'api_key': 'YOUR_KEY', 'bulk_job_id': bulk_id})
    data = s.json()
    if data['status'] == 'completed':
        for item in data['items']:
            print(item['url'], item['screenshot_url'])
        break
    time.sleep(3)
use Illuminate\Support\Facades\Http;

$response = Http::post('https://ailyrics.yeb.to/v1/screenshot/bulk', [
    'api_key' => config('services.yeb.key'),
    'urls' => [
        ['url' => 'https://site1.com', 'format' => 'png'],
        ['url' => 'https://site2.com', 'device' => 'iphone-15'],
    ],
    'default_settings' => ['block_ads' => true],
]);

$bulkJobId = $response->json('bulk_job_id');

Response Examples

{
  "success": true,
  "bulk_job_id": 789,
  "status": "processing",
  "total_urls": 3,
  "message": "Bulk job created",
  "response_code": 200
}
{
  "success": true,
  "bulk_job_id": 789,
  "status": "completed",
  "total": 3,
  "completed": 3,
  "failed": 0,
  "items": [
    {
      "url": "https://site1.com",
      "status": "completed",
      "screenshot_url": "https://cdn.yeb.to/.../ss_1.png"
    },
    {
      "url": "https://site2.com",
      "status": "completed",
      "screenshot_url": "https://cdn.yeb.to/.../ss_2.png"
    }
  ],
  "response_code": 200
}
{
  "error": "Maximum 50 URLs allowed per bulk request.",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 4
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

Bulk Screenshots

screenshot-bulk 0.0400 credits

Parameters

API Key
body · string · required
URLs
body · string · required
Default Settings
body · string
Webhook URL
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Scheduled Screenshots

POST https://ailyrics.yeb.to/v1/screenshot/schedule-create
POST https://ailyrics.yeb.to/v1/screenshot/schedule-update
POST https://ailyrics.yeb.to/v1/screenshot/schedule-delete
POST https://ailyrics.yeb.to/v1/screenshot/schedule-list
POST https://ailyrics.yeb.to/v1/screenshot/schedule-run

Create recurring screenshot schedules with cron expressions. Supports automatic visual change detection with configurable thresholds and email notifications when changes exceed the threshold.

Create Schedule
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
namestringтакSchedule name (max 255 chars)
urlstringтакURL to capture on schedule
cron_expressionstringтакCron expression (e.g. 0 9 * * * = daily 9 AM)
timezonestringнеобов'язковийIANA timezone (default: UTC)
screenshot_settingsobjectнеобов'язковийScreenshot settings (viewport, format, blocking, etc.)
detect_changesbooleanнеобов'язковийEnable visual change detection
change_thresholdnumberнеобов'язковийChange threshold % (default: 1.0)
notify_on_changebooleanнеобов'язковийSend email when changes detected
notify_emailstringнеобов'язковийEmail for change notifications
Update / Delete / Run
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
schedule_idintegerтакSchedule ID
is_activebooleanнеобов'язковийPause/resume schedule (update only)

Приклади запитів

# Create daily schedule with change detection
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/schedule-create" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Daily Homepage Check","url":"https://mysite.com","cron_expression":"0 9 * * *","timezone":"Europe/Sofia","detect_changes":true,"change_threshold":5.0,"notify_on_change":true,"notify_email":"[email protected]","screenshot_settings":{"full_page":true,"block_ads":true}}'
# List all schedules
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/schedule-list" \
  -H "X-API-Key: YOUR_KEY"
# Trigger manual run
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/schedule-run" \
  -H "X-API-Key: YOUR_KEY" \
  -d "schedule_id=123"

Cron Expression Reference

ExpressionDescription
*/5 * * * *Every 5 minutes
0 * * * *Every hour
0 9 * * *Daily at 9:00 AM
0 9 * * 1-5Weekdays at 9:00 AM
0 0 * * 0Weekly (Sunday midnight)
0 0 1 * *Monthly (1st at midnight)

Response Examples

{
  "success": true,
  "schedule_id": 123,
  "name": "Daily Homepage Check",
  "cron_expression": "0 9 * * *",
  "next_run_at": "2026-02-07T09:00:00Z",
  "is_active": true,
  "response_code": 200
}
{
  "success": true,
  "schedules": [
    {
      "id": 123,
      "name": "Daily Homepage Check",
      "url": "https://mysite.com",
      "cron_expression": "0 9 * * *",
      "is_active": true,
      "last_run_at": "2026-02-06T09:00:00Z",
      "next_run_at": "2026-02-07T09:00:00Z",
      "run_count": 45,
      "detect_changes": true
    }
  ],
  "response_code": 200
}
{
  "error": "Invalid cron expression.",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 3
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

Scheduled Screenshots

screenshot-schedule-create 0.1000 credits

Parameters

API Key
body · string · required
Name
body · string · required
URL
body · string · required
Cron Expression
body · string · required
Timezone
body · string
Settings
body · string
Detect Changes
body · string
Threshold
body · string
Notify
body · string
Email
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Visual Diff

POST https://ailyrics.yeb.to/v1/screenshot/diff
POST https://ailyrics.yeb.to/v1/screenshot/diff-status

Compare two screenshots pixel-by-pixel. Returns a diff image highlighting changed regions, the difference percentage, changed pixel count, and bounding boxes of changed areas.

Create Diff
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
job_a_idintegerтакFirst screenshot job ID (before)
job_b_idintegerтакSecond screenshot job ID (after)
webhook_urlstringнеобов'язковийWebhook URL for completion
Diff Status
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
diff_idintegerтакDiff ID from the create response

Приклади запитів

# Compare two screenshots
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/diff" \
  -H "X-API-Key: YOUR_KEY" \
  -d "job_a_id=12345&job_b_id=12346"
# Check diff status
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/diff-status" \
  -H "X-API-Key: YOUR_KEY" \
  -d "diff_id=567"

Інтеграції API

// Take two screenshots, then compare
const shot1 = await fetch('https://ailyrics.yeb.to/v1/screenshot/capture', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: 'api_key=YOUR_KEY&url=https://site.com&format=png'
}).then(r => r.json());

// ... some time later, take second screenshot ...

const diff = await fetch('https://ailyrics.yeb.to/v1/screenshot/diff', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: `api_key=YOUR_KEY&job_a_id=${shot1.job_id}&job_b_id=${shot2.job_id}`
}).then(r => r.json());

console.log(`${diff.difference_percent}% changed`);
console.log(diff.diff_image_url);
import requests

r = requests.post('https://ailyrics.yeb.to/v1/screenshot/diff', data={
    'api_key': 'YOUR_KEY',
    'job_a_id': 12345,
    'job_b_id': 12346,
})
data = r.json()
print(f"Difference: {data['difference_percent']}%")
print(f"Changed pixels: {data['changed_pixels']}")
print(f"Diff image: {data['diff_image_url']}")
$ch = curl_init('https://ailyrics.yeb.to/v1/screenshot/diff');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'api_key'  => 'YOUR_KEY',
    'job_a_id' => 12345,
    'job_b_id' => 12346,
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

echo "Difference: {$result['difference_percent']}%";

Response Example

{
  "success": true,
  "diff_id": 567,
  "status": "completed",
  "difference_percent": 3.45,
  "changed_pixels": 15234,
  "diff_image_url": "https://cdn.yeb.to/.../diff-567.png",
  "diff_regions": [
    {
      "x": 100,
      "y": 200,
      "width": 300,
      "height": 150
    }
  ],
  "response_code": 200
}
{
  "error": "Both screenshots must be image format (png/jpg/webp).",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 5
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

Visual Diff

screenshot-diff 0.1000 credits

Parameters

API Key
body · string · required
Job A ID
body · string · required
Job B ID
body · string · required
Webhook URL
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Job Status & Download

POST https://ailyrics.yeb.to/v1/screenshot/status
POST https://ailyrics.yeb.to/v1/screenshot/download

Check the status of any screenshot job (single, bulk, video). The /status endpoint returns the current state, output URL, progress, and metadata. The /download endpoint returns the raw file. Both endpoints are free (0 credits).

Job Status
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
job_idintegerтакScreenshot job ID
Download File
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
job_idintegerтакScreenshot job ID

Приклади запитів

# Check job status
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/status" \
  -H "X-API-Key: YOUR_KEY" \
  -d "job_id=12345"
# Download screenshot file
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/download" \
  -H "X-API-Key: YOUR_KEY" \
  -d "job_id=12345" -o screenshot.png

Async Polling Pattern

// 1. Start async capture
const { job_id } = await startCapture({ url: '...', async: true });

// 2. Poll until done
let result;
do {
  await new Promise(r => setTimeout(r, 2000)); // wait 2s
  result = await checkStatus(job_id);
} while (['pending', 'queued', 'capturing', 'processing'].includes(result.status));

// 3. Use the result
if (result.status === 'completed') {
  console.log('Screenshot URL:', result.url);
}

Response Examples

{
  "success": true,
  "job_id": 12345,
  "status": "completed",
  "url": "https://cdn.yeb.to/.../ss_abc.png",
  "thumbnail_url": "https://cdn.yeb.to/.../thumb.jpg",
  "width": 1920,
  "height": 1080,
  "format": "png",
  "file_size": 245678,
  "progress": 100,
  "created_at": "2026-02-06T12:00:00Z",
  "completed_at": "2026-02-06T12:00:03Z",
  "response_code": 200
}
{
  "success": true,
  "job_id": 12345,
  "status": "capturing",
  "progress": 45,
  "message": "Capturing screenshot...",
  "response_code": 200
}
{
  "success": true,
  "job_id": 12345,
  "status": "failed",
  "error": "Navigation timeout exceeded (30000 ms)",
  "response_code": 200
}
Free endpoint — Status checks cost 0 credits.

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

Job Status

screenshot-status 0.0000 credits

Parameters

API Key
body · string · required
Job ID
body · string · required

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Performance Metrics

POST https://ailyrics.yeb.to/v1/screenshot/metrics

Capture Core Web Vitals and performance metrics for any URL. Returns LCP, FCP, CLS, FID, TTI, and resource loading statistics. Use alongside screenshots for performance monitoring.

Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
urlstringтакURL to measure (or use job_id)
job_idintegerнеобов'язковийExisting job ID (returns cached metrics if available)
devicestringнеобов'язковийDevice preset for emulation
viewport_widthintegerнеобов'язковийViewport width (default: 1920)

Приклади запитів

# Measure page performance
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/metrics" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com"
# Mobile performance test
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/metrics" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&device=iphone-15"

Metrics Reference

MetricDescriptionGood
lcpLargest Contentful Paint (ms)< 2500ms
fcpFirst Contentful Paint (ms)< 1800ms
clsCumulative Layout Shift< 0.1
fidFirst Input Delay (ms)< 100ms
ttiTime to Interactive (ms)< 3800ms
total_blocking_timeTotal Blocking Time (ms)< 200ms

Response Example

{
  "success": true,
  "url": "https://example.com",
  "metrics": {
    "lcp": 1234,
    "fcp": 567,
    "cls": 0.05,
    "fid": 12,
    "tti": 2345,
    "total_blocking_time": 89,
    "dom_content_loaded": 890,
    "load_event": 1456,
    "resources": {
      "total": 45,
      "total_size": 2456789,
      "by_type": {
        "script": 12,
        "stylesheet": 5,
        "image": 18,
        "font": 4,
        "other": 6
      }
    }
  },
  "response_code": 200
}
{
  "error": "URL or job_id is required.",
  "code": 400,
  "response_code": 400,
  "response_time_ms": 3
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

Performance Metrics

screenshot-metrics 0.0500 credits

Parameters

API Key
body · string · required
Job ID
body · string · required

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

OCR & Text Extraction

POST https://ailyrics.yeb.to/v1/screenshot/ocr
POST https://ailyrics.yeb.to/v1/screenshot/extract-html
POST https://ailyrics.yeb.to/v1/screenshot/extract-text

Extract text from screenshots using OCR (Tesseract), or extract the DOM HTML / visible text directly from the page. OCR supports 11 languages with word-level bounding boxes.

OCR (from screenshot image)
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
job_idintegerтакCompleted screenshot job ID
languagestringнеобов'язковийOCR language (default: eng)
Extract HTML / Text (from page DOM)
Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
job_idintegerтакCompleted screenshot job ID

Supported OCR Languages

  • eng — English
  • bul — Bulgarian
  • deu — German
  • fra — French
  • spa — Spanish
  • ita — Italian
  • por — Portuguese
  • rus — Russian
  • jpn — Japanese
  • kor — Korean
  • chi_sim — Chinese (Simplified)

Приклади запитів

# Extract text from screenshot via OCR
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/ocr" \
  -H "X-API-Key: YOUR_KEY" \
  -d "job_id=12345&language=eng"
# Extract page HTML
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/extract-html" \
  -H "X-API-Key: YOUR_KEY" \
  -d "job_id=12345"
# Extract visible text
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/extract-text" \
  -H "X-API-Key: YOUR_KEY" \
  -d "job_id=12345"

Response Examples

{
  "success": true,
  "text": "Welcome to Example.com\nThis is a sample page...",
  "confidence": 0.95,
  "language": "eng",
  "blocks": [
    {
      "text": "Welcome",
      "confidence": 0.98,
      "bbox": {
        "x": 10, "y": 10,
        "width": 200, "height": 30
      }
    }
  ],
  "response_code": 200
}
{
  "success": true,
  "html": "<!DOCTYPE html>\n<html>...",
  "size": 45678,
  "response_code": 200
}
{
  "success": true,
  "text": "Welcome to Example.com\n\nThis is a sample page with content...",
  "word_count": 156,
  "response_code": 200
}

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

OCR Text Extraction

screenshot-ocr 0.2000 credits

Parameters

API Key
body · string · required
Job ID
body · string · required
Language
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Device Presets

POST https://ailyrics.yeb.to/v1/screenshot/devices

List all available device presets. Use the device parameter in capture endpoints to automatically set viewport dimensions, pixel density, and user agent. This endpoint is free (0 credits).

Параметр Тип Обов'язковий Опис
api_keystringтакYour API key
categorystringнеобов'язковийFilter by category: mobile, tablet, desktop

Приклади запитів

# List all devices
curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/devices" \
  -H "X-API-Key: YOUR_KEY"

Available Devices

Mobile
  • iphone-15-pro-max 430x932 @3x
  • iphone-15-pro 393x852 @3x
  • iphone-15 393x852 @3x
  • iphone-14 390x844 @3x
  • iphone-se 375x667 @2x
  • pixel-8-pro 412x915 @3.5x
  • pixel-8 412x915 @2.6x
  • galaxy-s24-ultra 412x915 @3.5x
  • galaxy-s24 360x780 @3x
Tablet
  • ipad-pro-12.9 1024x1366 @2x
  • ipad-pro-11 834x1194 @2x
  • ipad-air 820x1180 @2x
  • ipad-mini 768x1024 @2x
  • galaxy-tab-s9 800x1280 @2x
Desktop
  • desktop-1080p 1920x1080
  • desktop-1440p 2560x1440
  • desktop-4k 3840x2160
  • macbook-pro-16 1728x1117 @2x
  • macbook-air-15 1710x1112 @2x
Usage Example
# iPhone 15 screenshot
curl -s -X POST \
  "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com\
&device=iphone-15"

# iPad Pro screenshot
curl -s -X POST \
  "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com\
&device=ipad-pro-12.9"

Response Example

{
  "success": true,
  "devices": {
    "mobile": [
      {
        "id": "iphone-15-pro-max",
        "name": "iPhone 15 Pro Max",
        "width": 430,
        "height": 932,
        "scale": 3,
        "user_agent": "Mozilla/5.0 (iPhone...)"
      },
      {
        "id": "iphone-15",
        "name": "iPhone 15",
        "width": 393,
        "height": 852,
        "scale": 3
      }
    ],
    "tablet": [
      {
        "id": "ipad-pro-12.9",
        "name": "iPad Pro 12.9",
        "width": 1024,
        "height": 1366,
        "scale": 2
      }
    ],
    "desktop": [
      {
        "id": "desktop-1080p",
        "name": "Desktop 1080p",
        "width": 1920,
        "height": 1080,
        "scale": 1
      }
    ]
  },
  "response_code": 200
}
Free endpoint — Device list costs 0 credits.

Коди відповідей

КодОпис
200 SuccessЗапит оброблено успішно.
400 Bad RequestВалідація введення не пройдена.
401 UnauthorizedAPI-ключ відсутній або неправильний.
403 ForbiddenКлюч неактивний або не дозволений.
429 Rate LimitЗабагато запитів.
500 Server ErrorНепередбачена помилка.

Device Presets

screenshot-devices 0.0000 credits

Parameters

API Key
body · string · required
Category
body · string

Code Samples


                
                
                
            

Response

Status:
Headers

                
Body

                

Screenshot API — Practical Guide

A comprehensive guide to the Screenshot API: capture URLs and HTML as images or PDFs; process bulk batches; schedule recurring captures with visual change detection; and compare screenshots with pixel-level diffs.

#What the Screenshot API does

The Screenshot API turns any URL or HTML into a high-quality image or PDF. It handles viewport emulation, device presets, ad/cookie blocking, CSS/JS injection, watermarks, and more — so you don't have to manage browser infrastructure yourself.

  • 20+ device presets — iPhone, iPad, Pixel, Galaxy, MacBook, desktop resolutions.
  • Sync & async modes — get results immediately or queue jobs and poll for status.
  • Visual monitoring — schedule captures and get email alerts when pages change visually.
  • Webhooks — receive POST notifications when async jobs complete.

#Endpoints & actions

EndpointDescription
captureURL screenshot (PNG/JPG/WebP) with device emulation, blocking, watermarks.
capture-htmlRender custom HTML as an image.
capture-pdfGenerate PDF from URL or HTML with page settings.
bulkCapture multiple URLs (up to 50) in one request.
schedule-*Create/update/delete/list/run scheduled captures.
diffPixel-level visual comparison between two screenshots.
metricsCore Web Vitals (LCP, FCP, CLS, TTI).
status / downloadCheck job status or download the output file.
devicesList all available device presets.

#Quick start examples

#Basic screenshot

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&format=png"

#Mobile device screenshot

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&device=iphone-15&full_page=true"

#Clean capture with blocking

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://news-site.com&block_ads=true&block_cookie_banners=true&block_chat_widgets=true&block_tracking=true"

#Async capture with webhook

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/capture" \
  -H "X-API-Key: YOUR_KEY" \
  -d "url=https://example.com&async=true&webhook_url=https://yoursite.com/webhook"

# Response: {"success":true,"job_id":12345,"status":"queued"}
# Your webhook will receive a POST when the job completes.

#Key parameters explained

#Viewport & device

  • viewport_width / viewport_height — Set exact dimensions (320-3840 x 200-2160).
  • device — Use a preset like iphone-15 to auto-set viewport, pixel density, and user agent. Overrides manual viewport settings.
  • full_page — Capture the entire scrollable page, not just the visible viewport. Adds 0.03 credits.
  • retina — Render at 2x pixel density for sharp images. Adds 0.03 credits.

#Blocking options

  • block_ads — Blocks requests to known ad networks (Google Ads, DoubleClick, etc.).
  • block_cookie_banners — Removes common cookie consent overlays (OneTrust, CookieBot, etc.).
  • block_chat_widgets — Hides Intercom, Drift, Zendesk, and other chat widgets.
  • block_tracking — Blocks analytics and tracking scripts (Google Analytics, Facebook Pixel, etc.).

#Element targeting

  • selector — Capture only a specific CSS element (e.g. #hero-section).
  • click_selectors — Click elements before capture (accept cookies, close popups).
  • blur_selectors — Apply CSS blur to sensitive content.
  • remove_selectors — Remove elements entirely from the DOM.

#Output format

  • Images: png (default, lossless), jpg (smaller), webp (best compression).
  • Documents: pdf — with page format, orientation, margins, headers/footers.
  • quality — 1-100 for JPG/WebP (default: 80). Higher = larger file, better quality.
  • thumbnail_width — Auto-generate a thumbnail (50-800px wide).

#Async mode & webhooks

For heavy operations (bulk jobs, PDF generation), use async=true to queue the job. You have two options to get the result:

  1. Polling: Call /status with the job_id every 2-5 seconds until status is completed or failed.
  2. Webhook: Set webhook_url and your server will receive a POST with the full result when the job finishes. Includes retry logic (3 attempts).
// Webhook payload example
{
  "event": "screenshot.completed",
  "job_id": 12345,
  "status": "completed",
  "url": "https://cdn.yeb.to/.../screenshot.png",
  "file_size": 245678,
  "timestamp": "2026-02-06T12:00:03Z"
}

#Bulk screenshot processing

Send up to 50 URLs in a single /bulk request. Each URL can have individual settings, plus you can set default_settings applied to all. URLs are processed in parallel.

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/bulk" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": [
      {"url": "https://site1.com", "device": "iphone-15"},
      {"url": "https://site2.com", "format": "jpg", "quality": 90},
      {"url": "https://site3.com"}
    ],
    "default_settings": {
      "block_ads": true,
      "full_page": true
    }
  }'

#Scheduled captures & visual monitoring

Create automated schedules to capture pages at any frequency. Enable change detection to compare each capture with the previous one. When the visual difference exceeds your threshold, you get an email alert.

curl -s -X POST "https://ailyrics.yeb.to/v1/screenshot/schedule-create" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Daily Homepage Check",
    "url": "https://mysite.com",
    "cron_expression": "daily",
    "timezone": "Europe/Sofia",
    "detect_changes": true,
    "change_threshold": 5.0,
    "notify_on_change": true,
    "notify_email": "[email protected]",
    "screenshot_settings": {
      "full_page": true,
      "block_ads": true
    }
  }'

#Visual diff comparison

Compare any two completed screenshot jobs. The API generates a diff image highlighting changed pixels in red, and returns the difference percentage and bounding boxes of changed regions.

  • difference_percent — 0.00 means identical, 100.00 means completely different.
  • diff_regions — Array of {x, y, width, height} bounding boxes for changed areas.
  • diff_image_url — A PNG overlay showing changes in red against a dimmed background.

#Credit pricing breakdown

Each action has a base credit cost. Modifiers like full_page, retina, and 4K viewports add to the base. Check the endpoint documentation for exact pricing. Status, device list, and schedule list endpoints are free.

#Troubleshooting & tips

  1. Timeouts: Increase timeout_ms for slow pages (max 60000). Use delay_ms to wait for lazy-loaded content.
  2. Blank screenshots: Some SPAs need delay_ms=2000 or more. Try lazy_load=true for infinite scroll pages.
  3. Cookie walls: Use click_selectors=["#accept-cookies"] to auto-accept consent dialogs before capture.
  4. Large pages: Full-page captures of very long pages may take 10+ seconds. Use async=true for reliability.
  5. Watermarks: Add text watermarks via the watermark parameter with custom position and opacity.
  6. Rate limits: Default burst is 10 req/s. For bulk operations, use the /bulk endpoint instead of parallel single requests.

#API Changelog

2026-02-06
First public v1 release of Screenshot API with capture, capture-html, capture-pdf, bulk, schedule, diff, metrics, status, download, and devices endpoints.

Часті запитання

Ви можете робити знімки екрана у форматах PNG, JPG або WebP. Генерація PDF підтримує A4, A3, Letter та Legal з користувацькими полями, колонтитулами.

Коли full_page увімкнено, браузер прокручує до низу сторінки та захоплює всю висоту документа. Для сторінок з лінивим завантаженням контенту поєднуйте з lazy_load=true, щоб зображення та елементи активувалися під час прокрутки.

Так. Передайте пресет пристрою (напр. iphone-15, ipad-pro-12.9, galaxy-s24-ultra) і API автоматично встановить правильний viewport, щільність пікселів та user agent. Використовуйте endpoint /devices для списку всіх пресетів.

Ви можете блокувати рекламу, банери згоди cookie, віджети чату, скрипти відстеження, JavaScript, CSS, зображення, медіа та шрифти. Ви також можете надати користувацькі URL-шаблони для блокування конкретних ресурсів.

Один масовий запит приймає до 50 URL. Кожна URL обробляється паралельно і ви можете опитувати endpoint bulk-status або налаштувати webhook для сповіщення, коли всі захоплення завершені.

Створіть розклад з частотою (щогодини, щодня, щотижня тощо). API автоматично запускає захоплення та може порівнювати послідовні запуски для виявлення візуальних змін вище налаштовуваного порогу.

Endpoint diff порівнює два знімки екрана піксель за пікселем та повертає відсоток відмінностей, кількість змінених пікселів, уражені області та виділене зображення відмінностей. Поєднуйте з розкладами для автоматизованого моніторингу візуальної регресії.

Кожна дія має базову вартість у кредитах. Модифікатори як full_page, retina та 4K додаються до базової вартості. Endpoint-и статусу, списку пристроїв та списку розкладів безкоштовні. Точні значення дивіться в документації endpoint-ів.

За замовчуванням захоплення виконуються синхронно та повертають результат напряму. Встановіть async=true, щоб поставити завдання в чергу та отримати job_id негайно. Опитуйте endpoint /status або надайте webhook_url для сповіщення, коли захоплення готове.

Так. Кожен запит, навіть з помилкою, витрачає кредити. Ваші кредити прив'язані до кількості запитів, незалежно від успіху чи невдачі. Якщо помилка явно спричинена проблемою платформи з нашого боку, ми відновимо постраждалі кредити (без грошового повернення).

Зв'яжіться з нами за адресою [email protected]. Ми серйозно ставимося до зворотного зв'язку—якщо ваш звіт про помилку або запит на функцію є обґрунтованим, ми можемо швидко виправити або покращити API та надати вам 50 безкоштовних кредитів на подяку.

Залежить від API і іноді навіть від ендпоінту. Деякі ендпоінти використовують дані із зовнішніх джерел, які можуть мати суворіші обмеження. Ми також застосовуємо ліміти для запобігання зловживанням та підтримання стабільності платформи. Перевірте документацію щодо конкретного ліміту для кожного ендпоінту.

Ми працюємо на кредитній системі. Кредити — це передоплачені, неповоротні одиниці, які ви витрачаєте на API-виклики та інструменти. Кредити витрачаються за принципом FIFO (найстаріші першими) і дійсні протягом 12 місяців з дати покупки. Панель управління показує дату кожної покупки та її закінчення.

Так. Усі придбані кредити (включаючи дробові залишки) дійсні 12 місяців з моменту покупки. Невикористані кредити автоматично закінчуються і назавжди видаляються наприкінці терміну дії. Прострочені кредити не можна відновити або конвертувати в готівку чи іншу цінність. Перехідне правило: кредити, придбані до 22 вер. 2025, вважаються придбаними 22 вер. 2025 і закінчуються 22 вер. 2026 (якщо при покупці не було вказано ранішого терміну).

Так—у межах терміну дії. Невикористані кредити залишаються доступними і переносяться з місяця в місяць, поки не закінчаться через 12 місяців після покупки.

Кредити є неповоротними. Купуйте лише те, що потрібно—ви завжди можете поповнити пізніше. Якщо помилка платформи спричинить невдале списання, ми можемо відновити постраждалі кредити після розслідування. Без грошового повернення.

Ціни встановлені в кредитах, а не в доларах. Кожен ендпоінт має свою вартість—дивіться значок «Кредити / запит» вище. Ви завжди точно знатимете, скільки витрачаєте.
← Назад до API