← Projetos

Tutorial

API Docs: documentar APIs REST do zero

O que é uma API, como funciona uma requisição HTTP e o que é OpenAPI, aprendidos na prática com um editor de documentação que cabe em um único arquivo HTML.

O que é o API Docs

O API Docs é um editor e visualizador de documentação de APIs REST em um único arquivo HTML. [1] Ele mostra os endpoints de uma API, permite testá-los no navegador e exporta a documentação para OpenAPI, Postman, testes em Python, InterSystems IRIS, Markdown e PDF. Os dados ficam guardados dentro do próprio arquivo: para compartilhar a documentação, basta enviar o HTML.

Abrir o API Docs

Tela inicial do API Docs com o exemplo API Busca CEP dos Correios: a barra superior com Visualizar, Editar, Salvar, Exportar, Importar e Novo, a lista de endpoints à esquerda e a visão geral com servidor e autenticação
O API Docs aberto no modo Visualizar, com o exemplo que acompanha o arquivo.

Este tutorial tem duas metades. A primeira explica a teoria que está por trás de cada campo da tela: o que é uma API, como é uma requisição HTTP, o que significam os códigos de status, como funciona a autenticação e por que existe o padrão OpenAPI. A segunda é um roteiro prático: você vai documentar e testar uma API pública de verdade, o ViaCEP, e exportar o resultado. No fim, prompts de IA prontos para copiar aceleram cada etapa.

O que você precisa

  • Um navegador atual. Chrome e Edge gravam direto no arquivo; nos outros, salvar baixa uma cópia.
  • Conexão com a internet só para testar requisições e para importar por URL. Ver, editar, importar arquivo e exportar funcionam sem rede.
  • Nenhum conhecimento prévio de programação. Quem já programa vai aproveitar mais as seções de exportação.
↑ Voltar ao topo

O que é uma API

API quer dizer Application Programming Interface, ou interface de programação de aplicações. É um contrato entre dois programas: um deles, o servidor, oferece funções; o outro, o cliente, pede essas funções seguindo regras combinadas. Um aplicativo de entregas que preenche o endereço a partir do CEP não tem a base de CEPs do país: ele pergunta a uma API e recebe a resposta pronta.

O contrato diz o que pode ser pedido, como pedir e o que volta. Ele não diz como o servidor faz o trabalho por dentro. É isso que permite trocar o banco de dados ou a linguagem do servidor sem quebrar os clientes, desde que o contrato continue o mesmo. Documentar uma API é escrever esse contrato de forma que pessoas e programas consigam lê-lo.

REST

A maior parte das APIs da web segue, em maior ou menor grau, o estilo REST (Representational State Transfer), descrito por Roy Fielding em sua tese de doutorado de 2000. [2] Fielding define REST como um conjunto de restrições de arquitetura. As que mais aparecem no dia a dia são:

  • Cliente e servidor separados. Cada lado evolui sem depender do outro.
  • Sem estado (stateless). Cada requisição traz tudo o que o servidor precisa para atendê-la, inclusive a credencial. O servidor não “lembra” da conversa anterior.
  • Cache. A resposta diz se pode ser reaproveitada, o que poupa idas ao servidor.
  • Interface uniforme. Tudo é um recurso identificado por um endereço (o endereço de um CEP, a lista de pedidos de um cliente), e as operações sobre ele usam os mesmos poucos verbos do HTTP.

Na prática, “API REST” costuma significar uma API que usa HTTP, organiza os endereços por recursos e troca dados em JSON. O API Docs documenta exatamente esse tipo de API.

↑ Voltar ao topo

Anatomia de uma requisição

Cliente e servidor conversam por HTTP. Cada conversa é um par: o cliente manda uma requisição e o servidor devolve uma resposta. O significado de cada parte é definido pela RFC 9110, a norma atual da semântica do HTTP. [3]

O cliente envia uma requisição com método e caminho (GET /ws/01001000/json/), cabeçalhos como Host e Accept, e corpo vazio por ser GET. O servidor devolve uma resposta com código de status 200 OK, cabeçalho Content-Type application/json e o corpo em JSON com o endereço.
Uma consulta de CEP real, reduzida às partes que importam.

A URL: servidor, caminho e parâmetros

O endereço de um recurso é uma URL, cuja sintaxe é definida pela RFC 3986. [4] No API Docs, a URL é montada a partir de três campos que você preenche separadamente:

Duas URLs da API de exemplo. Na primeira, https é o esquema, api.correios.com.br é o servidor, /cep/v2/enderecos é o caminho e 01001001 é o parâmetro de caminho cep. Na segunda, o que vem depois do ponto de interrogação, uf=SP e size=50, são parâmetros de consulta separados por &.
O servidor é comum a todos os endpoints; o caminho e os parâmetros mudam em cada um.
Servidor (URL base)
O começo comum a todos os endereços, como https://api.correios.com.br. Uma API pode ter vários: produção, homologação, local.
Caminho
O recurso dentro do servidor, como /cep/v2/enderecos/{cep}. As chaves marcam um pedaço variável.
Parâmetro de caminho (path)
O valor que entra no lugar das chaves. Identifica qual recurso: 01001001. É sempre obrigatório.
Parâmetro de consulta (query)
Pares nome=valor depois do ?, separados por &. Filtram, ordenam ou paginam: ?uf=SP&size=50. Costumam ser opcionais.
Cabeçalho (header)
Informação sobre a requisição, fora da URL: formato aceito (Accept), credencial (Authorization), idioma.
Cookie
Valor que o navegador guarda e reenvia ao mesmo servidor. Raro em APIs consumidas por outros sistemas.

Esses quatro lugares são exatamente as opções da coluna Local dos parâmetros no app: path, query, header e cookie.

Os métodos

O método diz o que fazer com o recurso. A RFC 9110 classifica os métodos por duas propriedades que afetam a segurança e as novas tentativas: seguro é o método que, por definição, só lê; idempotente é aquele em que repetir a mesma requisição tem o mesmo efeito que fazê-la uma vez. [3]

MétodoUso típicoSeguroIdempotente
GETLer um recurso ou uma lista.SimSim
HEADComo o GET, mas só os cabeçalhos.SimSim
OPTIONSPerguntar o que o recurso aceita. O navegador usa no CORS.SimSim
POSTCriar um recurso ou disparar uma ação.NãoNão
PUTSubstituir o recurso inteiro.NãoSim
PATCHAlterar parte do recurso. Definido à parte, na RFC 5789. [18]NãoNão garantido
DELETERemover o recurso.NãoSim

