Skip to main content

O que são Seções?

Quando você cria um relatório através da API, ele é dividido em seções (sections). Cada seção representa uma parte específica do relatório, como “Resumo Executivo”, “Análise Financeira”, ou “Conclusão”. As seções são geradas de forma assíncrona - você receberá o relatório imediatamente, mas o conteúdo das seções será processado em segundo plano pela nossa IA.

Estrutura de uma Seção

Cada seção contém as seguintes informações:
CampoTipoDescrição
idstringIdentificador único da seção
titlestringTítulo/nome da seção
statusstringStatus do processamento (veja abaixo)
ordernumberOrdem da seção no relatório (1, 2, 3…)
contentstringConteúdo gerado pela IA (texto)

Status das Seções

Uma seção pode ter os seguintes status:
StatusSignificadoO que fazer
queuedNa fila para processamentoAguarde, será processada em breve
processingSendo gerada pela IAAguarde, o conteúdo está sendo criado
doneConcluída com sucessoO conteúdo está pronto em content
errorErro no processamentoVerifique logs ou tente novamente

Exemplo Prático

{
  "id": "rep_xyz789",
  "status": "processing",
  "sections": [
    {
      "id": "sec_abc123",
      "title": "Resumo Executivo",
      "status": "done",
      "order": 1,
      "content": "Este relatório apresenta uma análise completa da Empresa XYZ. Principais pontos: ..."
    },
    {
      "id": "sec_def456",
      "title": "Análise Financeira",
      "status": "processing",
      "order": 2,
      "content": null
    },
    {
      "id": "sec_ghi789",
      "title": "Conclusão",
      "status": "queued",
      "order": 3,
      "content": null
    }
  ]
}
Neste exemplo:
  • ✅ Primeira seção está pronta e você pode usar o conteúdo
  • ⏳ Segunda seção está sendo processada
  • ⏸️ Terceira seção está na fila aguardando

Como Usar as Seções

1. Criar um Relatório

POST /reports
{
  "target": {
    "document": "12345678901"
  },
  "template": "tpl_abc123"
}
Resposta:
{
  "id": "rep_xyz789",
  "sections": [
    {
      "id": "sec_abc123",
      "title": "Resumo Executivo",
      "status": "queued",
      "order": 1,
      "content": null
    }
  ]
}

2. Verificar o Progresso

Para ver se as seções foram processadas, faça uma nova requisição GET:
GET /reports/rep_xyz789
Resposta:
{
  "id": "rep_xyz789",
  "status": "completed",
  "sections": [
    {
      "id": "sec_abc123",
      "title": "Resumo Executivo",
      "status": "done",
      "order": 1,
      "content": "Análise completa da empresa..."
    }
  ]
}

3. Reprocessar Seções

Se precisar gerar novamente o conteúdo de um relatório:
POST /reports/rep_xyz789/run
Isso iniciará um novo processamento de todas as seções.

Monitoramento em Tempo Real

Polling (Recomendado)

Faça requisições periódicas para verificar o status:
async function waitForReport(reportId) {
  while (true) {
    const response = await fetch(`https://api.base39.com.br/v1/reports/${reportId}`);
    const report = await response.json();

    // Verifica se todas as seções estão prontas
    const allDone = report.sections.every(s => s.status === 'done');

    if (allDone) {
      return report;
    }

    // Aguarda 5 segundos antes de verificar novamente
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

Webhooks (Futuro)

Em breve, você poderá configurar webhooks para receber notificações quando as seções forem concluídas.

Boas Práticas

✅ Faça

  • Verifique o status antes de usar o conteúdo
  • Implemente retry para seções com erro
  • Use polling com intervalos adequados (5-10 segundos)
  • Processe seções individualmente conforme ficam prontas

❌ Evite

  • Não assuma que o conteúdo está pronto imediatamente
  • Não faça polling muito frequente (< 3 segundos)
  • Não ignore o campo status
  • Não processe seções com content: null

Tempos Estimados

Tipo de SeçãoTempo Estimado
Resumo curto10-30 segundos
Análise média30-60 segundos
Relatório completo1-3 minutos
Os tempos podem variar dependendo da complexidade da análise e da carga do sistema.

Exemplos de Código

Python

import requests
import time

def create_and_wait_report(document, template):
    # Criar relatório
    response = requests.post(
        'https://api.base39.com.br/v1/reports',
        headers={'Authorization': 'Bearer YOUR_TOKEN'},
        json={'target': {'document': document}, 'template': template}
    )
    report_id = response.json()['id']

    # Aguardar conclusão
    while True:
        response = requests.get(
            f'https://api.base39.com.br/v1/reports/{report_id}',
            headers={'Authorization': 'Bearer YOUR_TOKEN'}
        )
        report = response.json()

        # Verificar se todas as seções estão prontas
        all_done = all(s['status'] == 'done' for s in report['sections'])

        if all_done:
            return report

        time.sleep(5)

# Usar
report = create_and_wait_report('12345678901', 'tpl_abc123')
for section in report['sections']:
    print(f"{section['title']}: {section['content'][:100]}...")

JavaScript/TypeScript

async function createAndWaitReport(document: string, template: string) {
  // Criar relatório
  const createResponse = await fetch('https://api.base39.com.br/v1/reports', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_TOKEN',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      target: { document },
      template
    })
  });

  const { id } = await createResponse.json();

  // Aguardar conclusão
  while (true) {
    const response = await fetch(`https://api.base39.com.br/v1/reports/${id}`, {
      headers: { 'Authorization': 'Bearer YOUR_TOKEN' }
    });

    const report = await response.json();

    // Verificar se todas as seções estão prontas
    const allDone = report.sections.every(s => s.status === 'done');

    if (allDone) {
      return report;
    }

    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

// Usar
const report = await createAndWaitReport('12345678901', 'tpl_abc123');
report.sections.forEach(section => {
  console.log(`${section.title}:`, section.content.substring(0, 100));
});

Tratamento de Erros

async function processReport(reportId) {
  const report = await getReport(reportId);

  for (const section of report.sections) {
    switch (section.status) {
      case 'done':
        // Processar conteúdo
        console.log(section.content);
        break;

      case 'error':
        // Tentar reprocessar
        console.error(`Erro na seção ${section.title}`);
        await retrySection(reportId);
        break;

      case 'processing':
      case 'queued':
        // Aguardar
        console.log(`Aguardando seção ${section.title}...`);
        break;
    }
  }
}

Perguntas Frequentes

Por que as seções não estão prontas imediatamente?

As seções são geradas por IA que precisa analisar múltiplas fontes de dados, realizar pesquisas e processar informações. Isso leva alguns segundos a minutos dependendo da complexidade.

Posso processar apenas algumas seções?

Atualmente, todas as seções são processadas juntas. Em breve, será possível processar seções individualmente.

O que acontece se houver erro em uma seção?

A seção ficará com status: "error". As outras seções continuarão o processamento normalmente. Você pode tentar reprocessar o relatório completo usando o endpoint /run.

Quanto tempo os relatórios ficam disponíveis?

Os relatórios e suas seções ficam disponíveis indefinidamente na sua conta.
I