Documentação da API https://cooperpay.io

Receba, envie e acompanhe pagamentos com a CooperPay.

Aqui você aprende a receber por Pix, enviar dinheiro, consultar seu saldo e ser avisado de cada pagamento, tudo com poucas chamadas de API.

Visão geral

A API da CooperPay é REST: você envia e recebe JSON por HTTPS. Tudo parte de um endereço base:

Endereço base
https://cooperpay.io
🔑

Autenticar

Troque suas credenciais por um token de acesso.

⚡

Receber por Pix

Crie uma cobrança e receba o QR Code / Pix copia e cola.

💸

Enviar dinheiro

Faça transferências Pix para qualquer chave.

📊

Consultar

Veja saldo, cobranças e transferências a qualquer momento.

🔔

Ser avisado

Receba um webhook assim que o status mudar.

Comece em 3 passos

Do zero até a primeira cobrança Pix.

  1. Pegue o tokenChame POST /auth com seu clientId e clientSecret. A resposta traz o token.
  2. Use o token em todas as outras chamadasEnvie o header Authorization: Bearer SEU_TOKEN.
  3. Crie sua primeira cobrançaChame POST /order e mostre o pixCopiaECola (ou o QR Code) para o seu cliente pagar.
💡

Quer testar rápido? Use webhook.site como URL de webhook e acompanhe os avisos chegando em tempo real.

Autenticação e segurança

Dois cuidados simples mantêm sua integração protegida.

1. Token de acesso (Bearer)

Todos os endpoints, exceto /auth, exigem o header abaixo. O token tem validade limitada (a data aparece no campo expires da resposta). Quando expirar, gere outro com /auth.

Header
Authorization: Bearer SEU_TOKEN
Content-Type: application/json

2. Assinatura das chamadas (headers de segurança)

Nossa borda valida cada chamada à API. Existem duas formas de ser liberado: IP autorizado (combinado com a CooperPay) ou assinatura HMAC, enviando os 3 headers abaixo:

HeaderO que enviar
X-ClientIdO mesmo clientId usado no /auth.
X-TimestampHora atual em milissegundos (Unix, ex.: 1761600000000). Aceitamos uma diferença de até 5 minutos.
X-SignatureBase64( HMAC-SHA256( X-Timestamp + X-ClientId , chaveHmac ) )
A chaveHmac é uma chave própria para assinatura, fornecida pela CooperPay junto com o clientId.
Node.js
const crypto = require('crypto');

const clientId = 'SEU_CLIENT_ID';
const secret   = 'SUA_CHAVE_HMAC';
const ts = Date.now().toString(); // milissegundos

const signature = crypto
  .createHmac('sha256', secret)
  .update(ts + clientId)
  .digest('base64');
Bash (openssl)
CLIENT_ID="SEU_CLIENT_ID"
SECRET="SUA_CHAVE_HMAC"
TS=$(date +%s%3N)   # milissegundos

SIG=$(printf "%s%s" "$TS" "$CLIENT_ID" \
  | openssl dgst -sha256 -hmac "$SECRET" -binary \
  | base64)
🔒

Nunca coloque o clientSecret em aplicativos de celular, sites (JavaScript no navegador) ou repositórios públicos. Use sempre no seu servidor.

Endpoints

Tudo que você pode fazer, em um só lugar.

MétodoRotaPara quê
POST/authObter o token de acesso
POST/orderCriar uma cobrança Pix
POST/transferEnviar um Pix (transferência)
GET/balanceConsultar seu saldo
GET/order/byId/{id}Consultar cobrança pelo ID da CooperPay
GET/order/externalid/{externalid}Consultar cobrança pelo seu código
GET/transfer/{id}Consultar transferência pelo ID da CooperPay
GET/transfer/externalid/{id}Consultar transferência pelo seu código

Autenticar

Troque suas credenciais por um token.

POST/authNão precisa de token

Corpo da requisição

CampoTipoDescrição
clientIdobrigatóriotextoIdentificador da sua empresa, fornecido pela CooperPay.
clientSecretobrigatóriotextoSegredo da sua empresa, fornecido pela CooperPay. Guarde com cuidado.
cURL
curl -X POST https://cooperpay.io/auth \
  -H "Content-Type: application/json" \
  -H "X-ClientId: SEU_CLIENT_ID" \
  -H "X-Timestamp: $TS" \
  -H "X-Signature: $SIG" \
  -d '{
    "clientId": "SEU_CLIENT_ID",
    "clientSecret": "SEU_CLIENT_SECRET"
  }'
Resposta 200
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "expires": "2026-10-26T18:30:00Z"
}
ℹ️

Pode reutilizar o mesmo token até expires. Não é preciso autenticar a cada chamada.

Criar cobrança Pix

Gere um Pix para o seu cliente pagar.

POST/orderRequer Bearer token

Corpo da requisição

Os dados ficam dentro do objeto order.

CampoTipoDescrição
order.externalIdobrigatóriotextoSeu código único do pedido. Use para consultar depois e evitar duplicidade.
order.amountobrigatórionúmeroValor em reais. Ex.: 2.00 = R$ 2,00.
order.typeOrderobrigatóriotextoUse "pix".
order.expirationopcionalnúmeroValidade do Pix em segundos. Ex.: 30000.
order.webhook.urlopcionaltextoEndereço que receberá os avisos de pagamento. Veja webhooks.
order.webhook.typeWebhookopcionalnúmeroUse 2 para cobranças Pix.
order.webhook.headersopcionallistaHeaders extras que enviaremos no seu webhook, no formato [{"key":"...","value":"..."}].
cURL
curl -X POST https://cooperpay.io/order \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-ClientId: SEU_CLIENT_ID" \
  -H "X-Timestamp: $TS" \
  -H "X-Signature: $SIG" \
  -d '{
    "order": {
      "externalId": "pedido-1001",
      "amount": 2.00,
      "typeOrder": "pix",
      "expiration": 30000,
      "webhook": {
        "url": "https://seu-site.com/webhooks/cooperpay",
        "typeWebhook": 2
      }
    }
  }'

Resposta de sucesso 200

Campos principais da resposta (outros campos informativos podem aparecer):

CampoO que é
orderIdID da cobrança na CooperPay. Guarde para consultar depois.
externalIdO código que você enviou.
amountValor da cobrança.
statusSituação da cobrança (veja a tabela).
qrCodeLinkLink da imagem do QR Code para exibir ao cliente.
transaction.transactionPix.cobResponseDados do Pix, incluindo o Pix copia e cola e o txid.
dtCreatedData de criação.
Exemplo (resumido)
{
  "orderId": "683efe9c386974e24fbdcf90",
  "externalId": "pedido-1001",
  "amount": 2.0,
  "typeOrder": "pix",
  "status": "created",
  "qrCodeLink": "https://...",
  "expiration": 30000,
  "dtCreated": "2026-10-26T14:00:00Z",
  "transaction": {
    "transactionPix": {
      "cobResponse": { /* txid, pixCopiaECola, ... */ }
    }
  }
}
💡

Mostre ao cliente o Pix copia e cola ou o QR Code. Quando ele pagar, enviaremos um webhook com o status payed.

Enviar Pix (transferência)

Pague um Pix a partir do seu saldo CooperPay.

POST/transferRequer Bearer token
⚠️

Idempotência: envie o header X-Idempotency-Key com um valor único por transferência. Se você repetir a mesma chave (por exemplo, por falha de rede), responderemos 409 em vez de pagar duas vezes.

Corpo da requisição

CampoTipoDescrição
amountobrigatórionúmeroValor em reais, maior que zero. Ex.: 0.10.
typeobrigatóriotextoUse "pix".
externalIdobrigatóriotextoSeu código único da transferência (usado para consultar depois).
bankAccount.pixCPFtextoChave Pix do tipo CPF (somente números). Informe uma chave por transferência.
bankAccount.pixCNPJtextoChave Pix do tipo CNPJ.
bankAccount.pixEmailtextoChave Pix do tipo e-mail.
bankAccount.pixCelulartextoChave Pix do tipo celular.
bankAccount.pixAleatoriotextoChave Pix aleatória.
messageopcionaltextoMensagem que acompanha o Pix.
webhook.urlopcionaltextoEndereço que receberá o aviso quando a transferência for concluída.
webhook.typeWebhookopcionalnúmeroUse 3 para transferências Pix.
cURL
curl -X POST https://cooperpay.io/transfer \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Idempotency-Key: transf-2001" \
  -H "X-ClientId: SEU_CLIENT_ID" \
  -H "X-Timestamp: $TS" \
  -H "X-Signature: $SIG" \
  -d '{
    "bankAccount": { "pixCPF": "00000000000" },
    "amount": 0.10,
    "type": "pix",
    "message": "Pagamento fornecedor",
    "externalId": "transf-2001",
    "webhook": {
      "url": "https://seu-site.com/webhooks/cooperpay-transfer",
      "typeWebhook": 3
    }
  }'

Resposta de sucesso 200

A transferência é aceita e entra em processamento. O resultado final chega pelo webhook ou por consulta.

Exemplo (resumido)
{
  "id": "661172bd5d7e6d2095c467e1",
  "externalId": "transf-2001",
  "amount": 0.1,
  "type": "pix",
  "status": "Created",
  "createdAt": "2026-10-26T14:05:00Z"
}

Consultar saldo

Veja quanto você tem disponível agora.

GET/balanceRequer Bearer token
cURL
curl https://cooperpay.io/balance \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-ClientId: SEU_CLIENT_ID" \
  -H "X-Timestamp: $TS" \
  -H "X-Signature: $SIG"

Resposta 200

Exemplo
{
  "amountTodayPayIn": 1250.00,
  "amountTodayPayOut": 300.50,
  "amountWithdraw": 0,
  "previousBalance": 5000.00,
  "blockedBalance": 0,
  "availableBalance": 5949.50,
  "totalBalance": 5949.50
}
CampoSignificado
availableBalanceQuanto você pode usar agora.
totalBalanceSaldo total da conta.
blockedBalanceValor retido (ex.: contestações).
previousBalanceSaldo do dia anterior.
amountTodayPayInEntradas de hoje (líquidas).
amountTodayPayOutSaídas de hoje (inclui tarifas).

Consultar cobrança

Veja o status de uma cobrança Pix, de duas formas.

GET/order/byId/{id}Requer Bearer token

Use o orderId que a CooperPay devolveu ao criar a cobrança.

GET/order/externalid/{externalid}Requer Bearer token

Use o externalId que você mesmo enviou ao criar a cobrança.

cURL
curl https://cooperpay.io/order/byId/683efe9c386974e24fbdcf90 \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-ClientId: SEU_CLIENT_ID" -H "X-Timestamp: $TS" -H "X-Signature: $SIG"

curl https://cooperpay.io/order/externalid/pedido-1001 \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-ClientId: SEU_CLIENT_ID" -H "X-Timestamp: $TS" -H "X-Signature: $SIG"

A resposta tem o mesmo formato da criação da cobrança, com o status atualizado (e dtPayed quando pago). Se a cobrança não existir, retornamos 404.

Consultar transferência

Acompanhe o resultado de um Pix enviado.

GET/transfer/{id}Requer Bearer token
GET/transfer/externalid/{externalid}Requer Bearer token
cURL
curl https://cooperpay.io/transfer/661172bd5d7e6d2095c467e1 \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-ClientId: SEU_CLIENT_ID" -H "X-Timestamp: $TS" -H "X-Signature: $SIG"

curl https://cooperpay.io/transfer/externalid/transf-2001 \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-ClientId: SEU_CLIENT_ID" -H "X-Timestamp: $TS" -H "X-Signature: $SIG"

Resposta 200

Exemplo
{
  "id": "661172bd5d7e6d2095c467e1",
  "externalId": "transf-2001",
  "amount": 0.1,
  "status": "Transferred",
  "type": "pix",
  "endToEndId": "E00000000202610261405abcdef123456",
  "createdAt": "2026-10-26T14:05:00Z",
  "transferDate": "2026-10-26T14:05:03Z",
  "receiptURL": "https://...",
  "account": {
    "owner": { "name": "Nome do favorecido", "taxId": "***.000.000-**" }
  }
}
CampoO que é
statusSituação da transferência (veja a tabela).
endToEndIdIdentificador do Pix no Banco Central, útil para conciliação e suporte.
receiptURLLink do comprovante, quando disponível.
errorMessageMotivo da falha, quando o status for Error.

Webhooks (avisos automáticos)

Em vez de ficar perguntando se o Pix foi pago, deixe que a CooperPay avise você.

  1. Informe a URLEnvie webhook.url ao criar a cobrança ou a transferência.
  2. Recebemos a mudança de statusQuando algo muda (pago, cancelado, transferido, erro...), fazemos um POST com JSON na sua URL.
  3. Você responde 200Responda com status HTTP 2xx para confirmar o recebimento.
TipotypeWebhookQuando disparamosTentativas se falhar
Cobrança Pix2Quando o status da cobrança muda (ex.: paga).Até 5 tentativas, a cada 5 minutos.
Transferência Pix3Quando a transferência é concluída ou falha.Até 10 tentativas.

Aviso de cobrança paga

POST para a sua URL
{
  "Id": "683efe9c386974e24fbdcf90",
  "orderId": "683efe9c386974e24fbdcf90",
  "externalId": "pedido-1001",
  "amount": 2.0,
  "amountPayed": 2.0,
  "typeOrder": 0,
  "status": 1,
  "dtCreated": "2026-10-26T14:00:00Z",
  "dtPayed": "2026-10-26T14:01:12Z",
  "endToEndId": "E00000000202610261401abcdef123456",
  "companyId": "..."
}
ℹ️

Nos webhooks, status e typeOrder chegam como número. Veja os códigos em Status. Campos sem valor não são enviados.

Aviso de transferência

POST para a sua URL
{
  "id": "661172bd5d7e6d2095c467e1",
  "externalId": "transf-2001",
  "amount": 0.1,
  "status": 1,
  "type": "pix",
  "endToEndId": "E00000000202610261405abcdef123456",
  "createdAt": "2026-10-26T14:05:00Z",
  "transferDate": "2026-10-26T14:05:03Z",
  "receiptURL": "https://..."
}
✅

Boas práticas: responda rápido (200), processe depois; trate avisos repetidos como idempotentes (use externalId); e, se quiser ter certeza do estado, confirme com um GET.

🔐

Precisa que seu servidor valide a origem dos avisos? Use webhook.headers para que enviemos um header secreto seu em cada chamada.

Status

O que cada status significa.

Cobranças (order)

Código (webhook)Status (API)Significado
0createdCobrança criada, aguardando pagamento.
1payedPaga. Pode liberar o produto/serviço.
2waitingAguardando confirmação.
3canceledCancelada ou expirada.
4errorErro no processamento.
5refundedDevolvida ao pagador.
6chargebackContestada/estornada.
7refundingDevolução em andamento.

Transferências (transfer)

Código (webhook)Status (API)Significado
0CreatedRecebida e em processamento.
1TransferredConcluída, dinheiro enviado.
2ErrorFalhou. Veja errorMessage.
3ScheduledAgendada.
4RefundedEstornada.
5WaitingTokenAguardando token de aprovação.
6Partial_RefundedEstornada parcialmente.
7ApprovingEm aprovação.
8ApprovedAprovada.

Erros

Quando algo dá errado, a resposta explica o motivo.

Formato do erro
{
  "errorMessage": "The amount cannot be negative.",
  "propertyName": "Amount"
}
HTTPQuando aconteceO que fazer
200Deu certo.Siga o fluxo.
400Dados inválidos ou erro ao processar (ex.: valor negativo).Leia errorMessage e corrija o envio.
401Token ausente, inválido ou expirado.Gere um novo token em /auth.
403Acesso negado (assinatura/IP não autorizado ou conta sem permissão).Confira os headers de segurança e o IP de origem; se persistir, fale com a CooperPay.
404Registro não encontrado.Confira o id / externalid.
409Requisição duplicada (mesmo X-Idempotency-Key).A transferência já foi recebida. Consulte-a por externalid.
5xxInstabilidade temporária.Tente novamente após alguns segundos (com a mesma chave de idempotência).

Dúvidas comuns

Qual a diferença entre id e externalId?

id/orderId é gerado pela CooperPay. externalId é o seu código, escolhido por você. Ambos servem para consultar.

Como obtenho meu clientId e clientSecret?

Eles são fornecidos pela CooperPay no cadastro da sua empresa. Fale com o nosso time comercial ou de suporte.

Meu webhook não está chegando. E agora?

Confirme que a URL é pública (HTTPS) e responde 2xx. Você também pode consultar o status direto pelos endpoints GET.

Qual o formato dos valores?

Números com ponto decimal, em reais. Ex.: 10.50 é R$ 10,50. Datas seguem o padrão ISO 8601 (UTC).

🤝

Ficou com alguma dúvida? Fale com o time CooperPay, vamos adorar ajudar você a ir ao ar.