---
name: editalmd
description: "EditalMD — cinco exemplos grátis; acesso individual US$ 0,02/página, inclusive pronto, com geração incluída. Prazos, alertas e vigias. Use para EditalMD e licitações do PNCP."
---

# EditalMD — skill para agentes

**Live:** https://editalmd.com  
**Local (lab real):** https://dev.editalmd.com  
**Descoberta:** `GET /api/` · `/llms.txt` · `/llms-full.txt` · `/openapi.json`  
**MCP:** `POST https://editalmd.com/mcp`

**Consumo:** `/developers` reúne exemplos. Comece por `/llms.txt` ou `/api/`, leia a família
necessária em `/llms-full.txt?prefix=/api/...` e use HTTP/MCP. A UI é para pessoas; não raspe a tela.

## Regime de cobrança (leia antes de chamar)

**Piloto documental:** registre e conserve `X-Agent-Pass` em
`POST https://api.editalmd.com/licitacoes/api/agente`; a mesma credencial dá 1.000
leituras do índice e acesso às cotas documentais em `GET /api/avaliacao`.
`POST /api/documento/:id/avaliacao/premium` concede um premium até 50 páginas;
guarde `evaluation.access_code` e use `X-Editalmd-Avaliacao` junto de `X-Agent-Pass`.
MCP: `avaliacao_cotas`, `avaliacao_premium`; leitura/estado recebem
`avaliacao_codigo` + `agent_pass`. Repetir recupera o mesmo documento.
`POST /api/documento/:id/avaliacao/basico` solicita texto básico de PDF até
50 páginas/32 MiB; `GET` recupera o resultado. MCP: `avaliacao_basico` e
`avaliacao_basico_resultado`. Até 100 documentos por agente, sem revisão nem
tabelas estruturadas, sem liberar premium. Respeite `retry_after_s`.
Prazo limitado pelo piloto, sem renovação; orçamento/capacidade podem suspender
novas entregas. Guia: `/avaliacao.md`. Concessão patrocinada não é compra.

Para triagem, as listas de `/licitacoes/` já trazem `itens[].dados` com até
20 compras (objeto, órgão, valor e datas). Evite abrir cada ficha só para obter
esses campos. Para exigências e evidências, use os exemplos e `documento_dossie`,
fixando versão e respeitando cobertura parcial. Guia de integração e compra:
`/api-access-guide.md`; cliente de capacidade: `/api-access-client.js`.

**Metadados em volume:** `api_access` / `GET /api/acesso` informa disponibilidade
de US$1 por 1.000 leituras dos índices `/licitacoes`, `/empresas` e `/enderecos`,
válidas por 30 dias, sem renovação automática. Gere e guarde `api_pass` antes de
`api_access_buy` / `POST /api/acesso`, via x402 ou crédito. Nas origens declaradas
dos índices, use `X-API-Pass`; `GET <prefixo>/api/uso` consulta saldo sem consumo.
O pacote não compra documentos, OCR ou IA. 402 do índice aponta o emissor; retries
conservam passe e prova. Conciliação de pagamento incerto usa `X-API-Transaction`
com a prova original, sem nova cobrança.

Consulte `GET /api/pricing` (tool `pricing`) para franquias e preços e `GET /api/billing`
(tool `billing`) para x402 e crédito. São leituras públicas. Para documentos, use
a cotação de `estado_geracao` antes de pagar: ela informa páginas e total do pedido.

| Situação                                                       | Custo                                                            |
| -------------------------------------------------------------- | ---------------------------------------------------------------- |
| Buscar, abrir ficha da compra, ver saúde                       | **grátis**                                                       |
| Markdown, original, arquivos, imagens e ZIP, inclusive prontos | **US$ 0,02 por página por comprador**, geração necessária incluída |
| Reabrir com autorização própria e consultar andamento | sem nova cobrança |
| Cinco exemplos prontos                                         | **grátis** — `/exemplos`, `/api/exemplos`, tool `exemplos`       |
| Habilitação sobre Markdown pronto                              | incluída no acesso comprado |
| Documento inexistente                                          | **não cobra** (404)                                              |
| Outro comprador do mesmo documento | paga pelo próprio acesso, mesmo quando pronto |

## Operações

