GET
https://api.realoficial.com.br/api/v1
/
renders
curl -X GET "https://api.realoficial.com.br/api/v1/renders?limit=20&page=1" \
  -H "Authorization: Bearer seu_token_aqui" \
  -H "Content-Type: application/json"
{
  "message": "Lista de renders obtida com sucesso.",
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": "01k6ij90yqtsyrzjb0hveqy9ef",
        "short_id": "01k4ef56yqtsyrzjb0gveqy7cd",
        "status": "done",
        "download_url": "https://cdn-wasabi.realoficial.com.br/renders/01k6ij90yqtsyrzjb0hveqy9ef.mp4?v=20250124",
        "render_hash": "a1b2c3d4e5f6...",
        "storage_provider": "wasabi",
        "created_at": "2025-01-24T11:00:00.000000Z",
        "short": {
          "id": "01k4ef56yqtsyrzjb0gveqy7cd",
          "title": "Momento viral #1",
          "start_time": 245.5,
          "end_time": 305.2,
          "thumbnail_url": "https://img.youtube.com/vi/abc123/maxresdefault.jpg",
          "project": {
            "id": "01k3ab12yqtsyrzjb0fveqy5zx",
            "url": "https://www.youtube.com/watch?v=abc123"
          },
          "renders": [
            {
              "id": "01k6ij90yqtsyrzjb0hveqy9ef",
              "created_at": "2025-01-24T11:00:00.000000Z"
            }
          ]
        },
        "published_platforms": ["tiktok", "instagram"]
      },
      {
        "id": "01k6ij91yqtsyrzjb0hveqy0gh",
        "short_id": "01k4ef57yqtsyrzjb0gveqy8de",
        "status": "processing",
        "download_url": null,
        "render_hash": "b2c3d4e5f6g7...",
        "storage_provider": "wasabi",
        "created_at": "2025-01-24T11:05:00.000000Z",
        "short": {
          "id": "01k4ef57yqtsyrzjb0gveqy8de",
          "title": "Momento viral #2",
          "start_time": 512.0,
          "end_time": 571.5,
          "thumbnail_url": "https://img.youtube.com/vi/abc123/maxresdefault.jpg",
          "project": {
            "id": "01k3ab12yqtsyrzjb0fveqy5zx",
            "url": "https://www.youtube.com/watch?v=abc123"
          }
        },
        "published_platforms": []
      }
    ],
    "first_page_url": "https://api.realoficial.com.br/api/v1/renders?page=1",
    "from": 1,
    "last_page": 5,
    "per_page": 20,
    "to": 20,
    "total": 87
  }
}

Endpoint

GET https://api.realoficial.com.br/api/v1/renders
Este endpoint requer autenticacao via Bearer Token.

Query Parameters

page
integer
Numero da pagina (padrao: 1)
limit
integer
Quantidade de itens por pagina (padrao: 20)
project_id
string
Filtrar por ID de projeto especifico
fromPublishScreen
boolean
Otimiza resposta para listagem de videos prontos (apenas status done)

Resposta de Sucesso

