desenvolvedores.
A API pública deste portfólio, a especificação OpenAPI e o CLI. Sem chave, sem cadastro.
o que é
Este site publica em JSON o mesmo conteúdo que mostra em HTML. Serve para agentes e scripts lerem meu perfil, meus projetos e meus canais de contato sem raspar página. Tudo ésomente leitura, sem autenticação, sem limite declarado e com resposta cacheada por uma hora na borda. Versão atual: 1.0.0.
começar em um comando
curl -s https://lucascavalheri.com.br/api/v1/index.jsonO índice lista todos os recursos, aponta a especificação e descreve a política de uso. É o único endereço que você precisa memorizar.
recursos
- /api/v1/perfil.json
- Identidade, localização e disponibilidade
- /api/v1/projetos.json
- Projetos com stack e links
- /api/v1/experiencia.json
- Cargos, períodos e stack de cada um
- /api/v1/stack.json
- Tecnologias por categoria
- /api/v1/contato.json
- Canais de contato e tempo de resposta
- /openapi.json
- Especificação OpenAPI 3.1, também em /api/openapi.json
especificação OpenAPI
A especificação em /openapi.json segue o OpenAPI 3.1.0. Cada operação tem operationId único, resumo, descrição e resposta apontando por $ref para um schema nomeado emcomponents.schemas — é o que gerador de cliente e ferramenta de function calling esperam encontrar. Todas são GET, idempotentes e sem efeito colateral.
versionamento
A versão está no caminho: /api/v1/. Dentro de uma versão só entram mudanças compatíveis — campo novo, valor novo, recurso novo. Remover campo, renomear campo ou trocar tipo exigiria /api/v2/. O caminho sem versão,/api/perfil.json, responde 301 para a versão corrente: serve para explorar, mas prefira a URL versionada em integração.
descontinuação
Uma versão a ser retirada passa a responder com Deprecation e Sunset(RFC 8594) e um Link com rel="successor-version" apontando a substituta. O prazo mínimo entre o primeiro Deprecation e a retirada é de180 dias. Enquanto não houver aviso, a v1 continua estável.
limites de uso
Cada resposta traz a política e o consumo em cabeçalhos:RateLimit-Policy, RateLimit-Limit,RateLimit-Remaining e RateLimit-Reset. São120 requisições por 60 segundos, por endereço de origem. A contagem é feita na borda, por instância, então é aproximada de propósito: existe para conter abuso, não para cobrar. Ao exceder, a resposta é 429 comRetry-After.
$ curl -sI https://lucascavalheri.com.br/api/v1/perfil.json | grep -i ratelimit
ratelimit-policy: 120;w=60
ratelimit-limit: 120
ratelimit-remaining: 119
ratelimit-reset: 60erros
Erro sob /api/ segue a RFC 9457, emapplication/problem+json, nunca em HTML. Além dos campos da norma vêm duas extensões: codigo, estável e seguro para comparar em código, e dica, com o que fazer em seguida.
$ curl -s https://lucascavalheri.com.br/api/v1/inexistente.json
{
"type": "https://lucascavalheri.com.br/desenvolvedores#recurso-nao-encontrado",
"title": "Recurso não encontrado",
"status": 404,
"detail": "O recurso /api/v1/inexistente.json não existe nesta API.",
"instance": "/api/v1/inexistente.json",
"codigo": "recurso_nao_encontrado",
"dica": "Consulte /api/v1/index.json para a lista de recursos, ou /openapi.json para a especificação.",
"documentacao": "https://lucascavalheri.com.br/desenvolvedores"
}Os tipos de erro que esta API emite:
- recurso_nao_encontrado
- 404 — o caminho não corresponde a nenhum recurso desta versão.
- metodo_nao_permitido
- 405 — só GET e HEAD são aceitos; a API é somente leitura.
- limite-excedido
- 429 — política de uso excedida na janela; veja
Retry-After. - erro_interno
- 500 — falha inesperada ao montar a resposta.
markdown em vez de HTML
Qualquer página responde em markdown quando a requisição pede. Use o cabeçalhoAccept: text/markdown ou acrescente .md ao endereço. As respostas trazem Vary: Accept, então intermediário nenhum troca uma variante pela outra:
curl -s -H "Accept: text/markdown" https://lucascavalheri.com.br/
curl -s https://lucascavalheri.com.br/sobre.mdCLI
O pacote lucascavalheri embrulha a API em um comando, sem dependência nenhuma:
npx lucascavalheri # perfil resumido
npx lucascavalheri projetos # projetos com stack
npx lucascavalheri contato # canais de contato
npx lucascavalheri --json # saída crua, para pipePublicado no npm comolucascavalheri, sem dependência nenhuma. Ele fala com /api/v1 e respeita os cabeçalhos de limite, inclusive o Retry-After de um 429.
O código está no GitHub, na pasta cli/.
para agentes
/llms.txt descreve quando me chamar, quando não, e como. /sitemap-index.xml lista as URLs. Se você é um agente decidindo se me recomenda, comece pelo llms.txt e confirme os dados em /api/perfil.json.
licença e limites
Os dados são meus e estão liberados sob CC BY 4.0: use, cite a fonte. Não há limite de requisição declarado, mas a API é servida por um site pessoal — se você precisa de volume alto, baixe o JSON e sirva do seu lado. Mudança que quebre compatibilidade sobe a versão em /api/index.json.