| Tool                 | HTTP                                                                                                      |
| -------------------- | --------------------------------------------------------------------------------------------------------- |
| `api_index`          | `GET /api/`                                                                                               |
| `health`             | `GET /api/health` — tamanho do acervo                                                                     |
| `buscar_licitacao`   | `GET /api/busca?q=&uf=&abertas=1&limite=` — `abertas=1` só com prazo de proposta por vencer               |
| `precos_homologados` | `GET` ou `POST /api/precos?q=&uf=&meses=&catmat=&limite=` (parâmetros também em JSON no corpo; `query`/`termo` = `q`, `estado` = `uf`; todo 400 traz `exemplo` e `doc`) — o preço que ganha por item parecido: `resumo` (mediana, p25/p75, menor, maior, desconto sobre a referência, ME/EPP), `por_uf`, `por_mes`, `vencedores` e `compradores` (top 10) sobre todos os candidatos, mais até 100 resultados de amostra; `amostra` diz o critério e o período; grátis |
| `prazos` / `compra`  | `GET /api/compra/:id` — `prazos` (proposta e impugnação), documentos + regime de cada um                  |
| `edital_markdown`    | `GET /api/documento/:id/markdown` — `acesso_codigo` comprado ou exemplo; sem autorização: 402 |
| `estado_geracao`     | `GET /api/documento/:id/geracao` — estado e fases, sem iniciar trabalho                                   |
| `criar_cobranca`     | `POST /api/documento/:id/cobranca` — endereço/QR para depósito USDC/Base, mesma tarifa US$ 0,02/página    |
| `estado_cobranca`    | `GET /api/documento/:id/cobranca` — confirmação e recibo; intervalo de 30 s                               |
| `gerar_markdown`     | `POST /api/documento/:id/geracao` — compra acesso US$ 0,02/página, inclusive pronto; envie `cotacao` |
| `exemplos`           | `GET /api/exemplos` — cinco provas prontas com páginas, hash e links de leitura/download                  |
| `documento_leitura`  | `GET /api/documento/:id/leitura` — manifesto pronto com páginas, imagens e SHA-256                        |
| `documento_dossie` | `GET /api/documento/:id/dossie` — dados tipados, filtros kind, cursor after/next e limit até 30; mesma autorização |
| `documento_arquivos` | `GET /api/documento/:id/partes` — catálogo das peças, páginas e links de download                         |
| original HTTP        | `GET /api/documento/:id/original` — original do acervo do Licitação                                       |
| peça HTTP            | `GET /api/documento/:id/partes/:partId/arquivo` — arquivo pronto vinculado ao documento                   |
| download HTTP        | `GET /api/documento/:id/pacote?v=<text_sha256>` — ZIP MD+imagens da versão aberta                         |
| imagem HTTP          | `GET /api/documento/:id/imagens/:version/:imageSha` — PNG/JPEG do manifesto                               |
| `recibo`             | `GET /api/recibo/:id` — prova da entrega                                                                  |

## Prazos (grátis, em toda ficha e busca)

**Pagamento sem carteira no navegador.** Gere e guarde 32 bytes aleatórios como 64 hex minúsculos
antes de `criar_cobranca`; use como `cobranca_token` no MCP ou `X-Cobranca` no HTTP.
Envie a cotação recebida em `estado_geracao`. A resposta informa rede Base, contrato USDC,
endereço exclusivo, valor e URI para QR. Envie o valor líquido em até 30 min e acompanhe com
o mesmo token. O c3 confirma o depósito, libera seu acesso e solicita geração se necessária; a consulta não
inicia OCR. Em `gerando`, acompanhe fases por `estado_geracao`; em `revisao`, conserve o
ID e as transações para atendimento sem pagar novamente. No ambiente de desenvolvimento a rede
é a de teste e a transferência é real: o pagamento simulado do dev não vale para depósito.

Depois de x402/crédito fora da sessão da conta, ou da cobrança confirmada, guarde **`acesso.codigo`** privado.
Envie em `X-Editalmd-Acesso` nas leituras HTTP, inclusive OKF, ou `acesso_codigo` nas tools MCP.
Não publique esse código: ele concede acesso ao documento comprado. UUID e recibo público
não autorizam leitura. Browser conserva cookie HttpOnly equivalente por documento.
Outro documento exige outra compra; outro comprador paga mesmo se o texto já estiver pronto.

