Pular para o conteúdo principal

Guia de Autenticação

Este guia explica passo a passo como obter um token de acesso para utilizar a API PIX da CorpX.

Visão Geral

A API CorpX utiliza OAuth 2.0 com o fluxo Client Credentials para autenticação. Você precisará das suas credenciais (client_id e client_secret) para obter um token de acesso válido.

Pré-requisitos

Antes de começar, certifique-se de que você possui:

  • Client ID - Seu identificador único de cliente
  • Client Secret - Chave secreta para autenticação
  • X-Tenant-Id - Seu identificador de tenant (ex.: tenant-suaempresa)
informação

Se você ainda não possui credenciais, entre em contato com nossa equipe de suporte.

Ambientes

AmbienteURL de AutenticaçãoURL da APIObservações
Sandbox (dev)Temporariamente desativado.
Produçãohttps://auth.api.corpx.com/oauth2/tokenhttps://tenant.api.corpx.com

Passo 1: Solicitar um Token de Acesso

Request

curl -X POST "https://auth.api.corpx.com/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"

Parâmetros

ParâmetroTipoObrigatórioDescrição
grant_typestringSimSempre client_credentials
client_idstringSimSeu identificador de cliente
client_secretstringSimSua chave secreta
scopestringNãoSubconjunto dos escopos da credencial, separado por espaço. Omitir devolve um token com todos os escopos dela

Resposta de Sucesso (200 OK)

{
"access_token": "eyJraWQiOiJ0emwzZWVYWGx1eVlDWHFwQXdBTzJWYWJNQ0llMFMyMXVRWGV2Y281N2RRPSIsImFsZyI6IlJTMjU2In0...",
"expires_in": 300,
"token_type": "Bearer"
}
CampoDescrição
access_tokenToken JWT para autenticação nas chamadas à API
expires_inTempo de validade em segundos
token_typeTipo do token (sempre Bearer)
Confie sempre no expires_in

O TTL não é o mesmo para todas as credenciais: as criadas pelo painel do backoffice valem 5 minutos (expires_in: 300), enquanto credenciais antigas, provisionadas manualmente, ainda valem 1 hora. Não fixe 3600 no seu cliente — leia o expires_in da resposta e renove com folga sobre ele.

Resposta de Erro (401 Unauthorized)

{
"error": "invalid_client",
"error_description": "Client authentication failed"
}

Passo 2: Usar o Token nas Requisições

Com o token obtido, inclua-o no header Authorization de todas as requisições à API.

Exemplo: Consultar Saldo

curl -X GET "https://tenant.api.corpx.com/v1/accounts/{accountId}/balance" \
-H "Authorization: Bearer eyJraWQiOiJ0emwzZWVYWGx1eVlDWHFwQXdBTzJWYWJNQ0llMFMyMXVRWGV2Y281N2RRPSIsImFsZyI6IlJTMjU2In0..." \
-H "X-Tenant-Id: tenant-suaempresa" \
-H "Content-Type: application/json"

Headers Obrigatórios

HeaderDescrição
AuthorizationToken de acesso no formato Bearer {access_token}
X-Tenant-IdSeu identificador de tenant
Content-Typeapplication/json para requisições com body

Passo 3: Renovar o Token

O token expira após o tempo indicado em expires_in. Recomendamos:

  1. Armazene o token em cache com o expires_in que veio na resposta
  2. Renove antes de expirar — com TTL de 5 minutos, renovar no último minuto já é apertado
  3. Trate o 403 de token expirado — a API responde 403 Forbidden, não 401; ao recebê-lo, obtenha um novo token e repita a chamada

Exemplo de Renovação Automática (Bash)

#!/bin/bash

# Variables
CLIENT_ID="your_client_id"
CLIENT_SECRET="your_client_secret"
AUTH_URL="https://auth.api.corpx.com/oauth2/token"

