Документация API
Простой REST API для динамического рендеринга JavaScript-сайтов. Интегрируйте за пару строк.
Быстрый старт
Ваш SPA будет отдавать готовый HTML поисковым системам после одного запроса к нашему API.
- Базовый URL:
https://api.vrender.ru - Метод:
GET - Аутентификация: HTTP-заголовок
X-Api-Key
API-ключ можно получить в личном кабинете после регистрации.
Эндпоинт: /render
Отрендерить указанную страницу и вернуть статический HTML.
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
url |
string | Да | Полный URL страницы для рендеринга (с протоколом) |
mobile |
string | Нет | Если 1, рендеринг выполняется с эмуляцией мобильного устройства (iPhone X, Android Chrome). По умолчанию 0 (десктоп). |
wait_until |
string | Нет | Стратегия ожидания: load, domcontentloaded, networkidle (по умолчанию). |
wait_for_selector |
string | Нет | CSS-селектор, который нужно дождаться перед возвратом HTML. |
timeout |
integer | Нет | Таймаут рендеринга в миллисекундах (по умолчанию 30000). |
Заголовки запроса
| Заголовок | Обязательный | Описание |
|---|---|---|
X-Api-Key |
Да | Ваш персональный API-ключ |
Коды ответов
| Код | Тело ответа | Описание |
|---|---|---|
| 200 | HTML содержимое страницы | Успешный рендеринг. Заголовок X-Cache: HIT или MISS показывает, взят ли ответ из кэша. |
| 400 | {"error": "URL parameter required"} |
Не передан обязательный параметр url. |
| 401 | {"error": "API key required"} / "Invalid API key" |
Отсутствует или неверный API-ключ. |
| 429 | {"error": "Render limit exceeded"} |
Исчерпан месячный лимит рендеров по вашему тарифу. |
| 500 | {"error": "Render failed", "details": "..."} |
Ошибка при рендеринге (например, сайт недоступен). |
Интеграция с веб-сервером
Чтобы поисковые боты автоматически получали отрендеренный HTML, настройте свой веб-сервер на проксирование запросов к нашему API.
Добавьте в секцию server вашего конфигурационного файла Nginx:
location / {
set $prerender 0;
if ($http_user_agent ~* "googlebot|yandex|bingbot|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator|gptbot|chatgpt|perplexity") {
set $prerender 1;
}
if ($prerender = 1) {
proxy_pass https://api.vrender.ru/render?url=$scheme://$host$request_uri;
proxy_set_header X-Api-Key ВАШ_API_КЛЮЧ;
}
proxy_pass http://localhost:3000; # ваш SPA сервер
}
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (googlebot|yandex|bingbot|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator|gptbot|chatgpt|perplexity) [NC,OR]
RewriteCond %{QUERY_STRING} _escaped_fragment_
RewriteCond %{REQUEST_URI} !\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot) [NC]
RewriteRule ^(.*)$ https://api.vrender.ru/render?url=https://%{HTTP_HOST}/$1 [P,L]
RequestHeader set X-Api-Key "ВАШ_API_КЛЮЧ"
</IfModule>
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const userAgent = request.headers.get('User-Agent') || '';
const bots = /googlebot|yandex|bingbot|baiduspider|twitterbot|facebookexternalhit|gptbot|chatgpt|perplexity/i;
const url = new URL(request.url);
if (bots.test(userAgent) || url.searchParams.has('_escaped_fragment_')) {
const apiUrl = 'https://api.vrender.ru/render?url=' + encodeURIComponent(request.url);
const response = await fetch(apiUrl, {
headers: { 'X-Api-Key': 'ВАШ_API_КЛЮЧ' }
});
if (response.ok) return response;
}
return fetch(request);
}
const axios = require('axios');
function prerenderMiddleware(req, res, next) {
const userAgent = req.headers['user-agent'] || '';
const bots = /googlebot|yandex|bingbot|baiduspider|gptbot|chatgpt|perplexity/i;
const isBot = bots.test(userAgent) || '_escaped_fragment_' in req.query;
if (!isBot) return next();
const url = 'https://api.vrender.ru/render?url=' + encodeURIComponent(req.protocol + '://' + req.get('host') + req.originalUrl);
axios.get(url, {
headers: { 'X-Api-Key': 'ВАШ_API_КЛЮЧ' },
responseType: 'text'
})
.then(response => res.send(response.data))
.catch(() => next());
}
app.use(prerenderMiddleware);
Примеры кода
curl -H "X-Api-Key: ВАШ_API_КЛЮЧ" "https://api.vrender.ru/render?url=https://example.com"
import requests
url = "https://example.com"
api_url = "https://api.vrender.ru/render"
headers = {"X-Api-Key": "ВАШ_API_КЛЮЧ"}
response = requests.get(api_url, params={"url": url}, headers=headers)
if response.status_code == 200:
html = response.text
print(f"Кэш: {response.headers.get('X-Cache')}")
else:
print(f"Ошибка: {response.json()}")
<?php
$url = 'https://example.com';
$apiUrl = sprintf('https://api.vrender.ru/render?url=%s', urlencode($url));
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-Api-Key: ВАШ_API_КЛЮЧ',
]);
$html = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode === 200) {
echo $html; // отрендеренный HTML
} else {
echo "Ошибка рендеринга";
}
curl_close($ch);
?>
require 'net/http'
require 'uri'
uri = URI('https://api.vrender.ru/render')
params = { url: 'https://example.com' }
uri.query = URI.encode_www_form(params)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == 'https'
request = Net::HTTP::Get.new(uri)
request['X-Api-Key'] = 'ВАШ_API_КЛЮЧ'
response = http.request(request)
if response.code == '200'
puts response.body # отрендеренный HTML
else
puts "Ошибка: #{response.body}"
end
Часто задаваемые вопросы
Наш API не проверяет User-Agent автоматически — он рендерит любой URL, который вы передаёте. Рекомендуем на вашем сервере (Nginx/Apache) настроить редирект на API только для ботов: Googlebot, YandexBot, Bingbot, Baiduspider, Twitterbot, Facebot, GPTBot (ChatGPT), PerplexityBot и других. См. интеграции.
Если целевой URL не отвечает или возвращает ошибку, API вернёт
500 Internal Server Error с описанием в поле details. Ваш сервер должен корректно обработать такой ответ (например, отдать SPA как обычно).
В ответе вы получите статус 200 и HTML-код. Также обратите внимание на заголовок
X-Cache: если он равен MISS, страница была только что отрендерена; если HIT — взята из кэша.
Да! Передайте
mobile=1 для эмуляции мобильного устройства. Для AI-поисковиков (ChatGPT, Perplexity) мы рекомендуем добавить их User-Agent в список ботов на вашем сервере — они получат HTML так же, как обычные поисковики.
Да, но для этого требуется индивидуальная настройка. Свяжитесь с нами через поддержку, чтобы обсудить передачу cookies или заголовков авторизации.
Срок хранения кэша зависит от тарифного плана: от 7 до 90 дней. Вы можете изменить его в личном кабинете (если тариф позволяет) или обратиться к нам за индивидуальной настройкой.