Autenticação

Duas formas OAuth 2.0 de obter o mesmo token para a API BeeFood.

Qual escolher?

Integração diretaConectar com BeeFood
Fluxo OAuthClient CredentialsAuthorization Code + PKCE
Quem cria a credencialLojista no portal DevelopersLojista ao conectar no site da integradora
A integradora recebeclientId + clientSecretTokens, sem acesso ao segredo
Indicado paraSistema próprio ou poucos clientesIntegradora com muitos lojistas
Cadastro prévioNãoNão

Ambas usam as mesmas rotas /v1, os mesmos escopos e Authorization: Bearer. Apenas a obtenção do token muda.

Ambientes

ItemProduçãoSandbox
Autorização (login + consentimento)https://beefood.app/oauth/authorizehttps://api-sandbox.beefood.app/oauth/authorize
Token / Renovaçãohttps://api.beefood.app/v1/oauth/tokenhttps://api-sandbox.beefood.app/v1/oauth/token
Revogaçãohttps://api.beefood.app/v1/oauth/revokehttps://api-sandbox.beefood.app/v1/oauth/revoke
Metadatahttps://api.beefood.app/.well-known/oauth-authorization-serverhttps://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

  1. O lojista cria uma credencial no portal Developers e escolhe seus escopos.
  2. O lojista entrega clientId e clientSecret à integradora. O segredo é exibido uma única vez.
  3. 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 tokens

Renovar 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 scopes

Erros

StatusQuando
400Campo obrigatório ausente ou grant_type inválido
401Credencial, code, verifier, refresh ou token inválido/expirado
403Token válido sem o escopo exigido
json
{
  "message": "Invalid client credentials",
  "status": 401
}