**Conta opcional e recuperação.** A conta é a conta MM: a pessoa entra em `/conta/global` ou na
modal do site (código ou link por e-mail, senha, Google ou passkey) e a sessão fica num cookie
HttpOnly deste domínio. Não há ativação por produto: a conta já é a pessoa no EditalMD. Escrita por
cookie exige a mesma origem e `X-CSRF-Token` de `/api/auth/bootstrap`; cookie de sessão vencida
responde 401 `session_ended` (entre de novo), nunca vira convidado. `POST /api/auth/logout` revoga
a sessão. Não há bearer de conta para pessoas: `POST /api/auth/start` e `/verify` respondem 410.
O que foi comprado é o **direito global** do pagamento (banco `credito`, dono = conta ou convidado),
com o sku de cada compra: `documento`, `alerta`, `vigia`. Pagou e a gravação falhou: 502
`pago_nao_registrado` com o `recibo` (guarde-o; o suporte entrega ou estorna).
Compra feita com a sessão da conta vira direito da conta, sem código avulso. A anônima, e a do
depósito, sai com o código privado e vira da conta por `POST /api/documento/:id/vincular` com
sessão e `X-Editalmd-Acesso` (o site faz isso sozinho para quem está conectado); o código continua
abrindo o documento. `GET /api/documento/:id/acesso` exporta o código enquanto a conta não tem o direito.
`GET /api/me/documentos` e `/api/me/compras` trazem até 200 itens privados de uma vez
(`proximo_antes` sempre null). Cada item traz `abrir_url`, `geracao_url` e `markdown_url`.
Com sessão e crédito, use `X-Credito: cred_…` — a conta viaja no cookie, nunca em bearer.
Na tool `gerar_markdown`, passe `credito_token` e `idempotencia` para esses headers.
Tools (só com o cookie e o CSRF da conta MM repassados pelo cliente MCP): `minha_conta`,
`meus_documentos`, `meus_compras`, `documento_vincular`, `documento_acesso`,
`conta_acompanhamento`, `conta_vincular_acompanhamento`. Nunca grave códigos/sessões em logs.
O cliente pode comprar sem e-mail; na UI, Entrar/Minha conta e Guardar compra completam
o vínculo, com exportação/importação de arquivo privado para recuperação.

Com sessão, Salvas, Alertas e Vigias são da conta. `POST /api/auth/claim` com
`{"guest_token": "edm_…"}` (cookie + CSRF; a página da conta faz isso sozinha ao entrar) traz para a
conta o que o convidado criou e comprou: uma lista de cada por conta — a lista que a conta já tem
fica com ela, e a do convidado que colide continua no token, que segue valendo sozinho.
E-mail sozinho nunca assume aquisições nem listas anteriores: é necessária a respectiva prova privada.

`POST /api/cobranca/:id/registrar` é callback privado da origem para o razão financeiro,
com `X-Editalmd-Secret`; não é uma operação disponível ao agente consumidor.

`prazos.proposta_ate` é o fim do recebimento de propostas, que no PNCP é a abertura da sessão.
`prazos.impugnacao_ate` é **estimado**: 3 dias úteis antes da sessão (Lei 14.133/2021, art. 164),
descontando fins de semana e feriados **nacionais** — feriado municipal não está em base nenhuma,
por isso `estimado: true` sempre. Amparo fora da 14.133 vem com `impugnacao_ate: null` e `motivo`.
`pncp_url` é a página humana da compra.

## Acompanhar: dono, alertas e vigias

**Empresas do dono:** convidado `edm_…` do SDK ou sessão da conta MM (cookie; escrita com CSRF). `GET /api/me/empresas/busca?q=` busca CNPJ
ou razão social (3–120 caracteres, até oito sugestões). `PUT /api/me/empresas/:cnpj` importa
o perfil cadastral, sem sócios/contatos, até 20 vínculos; repetir não consulta nem grava.
`GET /api/me/empresas` retorna a coleção e o CNPJ selecionado. `PUT
/api/me/empresas/:cnpj/selecionar` salva a seleção e `DELETE /api/me/empresas/:cnpj` remove só
o vínculo desse dono. O claim da biblioteca leva empresas, seleção e comprovantes à conta,
sem mudar o namespace dos PDFs no c3. Tools: `buscar_empresa`, `adicionar_empresa`, `minhas_empresas`,
`selecionar_empresa`, `remover_empresa`. Cadastro e seleção não comprovam representação legal
nem habilitação e não executam IA.

