Docs · Comece aqui
Autenticação e chaves de API
As requisições são autenticadas com uma chave de API. A mesma chave vale nos endpoints compatíveis com OpenAI, nos compatíveis com Anthropic e nos nativos. As poucas operações que gerenciam a própria chave exigem uma sessão, como explicado abaixo.
A chave#
- Formato:
shvia_usr_<id>_<secret>, em que<secret>tem 32 letras e dígitos. - Uma chave por conta. Gerar uma chave nova substitui a antiga na hora. Não há chaves nomeadas, nem escopos, nem limites por chave: os limites pertencem à conta.
- Válida por 365 dias. O prazo é fixo. Gere uma chave nova antes que ela expire.
- Aparece uma vez. O servidor guarda um hash da chave e uma prévia curta, os primeiros 16 e os últimos 8 caracteres, nunca a chave inteira. Se você perder a chave, gere outra.
Quem pode criar uma chave#
Três condições precisam valer:
- Você tem uma conta. O cadastro público fica fechado, a menos que o operador o abra; fora isso, um administrador cria as contas.
- O seu grupo de conta tem acesso à API. O operador habilita por grupo. Uma conta recém-criada pode estar num grupo sem ele. Nesse caso o pedido para gerar a chave é recusado com
403e uma mensagem de que o seu grupo não tem permissão de API. Peça ao seu administrador que mude você de grupo. - Você prova quem é. Gerar uma chave exige a senha da sua conta e uma credencial de sessão: uma chave não gera outra chave.
Crie uma chave no app#
Abra a sua conta, vá à seção de chave de API e escolha gerar uma chave. Copie-a quando ela aparecer. Depois, o app mostra só uma prévia.
Crie uma chave pela API#
Entre para obter um token de sessão e depois peça a chave. A senha é exigida de novo aqui.
curl -s "$SHVIA_URL/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{ "email": "you@example.com", "password": "your password" }'{
"status": "success",
"message": "Login realizado com sucesso",
"data": {
"access_token": "1|…",
"token_type": "Bearer",
"expires_in": 86400,
"user": { "id": 42, "email": "you@example.com", "work_group": "expert", "…": "…" }
}
}expires_in é em segundos: 86400 para uma sessão normal, 2592000 quando você também envia "remember_me": true. user é o registro inteiro da conta, com muito mais campos do que os mostrados. Trate-o como informativo: os campos dele não são um contrato.
curl -s "$SHVIA_URL/api/v1/auth/api-key/generate" \
-H "Authorization: Bearer $SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "password": "your password" }'{
"status": "success",
"message": "API key gerada com sucesso. Guarde-a em local seguro, não será possível visualizá-la novamente.",
"data": {
"api_key": "shvia_usr_42_…",
"expires_at": "2027-10-10T17:43:47.000000Z"
}
}O login tem limite de 10 tentativas por minuto por endereço, e 5 falhas seguidas bloqueiam a conta por 30 minutos.
Envie a chave#
Coloque a chave no header Authorization:
curl -s "$SHVIA_URL/v1/models" \
-H "Authorization: Bearer $SHVIA_API_KEY"X-API-Key: <key> também é aceito. É o que o SDK da Anthropic envia. Se uma requisição traz um token Authorization: Bearer e também um X-API-Key, vale o token Bearer, mesmo quando ele está errado.
curl -s "$SHVIA_URL/api/v1/auth/verify" \
-H "X-API-Key: $SHVIA_API_KEY"Use sempre https://. Uma requisição http:// simples é redirecionada, e alguns clientes perdem o corpo de um POST redirecionado.
Verifique uma chave#
GET/api/v1/auth/verify#
Responde "esta credencial é boa?" e nada mais, o que a torna a chamada certa para um health check na sua integração.
{
"valid": true,
"via": "apikey",
"user": { "id": 42, "full_name": "Maria Souza", "email": "maria@example.com", "work_group": "expert", "role": "user", "is_active": true },
"checked_at": "2026-10-10T17:43:47+00:00"
}via é apikey para uma chave de API e sanctum para um token de sessão. Uma credencial ruim nunca devolve valid: false; devolve 401.
Revogue ou rotacione uma chave#
DELETE/api/v1/auth/api-key/revoke#
Revogar exige um token de sessão, como gerar. A chave antiga para de funcionar na hora. Para rotacionar, gere uma chave nova: a antiga morre no mesmo instante, então atualize primeiro o seu cofre de segredos e troque rápido.
Quando uma chave é recusada#
Uma chave é recusada com 401 quando é desconhecida, revogada ou expirada, quando a conta está desativada, ou quando o grupo da conta deixou de ter acesso à API. O corpo não diz qual. Nos endpoints /v1 o corpo usa o formato de erro da OpenAI:
{
"error": {
"message": "Missing or invalid API key. Send it as \"Authorization: Bearer <key>\".",
"type": "invalid_request_error",
"param": null,
"code": "invalid_api_key"
}
}Nos endpoints /api/v1 é {"message": "Unauthenticated."}. Veja erros.
O que uma chave de API não faz#
Algumas operações precisam de uma pessoa diante de uma tela, não de um script. Com uma chave de API elas respondem 403, ou 401 onde indicado:
- gerar ou revogar uma chave;
- salvar ou remover as chaves de provedores de nuvem, e conectar assinaturas de provedores (veja provedores e suas chaves);
- endpoints de administração, que aceitam só tokens de sessão e respondem
401a uma chave.
Tokens de sessão#
O token devolvido pelo login funciona nos mesmos endpoints de API que uma chave (nos endpoints /v1 só se o seu grupo tem acesso à API), e também nas operações de conta que uma chave não faz, como gerar uma chave. Ele serve para sessões curtas e para os apps. Para scripts e serviços, use uma chave.
Boas práticas#
- Leia a chave do ambiente ou de um cofre de segredos.
- Use uma conta por integração, para que um vazamento fique contido e o uso seja atribuível.
- Se você registra credenciais para depurar, registre só a parte
shvia_usr_<id>_. - Guarde o header
X-Request-Iddas chamadas que falharam. Ele identifica a requisição, e o suporte consegue encontrá-la.