Api reference

POST /render

Referência completa da API de renderização de PDFs

POST /api/v1/render

Endpoint principal para gerar PDFs a partir de diferentes formatos de entrada.

URL Base

https://renderhub.com/api/v1/render

Autenticação

Todas as requisições devem incluir sua chave de API no cabeçalho Authorization:

Authorization: Bearer SUA_CHAVE_API

Request

Headers

HeaderValorObrigatório
AuthorizationBearer {api_key}✅ Sim
Content-Typeapplication/json✅ Sim

Body Parameters

Parâmetros Principais

ParâmetroTipoObrigatórioDescrição
modestring✅ SimModo de operação: CONVERT ou RENDER
input_typestringCondicional*Formato de entrada: html, docx, markdown, xml, csv, json
datastringCondicional*Conteúdo a ser convertido (texto ou base64)
template_idstringCondicional**ID do template (apenas modo RENDER)

* Obrigatório quando mode: "CONVERT" ** Obrigatório quando mode: "RENDER"

Opções de Página

ParâmetroTipoPadrãoDescrição
page_sizestringA4Tamanho: A4, A3, Letter, Legal, Tabloid
orientationstringportraitOrientação: portrait, landscape
margin_topnumber20Margem superior em mm (0-100)
margin_bottomnumber20Margem inferior em mm (0-100)
margin_leftnumber15Margem esquerda em mm (0-100)
margin_rightnumber15Margem direita em mm (0-100)

Cabeçalho e Rodapé

ParâmetroTipoPadrãoDescrição
header_htmlstringnullHTML do cabeçalho (suporta {{page}}, {{total}}, {{date}})
footer_htmlstringnullHTML do rodapé (suporta {{page}}, {{total}}, {{date}})
header_heightnumber10Altura do cabeçalho em mm
footer_heightnumber10Altura do rodapé em mm

Opções Avançadas

ParâmetroTipoPadrãoDescrição
print_backgroundbooleantrueImprimir cores e imagens de fundo
scalenumber1.0Escala da página (0.1 - 2.0)
wait_forstringloadAguardar: load, domcontentloaded, networkidle
wait_timenumber0Tempo adicional de espera em ms (0-5000)
emulate_mediastringprintTipo de mídia CSS: screen, print

Webhook (Assíncrono)

ParâmetroTipoDescrição
webhook_urlstringURL para receber callback quando PDF estiver pronto
webhook_methodstringMétodo HTTP: POST (padrão), PUT

Exemplo: Modo CONVERT

curl -X POST https://renderhub.com/api/v1/render \
  -H "Authorization: Bearer rh_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "CONVERT",
    "input_type": "html",
    "data": "<html><body><h1>Meu PDF</h1></body></html>",
    "page_size": "A4",
    "orientation": "portrait",
    "margin_top": 20,
    "margin_bottom": 20,
    "margin_left": 15,
    "margin_right": 15,
    "print_background": true
  }'

Exemplo: Modo RENDER

curl -X POST https://renderhub.com/api/v1/render \
  -H "Authorization: Bearer rh_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "RENDER",
    "template_id": "tpl_invoice_001",
    "data": {
      "customer_name": "João Silva",
      "invoice_number": "2024-001",
      "total": "R$ 5.500,00"
    }
  }'

Exemplo: Com Cabeçalho/Rodapé

curl -X POST https://renderhub.com/api/v1/render \
  -H "Authorization: Bearer rh_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "CONVERT",
    "input_type": "html",
    "data": "<h1>Relatório</h1><p>Conteúdo...</p>",
    "header_html": "<div style=\"text-align: center; font-size: 10px;\">CONFIDENCIAL</div>",
    "footer_html": "<div style=\"text-align: center; font-size: 10px;\">Página {{page}} de {{total}} - {{date}}</div>",
    "header_height": 15,
    "footer_height": 15
  }'

Exemplo: Webhook Assíncrono

curl -X POST https://renderhub.com/api/v1/render \
  -H "Authorization: Bearer rh_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "CONVERT",
    "input_type": "html",
    "data": "<h1>PDF Grande</h1>",
    "webhook_url": "https://meuapp.com/webhook/pdf-ready"
  }'

Response

Success (200 OK)

Resposta Síncrona