**Análise de participação:** documentos privados da empresa em `GET/POST
/api/me/empresas/:cnpj/documentos`; baixe/remova por `GET/DELETE /documentos/:arquivo`.
PDF até 8 MiB, 20 anexos e 50 páginas somadas por empresa. Tools: `documentos_empresa`,
`anexar_documento_empresa`, `remover_documento_empresa`; binário usa HTTP autenticado.
Somente por pedido explícito do usuário, `analisar_participacao` faz `POST
/api/me/empresas/:cnpj/analises/:id?v=HASH_DO_MARKDOWN` e inicia/retoma Luna no c3.
Consulte com `consultar_participacao` (GET da mesma rota): `grupo=pendencias|atendidos|nao_aplicavel`,
`kind`, `after` e `limit` até 30. Convidado ou sessão, vínculo da empresa e acesso ao edital obrigatórios.
202 significa processamento, não aprovação. Apenas `ready` com `atual=true` permite usar
os resultados; perfil, anexos, dossiê ou data diferentes invalidam a análise. Fontes da empresa
e do edital acompanham motivos e ações. Falta de documento é `precisa_comprovar`, divergência
precisa de prova e obrigação futura é `acompanhar`. Não conclua habilitação global a partir
do CNAE ou dos cards verdes. A base normativa desta versão é o edital, sem consulta jurídica
externa. Orçamento/TTL do core limitam execução; GET nunca inicia OCR ou análise.

Sem cadastro: `POST /api/dono` devolve um convidado `edm_…`, emitido pela biblioteca de conta,
**uma única vez** (só o hash fica guardado). Mande `Authorization: Bearer edm_…` em tudo que é
seu; com a sessão da conta, as listas são dela e não precisam de token. Recurso de outro dono é 404.

`GET /api/salvas` lista até 200 licitações; `PUT /api/salvas/:id` salva pelo ID do acervo,
`GET` consulta e `DELETE` remove. Tudo gratuito, sem criar aviso. Tools: `salvas`,
`salvar_compra`, `remover_salva`. No painel, exportar/importar o código permite retomar os
mesmos dados em outro navegador; a importação verifica `GET /api/dono` antes de trocar o acesso.

`POST /api/alertas/previa` (tool `previa_alerta`) não cria nada: com CNPJ devolve sugestões
editáveis, com termos devolve até 20 compras publicadas nos últimos 7 dias. `filtros` serve
na prévia, na criação por termos/CNPJ e em `PATCH /api/alertas/:id` (tool `editar_alerta`):
`modalidades` (IDs PNCP), `municipios` (nomes exatos ou IBGE), `excluir` (expressões literais),
`valor_min`, `valor_max`, `abertas`. Listas têm teto 10. PATCH substitui o objeto de filtros;
`{}` limpa. Preserve o destino mascarado omitindo-o se não mudou; nunca envie a máscara.
O histórico `/api/alertas/:id/compras` pagina por `antes_compra=proximo_antes` até retornar nulo.

