Autenticação
Duas formas OAuth 2.0 de obter o mesmo token para a API BeeFood.
Qual escolher?
| Integração direta | Conectar com BeeFood | |
|---|---|---|
| Fluxo OAuth | Client Credentials | Authorization Code + PKCE |
| Quem cria a credencial | Lojista no portal Developers | Lojista ao conectar no site da integradora |
| A integradora recebe | clientId + clientSecret | Tokens, sem acesso ao segredo |
| Indicado para | Sistema próprio ou poucos clientes | Integradora com muitos lojistas |
| Cadastro prévio | Não | Não |
Ambas usam as mesmas rotas /v1, os mesmos escopos e Authorization: Bearer. Apenas a obtenção do token muda.
Ambientes
| Item | Produção | Sandbox |
|---|---|---|
| Autorização (login + consentimento) | https://beefood.app/oauth/authorize | https://api-sandbox.beefood.app/oauth/authorize |
| Token / Renovação | https://api.beefood.app/v1/oauth/token | https://api-sandbox.beefood.app/v1/oauth/token |
| Revogação | https://api.beefood.app/v1/oauth/revoke | https://api-sandbox.beefood.app/v1/oauth/revoke |
| Metadata | https://api.beefood.app/.well-known/oauth-authorization-server | https://api-sandbox.beefood.app/.well-known/oauth-authorization-server |
A URL selecionada no menu lateral é usada nos exemplos abaixo. Descoberta OAuth: GET /.well-known/oauth-authorization-server.
Integração direta · Client Credentials
- O lojista cria uma credencial no portal Developers e escolhe seus escopos.
- O lojista entrega clientId e clientSecret à integradora. O segredo é exibido uma única vez.
- O servidor da integradora troca as chaves pelo par de tokens.
curl
curl -X POST 'https://api.beefood.app/v1/oauth/token' \
-H 'Content-Type: application/json' \
-d '{"grantType":"client_credentials","clientId":"<CLIENT_ID>","clientSecret":"<CLIENT_SECRET>"}'Node.js
const response = await fetch("https://api.beefood.app/v1/oauth/token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ grantType: "client_credentials", clientId: "<CLIENT_ID>", clientSecret: "<CLIENT_SECRET>" }),
});
const tokens = await response.json();json
{
"accessToken": "<ACCESS_TOKEN>",
"refreshToken": "<REFRESH_TOKEN>",
"expiresAt": "<ISO_8601>"
}Nunca coloque o clientSecret no navegador, aplicativo mobile ou repositório.
Ver referência de emissão de tokensRenovar token
O access token dura 1 hora e o refresh token, 30 dias. Cada renovação substitui imediatamente o par anterior: salve o novo par antes de usá-lo e evite renovações simultâneas para o mesmo restaurante.
curl
curl -X POST 'https://api.beefood.app/v1/oauth/token' -H 'Content-Type: application/json' -d '{"grantType":"refresh_token","clientId":"<CLIENT_ID>","refreshToken":"<REFRESH_TOKEN>"}'Node.js
await fetch("https://api.beefood.app/v1/oauth/token", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ grantType: "refresh_token", clientId: "<CLIENT_ID>", refreshToken: "<REFRESH_TOKEN>" }) });Revogar token
curl
curl -X POST 'https://api.beefood.app/v1/oauth/revoke' -H 'Content-Type: application/json' -d '{"clientId":"<CLIENT_ID>","clientSecret":"<CLIENT_SECRET>","token":"<TOKEN>"}'Node.js
await fetch("https://api.beefood.app/v1/oauth/revoke", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ clientId: "<CLIENT_ID>", clientSecret: "<CLIENT_SECRET>", token: "<TOKEN>" }) });Usar o token
header
Authorization: Bearer <ACCESS_TOKEN>As duas formas acessam as mesmas rotas e escopos. Escrita inclui leitura do mesmo recurso; sem o escopo da rota a API responde 403.
Ver tabela de scopesErros
| Status | Quando |
|---|---|
| 400 | Campo obrigatório ausente ou grant_type inválido |
| 401 | Credencial, code, verifier, refresh ou token inválido/expirado |
| 403 | Token válido sem o escopo exigido |
json
{
"message": "Invalid client credentials",
"status": 401
}
