Bem-vindo à API AQhub
Construímos uma API REST limpa, previsível e documentada para que seu time consiga ir do primeiro hello world ao primeiro Pix em produção sem fricção.
O que você pode fazer
- Emitir e pagar Pix (chave, copia-e-cola, QR)
- Transferências TED e entre contas
- Abrir contas digitais (PF e PJ) por API
- Emitir e liquidar boletos
- Gerenciar cartões pré-pagos e virtuais
- Receber eventos em webhooks assinados
- Consultar extrato, saldo e comprovantes
- Cobranças recorrentes e parceladas
Ambientes
Você recebe um par de credenciais por ambiente. Recomendamos começar pelo sandbox.
Dados fictícios. Use para desenvolver e validar integrações.
https://sandbox.apirest.aqhub.com.brDinheiro real, regulatório vigente. Disponível após aprovação do plano de integração.
https://apirest.aqhub.com.brDomínios próprios garantem que o endpoint base da sua aplicação nunca mude, mesmo se houver migração de infraestrutura por trás.
Quickstart
Do zero ao primeiro request autenticado em três passos.
- 1
Solicite suas credenciais
Fale com seu gerente de conta. Você receberá um client_id e um client_secret — esse segredo é mostrado uma única vez.
- 2
Troque por um access token
auth.shcurl -X POST https://sandbox.apirest.aqhub.com.br/v1/auth/token \ --cert ./client.crt --key ./client.key \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=aqp_xxxxxxxxxxxx" \ -d "client_secret=sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - 3
Chame sua primeira rota
balance.shcurl https://sandbox.apirest.aqhub.com.br/v1/accounts/balance \ --cert ./client.crt --key ./client.key \ -H "Authorization: Bearer eyJhbGciOi...<access_token>" \ -H "X-Idempotency-Key: 7f3a-..." \ -H "Accept: application/json"
OAuth2 Client Credentials
Toda chamada precisa de um access token JWT de curta duração. Sem cookies, sem sessão, sem refresh token — apenas peça outro quando vencer.
mTLS obrigatório
Toda chamada — incluindo /v1/auth/token — exige certificado mTLS do cliente. Gere um par de chaves, cadastre o client.crt (parte pública) no portal Desenvolvedor → aba mTLS, e envie --cert client.crt --key client.key em todo request. Sem certificado válido a API responde 401 mtls_required.
Obter um access token
curl -X POST https://sandbox.apirest.aqhub.com.br/v1/auth/token \
--cert ./client.crt --key ./client.key \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=aqp_xxxxxxxxxxxx" \
-d "client_secret=sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5...",
"token_type": "Bearer",
"expires_in": 900,
"scope": "accounts.read pix.write"
}Requisições autenticadas
Exemplos prontos para colar em qualquer projeto.
import fetch from "node-fetch";
import https from "node:https";
import fs from "node:fs";
const BASE = "https://sandbox.apirest.aqhub.com.br";
// mTLS é obrigatório em todas as chamadas
const agent = new https.Agent({
cert: fs.readFileSync(process.env.AQHUB_CLIENT_CERT!), // client.crt
key: fs.readFileSync(process.env.AQHUB_CLIENT_KEY!), // client.key
});
async function getToken() {
const res = await fetch(`${BASE}/v1/auth/token`, {
method: "POST",
agent,
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
grant_type: "client_credentials",
client_id: process.env.AQHUB_CLIENT_ID!,
client_secret: process.env.AQHUB_CLIENT_SECRET!,
}),
});
if (!res.ok) throw new Error(`auth failed: ${res.status}`);
const { access_token, expires_in } = await res.json();
return { access_token, expires_in };
}
const { access_token } = await getToken();
const balance = await fetch(`${BASE}/v1/accounts/balance`, {
agent,
headers: { Authorization: `Bearer ${access_token}` },
}).then((r) => r.json());
console.log(balance);import os, requests
BASE = "https://sandbox.apirest.aqhub.com.br"
# mTLS é obrigatório em todas as chamadas
CERT = (os.environ["AQHUB_CLIENT_CERT"], os.environ["AQHUB_CLIENT_KEY"])
def get_token():
r = requests.post(f"{BASE}/v1/auth/token", cert=CERT, data={
"grant_type": "client_credentials",
"client_id": os.environ["AQHUB_CLIENT_ID"],
"client_secret": os.environ["AQHUB_CLIENT_SECRET"],
})
r.raise_for_status()
return r.json()["access_token"]
token = get_token()
balance = requests.get(
f"{BASE}/v1/accounts/balance",
cert=CERT,
headers={"Authorization": f"Bearer {token}"}
).json()
print(balance)Rate limits & idempotência
Rate limit padrão
300 req/min e 100.000 req/dia por cliente. Quando excedido, devolvemos 429 com header Retry-After.
Idempotência
Envie X-Idempotency-Key em qualquer rota financeira. A resposta fica cacheada por 24h para a mesma chave.
Webhooks assinados
Receba eventos em tempo real e valide a assinatura HMAC SHA-256 com o segredo do webhook.
import crypto from "node:crypto";
export function verifyAqhubSignature(req: Request, secret: string) {
const signature = req.headers.get("x-aqbank-signature") ?? "";
const timestamp = req.headers.get("x-aqbank-timestamp") ?? "";
const body = req.body ?? "";
const expected =
"sha256=" +
crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${body}`)
.digest("hex");
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}Códigos de erro
| HTTP | Código | O que fazer |
|---|---|---|
| 400 | invalid_request | Corrija o payload conforme a mensagem de erro. |
| 401 | invalid_token | Renove o access token via /auth/token. |
| 403 | forbidden_scope | Solicite o escopo ao gerente da conta. |
| 404 | not_found | Confirme o ID consultado. |
| 409 | idempotency_conflict | A chave foi reutilizada com payload diferente. |
| 422 | business_rule_violation | Veja `details` para a regra violada. |
| 429 | rate_limited | Aguarde o tempo do header Retry-After. |
| 500 | internal_error | Tente novamente; persistindo, abra um chamado. |
Prompts prontos para LLMs
Cole esse prompt no Cursor, Claude, ChatGPT ou Copilot Chat antes de pedir código de integração. Reduz drasticamente alucinação.
Você é um engenheiro integrando a AQhub API REST.
Documentação base: https://docs.aqhub.com.br
Ambiente sandbox: https://sandbox.apirest.aqhub.com.br
Ambiente produção: https://apirest.aqhub.com.br
Regras obrigatórias:
1. mTLS é OBRIGATÓRIO em TODAS as chamadas. Sempre envie o par client.crt + client.key (curl --cert/--key, https.Agent no Node, requests cert= no Python). Sem certificado válido cadastrado no portal, a API responde 401 mtls_required.
2. Autentique via OAuth2 Client Credentials em POST /v1/auth/token com client_id e client_secret.
3. O access_token retornado é JWT HS256, válido por 900 segundos (15 min). Renove antes do vencimento.
4. Envie sempre o header "Authorization: Bearer <access_token>".
5. O IP de origem precisa estar na whitelist da aplicação (cadastrada no portal Desenvolvedor).
6. Em endpoints financeiros (transferências, pix-out, pagamento) envie "X-Idempotency-Key" único por operação.
7. Nunca exponha client_secret nem client.key em frontend, mobile ou repositórios públicos.
8. Trate 401 como token expirado/inválido ou certificado mTLS inválido — refaça /auth/token (não há refresh token).
9. Trate 429 com backoff exponencial respeitando o header Retry-After.
Gere o código de integração na linguagem que eu pedir, seguindo essas regras.Dica
Em breve disponibilizaremos o arquivo aqhub.openapi.yaml e o pacote @aqhub/llms.txt, ambos importáveis diretamente em IDEs com suporte a contexto (Cursor, Zed, Windsurf).
Conecte sua IA via MCP
A AQhub expõe um servidor MCP (Model Context Protocol) remoto. Conecte Claude Desktop, Cursor, ChatGPT, Zed ou Windsurf e a IA consulta a documentação ao vivo — endpoints, scopes, autenticação, webhooks e códigos de erro.
https://mcp.aqhub.com.brTransporte: Streamable HTTP (sem autenticação para leitura da documentação).
Ferramentas expostas
list_endpointsLista todos os endpoints REST com método, path e scopes.get_endpoint_specDetalhes de um endpoint específico (headers, scopes, URLs).get_auth_guideGuia completo de OAuth2 + mTLS com exemplos cURL.get_webhook_signature_guideComo validar assinatura HMAC-SHA256 dos webhooks.list_error_codesCódigos de erro padronizados e como resolver.get_environmentsURLs base de produção e sandbox.
Cursor / Windsurf / Zed
{
"mcpServers": {
"aqhub": {
"url": "https://mcp.aqhub.com.br"
}
}
}Claude Desktop
Adicione ao seu claude_desktop_config.json:
{
"mcpServers": {
"aqhub": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.aqhub.com.br"]
}
}
}