Por que isso importa: se a rede cair no meio de um PUT, o cliente pode repetir sem medo; repetir um POST pode criar dois pedidos. É por isso que os testes exportados pelo app não executam métodos que alteram dados, a não ser que você autorize.

O corpo e o JSON

Requisições POST, PUT e PATCH levam dados no corpo. O cabeçalho Content-Type diz o formato; em APIs REST, quase sempre é application/json. JSON é um formato de texto com objetos entre chaves, listas entre colchetes, textos entre aspas, números e os valores true, false e null, definido pela RFC 8259. [5]

{
  "numero": "9912345678",
  "dr": 10
}

Uma requisição GET não deve levar corpo: a RFC 9110 diz que conteúdo em um GET não tem significado definido. [3] Por isso o app não mostra o campo de corpo para GET e HEAD.

Para fixar

  • URL = servidor + caminho + parâmetros de consulta.
  • Parâmetro de caminho identifica qual recurso; parâmetro de consulta filtra.
  • O método diz a ação. GET lê; POST cria; PUT substitui; DELETE remove.
↑ Voltar ao topo

Respostas e códigos de status

Toda resposta começa com um código de três dígitos. O primeiro dígito diz a família, e é isso que o app usa para colorir os selos das respostas. [3]

FamíliaSignificadoExemplos comuns
1xxInformativa: a resposta ainda vai continuar.Raros em APIs.
2xxSucesso.200 OK, 201 Created (recurso criado), 204 No Content (deu certo, sem corpo).
3xxRedirecionamento: o recurso está em outro lugar.301, 304 Not Modified (use o cache).
4xxErro do cliente: o pedido está errado.400 Bad Request, 401 Unauthorized (sem credencial válida), 403 Forbidden (credencial válida, sem permissão), 404 Not Found, 422 (dados inválidos).
5xxErro do servidor: o pedido parecia certo, mas o servidor falhou.500 Internal Server Error, 503 Service Unavailable.

A distinção entre 4xx e 5xx diz de quem é a culpa e, portanto, quem precisa agir. Uma boa documentação lista também as respostas de erro, com um exemplo do corpo, porque é nelas que o desenvolvedor do cliente mais precisa de ajuda.

↑ Voltar ao topo

Autenticação

A maioria das APIs precisa saber quem está pedindo. Como o REST é sem estado, a credencial vai em toda requisição, em geral no cabeçalho Authorization. O app oferece os quatro esquemas mais comuns em Editar → Autenticação:

Tipo no appComo vai na requisiçãoO que saber
NenhumaNada.APIs públicas, como o ViaCEP.
BasicAuthorization: Basic seguido de usuário:senha em Base64.Base64 é só codificação, não criptografia: qualquer um que veja a requisição lê a senha. Só use com HTTPS. [6]
Bearer TokenAuthorization: Bearer seguido do token.Quem tem o token tem o acesso, sem provar mais nada; por isso o token expira e deve ser guardado como uma senha. [7] O exemplo dos Correios gera o token em um endpoint próprio e o usa nos demais.
API KeyUma chave em um cabeçalho (como X-API-Key) ou na query string.Simples de usar. Na query, a chave fica gravada em históricos e logs de servidores; prefira o cabeçalho.

No app, a autenticação vale para todos os endpoints. Ao testar, os campos de credencial aparecem no painel Testar requisição. Eles ficam só na memória e não são gravados no arquivo ao salvar.

↑ Voltar ao topo

Documentar com OpenAPI

Uma documentação escrita em texto livre serve para pessoas, mas não para programas. A Especificação OpenAPI resolve isso: ela define uma descrição padronizada e independente de linguagem para APIs HTTP, que pessoas e computadores conseguem ler sem acesso ao código-fonte. [8] O documento OpenAPI é um objeto JSON, que pode ser escrito em JSON ou em YAML. [8]

Um pouco de história

O formato nasceu como Swagger, na empresa Wordnik. A Wikipédia situa a criação em 2010; o histórico de revisões da própria especificação registra a versão 1.0 em 10/08/2011 e o Swagger 2.0 em 08/09/2014. [10] [8] Em 2015, a especificação foi doada à OpenAPI Initiative, sob a Linux Foundation, e passou a se chamar OpenAPI. A data da doação diverge entre as fontes: a Wikipédia cita o anúncio da iniciativa em novembro de 2015, e o histórico da especificação registra a doação em 31/12/2015. A versão 3.0.0 saiu em 26/07/2017, e a 3.0.3, que é a que o app exporta, em 20/02/2020. [8] Já existem versões mais novas: a 3.2.0 foi publicada em setembro de 2025. [9] O nome Swagger continua vivo nas ferramentas da SmartBear, como o Swagger UI, e por isso as pessoas ainda dizem “o Swagger da API”.

Por que um padrão ajuda

  • Uma fonte, vários usos. Do mesmo arquivo saem a página de documentação, coleções para ferramentas de teste, clientes gerados em várias linguagens e esqueletos de servidor.
  • Contrato antes do código. No estilo design-first, a equipe escreve e discute a especificação antes de programar, e cliente e servidor podem ser desenvolvidos em paralelo. No estilo code-first, a especificação é gerada a partir do código já pronto. O API Docs atende o primeiro estilo e também importa o resultado do segundo.
  • Verificável. Um documento OpenAPI pode ser validado por programa, e testes podem conferir se a API real cumpre o que está escrito.

Onde cada campo do app vai parar

Cada campo do app corresponde a uma parte do documento OpenAPI exportado. Conhecer essa relação ajuda a ler qualquer arquivo OpenAPI que você encontrar.

No appNo OpenAPI 3.0.3
Título, Versão, Descriçãoinfo.title, info.version, info.description
Servidoresservers[]
Tagstags[] e tags de cada operação
Método + Caminhopaths["/caminho"].get (ou post, put…)
Resumo, Descrição, Obsoletosummary, description, deprecated
Parâmetrosparameters[], com in, required, schema.type e example
Corpo da requisiçãorequestBody.content["tipo"].example
Respostasresponses["código"], com o exemplo em application/json
Autenticaçãocomponents.securitySchemes e security
Schemascomponents.schemas

