Minstrel
Navegar na documentação

Comece aqui

Qual API chamar e em qual ordem

Do cadastro à confirmação: origem dos IDs, seleção de fluxo, conta do parceiro e APIs necessárias para cobrar de verdade.

Guia de integração · 6 min de leitura

Nesta página

Uma cobrança pontual começa em POST /v1/payments. Uma recorrência começa em POST /v1/subscriptions, depois de cadastrar cliente, produto, plano e cartão reutilizável com consentimento. O Minstrel gera e cobra as faturas da assinatura; não crie outro pagamento para cobrar o mesmo ciclo.

O caminho de uma transação

Do backend à confirmação: pagamento, seleção de fluxo ou conta elegível, parceiro e confirmação por consulta e webhook.

Abrir diagrama em tamanho integral

  1. Conta do parceiro: conecte-a em Plugins ou POST /v1/connector-accounts. Consulte GET /v1/connectors para campos e capacidades do plugin e GET /v1/connector-accounts para suas contas e capacidades efetivas.
  2. Cliente: crie em POST /v1/customers. Para Pix e boleto, informe documento; boleto também precisa do endereço completo.
  3. Cartão: use somente token obtido legitimamente no parceiro, na conta de origem. Para salvar, chame POST /v1/customers/{customerId}/payment-methods. No Minstrel Sandbox, .../payment-methods/test-card dispensa cartão real.
  4. Cobrança: chame POST /v1/payments, com Idempotency-Key. Envie paymentMethodId ou card para crédito; Pix e boleto não usam esses campos.
  5. Resultado: confira status, decline e nextAction. Consulte GET /v1/payments/{paymentId} e acompanhe os webhooks.

O caminho de navegador para coletar cartão real está suspenso, inclusive Cielo sandbox. A nova coleta deve ocorrer integralmente em página hospedada pelo parceiro. Configurar uma conta não ativa automaticamente checkout, 3DS ou link real. Veja disponibilidade da coleta.

Como selecionar um flow

Você pode manter vários fluxos publicados. No painel Fluxos, copie o flowId para a API (flw_), disponível no cartão da lista e no editor. Pela API, use o id de GET /v1/flows; confira status: published, triggerEvent e activeVersion.

RequisiçãoComo a rota é escolhida
POST /v1/payments com flowIdUsa esse fluxo publicado da mesma conta e ambiente, com gatilho payment.authorization_requested.
Sem flowId, com fluxo publicadoUsa o padrão daquele gatilho no ambiente.
Sem flowId e sem fluxo publicadoRoteamento direto, se houver uma conta elegível ou origem inequívoca do token. Várias contas elegíveis exigem configuração de fluxo.
Fatura de assinaturaO cobrador prioriza o padrão de invoice.payment_due; na ausência, usa payment.authorization_requested.

O flowId escolhe o fluxo; o motor fixa sua versão publicada na criação do pagamento. Publicar outra versão enquanto um checkout espera confirmação não troca a versão já selecionada. O flowVersionId (flv_) é a versão de auditoria, não o ID para enviar como flowId.

ID inexistente, rascunho, arquivado, de outra conta/ambiente ou com gatilho incompatível responde 422 em flowId antes de criar o pagamento. Não há fallback silencioso para outro fluxo. Se um fluxo selecionado for arquivado antes do processamento, a cobrança não é enviada por outra rota.

O exemplo usa um fluxo que continua publicado, embora outro seja o padrão:

Selecionar um fluxo publicado diferente do padrao

cURL / Bash
curl -X POST "https://api.minstrel.com.br/v1/payments" \
  -H "Authorization: Bearer $MINSTREL_API_KEY" \
  -H "Idempotency-Key: pedido-fluxo-escolhido-001" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "amount": 25990,
  "customerId": "cus_01M5DA7M63VN499S6P34D6DQJZ",
  "paymentMethodId": "pm_01M5DA7M79Q7WTDWW10ZHD1V0D",
  "flowId": "flw_01M5DA7P8GHHVQAJWEYPYY0KXC",
  "externalId": "pedido-fluxo-escolhido-001"
}'

HTTP 201 · Resposta completa capturada no Minstrel Sandbox com dados fictícios

