Autenticação
A credencial da sua máquina é o par client_id e client_secret. Troque os dois por um token OAuth2 (client_credentials) e envie o token em Authorization: Bearer em toda chamada a /v2/. O token vale 900 segundos.
A API só aceita chamadas dos IPs do seu servidor cadastrados na sua credencial. Você gera o client_secret e informa os IPs de saída no painel, em O segredo e os IPs no painel.
Token #
POST /oauth/token
O client_id e o client_secret vão em HTTP Basic. É o que curl -u faz:
curl -u "loja01:SEU_CLIENT_SECRET" -d "grant_type=client_credentials" -d "scope=cob.write cob.read pix.read ex.saldo.read ex.config.read" https://api.amunpay.com/oauth/token
POST /oauth/token
Authorization: Basic base64(client_id:client_secret)
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&scope=cob.write cob.read pix.read ex.saldo.read ex.config.read
→ 200
{
"access_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IjAxSjEifQ...",
"token_type": "Bearer",
"expires_in": 900,
"scope": "cob.write cob.read pix.read ex.saldo.read ex.config.read"
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
grant_type |
string | sim | Sempre client_credentials. |
scope |
string | não | Escopos separados por espaço, no máximo 10, dentro dos concedidos. Omitido, o token traz todos os escopos concedidos. |
Como alternativa ao Basic, client_id e client_secret podem ir no corpo do formulário. Mandar os dois nas duas formas com valores diferentes responde 400 invalid_request.
O token só é emitido e só vale para chamadas vindas dos IPs cadastrados: de outro IP, o pedido do token e cada chamada respondem 403 origem_nao_permitida. Sem nenhum IP cadastrado, nenhuma chamada passa.
O segredo e os IPs no painel #
O gestor da sua empresa gera o client_secret no painel, em Integração, na aba Credenciais, com o código do segundo fator. O segredo aparece uma vez, ao lado do client_id, cada um com o botão de copiar, e nunca é mostrado de novo. Perdeu, gere outro: o anterior deixa de valer na hora. Os tokens já emitidos valem até expirar, salvo quando você marca suspeita de vazamento, que os derruba também.
| Quando | O que acontece |
|---|---|
| Primeira credencial | Você informa pelo menos um IP de saída, e os IPs valem na hora. |
| Gerar de novo | Um segredo novo. Os escopos e os IPs ficam. |
| Tirar um IP | Vale na hora. |
| Incluir um IP | Vale na hora, com um e-mail aos contatos técnico e financeiro da sua empresa. Se a AmunPay ligar a espera de IP para a sua conta, ele vale 24 horas depois: a tela mostra a hora em que ele passa a valer, e você pode desistir antes. |
O painel aceita IP público, com prefixo até /24 (IPv4) ou /48 (IPv6), até 20 IPs. Todo ato sobre a credencial vai por e-mail aos contatos da sua empresa, sem o segredo. Sem contato técnico nem financeiro cadastrado, o painel não gera nem inclui IP.
Só o gestor gera e muda os IPs. Os outros usuários veem o client_id e os IPs. Se a AmunPay ligar a espera do segundo fator para a sua conta, o gestor que acabou de ativar o segundo fator, que foi promovido, reativado ou que teve a senha redefinida por outra pessoa espera 24 horas para gerar. A credencial de uma sub-conta com credencial própria é gerada pela empresa titular.
Se a tela disser que a funcionalidade não está habilitada para a sua conta, fale com a AmunPay. Ela também gera o segredo e cadastra os IPs para você, e pela AmunPay o IP novo vale na hora.
Primeira chamada #
GET /v2/ex/config
GET /v2/ex/config
→ 200
{
"conta": { "status": "ATIVA", "desde": "2026-09-18T09:20:23Z" },
"capacidades": {
"pix": true,
"subcontas": true,
"split": true,
"baas": false
},
"recebedor": { "chave": "01J8Z3QK5W7R2N4M6P8T0V2X4Y" },
"custodia": { "tipo": "PROPRIA", "custodiante": "Conta PI", "recusaAntesDoCredito": true },
"depositoPorChave": { "modo": "RECUSAR" }
}
| Campo | Tipo | Descrição |
|---|---|---|
conta.status |
string | ATIVA é o único estado que opera. |
capacidades |
objeto | O que esta conta pode usar. Leia antes de assumir. |
recebedor.chave |
string | Identificador da sua conta, que vai na chave das cobranças. Não o divulgue como chave Pix: receba sempre por cobrança, pelo pixCopiaECola. Um Pix sem txid não vira saldo, salvo quando depositoPorChave.modo é ACEITAR. |
custodia.tipo |
string | PROPRIA: a conta é desta instituição. PARCEIRA: conta nominal noutra instituição de pagamento. |
custodia.recusaAntesDoCredito |
booleano | true: um Pix recusado não entra na conta. false: ele entra e volta ao pagador por devolução. |
depositoPorChave.modo |
string | RECUSAR: um Pix sem cobrança é recusado ou devolvido. ACEITAR: ele vira uma cobrança e credita. |
Escopos #
| Escopo | O que libera |
|---|---|
cob.read, cob.write |
Cobranças. |
pix.read, pix.write |
Pix recebidos e devoluções. |
ex.pix.send, ex.pix.send.read |
Saques. |
ex.saldo.read, ex.extrato.read |
Saldo, extrato, transações e resumo. |
ex.webhook.read, ex.webhook.write, ex.eventos.read |
Webhooks e o feed de eventos. |
ex.subcontas.read, ex.subcontas.write |
Sub-contas. |
ex.limites.read, ex.limites.write, ex.bloqueios.read |
Limites e bloqueios de saldo. |
ex.med.read |
Contestações. |
ex.inquilinos.read, ex.inquilinos.write |
Credenciais próprias de sub-conta. |
ex.config.read |
GET /v2/ex/config. |
Erros do token #
O POST /oauth/token responde no formato { "error", "error_description" }.
| Status | error |
Quando |
|---|---|---|
| 401 | invalid_client |
Segredo errado, client_id desconhecido ou credencial suspensa (a resposta não diz qual), ou nenhuma credencial enviada. |
| 400 | invalid_request |
grant_type ausente, Basic que não decodifica, ou Basic e corpo divergentes. |
| 400 | unsupported_grant_type |
grant_type diferente de client_credentials. |
| 400 | invalid_scope |
Escopo fora dos concedidos, ou mais de 10. |
| 403 | origem_nao_permitida |
O IP de origem não está entre os IPs que valem na credencial. Um IP incluído pelo painel com a espera de IP ligada só vale 24 horas depois. |
| 429 | invalid_client |
Cinco segredos errados seguidos do mesmo IP. Espere o Retry-After; a tentativa durante a espera não é conferida. |
| 429 | limite_requisicoes |
Mais de 2 pedidos por segundo do mesmo IP (rajada de 20). Espere o Retry-After. |
| 413 | corpo_grande_demais |
O corpo passa de 4 KiB. |
Erros nas chamadas #
| Status | title |
Quando |
|---|---|---|
| 401 | acesso_negado |
Chamada sem Authorization: Bearer. |
| 401 | token_invalido |
Token inválido ou expirado. Renove. |
| 401 | token_revogado |
O token foi revogado antes de expirar (rotação do segredo, mudança de escopos ou suspensão). Peça outro token uma vez, com o segredo atual; se o pedido for recusado, fale com o suporte. |
| 403 | origem_nao_permitida |
O IP de origem não está entre os IPs que valem na credencial. Renovar não resolve. Um IP incluído pelo painel com a espera de IP ligada só vale 24 horas depois. |
| 403 | escopo_insuficiente |
O token não tem o escopo da rota. Peça um token com ele, ou sem scope. Se ele não estiver entre os concedidos, fale com o suporte. |
| 403 | merchant_nao_provisionado |
O client_id ainda não tem conta. |
| 403 | conta_bloqueada |
A conta não está ATIVA. |