Os schemas descrevem a forma de um objeto: quais campos tem e de que tipo. O OpenAPI 3.0 usa para isso um subconjunto estendido do JSON Schema. [8]

↑ Voltar ao topo

Primeiros passos com o exemplo

O arquivo vem com uma documentação de exemplo, “API Busca CEP — Correios”. Ela serve para ver como uma API completa aparece no app: autenticação por token, um endpoint de geração de token, consulta, pesquisa paginada e um schema. A própria descrição do exemplo avisa que caminhos e campos devem ser conferidos no portal oficial dos Correios antes de qualquer uso real. [1] Em cinco minutos:

  1. Abra o API Docs. Ele começa no modo Visualizar, com a visão geral: título, versão, descrição, servidor e o tipo de autenticação.
  2. Na barra lateral, clique em GET /cep/v2/enderecos/{cep}. O cartão do endpoint se abre com a descrição, a tabela de parâmetros e as respostas. O asterisco vermelho ao lado de cep marca um parâmetro obrigatório.
  3. Repare nas cores: GET azul, POST verde; respostas 2xx em verde, 4xx em laranja e 5xx em vermelho.
  4. No campo Filtrar endpoints…, digite token. Sobra só o endpoint de autenticação. Apague o filtro.
  5. No fim da barra lateral, clique em Endereco, em Schemas. A definição do objeto aparece em JSON.
Cartão do endpoint GET /cep/v2/enderecos/{cep} aberto, com a tabela de parâmetros mostrando cep, local path, tipo string e exemplo 01001001, e a tabela de respostas com 200 e o exemplo em JSON, 401 e 404
Um endpoint aberto: parâmetros em cima, respostas com exemplos embaixo e, ao final, o painel Testar requisição.

No fim de cada cartão aberto fica o painel Testar requisição. Não o use com o exemplo dos Correios: a API exige contrato e token. O teste de verdade fica para a próxima seção, com uma API aberta.

↑ Voltar ao topo

Seu primeiro documento: ViaCEP

O ViaCEP é um serviço gratuito de consulta de CEP que não exige cadastro. A consulta é um GET em viacep.com.br/ws/{cep}/json/, com o CEP em 8 dígitos. [12] O roteiro abaixo foi executado com cliques reais no app em 11/11/2026.

1. Comece um documento em branco

  1. Se quiser guardar o exemplo, salve antes uma cópia do arquivo.
  2. Clique em Novo e confirme. O app passa ao modo Editar, na página Informações gerais.

2. Preencha as informações gerais

  1. Título: ViaCEP. Versão: 1.0. A versão é a da sua documentação; quando o contrato mudar, aumente-a.
  2. Descrição: um parágrafo sobre a API. O campo aceita Markdown simples: **negrito**, `código`, links e listas com “- ”.
  3. Em Servidores, troque a URL base para https://viacep.com.br, sem barra no final, e a descrição para Produção.
Página Informações gerais no modo Editar, com título ViaCEP, versão 1.0, descrição em Markdown e o servidor https://viacep.com.br marcado como Produção
Informações gerais. O aviso “● não salvo” no alto lembra que as alterações ainda estão só na memória.

A autenticação fica em Nenhuma, que já é o padrão de um documento novo.

3. Crie o endpoint

  1. Na barra lateral, clique em + Endpoint. Um GET /novo-recurso aparece.
  2. Caminho: /ws/{cep}/json/. Resumo: Consultar um CEP. Tag: CEP. A tag agrupa endpoints na barra lateral.
  3. Clique em Detectar {parâmetros} do caminho. O app lê as chaves do caminho e cria o parâmetro cep, local path, obrigatório.
  4. Na linha do parâmetro, escreva a descrição CEP com 8 dígitos, sem hífen e o exemplo 01001000. O exemplo é o valor que o painel de teste usa de início.
Edição do endpoint GET /ws/{cep}/json/, com método, caminho, resumo, tag CEP, descrição, e a tabela de parâmetros com cep em path, tipo string, obrigatório e exemplo 01001000
O endpoint no modo Editar, depois de detectar o parâmetro do caminho.

4. Documente as respostas

  1. Na resposta 200 que já existe, escreva a descrição: Endereço encontrado. CEP inexistente também volta 200, com o campo `erro`.
  2. Em Exemplo de resposta, cole um JSON curto e clique em Formatar JSON:
    {"cep":"01001-000","logradouro":"Praça da Sé","complemento":"lado ímpar","bairro":"Sé","localidade":"São Paulo","uf":"SP","ddd":"11"}
    Se o JSON estiver errado, a caixa fica vermelha com o aviso “JSON inválido”.
  3. Clique em + Resposta, escreva o código 400 e a descrição Formato inválido (não tem 8 dígitos).

5. Teste de verdade

  1. Clique em Visualizar e, na barra lateral, em GET /ws/{cep}/json/.
  2. No painel Testar requisição, o campo cep já traz 01001000, e a URL completa aparece ao lado do botão.
  3. Clique em Executar. Em menos de um segundo, no teste deste tutorial, chegou 200 OK com o endereço da Praça da Sé.
Painel Testar requisição com o CEP 01001000, a URL https://viacep.com.br/ws/01001000/json/, o resultado 200 OK em 928 milissegundos e o corpo JSON com logradouro Praça da Sé, bairro Sé e localidade São Paulo
Uma chamada real ao ViaCEP. A resposta tem mais campos do que o exemplo documentado, como ibge e regiao.

Compare a resposta real com o exemplo que você escreveu: ela tem campos a mais. Isso é comum, e é por isso que os testes exportados conferem só se os campos documentados existem, e não se a resposta é idêntica. Se quiser uma documentação completa, copie a resposta real para o exemplo.

6. Provoque um erro

  1. Troque o CEP para 0100100, com 7 dígitos, e execute. O app mostra Falha na requisição: “Failed to fetch”.
  2. Troque para 99999999 e execute. Volta 200 OK com {"erro": "true"}.

O primeiro caso parece uma queda da API, mas não é. A seção Testar requisições e CORS explica o que aconteceu. No segundo, a documentação do ViaCEP mostra "erro": true, booleano, e a resposta real trouxe "true", texto. [12] Esse tipo de diferença é exatamente o que testar a documentação revela.