{
  "id": "render_7kj3h2g1k4j5h6",
  "status": "DONE",
  "pdf_base64": "JVBERi0xLjQKJeLjz9MKMyAwIG9iago8P...",
  "pages": 3,
  "file_size_kb": 245,
  "duration_ms": 1250,
  "created_at": "2024-01-15T10:30:00Z"
}

Resposta Assíncrona (com webhook)

{
  "id": "render_7kj3h2g1k4j5h6",
  "status": "QUEUED",
  "job_id": "job_abc123xyz",
  "webhook_url": "https://meuapp.com/webhook/pdf-ready",
  "estimated_time_ms": 3000,
  "created_at": "2024-01-15T10:30:00Z"
}

Response Fields

CampoTipoDescrição
idstringID único da renderização
statusstringStatus: QUEUED, PROCESSING, DONE, FAILED
pdf_base64stringPDF codificado em base64 (apenas quando DONE)
pagesnumberNúmero de páginas do PDF
file_size_kbnumberTamanho do arquivo em KB
duration_msnumberTempo de processamento em milissegundos
created_atstringTimestamp ISO 8601 da criação
job_idstringID do job (apenas modo assíncrono)
webhook_urlstringURL do webhook (apenas modo assíncrono)
estimated_time_msnumberTempo estimado (apenas modo assíncrono)

Callback do Webhook

Quando o PDF estiver pronto, o RenderHub envia um POST para sua webhook_url:

{
  "id": "render_7kj3h2g1k4j5h6",
  "status": "DONE",
  "job_id": "job_abc123xyz",
  "pdf_url": "https://renderhub.com/api/v1/download/render_7kj3h2g1k4j5h6",
  "pdf_expires_at": "2024-01-15T11:30:00Z",
  "pages": 3,
  "file_size_kb": 245,
  "duration_ms": 2800
}

Baixe o PDF da pdf_url dentro de 1 hora (expira automaticamente).

Errors

400 - Bad Request

Requisição inválida ou parâmetros incorretos.

{
  "error": "invalid_request",
  "message": "O campo 'mode' é obrigatório",
  "field": "mode",
  "code": 400
}

401 - Unauthorized

Chave de API ausente ou inválida.

{
  "error": "unauthorized",
  "message": "Chave de API inválida ou ausente",
  "code": 401
}

403 - Quota Exceeded

Quota mensal excedida.

{
  "error": "quota_exceeded",
  "message": "Quota mensal de 1.000 requisições excedida",
  "quota_reset": "2024-02-01T00:00:00Z",
  "code": 403
}

413 - Payload Too Large

Conteúdo excede o tamanho máximo permitido.

{
  "error": "payload_too_large",
  "message": "O tamanho do conteúdo excede 10 MB",
  "max_size_mb": 10,
  "received_size_mb": 15.2,
  "code": 413
}

422 - Unprocessable Entity

Erro ao processar o conteúdo.

{
  "error": "conversion_failed",
  "message": "Falha ao converter HTML: CSS inválido na linha 15",
  "details": "Unexpected token '}' at line 15",
  "code": 422
}

429 - Too Many Requests

Rate limit excedido.

{
  "error": "rate_limit_exceeded",
  "message": "Você excedeu 20 requisições por minuto",
  "retry_after": 45,
  "code": 429
}

500 - Internal Server Error

Erro interno do servidor.

{
  "error": "internal_error",
  "message": "Erro interno ao processar requisição",
  "request_id": "req_abc123",
  "code": 500
}

Rate Limits

Cada resposta inclui headers de rate limiting:

HTTP/1.1 200 OK
X-RateLimit-Limit: 20
X-RateLimit-Remaining: 15
X-RateLimit-Reset: 1640995200
X-Quota-Limit: 1000
X-Quota-Remaining: 750
X-Quota-Reset: 1643673600

Exemplos por Linguagem

Node.js

const axios = require('axios');
const fs = require('fs');