| Tool                                  | HTTP                                                                                                                                                                         | Custo                                                                                                                              |
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `criar_dono`                          | `POST /api/dono`                                                                                                                                                             | grátis; teto por rede e hora; devolve também o `webhook_segredo` (`whsec_…`)                                                       |
| `dono` / `rotacionar_segredo_webhook` | `GET /api/dono` · `POST /api/dono/segredo`                                                                                                                                   | grátis — relê o segredo; a rotação mantém o anterior por 24 h                                                                      |
| `criar_alerta`                        | `POST /api/alertas` `{termos, uf?, canal, destino?}` — espaço = todas as palavras, `\|` = qualquer uma (`uniforme\|fardamento escolar`)                                      | 1º ativo grátis; extra **US$ 0,10 / 30 dias** (x402 ou crédito)                                                                    |
| `alerta_por_cnpj`                     | `POST /api/alertas` `{cnpj, max_familias?, uf?, canal, destino?}` — cada CNAE da empresa vira uma família de termos, um alerta por família, principal primeiro               | mesma franquia; o que passar é cobrado **numa vez só** (N × US$ 0,10)                                                              |
| `cnaes`                               | `GET /api/cnaes?q=&limite=` — o dicionário CNAE → termos, a descrição oficial (IBGE) e os fornecedores ativos no SICAF; sem `q`, o ranking de quem mais vende para o governo | grátis                                                                                                                             |
| `alertas_compras`                     | `GET /api/alertas/:id/compras`                                                                                                                                               | grátis — é o canal **pull**                                                                                                        |
| —                                     | `GET/PATCH/DELETE /api/alertas/:id`, `GET /api/alertas`                                                                                                                      | grátis                                                                                                                             |
| `vigiar_compra`                       | `POST /api/vigias` `{compra_id, canal?, destino?}`                                                                                                                           | 1ª ativa grátis; extra **US$ 0,05** até 30 dias após o encerramento                                                                |
| `vigia_eventos`                       | `GET /api/vigias/:id/eventos`                                                                                                                                                | grátis — eventos `situacao`, `prazo_adiado`, `valor`, `documento_novo`, `documento_removido`, `prazo_impugnacao`, `prazo_proposta` |

Canais: `pull` (você lê `/compras`), `webhook` (POST JSON **assinado** na sua URL https pública,
porta 443, sem credencial na URL — Standard Webhooks: `webhook-id`, `webhook-timestamp`, `webhook-signature: v1,<base64>` = HMAC-SHA256
de `id.timestamp.corpo` com a chave do `whsec_…`; rejeite timestamp fora de 5 min; corpo com
`alerta_url` para conferir por pull) e `email` (só com a sessão da conta: vai para o e-mail
verificado dela, lido na conta a cada envio, com "como parar" no rodapé; convidado recebe 403;
responde 503 enquanto o remetente estiver desligado; recusa definitiva do provedor fica
`email:recusado` e não repete). O cron confere a cada 30 minutos, com páginas
confirmadas no c3. Depois da janela inicial, acompanha IDs ingeridos sem limitar pela data
antiga de publicação. Falha mantém a página pendente. Entregas malsucedidas são tentadas
novamente, até 10 falhas seguidas pausarem o alerta; o destinatário deduplica pelo webhook-id.

**Alerta pelo CNPJ.** Mande `cnpj` (14 dígitos, com ou sem pontuação) em vez de `termos`: a ficha vem
do Radar CNPJ, pela origem no c3 (cache de 30 dias), cada CNAE que está no dicionário vira uma família de
termos e sai um alerta por família distinta, principal primeiro, até `max_familias` (1 a 8). A
resposta traz `alertas[]` (cada um com `origem`: cnpj, família, CNAE e descrição), `empresa` (razão
social e cada CNAE com `familia`/`termos`, nulos quando ainda não mapeado), `nao_criados[]` e
`pagamento`. Erros: 400 `cnpj_invalido`, 404 `cnpj_nao_encontrado`, 422 `cnpj_sem_familia` (a
resposta lista os CNAEs; crie por termos), 503 `cnpj_indisponivel` (`retry_after`). O dicionário
começa pelos CNAEs com mais fornecedores no SICAF; a lista oficial (IBGE) e a contagem de
fornecedores (dados abertos do compras.gov.br) são re-medidas pelo cron diário — `GET /api/cnaes`
mostra o estado, e `GET /api/health` traz `cnaes` com as datas.

A vigia fotografa a compra ao nascer e reconfere a cada hora; compra que o acervo não revisita há
mais de 3 dias é conferida **direto no PNCP**. Termo aditivo de contrato não é coberto: o acervo
não ingere contratos.

## Habilitação extraída do edital