7. Salve e exporte

  1. Clique em Salvar (Ctrl+S) e grave, por exemplo, como viacep.html. Esse arquivo já é a documentação pronta para enviar.
  2. Em Exportar ▾ → OpenAPI 3, o app baixa viacep-openapi.json. No teste deste tutorial, esse arquivo passou na validação do pacote @apidevtools/swagger-parser, que confere o documento contra o esquema oficial do OpenAPI 3.0.
  3. Em Exportar ▾ → Testes Python, o app baixa test_viacep.py. Executado com pytest, o teste passou contra o ViaCEP real.
↑ Voltar ao topo

A interface

Barra superior
Título e versão da API, o aviso ● não salvo, a chave Visualizar / Editar, e os botões Salvar, Exportar ▾, Importar ▾ e Novo.
Barra lateral
O campo Filtrar endpoints…, que procura no método, no caminho, no resumo e na tag; os endpoints agrupados por tag; e os schemas. No modo Editar, ganha Informações gerais, Autenticação, Tags, + Endpoint e + Schema.
Área central
No modo Visualizar, a documentação navegável com o painel de teste em cada endpoint. No modo Editar, o formulário do item escolhido na barra lateral.
Avisos
Mensagens curtas aparecem por alguns segundos no rodapé da tela: arquivo salvo, parâmetros detectados, erro de importação.

Em telas com menos de 860 px de largura, a barra lateral some e a navegação fica só pela rolagem da área central.

↑ Voltar ao topo

O modo Editar em detalhe

PáginaO que você define
Informações geraisTítulo, versão, descrição em Markdown simples e a lista de servidores. O primeiro servidor é o padrão do teste; no modo Visualizar, uma lista permite trocar.
AutenticaçãoNenhuma, Bearer Token, Basic ou API Key. Para API Key, o nome do cabeçalho ou parâmetro e se vai no header ou na query.
TagsNome e descrição de cada grupo. Renomear uma tag atualiza os endpoints que a usam.
EndpointMétodo, caminho, resumo, tag, descrição, a opção Obsoleto (deprecated), parâmetros, corpo da requisição e respostas. Duplicar cria uma cópia logo abaixo; Excluir pede confirmação.
SchemaNome, descrição e a definição em JSON Schema.

Parâmetros

Cada linha tem nome, local (path, query, header, cookie), tipo, a marca de obrigatório, descrição e exemplo. Um parâmetro de caminho é sempre obrigatório: a especificação OpenAPI exige isso, e o app aplica a regra ao exportar, mesmo que a marca esteja desligada. [8] Os tipos integer, number e boolean fazem o exemplo ser exportado como número ou booleano, e não como texto.

Corpo e respostas

O Content-Type sugere os tipos mais comuns. Os campos de exemplo com JSON validam enquanto você digita e têm o botão Formatar JSON. Um exemplo que não é JSON é aceito, mas tratado como texto.

Endpoints marcados como obsoletos aparecem riscados e com o selo “obsoleto”. É a forma padrão de avisar que algo vai sair, sem remover de repente.

↑ Voltar ao topo

Testar requisições e CORS

O painel Testar requisição monta a URL com o servidor escolhido, preenche os parâmetros com os exemplos, inclui a credencial digitada e envia a requisição pelo próprio navegador. O resultado mostra o código, o tempo, os cabeçalhos da resposta, o comando curl equivalente e o corpo formatado.

Por que o navegador bloqueia algumas chamadas

Por segurança, o navegador só deixa um script ler a resposta de outro site se esse site autorizar, com o cabeçalho Access-Control-Allow-Origin. Esse mecanismo se chama CORS (Cross-Origin Resource Sharing). [11] Sem a autorização, o navegador entrega ao script apenas um erro genérico, e o app mostra “Failed to fetch”.

Foi o que aconteceu com o CEP de 7 dígitos. Chamado fora do navegador, o ViaCEP respondeu 400 Bad Request com uma página HTML e sem o cabeçalho CORS; a consulta válida voltou com Access-Control-Allow-Origin: *. O erro existia, mas o navegador o escondeu.

Além disso, requisições com Authorization, com Content-Type: application/json ou com métodos como PUT e DELETE passam antes por uma consulta OPTIONS, a preflight, que o servidor também precisa aprovar. [11] Muitas APIs corporativas não liberam CORS para qualquer origem.

O que fazer quando o teste falha

  1. Abra Comando curl, clique em Copiar curl e rode no terminal. O curl não é navegador e não aplica CORS: você vê o código e o corpo verdadeiros.
  2. Se o curl funcionar, a API está no ar e o bloqueio é do navegador. Documente normalmente; o teste no app é que não é possível.
  3. Se o curl também falhar, confira o servidor, o caminho, a credencial e a rede.
↑ Voltar ao topo

Salvar

O app não usa servidor nem banco de dados. A documentação fica em um bloco JSON dentro do próprio HTML, e salvar é gravar um novo HTML com esse bloco atualizado.

No centro fica o documento da API, guardado como JSON dentro do próprio arquivo HTML, que você vê e altera nos modos Visualizar e Editar. Importar traz Swagger 2.0 ou OpenAPI 3 em JSON ou YAML, por arquivo ou URL, e collections do Postman. Exportar gera OpenAPI 3, Postman v2.1, testes Python, classe InterSystems IRIS, Markdown e PDF. Salvar grava um novo arquivo HTML com os dados, e Testar requisição chama a API real.
Tudo gira em torno do documento guardado no HTML.
NavegadorO que acontece ao salvar
Chrome e EdgeNa primeira vez, o navegador pergunta onde gravar. Depois disso, Salvar grava no mesmo arquivo. [17]
OutrosO app baixa uma cópia. Substitua o arquivo original por ela.

O que não é gravado: as credenciais digitadas no teste, os valores alterados no painel de teste e os resultados das chamadas. Se você tentar fechar a aba com alterações pendentes, o navegador pede confirmação.

↑ Voltar ao topo

Importar

Muitas APIs já têm uma especificação, gerada pelo próprio framework do servidor. Importar evita digitar tudo de novo.