async function generatePDF() {
  try {
    const response = await axios.post('https://renderhub.com/api/v1/render', {
      mode: 'CONVERT',
      input_type: 'html',
      data: '<html><body><h1>Olá RenderHub!</h1></body></html>',
      page_size: 'A4',
      orientation: 'portrait'
    }, {
      headers: {
        'Authorization': `Bearer ${process.env.RENDERHUB_API_KEY}`,
        'Content-Type': 'application/json'
      }
    });

    // Salvar PDF
    const pdfBuffer = Buffer.from(response.data.pdf_base64, 'base64');
    fs.writeFileSync('output.pdf', pdfBuffer);

    console.log('✅ PDF gerado com sucesso!');
    console.log(`Páginas: ${response.data.pages}`);
    console.log(`Tamanho: ${response.data.file_size_kb} KB`);
  } catch (error) {
    if (error.response) {
      console.error('Erro:', error.response.data);
    } else {
      console.error('Erro:', error.message);
    }
  }
}

generatePDF();

Python

import os
import base64
import requests

API_KEY = os.getenv('RENDERHUB_API_KEY')

def generate_pdf():
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }

    data = {
        'mode': 'CONVERT',
        'input_type': 'html',
        'data': '<html><body><h1>Olá RenderHub!</h1></body></html>',
        'page_size': 'A4',
        'orientation': 'portrait'
    }

    response = requests.post(
        'https://renderhub.com/api/v1/render',
        headers=headers,
        json=data
    )

    if response.status_code == 200:
        result = response.json()

        # Decodificar e salvar PDF
        pdf_bytes = base64.b64decode(result['pdf_base64'])
        with open('output.pdf', 'wb') as f:
            f.write(pdf_bytes)

        print(f'✅ PDF gerado com sucesso!')
        print(f'Páginas: {result["pages"]}')
        print(f'Tamanho: {result["file_size_kb"]} KB')
    else:
        print(f'Erro: {response.json()}')

generate_pdf()

PHP

<?php

$apiKey = getenv('RENDERHUB_API_KEY');

$data = [
    'mode' => 'CONVERT',
    'input_type' => 'html',
    'data' => '<html><body><h1>Olá RenderHub!</h1></body></html>',
    'page_size' => 'A4',
    'orientation' => 'portrait'
];

$ch = curl_init('https://renderhub.com/api/v1/render');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $apiKey,
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $result = json_decode($response, true);

    // Decodificar e salvar PDF
    $pdfBytes = base64_decode($result['pdf_base64']);
    file_put_contents('output.pdf', $pdfBytes);

    echo "✅ PDF gerado com sucesso!\n";
    echo "Páginas: {$result['pages']}\n";
    echo "Tamanho: {$result['file_size_kb']} KB\n";
} else {
    echo "Erro: $response\n";
}

Limites e Restrições

RecursoLimiteUpgrade
Tamanho do payload10 MBEnterprise: 50 MB
Timeout30 segundosEnterprise: 60 segundos
Páginas por PDF100 páginasEnterprise: Ilimitado
Imagens externas50 por documentoEnterprise: Ilimitado
JavaScript timeout5 segundosEnterprise: 10 segundos

Melhores Práticas

1. Sempre use HTTPS

// ✅ Correto
const url = 'https://www.renderhub.app/api/v1/render';

// ❌ Incorreto
const url = 'http://www.renderhub.app/api/v1/render';

2. Armazene a chave em variáveis de ambiente

// ✅ Correto
const apiKey = process.env.RENDERHUB_API_KEY;

// ❌ Incorreto
const apiKey = 'rh_live_abc123...';

3. Implemente retry com backoff

async function generatePDFWithRetry(data, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await axios.post('/api/v1/render', data);
    } catch (error) {
      if (error.response?.status === 429) {
        const delay = error.response.headers['retry-after'] || (2 ** i);
        await sleep(delay * 1000);
      } else {
        throw error;
      }
    }
  }
}

4. Use webhooks para PDFs grandes

// Para PDFs que levam >5s
const response = await axios.post('/api/v1/render', {
  mode: 'CONVERT',
  input_type: 'html',
  data: largeHtmlContent,
  webhook_url: 'https://meuapp.com/webhook'
});
// Não espera o PDF, processa quando receber callback

5. Valide a entrada antes de enviar

// Valide HTML antes de enviar
const isValidHTML = html.includes('<html>') && html.includes('</html>');
if (!isValidHTML) {
  throw new Error('HTML inválido');
}

Próximos Passos

On this page