message
string
Mensagem de confirmacao
data
object
Objeto paginado com os renders
curl -X GET "https://api.realoficial.com.br/api/v1/renders?limit=20&page=1" \
  -H "Authorization: Bearer seu_token_aqui" \
  -H "Content-Type: application/json"
{
  "message": "Lista de renders obtida com sucesso.",
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": "01k6ij90yqtsyrzjb0hveqy9ef",
        "short_id": "01k4ef56yqtsyrzjb0gveqy7cd",
        "status": "done",
        "download_url": "https://cdn-wasabi.realoficial.com.br/renders/01k6ij90yqtsyrzjb0hveqy9ef.mp4?v=20250124",
        "render_hash": "a1b2c3d4e5f6...",
        "storage_provider": "wasabi",
        "created_at": "2025-01-24T11:00:00.000000Z",
        "short": {
          "id": "01k4ef56yqtsyrzjb0gveqy7cd",
          "title": "Momento viral #1",
          "start_time": 245.5,
          "end_time": 305.2,
          "thumbnail_url": "https://img.youtube.com/vi/abc123/maxresdefault.jpg",
          "project": {
            "id": "01k3ab12yqtsyrzjb0fveqy5zx",
            "url": "https://www.youtube.com/watch?v=abc123"
          },
          "renders": [
            {
              "id": "01k6ij90yqtsyrzjb0hveqy9ef",
              "created_at": "2025-01-24T11:00:00.000000Z"
            }
          ]
        },
        "published_platforms": ["tiktok", "instagram"]
      },
      {
        "id": "01k6ij91yqtsyrzjb0hveqy0gh",
        "short_id": "01k4ef57yqtsyrzjb0gveqy8de",
        "status": "processing",
        "download_url": null,
        "render_hash": "b2c3d4e5f6g7...",
        "storage_provider": "wasabi",
        "created_at": "2025-01-24T11:05:00.000000Z",
        "short": {
          "id": "01k4ef57yqtsyrzjb0gveqy8de",
          "title": "Momento viral #2",
          "start_time": 512.0,
          "end_time": 571.5,
          "thumbnail_url": "https://img.youtube.com/vi/abc123/maxresdefault.jpg",
          "project": {
            "id": "01k3ab12yqtsyrzjb0fveqy5zx",
            "url": "https://www.youtube.com/watch?v=abc123"
          }
        },
        "published_platforms": []
      }
    ],
    "first_page_url": "https://api.realoficial.com.br/api/v1/renders?page=1",
    "from": 1,
    "last_page": 5,
    "per_page": 20,
    "to": 20,
    "total": 87
  }
}

Filtrar por Projeto

Para listar renders de um projeto especifico:
GET /renders?project_id=01k3ab12yqtsyrzjb0fveqy5zx

Download do Video

Quando o status e done, o campo download_url contem a URL direta para o arquivo MP4:
// Baixar video programaticamente
async function downloadVideo(render) {
  if (render.status !== 'done') {
    throw new Error('Render ainda nao concluido');
  }

  const response = await fetch(render.download_url);
  const blob = await response.blob();

  // Salvar localmente
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = `${render.short.title}.mp4`;
  a.click();
}

Status dos Renders

pending

Na fila de processamento. Aguardando worker disponivel.

processing

Sendo renderizado. Pode levar de 30s a 2 minutos.

done

Concluido! Campo download_url disponivel.

error

Erro durante renderizacao. Tente novamente.

CDN e Cache

Os videos sao armazenados em CDN global (Wasabi) e ficam disponiveis por tempo indeterminado. As URLs incluem um parametro de versao para cache busting.

Exemplo de Integracao Completa

// Fluxo completo: criar projeto -> aguardar cortes -> renderizar -> baixar
async function processVideo(youtubeUrl) {
  const token = 'seu_token_aqui';
  const headers = {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  };

  // 1. Criar projeto
  const createResponse = await fetch('https://api.realoficial.com.br/api/v1/createShorts', {
    method: 'POST',
    headers,
    body: JSON.stringify({
      url: youtubeUrl,
      clipDuration: '60',
      startTime: 0,
      endTime: 1800,
      aspect_ratio: 'vertical',
      layout: 'single'
    })
  });
  const project = await createResponse.json();

  // 2. Aguardar processamento (polling)
  let shorts = [];
  while (shorts.length === 0) {
    await new Promise(r => setTimeout(r, 30000)); // 30 segundos

    const shortsResponse = await fetch(
      `https://api.realoficial.com.br/api/v1/shorts/${project.data.id}?sort=score`,
      { headers }
    );
    const shortsData = await shortsResponse.json();

    if (shortsData.project?.status === 'face_analysis_done') {
      shorts = shortsData.data.data;
    }
  }

  // 3. Renderizar os 3 melhores cortes
  const topShorts = shorts.slice(0, 3);
  for (const short of topShorts) {
    await fetch(
      `https://api.realoficial.com.br/api/v1/shorts/${project.data.id}/${short.id}/render`,
      { method: 'POST', headers }
    );
  }

  // 4. Aguardar renders
  await new Promise(r => setTimeout(r, 120000)); // 2 minutos

  // 5. Obter URLs dos videos
  const rendersResponse = await fetch(
    `https://api.realoficial.com.br/api/v1/renders?project_id=${project.data.id}`,
    { headers }
  );
  const renders = await rendersResponse.json();

  return renders.data.data
    .filter(r => r.status === 'done')
    .map(r => r.download_url);
}