OpçãoAceita
Swagger / OpenAPIArquivo .json, .yaml ou .yml, em Swagger 2.0 ou OpenAPI 3. Também dá para arrastar o arquivo para a janela.
Swagger por URLO endereço da especificação, como …/swagger.json. Depende de CORS: se o servidor bloquear, baixe o arquivo e importe pelo disco.
Collection do PostmanArquivo .json exportado pelo Postman, nas versões 2.0 ou 2.1.

Se o documento atual já tiver endpoints, o app pergunta o que fazer:

Janela Importar OpenAPI 3.0.3 sobre o exemplo dos Correios, informando 1 endpoint encontrado em ViaCEP, com os botões Cancelar, Mesclar e Substituir tudo
Ao importar sobre uma documentação existente, escolha entre mesclar e substituir.
  • Mesclar acrescenta endpoints, tags, servidores e schemas que ainda não existem. Um endpoint com o mesmo método e caminho de outro já existente é ignorado. No teste, mesclar o ViaCEP ao exemplo dos Correios resultou em 5 endpoints.
  • Substituir tudo descarta a documentação atual.

Quando um exemplo não existe na especificação de origem, o app cria um a partir do schema, com valores genéricos como "string" e 0. Revise esses exemplos depois de importar.

↑ Voltar ao topo

Exportar

Menu Exportar aberto com as opções OpenAPI 3, Postman, Testes Python, InterSystems IRIS, Markdown e PDF, cada uma com uma linha de explicação
Seis saídas a partir da mesma documentação.
FormatoArquivoPara que serve
OpenAPI 3nome-openapi.jsonEspecificação 3.0.3 para Swagger UI, Redoc, geradores de código e gateways de API. [8]
Postmannome.postman_collection.jsonCollection v2.1 com uma pasta por tag, variável baseUrl e variáveis vazias para as credenciais. [13]
Testes Pythontest_nome.pyTestes com pytest e Requests. [14] [15] Detalhes abaixo.
InterSystems IRISPacote.Classe.clsClasse que estende %CSP.REST, com as rotas no UrlMap, um método por endpoint com a resposta de exemplo e marcas TODO, e a rota GET /_spec que devolve o OpenAPI. [16] O app pede o nome da classe.
Markdownnome.mdDocumento com sumário, tabelas e exemplos, para README, wiki ou repositório.
PDFpela impressãoAbre a janela de impressão com capa, sumário, endpoints e schemas. Escolha “Salvar como PDF” como destino.

Os testes em Python

O arquivo gerado traz no topo as instruções de instalação e execução. Cada teste chama um endpoint com os valores de exemplo, confere o código de sucesso documentado e verifica se os campos do exemplo de resposta existem na resposta real com o mesmo tipo JSON.

pip install pytest requests
pytest -v test_viacep.py
  • A URL base e as credenciais vêm de variáveis de ambiente: API_BASE_URL, API_TOKEN, API_USER e API_PASS, ou API_KEY. Assim, nenhuma senha fica no código.
  • Métodos que alteram dados (POST, PUT, PATCH, DELETE) só rodam com API_ALLOW_WRITE=1. Sem isso, aparecem como pulados.
  • Se a API tem autenticação e o endpoint documenta a resposta 401, o app cria também um teste sem credencial, que espera 401.
  • API_MAX_MS define um tempo máximo de resposta, se você quiser vigiar a lentidão.
↑ Voltar ao topo

Prompts de IA

Uma IA acelera as partes demoradas da documentação: levantar endpoints espalhados pelo código, transformar chamadas soltas em uma especificação, escrever descrições e ampliar testes. Ela também erra com segurança: inventa campos, chuta códigos de status e descreve comportamentos que a API não tem. Trate a saída como rascunho e confira cada endpoint com o painel Testar requisição, que fala com a API de verdade. Para escrever prompts melhores, veja o tutorial de prompts.

Seis passos: você reúne código, chamadas cURL e textos; a IA rascunha a especificação OpenAPI em JSON com os prompts 1 a 4; o app importa o arquivo e você revisa no modo Editar; o app testa na API real; a IA revisa textos, lacunas e testes com os prompts 5 a 9, e você ajusta no app; por fim, você decide, salva e publica.
A IA rascunha e revisa; o app importa e testa contra a API real; a decisão é sua.

Antes de colar: tire tokens, senhas, chaves de API, endereços internos e dados de clientes do que vai para a IA. Troque por valores fictícios e siga a política da sua organização. O app só se comunica com a API que você testa, mas o serviço de IA recebe tudo o que você colar nele.

Troque os trechos entre colchetes e cole na ferramenta de IA que você usa. Os prompts seguem a ordem do trabalho: os de 1 a 4 produzem a documentação, e os de 5 a 9 a revisam e a colocam em uso. Cada um funciona sozinho.

1. Entrevistar antes de documentar

Quando a API ainda está na cabeça de quem a fez. A IA pergunta, em vez de supor.

Você é um redator técnico experiente em APIs REST e na especificação OpenAPI.
Quero documentar esta API: [descreva em poucas frases o que ela faz e quem a usa].

Antes de escrever qualquer documentação, me entreviste:
- Faça uma pergunta por vez e espere minha resposta.
- Cubra: URL base de cada ambiente; forma de autenticação; cada recurso e as operações sobre ele (método e caminho); parâmetros de caminho, de consulta e de cabeçalho, com tipo, obrigatoriedade e um exemplo; corpo das requisições; respostas de sucesso e de erro, com o código e um exemplo de corpo; paginação; limites de uso; o que está obsoleto.
- Pergunte principalmente sobre os erros: o que acontece com dado inválido, sem credencial, sem permissão e com recurso inexistente.
- Não invente respostas. Se eu não souber, registre como pendência.

Ao final, entregue: uma tabela de endpoints (método, caminho, resumo, tag), a lista de parâmetros e respostas de cada um, exemplos de corpo em JSON e a lista de pendências.

2. Levantar endpoints a partir do código

Para APIs já programadas sem documentação. Pede a origem de cada item, o que facilita conferir.

A partir do código abaixo, levante o contrato da API REST que ele implementa.