json
{
  "object": "payment",
  "security": {
    "transactionFingerprint": "1501579242f55e416f9fce08e8e0b93d5a211c2d84814ece75709bd034987076",
    "deviceFingerprint": null,
    "cardFingerprint": "d94bbdbc0b0d993e7807a75565ca70a817226c77059c7536ed8bb5d458a224bd",
    "cardIdentitySource": "token",
    "channel": "api"
  },
  "id": "pay_01M5DA7PKZB6NBTZ0TY8HBTA40",
  "status": "captured",
  "amount": 25990,
  "currency": "BRL",
  "capturedAmount": 25990,
  "refundedAmount": 0,
  "captureMethod": "automatic",
  "installments": 1,
  "methodType": "card",
  "nextAction": null,
  "actionExpiresAt": null,
  "initiator": "customer",
  "mitType": null,
  "description": null,
  "softDescriptor": null,
  "externalId": "pedido-fluxo-escolhido-001",
  "customerId": "cus_01M5DA7M63VN499S6P34D6DQJZ",
  "invoiceId": null,
  "paymentMethod": {
    "id": "pm_01M5DA7M79Q7WTDWW10ZHD1V0D",
    "type": "card",
    "brand": "visa",
    "last4": "4242",
    "expMonth": 12,
    "expYear": 2029,
    "isNetworkToken": false
  },
  "decline": null,
  "fraudReview": null,
  "attempts": [
    {
      "id": "att_01M5DA7PP8ZAK9GE4EX77FW9RP",
      "attemptNumber": 1,
      "status": "succeeded",
      "trigger": "initial",
      "connector": null,
      "authorizationCode": "6C41F6",
      "nsu": "160006",
      "tid": "17925220503098831",
      "rawResponseCode": null,
      "declineReason": null,
      "reversibility": null,
      "retryAction": null,
      "latencyMs": 63,
      "startedAt": "2026-10-20T18:47:30.252Z"
    }
  ],
  "splits": [],
  "metadata": {},
  "authorizedAt": "2026-10-20T18:47:30.350Z",
  "capturedAt": "2026-10-20T18:47:30.350Z",
  "failedAt": null,
  "createdAt": "2026-10-20T18:47:30.190Z",
  "updatedAt": "2026-10-20T18:47:30.352Z",
  "clientSecret": null
}

Na sua integração, substitua o flowId pelo ID copiado no seu painel e os outros IDs pelas respostas da sua conta. Publicar configura as regras; a transação só começa ao chamar a API de pagamento.

Quando chamar uma adquirente diretamente

O plugin é um adaptador interno. Você não chama um endpoint separado da Cielo, Rede ou outro plugin dentro da API Minstrel para autorizar. O ponto de entrada continua sendo POST /v1/payments.

Para uma rota fixa, publique um fluxo com Escolher adquirente → Autorizar pagamento e passe seu flowId. Nesse caminho, configure Zero Auth, 3DS e split somente depois de escolher uma conta que suporte os recursos.

CampoFinalidade
flowId no pagamentoSelecionar regras e rota de um fluxo publicado.
card.connectorAccountIdIdentificar onde o token foi emitido. Não ignora o fluxo nem torna o token portável.
tokenizationAccountIdSelecionar a conta no checkout sem token, atualmente exclusivo da simulação Minstrel Sandbox. Não serve para roteamento de cartão salvo.
connectorAccountId na assinaturaEscolher onde cobrar os ciclos daquela assinatura. O cartão precisa ser compatível; as etapas de risco do fluxo continuam valendo.

connectorAccountId não existe na raiz de POST /v1/payments. Não envie campos que não fazem parte do contrato esperando que alterem a rota.

De onde vem cada ID

Todos pertencem à organização e ao ambiente da chave. Nomes, documentos e IDs do seu ERP não substituem os IDs retornados pelo Minstrel.

Campo usadoCriar ou localizarValor que deve ser guardado
customerIdPOST /v1/customers ou GET /v1/customersid com prefixo cus_
connectorAccountIdPlugins no painel ou GET /v1/connector-accountsid com prefixo ca_, não connectorSlug
paymentMethodIdPOST/GET /v1/customers/{customerId}/payment-methodsid com prefixo pm_, não o token do cofre
flowIdFluxos no painel ou GET /v1/flowsid com prefixo flw_, não activeVersion.id
productIdPOST/GET /v1/productsid com prefixo prod_
planIdPOST/GET /v1/plansid com prefixo plan_
subscriptionIdPOST/GET /v1/subscriptionsid com prefixo sub_
invoiceIdlatestInvoice.id da assinatura ou GET /v1/invoicesid com prefixo inv_, não o número da fatura
paymentIdPOST /v1/payments ou firstCharge.paymentIdid com prefixo pay_
recipientIdPOST/GET /v1/recipientsid com prefixo rcp_; verifique cadastro no parceiro

APIs necessárias por cenário

