1. Visão geral
A ORQTA entrega a inteligência sobre o mercado público de três formas:
| Forma | Para quem | Como funciona |
|---|---|---|
| Webhooks | Quem quer os alertas no CRM, numa planilha ou no chat da equipe | A ORQTA envia um POST para a sua URL quando surge um alerta |
| API REST | Quem constrói software ou integra sistemas | Você consulta órgãos, empresas, contratos, licitações, sinais e eventos |
| MCP | Agentes de IA (Claude, ChatGPT e outros clientes MCP) | Sete ferramentas prontas para o agente consultar a ORQTA |
Os scores são índices comparativos explicáveis, nunca probabilidade de compra. Toda resposta traz a fonte e a data.
2. Conectar ao CRM sem programar (webhooks)
Esse é o caminho mais rápido para receber alertas no Pipedrive, RD Station CRM, HubSpot, Google Sheets, Slack e outros.
Pré-requisitos: plano Business (3 webhooks) ou Agency (5); papel de dono da organização; conta numa plataforma de automação: Zapier, Make, n8n ou Pluga.
Passo a passo:
- Na plataforma de automação, crie um gatilho do tipo webhook e copie a URL que ela gerar. Zapier: "Webhooks by Zapier → Catch Hook"; Make: "Webhooks → Custom webhook"; n8n: nó "Webhook"; Pluga: "Pluga Webhooks".
- No console da ORQTA, abra Integrações → Novo webhook: cole a URL; escolha os alertas (nenhum marcado = todos); clique em Criar webhook.
- Guarde o segredo que aparece. Ele é exibido uma única vez e serve para conferir a assinatura (seção 5.4). No Zapier, Make e Pluga essa conferência é opcional.
- Clique em Enviar teste. A entrega sai no próximo ciclo, em até 5 minutos, com o alerta mais recente dos tipos que você escolheu, marcado com
"test": true. - Na plataforma de automação, carregue o teste e crie a ação no destino usando os campos do bloco resumo (seção 5.2).
- Ligue a automação.
3. API REST: primeiros passos
Endereço base:
https://api.orqta.com.br/functions/v1/api-v1Chave de API: gere no console, em Chaves de API. O segredo aparece uma única vez; guardamos só o prefixo e um resumo criptográfico; nunca enviamos nem pedimos chaves por e-mail, mensagem ou telefone.
Autenticação — envie a chave em todo pedido:
Authorization: Bearer gi_<prefixo>.<segredo>Primeira chamada (a rota de saúde não pede chave):
curl https://api.orqta.com.br/functions/v1/api-v1/v1/healthPerfil de um órgão, pelo código IBGE ou pelo id da ORQTA:
curl -H "Authorization: Bearer $ORQTA_API_KEY" \
https://api.orqta.com.br/functions/v1/api-v1/v1/governments/2611606Especificação OpenAPI 3.1: GET /v1/openapi.json, sem chave.
4. Referência da API
4.1 Rotas
| Método e rota | O que devolve | Escopo |
|---|---|---|
GET /v1/health | Estado do serviço | não pede chave |
GET /v1/openapi.json | Especificação OpenAPI | não pede chave |
GET /v1/governments/{id} | Perfil do órgão, com os scores e as notas dos scores. {id} = código IBGE ou id ORQTA. ?consolidado=false traz só o órgão, sem a conta consolidada | read:governments |
GET /v1/governments/{id}/contracts | Contratos do órgão | read:contracts |
GET /v1/governments/{id}/procurements | Licitações do órgão | read:procurements |
GET /v1/governments/{id}/signals | Sinais ativos do órgão | read:signals |
GET /v1/companies/{cnpj}/government | Relação da empresa com o setor público, incluindo sanções com efeito e abrangência | read:companies |
GET /v1/companies/{cnpj}/awards | Contratos ganhos pela empresa, do mais recente ao mais antigo | read:companies |
GET /v1/me | Organização, plano e limite de webhooks da chave (útil para testar a chave) | read:events |
GET /v1/events | Eventos (alertas) da sua organização, no mesmo formato da entrega de webhook (type, schema_version e resumo) | read:events |
POST /v1/opportunities/search | Contas priorizadas para o seu perfil de produto | read:signals |
POST /v1/watchlists | Cria uma lista de monitoramento | write:watchlists |
GET /v1/coverage | Cobertura medida por fonte. Leia antes de tratar qualquer contagem como universo | read:governments |
GET /v1/webhooks | Lista os webhooks da organização (sem o segredo) | read:events |
POST /v1/webhooks | Registra um webhook e devolve o segredo de assinatura. Exige plano com webhooks (Business, Agency, API Developer ou Scale), dentro do limite do plano | read:events |
DELETE /v1/webhooks/{id} | Remove um webhook | read:events |
4.2 Parâmetros
Listas (todas as rotas que devolvem lista): limit (padrão 50, máximo 200); offset (padrão 0).
GET /v1/events: since (data ISO 8601; só eventos a partir dela); event_types (lista separada por vírgula, ex.: NEW_PROCUREMENT,CONTRACT_EXPIRING); unread_only=true (só os não lidos).
POST /v1/opportunities/search (corpo JSON, todos os campos opcionais):
{ "product_profile_id": "<uuid>", "sphere": "municipal", "ufs": ["PE", "PB"], "limit": 50 }Sem product_profile_id, a busca usa o perfil padrão da organização.
POST /v1/watchlists:
{ "name": "Prefeituras PE" }POST /v1/webhooks:
{ "url": "https://...", "event_types": ["NEW_PROCUREMENT"], "description": "Pipedrive via Zapier" }event_types também aceita texto separado por vírgula; sem event_types = todos os alertas.
CNPJ: 14 dígitos. Pontos e barras são ignorados.
4.3 Formato das respostas
Rotas de lista:
{
"data": [ ... ],
"pagination": { "limit": 50, "offset": 0, "returned": 50, "has_more": true },
"meta": { "source": "...", "coverage_note": "...", "generated_at": "..." }
}Rotas de item único: { "data": { ... }, "meta": { "generated_at": "..." } }.
Erros:
{ "error": { "code": "not_found", "message": "orgao nao encontrado" } }Códigos: unauthorized (401); rate_limited (429, com Retry-After); invalid_cnpj, invalid_since, invalid_body e invalid_webhook (400); not_found (404); internal_error (500).
4.4 Limites e cabeçalhos
Toda resposta autenticada traz:
| Cabeçalho | Significado |
|---|---|
X-GI-Plan | Plano da chave |
X-GI-RateLimit-Limit / X-GI-RateLimit-Remaining | Pedidos por minuto e quanto ainda resta no minuto |
X-GI-Quota-Limit / X-GI-Quota-Used | Cota do mês e quanto já foi usado |
| Plano | Pedidos/min | Cota mensal | Chaves | Webhooks | Escopos |
|---|---|---|---|---|---|
| API — Avaliação (7 dias) | 30 | 5.000 | 1 | — | leitura |
| API inclusa (plano Business) | 30 | 15.000 | 1 | — | leitura |
| API Developer | 60 | 100.000 | 3 | 3 | leitura + write:watchlists |
| Scale | 600 | 2.000.000 | 10 | 20 | leitura + read:scores e write:watchlists |
Webhooks pela API: o direito e o limite vêm do plano da organização (console ou API); a chave só precisa ser válida.
Os planos e valores ainda estão em validação comercial.
Ao passar do limite por minuto, a resposta é 429 com Retry-After. Ao atingir a cota do mês, os pedidos são recusados até o ciclo seguinte, sem cobrança de excedente na API inclusa.
Escopos de leitura: read:governments, read:companies, read:contracts, read:procurements, read:signals, read:events.
5. Webhooks: referência
5.1 Quando a ORQTA envia
Um alerta vira entrega quando é da sua organização e o tipo está entre os escolhidos no webhook. Os alertas da organização saem do perfil de produto, das categorias e das listas de monitoramento.
Frequência: a fila é montada e enviada a cada 5 minutos. A entrega chega alguns minutos depois de o alerta surgir.
5.2 Corpo da entrega (schema_version: 2)
O método é POST e o corpo é Content-Type: application/json. Exemplo real (entrega de teste de 25/09/2026):
{
"schema_version": 2,
"id": 3663670,
"type": "SUPPLIER_AWARD",
"test": true,
"occurred_at": "2026-09-24T18:17:45.060302-03:00",
"resumo": {
"tipo": "Contrato assinado",
"titulo": "Contratacao de empresa especializada para prestacao de servicos de cessao de uso de softwares para Gestao Publica, ...",
"orgao": "SERVICO AUTONOMO DE AGUA E ESGOTO",
"uf": "ES",
"municipio": "Vargem Alta",
"valor": 242100.00,
"data_limite": "2027-09-14",
"fornecedor": "E & L PRODUÇÕES DE SOFTWARE LTDA",
"fornecedor_cnpj": "39781752000172",
"categoria": "ERP / gestão pública, Software (geral)",
"pncp_id": "31724255000120-2-000027/2026",
"link": "https://app.orqta.com.br/governments/b84c9c50-...",
"fonte": "pncp"
},
"subject": { "kind": "contract", "id": "38505946-..." },
"government_id": "b84c9c50-...",
"company_id": "a260dbc1-...",
"category_codes": ["ti.software.erp_publico", "ti.software.geral"],
"match_reason": ["CATEGORY_MATCH", "MIN_STRENGTH_MET"],
"payload": { "...": "dados originais do evento, variam por tipo" },
"organization_id": "..."
}Campos do resumo, feitos para mapear direto no CRM. Um campo sem valor para aquele tipo de alerta não vem no corpo.
| Campo | O que traz |
|---|---|
tipo | Tipo do alerta, em português |
titulo | Título do alerta (objeto da licitação ou do contrato) |
orgao | Órgão |
uf / municipio | Localização do órgão |
valor | Valor (estimado, global ou do item, conforme o tipo) |
data_limite | Prazo relevante: abertura das propostas, fim da vigência etc. |
fornecedor / fornecedor_cnpj | Fornecedor atual ou vencedor, quando houver. Só pessoa jurídica |
categoria | Categorias da ORQTA |
pncp_id | Número de controle no PNCP |
link | Página do órgão na ORQTA |
fonte | Fonte oficial do dado |
Tipos de alerta (type):
| type | No console |
|---|---|
NEW_PROCUREMENT | Licitação aberta |
CONTRACT_EXPIRING | Contrato vencendo |
SUPPLIER_AWARD | Contrato assinado |
PCA_MATCH | Está no plano de compras |
SCORE_CHANGE | Prioridade mudou |
TRANSFER_SIGNAL | Emenda parlamentar recebida |
SANCTION_ADDED | Sanção que restringe contratar |
FISCAL_CHANGE | Mudança fiscal (em implantação) |
PROJECT_SIGNAL | Obra pública cadastrada ou paralisada (em implantação) |
5.3 Cabeçalhos
| Cabeçalho | Valor |
|---|---|
User-Agent | GovernmentIntelligence-Webhook/1 |
X-GI-Timestamp | Momento do envio, em segundos Unix |
X-GI-Signature | sha256=<hex>: HMAC-SHA256 de timestamp + "." + corpo, com o segredo do webhook |
5.4 Como conferir a assinatura
Calcule o HMAC sobre o corpo bruto, exatamente como chegou. Não refaça o JSON: a ordem das chaves e os espaços contam. Recuse também timestamps muito antigos, por exemplo com mais de 5 minutos, para evitar reenvio malicioso.
Node.js:
import crypto from "node:crypto";
function assinaturaValida(rawBody, headers, segredo) {
const ts = headers["x-gi-timestamp"];
const recebida = (headers["x-gi-signature"] || "").replace(/^sha256=/, "");
if (!ts || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const esperada = crypto.createHmac("sha256", segredo).update(`${ts}.${rawBody}`).digest("hex");
return recebida.length === esperada.length &&
crypto.timingSafeEqual(Buffer.from(recebida), Buffer.from(esperada));
}Python:
import hmac, hashlib, time
def assinatura_valida(raw_body: bytes, headers, segredo: str) -> bool:
ts = headers.get("X-GI-Timestamp", "")
recebida = headers.get("X-GI-Signature", "").removeprefix("sha256=")
if not ts or abs(time.time() - int(ts)) > 300:
return False
esperada = hmac.new(segredo.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(recebida, esperada)5.5 Entrega, novas tentativas e desligamento
- Sucesso: resposta HTTP 2xx em até 8 segundos. Responda rápido e processe depois.
- Falha: a ORQTA tenta de novo com espera crescente de 1, 2, 4, 8, 16 e 32 minutos, até 6 tentativas. Depois disso, a entrega fica como "Falhou".
- Desligamento automático: um webhook com 20 entregas sem sucesso em 7 dias é desligado, com o motivo exibido no console. Corrija o destino e clique em Ligar.
- Duplicidade: use o id do alerta para ignorar repetições. Uma nova tentativa reenvia o mesmo id, e o teste também usa o id de um alerta real, com
"test": true. - Destino: somente https://. Endereços locais e IPs privados são recusados.
- Histórico: as últimas entregas de cada webhook, com código HTTP e erro, aparecem no console.
6. Guias passo a passo
"Testado pela ORQTA" quer dizer que fizemos o caminho completo, com alerta real, em 25/09/2026.
Caminhos testados pela ORQTA: Zapier → Pipedrive, Zapier → Google Sheets, Pluga → RD Station CRM, n8n (recebimento do webhook) e, via Make, HubSpot, Salesforce, Zoho CRM, Trello, Notion, ClickUp e Airtable.
6.1 Zapier → PipedriveTestado pela ORQTA
- Zapier → Create Zap → gatilho Webhooks by Zapier → Catch Hook → copie a URL.
- ORQTA → Integrações → Novo webhook com a URL → Enviar teste.
- Em até 5 minutos, no Zapier, clique em Test trigger e escolha a entrega recebida.
- Adicione a ação Pipedrive → Create Deal e conecte a sua conta.
- Mapeie os campos: Title — monte com o botão +:
resumo.orgao + " (" + resumo.municipio + " - " + resumo.uf + ")"; Deal Value:resumo.valor; Currency: Brazilian Real; Expected Close Date:resumo.data_limite. - Clique em Test step. O negócio aparece na primeira etapa do funil.
- Publish para ligar.
Dicas: no Zapier, digitar "/" num campo para inserir dado substitui o que já está escrito — para juntar vários campos num só, use o botão +. Opcional: acrescente Pipedrive → Create Note com resumo.titulo, resumo.categoria, resumo.fornecedor e resumo.link; use Find or Create Organization com resumo.orgao para ligar o negócio à organização.
6.2 Zapier → Google SheetsTestado pela ORQTA
- Crie uma planilha com uma coluna para cada campo do resumo, mais evento_id e teste.
- No mesmo Zap, ou num novo, adicione Google Sheets → Create Spreadsheet Row e conecte a sua conta Google.
- Escolha a planilha e a aba e mapeie cada coluna para o campo
resumo.*correspondente; evento_id =id; teste =test. - Test step → a linha aparece na planilha.
6.3 MakeTestado pela ORQTA
- Cenário novo → módulo Webhooks → Custom webhook → Add → copie o endereço.
- Cadastre o endereço na ORQTA e clique em Enviar teste. O Make aprende a estrutura com a primeira entrega.
- Adicione o módulo do destino (Pipedrive, RD Station CRM, Google Sheets…) e mapeie os campos do resumo.
6.4 n8nTestado pela ORQTA
- Nó Webhook, método POST → copie a Production URL.
- Cadastre a URL na ORQTA.
- Para conferir a assinatura, ative Raw Body no nó e aplique a função da seção 5.4 num nó Code.
- Ligue o nó do destino (CRM, planilha, chat).
6.5 Pluga → RD Station CRMTestado pela ORQTA
Pré-requisito: a conta RD precisa ter o RD Station CRM ativado. É um produto separado do RD Station Marketing e tem plano gratuito.
- Na Pluga, gatilho Webhooks → Notificação recebida; copie a URL.
- Na ORQTA, Integrações → Novo webhook com essa URL → Enviar teste.
- Ação RD Station CRM → Criar ou atualizar negociação; na janela do RD, escolha RD Station CRM e autorize.
- Título =
resumo.orgao-resumo.tipo; empresa =resumo.orgao(o RD passa a exigir o responsável pela empresa); anotação =resumo.titulo| Valor R$resumo.valor|resumo.link.
Na Pluga, o valor da negociação só entra pelo bloco de produto, por isso o guia coloca o valor na anotação.
7. MCP: agentes de IA
Endereço:
https://api.orqta.com.br/functions/v1/mcpProtocolo: Streamable HTTP, versão 2025-06-18. Autenticação: Authorization: Bearer <sua chave de API>, com os mesmos limites e escopos da API.
| Ferramenta | Escopo |
|---|---|
search_government_accounts | read:governments |
get_government_profile | read:governments |
search_opportunities | read:signals |
get_company_government_profile | read:companies |
explain_score | read:signals |
create_watch | write:watchlists |
get_recent_events | read:events |
8. Dados, cobertura e LGPD
- Os dados vêm de fontes públicas oficiais: PNCP, Portal da Transparência, SICONFI/Tesouro, Transferegov, IBGE e Obrasgov.
- Uma contagem sem a cobertura ao lado não é universo. Consulte
/v1/coverage. - Não enviamos CPF, nem nome de pessoa física como fornecedor.
- O uso dos dados segue os Termos de Uso. Redistribuir ou revender a base não é permitido.