Linguagem e framework: [por exemplo: Java com Spring, C# com ASP.NET, Node com Express, Python com FastAPI, ObjectScript com %CSP.REST]
Código:
[cole os controladores, rotas ou o UrlMap, e as classes de entrada e saída]

Entregue:
1. Tabela de endpoints: método, caminho (com {parâmetros}), resumo, tag sugerida e o arquivo e a linha de onde saiu.
2. Para cada endpoint: parâmetros (nome, local path, query, header ou cookie, tipo, obrigatório), corpo da requisição com um exemplo em JSON, e respostas com código e exemplo de corpo.
3. Os códigos de erro que o código realmente devolve, e em que situação.
4. Como a autenticação é verificada.
5. Lacunas: retornos que dependem de código que não está aqui, exceções não tratadas e comportamentos ambíguos, com uma pergunta para cada um.

Não deduza o que o código não mostra. Use exemplos fictícios.

3. Gerar o OpenAPI para importar no app

Transforma o que você reuniu em um arquivo que o app importa de uma vez, em vez de digitar endpoint por endpoint. O formato pedido é o que o importador do app aproveita.

Gere uma especificação OpenAPI 3.0.3 em JSON para a API descrita no fim. Ela será importada no API Docs, um editor que lê um subconjunto do OpenAPI.

Responda só com o JSON, sem comentários e sem cercas de código.

Use apenas estes elementos:
- "openapi": "3.0.3" e "info" com "title", "version" e "description". A descrição aceita Markdown simples: **negrito**, `código`, links e listas com "- ".
- "servers": lista com "url" (sem barra no final) e "description".
- "tags": lista com "name" e "description". Cada operação usa uma só tag.
- "paths": uma operação por método (get, post, put, patch, delete), com "tags", "summary" (curto, começando por verbo), "description" e, se for o caso, "deprecated": true.
- "parameters": "name", "in" (path, query, header ou cookie), "required", "description", "schema" com "type" (string, integer, number, boolean, array ou object) e "example". Todo {parâmetro} do caminho precisa de um parâmetro com "in": "path" e "required": true.
- "requestBody" só em post, put e patch: "description" e "content" com um único tipo de mídia, em geral "application/json", contendo "example".
- "responses": para cada código, "description" e, quando houver corpo, "content": {"application/json": {"example": ...}}. Inclua as respostas de erro que a API realmente usa, com o corpo de erro.
- "components.securitySchemes" com um único esquema: {"type": "http", "scheme": "bearer"}, {"type": "http", "scheme": "basic"} ou {"type": "apiKey", "name": "...", "in": "header"}; e "security" na raiz apontando para ele. Se a API for pública, omita os dois.
- "components.schemas" com os objetos principais.

Regras:
- Não invente endpoints, campos nem códigos. O que faltar vai para "info.description", em uma lista chamada Pendências.
- Exemplos realistas e fictícios: nunca tokens, senhas, documentos ou e-mails reais.
- Os exemplos de resposta usam os mesmos nomes de campo dos schemas.

Informações da API:
[cole o resultado do prompt 1, 2 ou 4, a documentação existente ou a sua descrição]

4. Transformar chamadas reais em documentação

Quando você só tem chamadas que funcionam. No navegador, abra as ferramentas de desenvolvedor, aba Rede, clique com o botão direito na requisição e use “Copiar como cURL”.

Abaixo há chamadas reais a uma API, em cURL, com as respostas que voltaram.
Já troquei tokens e dados pessoais por valores fictícios.

[cole cada cURL seguido do código de status e do corpo da resposta]

Faça:
1. Agrupe as chamadas por recurso e deduza os endpoints: método e caminho, trocando valores que variam por {parâmetros} com nomes claros (por exemplo /pedidos/123 vira /pedidos/{id}).
2. Para cada endpoint, liste parâmetros de caminho, consulta e cabeçalho, com tipo e um exemplo tirado das chamadas.
3. Use os corpos reais como exemplos de requisição e de resposta, encurtando listas longas para dois itens.
4. Identifique a autenticação pelos cabeçalhos (Authorization, X-API-Key ou outro), sem repetir o valor.
5. Marque como “visto uma vez” o que aparece em uma só chamada, e liste o que falta saber: respostas de erro não observadas, parâmetros opcionais e limites.

Entregue em tabelas, prontas para usar no prompt 3.

5. Revisar a documentação

Uma segunda leitura antes de publicar. Use o arquivo de Exportar ▾ → Markdown ou OpenAPI 3.

Revise a documentação de API abaixo como alguém que vai integrar com ela pela primeira vez.

[cole o Markdown ou o OpenAPI exportado pelo API Docs]

Verifique e aponte, endpoint por endpoint:
- Método coerente com a ação: GET só lê, POST cria, PUT substitui, PATCH altera parte, DELETE remove.
- Caminhos com substantivos e padrão de nomes consistente (plural ou singular, maiúsculas, hífens).
- Parâmetros sem descrição, sem exemplo, com tipo errado, ou de caminho que não aparecem no caminho.
- Respostas de erro ausentes (400, 401, 403, 404, 422, 500) e erros devolvidos com código 200.
- Exemplos que não batem com o schema ou entre si.
- Dados que parecem reais ou sensíveis em exemplos: tokens, senhas, documentos, e-mails.
- Resumos vagos e descrições que não dizem o efeito da operação.

Entregue uma tabela com: endpoint, problema, gravidade (alta, média, baixa) e a correção sugerida, em texto pronto para colar no app. Termine com as três correções mais importantes.

6. Escrever textos para quem vai integrar

Melhora resumos e descrições sem mudar o contrato. A saída vem no formato dos campos do app.

Reescreva os textos desta documentação de API para quem vai integrar com ela.

[cole o Markdown exportado ou a lista de endpoints com resumo e descrição]

Para cada endpoint, entregue:
- Resumo: até 60 caracteres, começando por verbo no infinitivo (por exemplo, Consultar um CEP).
- Descrição: até 4 frases. O que a operação faz, quando usar, efeitos colaterais e um cuidado importante. Use só este Markdown: **negrito**, `código`, links e listas com "- ".
- Descrição de cada parâmetro: uma frase com o formato esperado e um exemplo.

Escreva também a descrição geral da API, com: para que serve, como autenticar, onde conseguir a credencial e um primeiro passo.

Não altere métodos, caminhos, nomes de campos nem códigos. Se um texto atual estiver errado em relação ao contrato, aponte em separado.

7. Ampliar os testes em Python

O arquivo de Exportar ▾ → Testes Python cobre o caminho feliz. Este prompt acrescenta os casos de erro e de borda.

Abaixo está um arquivo de testes pytest gerado a partir da documentação de uma API, e a documentação.

Testes:
[cole o test_*.py exportado]
Documentação:
[cole o OpenAPI ou o Markdown exportado]

Acrescente testes, sem mudar os que existem:
- Para cada endpoint: parâmetro obrigatório ausente, tipo errado, valor fora do limite e recurso inexistente, esperando os códigos que a documentação define.
- Para endpoints com autenticação: sem credencial (401) e, se a documentação definir, sem permissão (403).
- Para listas paginadas: primeira página, página vazia e tamanho máximo.

Regras:
- Reaproveite a fixture api e as funções url, check_status, json_of e assert_shape do arquivo.
- Leia URL e credenciais das variáveis de ambiente já usadas; nunca escreva segredos no código.
- Marque com @WRITE todo teste que use POST, PUT, PATCH ou DELETE.
- Se a documentação não disser qual código esperar, não invente: crie o teste com pytest.skip e o motivo.

Entregue só o código novo, pronto para colar no fim da classe correspondente, e uma lista do que ficou sem teste.

8. Diagnosticar uma chamada que falhou

Para quando o painel de teste mostra erro e você não sabe se o problema é a API, a rede, o navegador ou a documentação.

Uma chamada a uma API falhou. Ajude a descobrir a causa.

Mensagem no navegador: [por exemplo: Failed to fetch, ou o código e o corpo mostrados]
Comando curl (sem o token): [cole o curl copiado do painel Testar requisição]
Resultado do curl no terminal: [código de status, cabeçalhos e corpo, ou a mensagem de erro]
O que a documentação diz que deveria acontecer: [código e corpo esperados]

Classifique a causa mais provável entre: bloqueio de CORS no navegador, rede ou DNS, certificado HTTPS, credencial ausente ou expirada, falta de permissão, requisição malformada, recurso inexistente, erro do servidor, ou documentação desatualizada.

Explique em que evidência você se baseou, diga o próximo teste que confirma a hipótese e, se for o caso, o que corrigir na documentação. Não suponha nada que as evidências não mostrem.

9. Implementar a classe gerada para o InterSystems IRIS

A exportação InterSystems IRIS cria rotas e métodos com a resposta de exemplo e marcas TODO. Este prompt pede a implementação, mantendo o contrato.

Abaixo está uma classe ObjectScript que estende %CSP.REST, gerada a partir da documentação de uma API. Cada método devolve a resposta de exemplo e tem um comentário TODO.

Classe:
[cole o .cls exportado]
Regras de negócio e dados:
[descreva as tabelas ou classes persistentes envolvidas e o que cada endpoint deve fazer]

Implemente os métodos marcados com TODO:
- Não mude o UrlMap, os nomes dos métodos nem os códigos e campos da documentação.
- Use %DynamicObject e %DynamicArray para montar o JSON de resposta.
- Em SQL, use parâmetros (? ou :variável); nunca concatene texto do usuário na consulta.
- Responda com ..Erro(código, mensagem) nos erros documentados: 400 para entrada inválida e 404 para recurso inexistente.
- Mantenha o bloco Try/Catch existente.

Entregue a classe completa e, em seguida, a lista de suposições que você fez sobre os dados.

Como importar o JSON do prompt 3

  1. Copie a resposta da IA para um editor de texto e salve com a extensão .json, por exemplo minha-api.json.
  2. No app, use Importar ▾ → Swagger / OpenAPI, ou arraste o arquivo para a janela. Se já houver endpoints, escolha Mesclar ou Substituir tudo.
  3. Passe pelo modo Editar: confira caminhos, parâmetros e exemplos, e leia as pendências na descrição geral.
  4. No modo Visualizar, teste cada endpoint em Testar requisição. Onde a resposta real divergir do exemplo, vale a resposta real.
  5. Clique em Salvar.

Para APIs grandes, peça um JSON por tag e importe cada um com Mesclar: o app acrescenta o que é novo e ignora endpoints com o mesmo método e caminho.

Sintoma ao importarCausa provávelO que fazer
“YAML linha 1: esperado "chave: valor"” (ou outra linha)A IA escreveu texto antes ou depois do JSON. Como o arquivo não começa com {, o app tenta lê-lo como YAML.Apague tudo o que estiver fora das chaves externas { }.
“conteúdo não reconhecido”A resposta veio entre cercas de código, como ```json.Apague as linhas das cercas.
“JSON inválido”A resposta foi cortada no meio, comum em APIs grandes.Peça em partes, uma tag por vez, e importe cada parte com Mesclar.
“formato não reconhecido”Falta a chave "openapi" na raiz.Peça para a IA corrigir conforme o formato do prompt 3.
“Nenhum endpoint encontrado no arquivo”"paths" vazio, ou métodos em maiúsculas ("GET").Confira se cada operação está dentro de "paths", com o método em minúsculas.
Exemplos com "string" e 0A IA deu só o schema, sem "example".Peça exemplos realistas ou cole respostas reais do painel de teste.
↑ Voltar ao topo

Erros comuns

  • “Failed to fetch: a API caiu”

    Quase sempre é CORS ou rede. Rode o curl antes de concluir qualquer coisa.

  • Credencial no exemplo ou na descrição

    O arquivo HTML é feito para ser enviado. Token e senha vão só nos campos do painel de teste, que não são gravados.

  • Exemplo inventado

    Um exemplo escrito de cabeça diverge da API real. Execute a chamada e use a resposta verdadeira como exemplo.

  • Documentar só o sucesso

    Quem integra precisa saber o que volta quando dá errado. Documente 400, 401, 404 e o corpo de erro.

  • Corpo em GET

    Conteúdo em GET não tem significado definido no HTTP. Para filtros, use parâmetros de consulta.

  • Esquecer de salvar

    Enquanto aparecer “● não salvo”, nada foi gravado. Use Ctrl+S.

↑ Voltar ao topo

Limitações e solução de problemas

O app cobre o essencial do OpenAPI, não a especificação inteira. O que fica de fora:

  • Uma única forma de autenticação para a API toda. Não há autenticação por endpoint, OAuth 2 com fluxos, nem mais de um esquema. Ao importar, só o primeiro esquema é aproveitado, e OAuth 2 vira Bearer.
  • Parâmetros têm só tipo, sem formato, lista de valores, mínimo ou máximo.
  • Exemplos de resposta são exportados sempre como application/json, e cabeçalhos de resposta não são documentados.
  • Os schemas ficam numa lista própria; os endpoints não apontam para eles com $ref.
  • Na importação, ficam de fora os parâmetros formData do Swagger 2.0 e os cabeçalhos de resposta; de várias tags ou vários exemplos, fica o primeiro.
  • O YAML é lido por um interpretador próprio, que cobre o uso comum. Se um arquivo YAML falhar, converta-o para JSON e importe de novo.
SintomaCausa provável e solução
“Failed to fetch” no testeCORS, rede ou certificado. Rode o curl copiado do painel.
401 no testeCredencial ausente, errada ou expirada. Preencha o campo de token do painel; ele não persiste depois de recarregar a página.
A URL do teste mostra {cep}O parâmetro de caminho está vazio, ou o nome entre chaves não bate com o nome do parâmetro.
“Formato não reconhecido” ao importarO arquivo não é Swagger 2.0, OpenAPI 3 nem Postman v2. Confira se o JSON está completo.
Swagger por URL falhaO servidor bloqueia CORS. Abra a URL no navegador, salve o arquivo e use Swagger / OpenAPI.
Salvar baixou um arquivo em vez de gravarComportamento esperado fora do Chrome e do Edge. Substitua o original pela cópia baixada.
↑ Voltar ao topo

Revisão rápida

Tente responder antes de abrir cada pergunta.

1. Em https://viacep.com.br/ws/01001000/json/, qual é o servidor e qual é o parâmetro de caminho?

O servidor é https://viacep.com.br, e o parâmetro de caminho é 01001000, o valor de {cep}.

2. Repetir um PUT por causa de uma queda de rede é seguro? E um POST?

O PUT é idempotente: repetir tem o mesmo efeito. O POST não é: repetir pode criar o recurso duas vezes.

3. Qual a diferença entre 401 e 403?

401: falta uma credencial válida. 403: a credencial é válida, mas não tem permissão para aquilo.

4. Por que Basic sem HTTPS é perigoso?

Porque usuário e senha vão apenas codificados em Base64, que qualquer pessoa decodifica.

5. O teste mostrou “Failed to fetch”. Qual é o primeiro passo?

Copiar o curl e rodar no terminal, para ver o código e o corpo verdadeiros, sem a restrição de CORS do navegador.

6. O token digitado no painel de teste vai junto quando envio o HTML salvo?

Não. Credenciais ficam só na memória e não são gravadas no arquivo.

7. Por que exportar OpenAPI, se o HTML já mostra a documentação?

Porque o OpenAPI é lido por outras ferramentas: Swagger UI, geradores de clientes, gateways e validadores.

↑ Voltar ao topo

Referências

  1. Giovani Perotto Mesquita, “API Docs”, aplicativo em um único arquivo HTML, giovanipm.github.io/api-docs.html.
  2. Roy Thomas Fielding (em inglês), “Architectural Styles and the Design of Network-based Software Architectures”, tese de doutorado, Universidade da Califórnia em Irvine, 2000, capítulo 5, acesso em 11/11/2026, ics.uci.edu/~fielding/pubs/dissertation/top.htm.
  3. IETF (em inglês), RFC 9110, “HTTP Semantics”, junho de 2022, seções 9 (métodos) e 15 (códigos de status), acesso em 11/11/2026, rfc-editor.org/rfc/rfc9110.
  4. IETF (em inglês), RFC 3986, “Uniform Resource Identifier (URI): Generic Syntax”, 2005, acesso em 11/11/2026, rfc-editor.org/rfc/rfc3986.
  5. IETF (em inglês), RFC 8259, “The JavaScript Object Notation (JSON) Data Interchange Format”, 2017, acesso em 11/11/2026, rfc-editor.org/rfc/rfc8259.
  6. IETF (em inglês), RFC 7617, “The 'Basic' HTTP Authentication Scheme”, 2015, acesso em 11/11/2026, rfc-editor.org/rfc/rfc7617.
  7. IETF (em inglês), RFC 6750, “The OAuth 2.0 Authorization Framework: Bearer Token Usage”, 2012, acesso em 11/11/2026, rfc-editor.org/rfc/rfc6750.
  8. OpenAPI Initiative (em inglês), “OpenAPI Specification v3.0.3”, 20/02/2020, inclusive o apêndice A, “Revision History”, acesso em 11/11/2026, spec.openapis.org/oas/v3.0.3.html.
  9. OpenAPI Initiative (em inglês), “OpenAPI Specification v3.2.0”, setembro de 2025, acesso em 11/11/2026, spec.openapis.org/oas/v3.2.
  10. Wikipédia (em inglês), “OpenAPI Specification”, acesso em 11/11/2026, en.wikipedia.org/wiki/OpenAPI_Specification. Divergência: a Wikipédia data a criação do Swagger em 2010 e o anúncio da OpenAPI Initiative em novembro de 2015; o histórico de revisões da especificação [8] registra a versão 1.0 em 10/08/2011 e a doação em 31/12/2015.
  11. MDN Web Docs (em inglês), “Cross-Origin Resource Sharing (CORS)”, acesso em 11/11/2026, developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS.
  12. ViaCEP, página do webservice, acesso em 11/11/2026, viacep.com.br. Divergência: a página mostra "erro": true para CEP inexistente; a chamada real deste tutorial, em 11/11/2026, devolveu "erro": "true".
  13. Postman (em inglês), “Postman Collection Format v2.1.0”, esquema JSON, acesso em 11/11/2026, schema.getpostman.com/json/collection/v2.1.0/collection.json.
  14. pytest (em inglês), documentação, acesso em 11/11/2026, docs.pytest.org.
  15. Requests (em inglês), “Requests: HTTP for Humans”, documentação, acesso em 11/11/2026, requests.readthedocs.io.
  16. InterSystems (em inglês), “Creating REST Services”, documentação do InterSystems IRIS, acesso em 11/11/2026, docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GREST.
  17. MDN Web Docs (em inglês), “File System API”, acesso em 11/11/2026, developer.mozilla.org/en-US/docs/Web/API/File_System_API.
  18. IETF (em inglês), RFC 5789, “PATCH Method for HTTP”, 2010, acesso em 11/11/2026, rfc-editor.org/rfc/rfc5789.
↑ Voltar ao topo