`POST /api/documento/:id/habilitacao` (tool `habilitacao`) devolve a lista de habilitação por
família (jurídica, fiscal/social/trabalhista, econômico-financeira, técnica), cada item com o
**trecho literal** do edital de onde saiu; trecho que não existe no texto é descartado e contado.
Conserva condições, exceções e todas as evidências com páginas. Os campos históricos
`exclusivo_me_epp`, `impugnacao_texto` e `proposta_texto` ficam nulos: essas informações
condicionais pertencem aos fatos tipados do dossiê, sem simplificação em um booleano global.
**Incluído no acesso comprado**; exige dossiê pronto e não inicia OCR ou outra IA.
É o lado do edital: o que a empresa tem não entra.

`GET /api/documento/:id/dossie` inclui identificação, itens/especificações, exigências, atestados,
prazos e obrigações com condições/exceções/evidências. Use `kind`, `limit` (até 30), `after=next`
até `next=null`; `v` fixa o hash do texto. `format=json` sem filtro/paginação baixa a versão
completa pronta, até 16 MiB. Estado parcial informa cobertura e não oferece exportação concluída.

## O que vem no markdown

Front-matter com `pncp`, `orgao`, `unidade`, `uf`, `modalidade`, `situacao`, `valor_estimado`,
`publicado_em`, `paginas`, `extracao_motor` e `extracao_sha256`, seguido do texto extraído. É o que
permite **citar com procedência**: o hash identifica exatamente o texto que você leu.

O leitor amplo oferece paginação, sumário, busca, tabelas, notas, fórmulas, imagens ampliáveis,
fontes/largura, tela cheia e download. O ZIP traz `documento.md` e `imagens/` relativas para abrir
fora do site, além de `fonte.md` literal e manifesto. Recursos ainda ausentes são 404; GET de
manifesto/imagem/ZIP não dispara OCR. `document_approved: false` identifica a extração automática,
sem exigir revisão do usuário do EditalMD. A aprovação de fidelidade pertence ao Licitech.

Busca e ficha `/licitacoes/compra/:id/` oferecem Leitura, Markdown paginado, Original e
Arquivos. A aba Original exibe PDFs e permite escolher as peças. Os downloads e a cópia
ficam visíveis. O EditalMD é somente a casca: originais, peças, texto e pacote vêm da
API do Licitação, sem busca direta do PDF no PNCP ou desempacotamento no consumidor.

## Pagamento (x402)

O POST compra **acesso individual por US$ 0,02 por página**, inclusive quando o texto já está pronto,
com x402 ou crédito pré-pago. Geração necessária está incluída. Sem pagamento responde 402.
Use `GET /geracao` para cotação, `acesso_comprado` e fases; quando pronto, leia `GET /markdown`
com sua autorização privada. Não repita POST como polling.
Não há geração gratuita por captcha. O GET/402 traz `cotacao`: `paginas`, `source_sha256`,
`preco_pagina_usd` e `preco_total_usd`. Confira e envie esse objeto no corpo do POST junto do
pagamento. Mudança ou falta da cotação retorna 409 antes de cobrar. Sem contagem confirmada,
não há venda. Ex.: 152 páginas × US$ 0,02 = US$ 3,04.
Guarde `pagamento.recibo` e `payment-response` quando presentes. A leitura traz
`x-editalmd-sha256` e não grava recibo. A data de publicação não muda este contrato.

## Fonte

Compras e documentos do PNCP (dado público), com texto já extraído e normalizado. O acervo é
lido de uma origem no c3; este app é proxy. O Licitech mantém o único stack de extração:
Mistral OCR seguido de revisão Luna por página e montagem do pacote no c3.
Texto em preparação é 202 com `Retry-After`; recusa de extração
é 409 com causa; falha de transporte é 502. 202 não é documento vazio nem entrega concluída.

## Acervos públicos de dados

`GET /api/` → `docs.data_indexes` descobre os acervos de leitura: endereços CNEFE
e metadados PNCP. As mesmas raízes
estão em `/llms.txt`, `/llms-full.txt`, `/okf/index.md` e `/developers#dados`. Abra o
`formats.json` adequado e siga a hierarquia e `links.proximo` (até 20 itens por página).
Atualização manual: confira fonte e referência. Respeite `Retry-After` em 429/503. Não
encaminhe credenciais do produto a esses hosts. Leia somente o recorte necessário à tarefa.

<!-- GERADO por scripts/monta-ui.mjs — fonte: .agents/skills/<produto>/SKILL.md. Não edite. npm run ui -->
