Desenvolvedores: API e importação

Leve os dados para outros sistemas (ERP, administradora, BI) pela API de integração, e traga pontos, rondas e tarefas de outros sistemas por CSV.

API de integração (leitura)

Uma API REST somente leitura, em JSON, com os dados da empresa.

  • Endereço base: https://vistoria.trng.capital/api/integration/v1
  • Autenticação: cada requisição envia o cabeçalho X-API-Key: psk_…
  • As chaves (começam com psk_) são criadas e revogadas pelo síndico em Painel › Integrações. A chave aparece uma única vez; guarde-a num cofre de senhas.
  • Disponível nos planos Profissional e Completo, com a assinatura ativa.
  • Limite: 600 requisições por minuto por chave (acima disso, 429).
  • Listas por data vêm em páginas de 500 itens: repita a chamada com cursor=next_cursor até next_cursor ser null.
curl -H "X-API-Key: psk_…" \
  "https://vistoria.trng.capital/api/integration/v1/entries?since=2026-10-01T00:00:00Z&until=2026-11-01T00:00:00Z"

Endpoints

EndpointParâmetrosRetorna
GET /entriessince, until, location_id, cursorRegistros de pontos (horário do aparelho e do servidor, GPS, foto, alerta de relógio).
GET /occurrencessince, until, location_id, cursorLivro de ocorrências com status e resolução.
GET /sessionssince, until, cursorTurnos: entrada, saída, assinatura.
GET /checkpoints—Pontos cadastrados (NFC, QR Code, GPS).
GET /locations—Locais (prédios).

since e until são datas ISO 8601 (com fuso; sem fuso = UTC). location_id filtra por local. Datas nas respostas estão em UTC.

{
  "entries": [
    {"id": "6f1c…", "recorded_at": "2026-10-05T22:04:11Z", "received_at": "2026-10-05T22:04:13Z",
     "username": "joao", "entry_type": "rfid", "area_name": "Portaria",
     "checkpoint_id": "a41e…", "location_id": "0b9d…", "identifier": "04:A1:B2:C3:D4:E5:F6",
     "latitude": -23.561414, "longitude": -46.655881, "session_key": "…",
     "comments": "", "has_photo": true, "clock_anomaly": false, "time_zone": "America/Sao_Paulo"}
  ],
  "next_cursor": "eyJ0IjogIjIwMjYt…"
}

Exportar o livro de ocorrências

Todas as ocorrências da empresa, com autor, local, gravidade, status e resolução — ideal para levar à administradora ou a um sistema de chamados.

curl -H "X-API-Key: psk_…" "https://vistoria.trng.capital/api/integration/v1/occurrences?since=2026-10-01T00:00:00Z"

{
  "occurrences": [
    {"id": "c2d7…", "category": "iluminacao", "severity": "media",
     "description": "Lâmpada queimada no hall do bloco A", "status": "resolvida",
     "author": {"id": "…", "display_name": "João", "role": "worker"},
     "location": {"id": "0b9d…", "name": "Torre A"},
     "recorded_at": "2026-10-05T22:26:00Z", "has_photo": true, "photo_received": true,
     "resolved_at": "2026-10-06T09:10:00Z", "resolution_note": "Trocada pela manutenção"}
  ],
  "next_cursor": null
}

Uma ocorrência nunca é editada nem apagada depois de registrada: só a resolução é acrescentada. O que a API devolve é o histórico real.

Para baixar tudo, siga o next_cursor:

cursor=""
while :; do
  page=$(curl -s -H "X-API-Key: $KEY" "https://vistoria.trng.capital/api/integration/v1/occurrences?cursor=$cursor")
  echo "$page" | jq -c '.occurrences[]' >> ocorrencias.jsonl
  cursor=$(echo "$page" | jq -r '.next_cursor // empty')
  [ -z "$cursor" ] && break
done

Importação por CSV

Pontos, rondas e tarefas podem ser importados pelo painel (Painel › Importar) ou pela API do aplicativo. Até 2000 linhas e 1024 KB por arquivo.

  • Tudo ou nada: todas as linhas são verificadas antes; se houver qualquer erro, nada é gravado e a lista de erros diz a linha, a coluna e o problema.
  • CSV em UTF-8, separado por vírgula ou ponto e vírgula, com cabeçalho. Os nomes das colunas aceitam português ou inglês, com ou sem acento; colunas desconhecidas são recusadas (para não perder dados por engano).
  • Datas: DD/MM/AAAA ou AAAA-MM-DD, no fuso da empresa. Horas: HH:MM.
  • Dias da semana: seg, ter, qua, qui, sex, sab, dom (ou mon…sun, ou 0 = segunda … 6 = domingo).
  • Listas dentro de uma célula (paradas, horários, dias) são separadas por |.
  • Locais, pontos e pessoas são procurados pelo nome (ou e-mail) só dentro da sua empresa e dos locais que você pode ver.

Pontos

ColunaTambém aceitaConteúdo
name obrigatória nome, ponto, area Nome do ponto (único no local).
kind obrigatória tipo nfc, qr ou gps.
identifier identificador, id_tag, tag, codigo, qr, code ID da etiqueta NFC ou conteúdo do QR Code. Vazio para GPS.
place local, predio, location Nome do local. Pode ficar vazio se a empresa tem um só local.
latitude lat Ex.: -23.561414 (obrigatória para GPS).
longitude lon, lng Ex.: -46.655881 (obrigatória para GPS).
radius_m raio, raio_m, radius Raio do ponto de GPS em metros (2 a 800; padrão 30).

Rondas

ColunaTambém aceitaConteúdo
name obrigatória nome, ronda, rota Nome da ronda (único no local).
place local, predio, location Nome do local.
stops obrigatória paradas, pontos, checkpoints Nomes dos pontos, na ordem, separados por | (os pontos já devem existir).
round_minutes minutos_ronda, duracao, minutes Tempo para completar a ronda (5 a 720; padrão 60).
times horarios, horas, schedule_times Horários de início, ex.: 22:00|02:00.
days dias, schedule_days Dias, ex.: seg|qua|sex. Vazio = todos os dias.
tolerance_minutes tolerancia, tolerance Tolerância em minutos (0 a 120; padrão 15).
active ativa, ativo, is_active sim ou não. Só uma ronda ativa por local.

Tarefas

ColunaTambém aceitaConteúdo
title obrigatória titulo, tarefa Título da tarefa.
description descricao, body, detalhes Descrição (opcional).
assignee obrigatória responsavel, email, assignee_email E-mail de uma pessoa da equipe.
start_date inicio, data_inicio, start Data de início (DD/MM/AAAA ou AAAA-MM-DD).
due_date prazo, data_prazo, due, data_limite Prazo. Igual ao início = tarefa para aquele dia.
due_time hora_prazo Hora do prazo (HH:MM; padrão 23:59).
repeat repetir, frequencia, frequency Vazio (uma vez), diaria, semanal, mensal ou anual.
every a_cada, intervalo, interval A cada quantos dias/semanas/meses/anos (padrão 1).
weekdays dias_semana Para semanal: seg|qui …
month_day dia_mes, dia_do_mes Para mensal e anual: dia do mês (1 a 31).
month mes Para anual: mês (1 a 12).
time hora, horario Para as repetidas: hora em que a tarefa é aberta (HH:MM).
place local, predio, location Local (opcional; ajuda a achar o ponto).
checkpoint ponto Nome de um ponto ligado à tarefa (opcional).

Exemplo: tarefas únicas e programadas

titulo;descricao;responsavel;inicio;prazo;hora_prazo;repetir;a_cada;dias_semana;dia_mes;mes;hora;local;ponto
Trocar lâmpada do hall;Bloco A;joao@exemplo.com.br;05/10/2026;05/10/2026;18:00;;;;;;;;
Revisar hidrantes;;joao@exemplo.com.br;;;;semanal;1;seg;;;07:00;;
Bomba d'água;Conferir pressão;joao@exemplo.com.br;;;;semanal;1;qui;;;22:00;Torre A;Casa de bombas
Dedetização;;maria@exemplo.com.br;;;;anual;1;;15;3;09:00;;

Importar pela API do aplicativo

Síndicos e supervisores podem enviar o mesmo CSV com o token de acesso do aplicativo. commit=0 só verifica; commit=1 importa quando não há erros (com erros, responde 422 e nada é gravado).

curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: text/csv" \
  --data-binary @pontos.csv "https://vistoria.trng.capital/api/v1/import/checkpoints?commit=0"

{"kind": "checkpoints", "rows": 2, "valid": false,
 "errors": [{"row": 2, "column": "identifier", "code": "duplicate_identifier",
             "message": "Já existe um ponto com este identificador."}]}

Erros

Erros vêm com um código estável (para o seu sistema tratar) e uma mensagem. 401: chave ou token inválido; 402: assinatura inativa; 403: plano sem API ou sem permissão; 429: limite de requisições.

{"detail": {"code": "plan_feature_unavailable", "message": "…"}}

Dúvidas: suporte@trng.capital.