# Function to get token
get_token() {
response=$(curl -s -X POST "$AUTH_URL" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET")

echo "$response" | jq -r '.access_token'
}

# Get token
TOKEN=$(get_token)

# Use the token
curl -X GET "https://tenant.api.corpx.com/v1/accounts/{accountId}/balance" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-Id: tenant-suaempresa"

Exemplos Completos em Diferentes Linguagens

Python

import requests

# Credentials
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
TENANT_ID = "tenant-suaempresa"

# Get token
auth_response = requests.post(
"https://auth.api.corpx.com/oauth2/token",
data={
"grant_type": "client_credentials",
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET
}
)

token = auth_response.json()["access_token"]

# Use the token
headers = {
"Authorization": f"Bearer {token}",
"X-Tenant-Id": TENANT_ID,
"Content-Type": "application/json"
}

response = requests.get(
"https://tenant.api.corpx.com/v1/accounts/{accountId}/balance",
headers=headers
)

print(response.json())

Node.js

const axios = require('axios');

const CLIENT_ID = 'your_client_id';
const CLIENT_SECRET = 'your_client_secret';
const TENANT_ID = 'tenant-suaempresa';

async function getToken() {
const response = await axios.post(
'https://auth.api.corpx.com/oauth2/token',
new URLSearchParams({
grant_type: 'client_credentials',
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET
}),
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
);
return response.data.access_token;
}

async function getBalance(accountId) {
const token = await getToken();

const response = await axios.get(
`https://tenant.api.corpx.com/v1/accounts/${accountId}/balance`,
{
headers: {
'Authorization': `Bearer ${token}`,
'X-Tenant-Id': TENANT_ID,
'Content-Type': 'application/json'
}
}
);

return response.data;
}

Escopos de credencial

Cada credencial (client_id/client_secret) carrega um conjunto de escopos que define exatamente o que ela pode fazer. Você escolhe os escopos ao criar a credencial no painel do backoffice (seção API Credentials, disponível para usuários com perfil tenant manager).

Escopos que você mesmo concede:

EscopoLibera
readConsultas amplas da conta: saldo, extrato, timeline, lançamentos
qrcode.manageQR code estático e dinâmico: criar, cancelar e consultar o pagamento do próprio QR
pix_keys.manageChaves PIX: listar, criar e excluir
webhooks.manageAssinaturas de webhook, entregas e reenvio
exports.createExports de extrato: criar, acompanhar e baixar
med.defendMED: consultar, responder e anexar evidências (não decide a devolução)

Cada escopo já consulta o próprio domínio. É o que permite uma credencial de recebimento que emite QR code e vê se ele foi pago sem ter acesso ao saldo e ao extrato: basta conceder qrcode.manage sozinho. Marque read apenas quando a credencial precisar realmente das consultas amplas da conta.

Escopos que movimentam dinheiro são emitidos pela CorpX, nunca pelo painel:

EscopoLibera
pix_out.createPIX out em todas as variantes (/pix/out/*), com o status dos próprios pagamentos
refund.createDevolução de PIX recebido, com o status das próprias devoluções
internal_transfer.createTransferência interna, com o lookup do destino
ted.createTED, com o status das próprias transferências
boleto_payment.createPreview, pagamento e status de boleto
med.decideDecidir a devolução de um MED

Se você pedir um desses escopos pelo painel, a criação é recusada com 403 scope_not_self_service — fale com o suporte para emitirmos a credencial.

Restrição por conta

Uma credencial pode ficar restrita a contas específicas do seu tenant. É o caminho para, por exemplo, dar a um subsistema uma credencial que só emite QR code de uma conta. Chamadas a contas fora do conjunto respondem 403 forbidden — o erro genérico de permissão, sem insufficient_scope: o escopo está lá, a conta é que não. A mensagem não distingue conta inexistente de conta fora do conjunto, de propósito.

Combinando as duas dimensões: qrcode.manage + uma única conta resulta numa credencial que cobra por QR code naquela conta e não enxerga mais nada — nem o saldo dela, nem as outras contas do tenant.

Quando falta escopo

Se a credencial não tem o escopo da rota, a API responde 403 Forbidden nomeando o que falta:

{ "errorCode": "insufficient_scope", "message": "esta credencial não tem escopo para esta operação; é necessário o escopo qrcode.manage" }

Credenciais emitidas antes dos escopos granulares continuam funcionando sem alteração: elas mantêm o par grosso (api2/read api2/write) e acesso total.

Acesso suspenso por pendência

Quando existe uma pendência em aberto com a CorpX, o acesso do tenant pode ser suspenso temporariamente. A suspensão não invalida sua credencial: o mesmo client_id/client_secret continua obtendo token normalmente, e a recusa vem na chamada à API.

EstadoO que continua funcionandoResposta nas demais chamadas
SuspensoConsultas (GET) — saldo, extrato, status de operações403 tenant_suspended nas escritas
DesativadoNada403 tenant_disabled em todas as rotas
{ "errorCode": "tenant_suspended", "message": "há uma pendência em aberto: operações de escrita estão suspensas até a regularização, consultas seguem disponíveis" }

Dois pontos importantes:

  • O dinheiro não para. PIX recebido continua sendo creditado, e você continua recebendo os webhooks desses eventos. O que a suspensão bloqueia é iniciar novas operações.
  • Reativar é imediato. Assim que a pendência é regularizada, o acesso volta na chamada seguinte — não é preciso gerar credencial nova nem novo token.

O motivo da pendência não vem no corpo do erro: ele aparece no painel do backoffice, para os operadores do seu time.

Erros Comuns

ErroCausaSolução
invalid_clientClient ID ou Secret incorretosVerifique suas credenciais
invalid_grantTipo de grant inválidoUse client_credentials
401 UnauthorizedHeader Authorization ausenteEnvie Authorization: Bearer <token>
403 Forbidden (token inválido/expirado)Token expirado, inválido ou assinatura incorretaObtenha um novo token. Note que expiração é 403, não 401
403 insufficient_scopeCredencial sem o escopo da rotaCrie uma credencial com o escopo indicado na mensagem
403 tenant_suspendedPendência em aberto: escrita suspensaRegularize com o suporte CorpX; consultas seguem disponíveis
403 tenant_disabledTenant desativadoFale com o suporte CorpX para reativar
403 forbiddenToken válido, mas sem permissão nesse tenant ou nessa contaVerifique o X-Tenant-Id e se a credencial está restrita a outras contas

Boas Práticas

  1. Nunca exponha o client_secret em código client-side (frontend)
  2. Use variáveis de ambiente para armazenar credenciais
  3. Implemente cache de token para evitar requisições desnecessárias
  4. Monitore a expiração e renove tokens de forma proativa
  5. Use HTTPS para todas as comunicações

Próximos Passos

Agora que você sabe como autenticar, explore os outros guias: