OAuth 2.1
Apps que agem em nome de uma pessoa, em qualquer workspace.
Com OAuth, uma pessoa autoriza o seu app a agir por ela em um workspace dela. O app recebe um access token que vale para a API (/api/v1) ou para o servidor MCP (/api/mcp) e alcança só o que os escopos concedidos e o papel da pessoa permitem.
O servidor de autorização é o do próprio Zaplin, com Authorization Code e PKCE (S256), registro dinâmico de clientes (RFC 7591) e resource indicators (RFC 8707).
Endpoints
https://app.zaplin.com.br/.well-known/oauth-authorization-server/api/auth| Para quê | Endpoint |
|---|---|
| Issuer | https://app.zaplin.com.br/api/auth |
| Autorização | /api/auth/oauth2/authorize |
| Token | /api/auth/oauth2/token |
| Registro dinâmico | /api/auth/oauth2/register |
| Revogação | /api/auth/oauth2/revoke |
| Introspecção | /api/auth/oauth2/introspect |
| Userinfo | /api/auth/oauth2/userinfo |
| Chaves públicas (JWKS) | /api/auth/jwks |
Leia os endereços dos metadados em vez de fixá-los no código.
Registre o app
Há dois jeitos:
Em Desenvolvedores → OAuth apps
Owner e Admin criam apps em Configurações → Desenvolvedores → OAuth apps → Novo app OAuth:
- Nome: aparece na tela de consentimento.
- URIs de redirecionamento: uma por linha, de 1 a 10. HTTPS, ou HTTP em
localhost,127.0.0.1ou[::1], sem fragmento (#). - Escopos: os mesmos das chaves de API, pelo menos um.
O app recebe um client ID e um segredo cs_live_…, que aparece uma única vez. É um cliente confidencial: autentica no token com client_secret_basic, usa os grants authorization_code e refresh_token, e o PKCE é obrigatório.
Rotacionar segredo emite um segredo novo, e o antigo continua valendo por 24 horas para você trocar sem parar o app (Revogar agora encerra o antigo antes). Rotacionar pede que você tenha entrado nos últimos 10 minutos.
Registro dinâmico
Clientes como assistentes de IA se registram sozinhos com POST /api/auth/oauth2/register, sem login. O PKCE é obrigatório e não pode ser desligado. Esses clientes não aparecem em OAuth apps e não passam por verificação.
O fluxo
Mande a pessoa autorizar
Gere um code_verifier, calcule o code_challenge (S256) e mande o navegador para a URL de autorização:
import { createHash, randomBytes } from "node:crypto"
const verifier = randomBytes(32).toString("base64url") // guarde para o próximo passo
const challenge = createHash("sha256").update(verifier).digest("base64url")
const url = new URL("https://app.zaplin.com.br/api/auth/oauth2/authorize")
url.search = new URLSearchParams({
response_type: "code",
client_id: CLIENT_ID,
redirect_uri: "https://seuapp.com/callback",
scope: "contacts:read messages:write offline_access",
state: STATE,
code_challenge: challenge,
code_challenge_method: "S256",
resource: "https://app.zaplin.com.br/api/v1",
}).toString()
// mande o navegador para url.hrefO resource diz para onde o token vai: https://app.zaplin.com.br/api/v1 para a API, https://app.zaplin.com.br/api/mcp para o MCP. Sem ele, o token não é aceito.
A tela de consentimento
A pessoa entra no Zaplin, se ainda não entrou, e vê Autorizar {app}?:
- Workspace: ela escolhe um dos workspaces em que pode autorizar apps. O token vale para esse workspace.
- O {app} poderá: uma frase por escopo pedido, como "Ler e editar contatos" ou "Enviar mensagens em seu nome".
campaigns:sendvem marcado como Alto risco. - O {app} não poderá: gerenciar membros, cobrança ou credenciais, nem conectar ou desconectar números de WhatsApp.
Ela clica em Autorizar ou Recusar, e o navegador volta para o seu redirect_uri com code e state.
Só autoriza quem é membro do workspace com assento e não é Viewer.
Troque o código pelo token
curl https://app.zaplin.com.br/api/auth/oauth2/token \
-u "CLIENT_ID:CLIENT_SECRET" \
-d grant_type=authorization_code \
-d code=CODE \
-d redirect_uri=https://seuapp.com/callback \
-d code_verifier=CODE_VERIFIER \
-d resource=https://app.zaplin.com.br/api/v1O access token é um JWT que vale 10 minutos. Com offline_access vem também um refresh token, que vale 30 dias; troque-o com grant_type=refresh_token.
Chame a API
curl https://app.zaplin.com.br/api/v1/conversations?status=open \
-H "Authorization: Bearer ACCESS_TOKEN"O que um token alcança
- Os escopos concedidos, e só onde o membro tem a permissão correspondente (veja a tabela de escopos). Uma chamada fora disso recebe
403. - As conversas, números e grupos que o membro vê pelo alcance dele (todo o workspace, as equipes dele ou só o que é atribuído a ele).
- O que o app faz aparece na auditoria em nome do app e da pessoa.
O token é conferido a cada chamada: se o app for desconectado, se a pessoa sair do workspace, perder o assento ou virar Viewer, a próxima chamada recebe 401.
Apps não verificados
Um app criado em OAuth apps nasce Não verificado e pode ser conectado ao workspace dono dele e a mais 10 workspaces. Para passar disso, peça a verificação em Pedir verificação, contando como o app usa os dados (e, se quiser, o site ou a documentação dele). O app fica Em análise até a equipe do Zaplin responder. Mudar as URIs de redirecionamento para outro domínio volta o app para Não verificado.
Desconectar
Owner e Admin veem cada app autorizado no workspace em Configurações → Desenvolvedores → Apps conectados. Revogar acesso apaga a autorização e os refresh tokens; os access tokens param na próxima chamada.