AQpay

    AQpay / Documentação AQhub

    Documentação para integrar com AQpay.

    APIs, autenticação, webhooks e módulos de pagamento. Encontre a referência para sua integração.

    Segurança bancária

    OAuth2 Client Credentials, mTLS obrigatório em todas as chamadas, IP whitelist por aplicação e auditoria completa.

    Latência baixa

    Edge gateway próprio em São Paulo, rate limits por cliente e idempotência nativa em rotas financeiras.

    IA-friendly

    Prompts oficiais prontos para Cursor, Copilot, Claude e ChatGPT gerarem código correto na primeira tentativa.

    Visão geral

    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
    URLs

    Ambientes

    Você recebe um par de credenciais por ambiente. Recomendamos começar pelo sandbox.

    Sandbox

    Dados fictícios. Use para desenvolver e validar integrações.

    https://sandbox.apirest.aqhub.com.br
    Produção

    Dinheiro real, regulatório vigente. Disponível após aprovação do plano de integração.

    https://apirest.aqhub.com.br

    Domínios próprios garantem que o endpoint base da sua aplicação nunca mude, mesmo se houver migração de infraestrutura por trás.

    5 minutos

    Quickstart

    Do zero ao primeiro request autenticado em três passos.

    1. 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. 2

      Troque por um access token

      auth.sh
      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"
    3. 3

      Chame sua primeira rota

      balance.sh
      curl 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"
    Autenticação

    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.

    Grant type
    client_credentials
    Algoritmo
    HS256 (JWT)
    Validade
    900 segundos

    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
    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"
    Resposta
    200 OK
    {
      "access_token": "eyJhbGciOiJIUzI1NiIsInR5...",
      "token_type": "Bearer",
      "expires_in": 900,
      "scope": "accounts.read pix.write"
    }

    Requisições autenticadas

    Exemplos prontos para colar em qualquer projeto.

    node.ts
    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);
    python.py
    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)
    Resiliência

    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.

    Eventos

    Webhooks assinados

    Receba eventos em tempo real e valide a assinatura HMAC SHA-256 com o segredo do webhook.

    verify-webhook.ts
    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));
    }
    Reference

    Códigos de erro

    HTTPCódigoO que fazer
    400invalid_requestCorrija o payload conforme a mensagem de erro.
    401invalid_tokenRenove o access token via /auth/token.
    403forbidden_scopeSolicite o escopo ao gerente da conta.
    404not_foundConfirme o ID consultado.
    409idempotency_conflictA chave foi reutilizada com payload diferente.
    422business_rule_violationVeja `details` para a regra violada.
    429rate_limitedAguarde o tempo do header Retry-After.
    500internal_errorTente novamente; persistindo, abra um chamado.
    IA

    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.

    prompt-aqhub.md
    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).

    MCP

    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.

    URL do servidor MCP
    mcp-url
    https://mcp.aqhub.com.br

    Transporte: 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

    .cursor/mcp.json
    {
      "mcpServers": {
        "aqhub": {
          "url": "https://mcp.aqhub.com.br"
        }
      }
    }

    Claude Desktop

    Adicione ao seu claude_desktop_config.json:

    claude_desktop_config.json
    {
      "mcpServers": {
        "aqhub": {
          "command": "npx",
          "args": ["-y", "mcp-remote", "https://mcp.aqhub.com.br"]
        }
      }
    }
    Precisa de algo que não está aqui? Fale com nosso time.