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

Metadados (RFC 8414)
https://app.zaplin.com.br/.well-known/oauth-authorization-server/api/auth
Para quêEndpoint
Issuerhttps://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.1 ou [::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.href

O 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:send vem 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/v1

O 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.

Nesta página