CenárioChamadas principaisO que confirma o recebimento
Crédito com token salvoCliente → salvar token → POST /paymentsstatus: captured, consulta e webhook
Pré-autorizaçãoMesmo caminho, captureMethod: manual → POST /payments/{id}/captureauthorized apenas reserva; entrega depende da captura
PixCliente com documento → POST /payments com methodType: pixQR emitido não é pago; aguarde captured
BoletoCliente com documento/endereço → POST /payments com methodType: boletoBoleto emitido não é pago; aguarde liquidação
RecorrênciaCliente/token → produto → plano → POST /subscriptionsFatura paga e eventos de ativação/pagamento
Zero Authverify: true ao salvar token, ou nó no fluxoValida cartão, não recebe dinheiro
3DSNó no fluxo antes da autorizaçãoAutenticar não captura; o caminho público atual é só simulado

Cadastre webhooks uma vez por ambiente; não a cada transação. Operações de configuração exigem os escopos de escrita dos respectivos recursos; cobranças usam payments:write, consultas payments:read, assinaturas e planos subscriptions:write/read, faturas invoices:write/read.

Ler a resposta sem confundir HTTP com pagamento

Uma requisição pode retornar HTTP 201 e status: failed: o recurso foi criado, mas o emissor recusou. Este é um exemplo completo de recusa 51:

Recusa do emissor com HTTP 201

cURL / Bash
curl -X POST "https://api.minstrel.com.br/v1/payments" \
  -H "Authorization: Bearer $MINSTREL_API_KEY" \
  -H "Idempotency-Key: pedido-recusado-001" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "amount": 14990,
  "customerId": "cus_01M5DA7M63VN499S6P34D6DQJZ",
  "paymentMethodId": "pm_01M5DA7MJNT7BVK0XTG7V50QQN",
  "externalId": "pedido-recusado-001"
}'

HTTP 201 · Resposta completa capturada no Minstrel Sandbox com dados fictícios

json
{
  "object": "payment",
  "security": {
    "transactionFingerprint": "5686dea6c2d0b1af0170ae81f5a2bd3b9e58b08725ac4b691f03a61cd9786e85",
    "deviceFingerprint": null,
    "cardFingerprint": "4cfba0c7efe60702dd0a2c57f626d2e2635a9d242db3a7912043d413c1436e69",
    "cardIdentitySource": "token",
    "channel": "api"
  },
  "id": "pay_01M5DA7MKKRBS69W8JX90RDA47",
  "status": "failed",
  "amount": 14990,
  "currency": "BRL",
  "capturedAmount": 0,
  "refundedAmount": 0,
  "captureMethod": "automatic",
  "installments": 1,
  "methodType": "card",
  "nextAction": null,
  "actionExpiresAt": null,
  "initiator": "customer",
  "mitType": null,
  "description": null,
  "softDescriptor": null,
  "externalId": "pedido-recusado-001",
  "customerId": "cus_01M5DA7M63VN499S6P34D6DQJZ",
  "invoiceId": null,
  "paymentMethod": {
    "id": "pm_01M5DA7MJNT7BVK0XTG7V50QQN",
    "type": "card",
    "brand": "visa",
    "last4": "0051",
    "expMonth": 12,
    "expYear": 2029,
    "isNetworkToken": false
  },
  "decline": {
    "reason": "INSUFFICIENT_FUNDS",
    "reversibility": "REVERSIBLE",
    "retryAction": "RETRY_LATER"
  },
  "fraudReview": null,
  "attempts": [
    {
      "id": "att_01M5DA7MPS4SK2NAC7K6G3R1QG",
      "attemptNumber": 1,
      "status": "failed",
      "trigger": "initial",
      "connector": null,
      "authorizationCode": null,
      "nsu": null,
      "tid": null,
      "rawResponseCode": "51",
      "declineReason": "INSUFFICIENT_FUNDS",
      "reversibility": "REVERSIBLE",
      "retryAction": "RETRY_LATER",
      "latencyMs": 19,
      "startedAt": "2026-10-20T18:47:28.221Z"
    }
  ],
  "splits": [],
  "metadata": {},
  "authorizedAt": null,
  "capturedAt": null,
  "failedAt": "2026-10-20T18:47:28.274Z",
  "createdAt": "2026-10-20T18:47:28.130Z",
  "updatedAt": "2026-10-20T18:47:28.275Z",
  "clientSecret": null
}

Não repita uma cobrança com uma chave nova só porque seu backend perdeu a resposta. Reenvie o mesmo corpo e a mesma Idempotency-Key; consulte o pagamento e siga a política de retentativa.

Continuar a integração

As opções são independentes e podem ser alteradas a qualquer momento no rodapé. Sua escolha vale por até 180 dias.

Necessários Sempre ativos

Lembram sua escolha de privacidade e permitem as funções essenciais.

Ler a política de cookies