Документация API

Простой REST API для динамического рендеринга JavaScript-сайтов. Интегрируйте за пару строк.

Быстрый старт

Ваш SPA будет отдавать готовый HTML поисковым системам после одного запроса к нашему API.

  • Базовый URL: https://api.vrender.ru
  • Метод: GET
  • Аутентификация: HTTP-заголовок X-Api-Key

Эндпоинт: /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 дней. Вы можете изменить его в личном кабинете (если тариф позволяет) или обратиться к нам за индивидуальной настройкой.