Zoov Payment API

Plataforma completa de pagamentos. Infraestrutura financeira via API REST, desde cadastro de clientes até operações complexas de Banking as a Service e Split de Pagamentos.

Cadastros & Fundações

Base para todas as operações. Gerencie clientes, cartões, endereços e produtos.

  • Clientes (PF e PJ)
  • Cartoes tokenizados
  • Endereços de cobrança
  • Catalogo de produtos

Motor de Pagamentos

Processe pagamentos com multiplos métodos e seguranca de nivel bancario.

  • Cartão de Crédito/Debito
  • PIX instantaneo
  • Boleto bancario
  • Faturas e 3DS 2.0

Operações Avancadas

Recursos enterprise para marketplaces, recorrencia e gestao financeira.

  • Banking as a Service
  • Split de Pagamento
  • Cobrança recorrente
  • Gestao financeira
Fluxo de pagamento com cartão
1
Tokenizar
Transforme dados sensiveis em token seguro
2
Autorizar
Crie a cobrança e reserve o valor
3
Capturar
Confirme e efetive o pagamento

Primeiros Passos

Tudo que você precisa para começar a integrar com a API Zoov Payment. Configure seu ambiente, obtenha suas credenciais e entenda as convenções.

Ambientes #

A Zoov Payment disponibiliza dois ambientes para integração. Utilize o Sandbox para desenvolvimento e testes, e o ambiente de Produção para transações reais.

Ambiente API Base URL Painel
Sandbox https://api-sandbox.deltapag.io painel-sandbox.deltapag.io
Produção https://api.deltapag.io painel.deltapag.io
Dica: O ambiente Sandbox permite realizar transações de teste sem movimentar valores reais. Utilize os cartões de teste para simular diferentes cenarios.

Autenticação #

Todas as requisicoes a API devem incluir um token de autenticação no header Authorization utilizando o esquema Bearer Token.

Como gerar seu token

  1. Acesse o Painel Zoov Payment do ambiente desejado
  2. Navegue até ConfiguraçõesIntegracoesAPI
  3. Clique em "Gerar novo token"
  4. Copie e armazene o token com seguranca
Importante: O token e exibido apenas uma vez no momento da geração. Armazene-o em local seguro. Em caso de perda, sera necessário gerar um novo token.

Exemplo de requisição autenticada

bash
curl -X GET https://sandbox-api.zoov.com.br/api/v2/customers \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json"

Convenções da API #

A API Zoov Payment segue padrões REST com algumas convenções importantes. Entenda como a API se comporta para integrar corretamente.

Resposta de criação (POST)

Requisicoes POST retornam 201 Created com corpo vazio. O recurso criado e referenciado pelos headers da resposta:

http response
HTTP/1.1 201 Created
Location: /api/v2/customers/cus_abc123
Content-ID: cus_abc123
Link: </api/v2/customers/cus_abc123>; rel="self"
Header Descrição
Location URL completa do recurso criado
Content-ID Identificador único do recurso (UUID ou ID prefixado)
Link Links HATEOAS para navegação entre recursos relacionados

Formatos de dados

  • Valores monetarios em centavos Todos os valores financeiros sao representados em centavos (inteiro). Exemplo: R$ 1.500,00 = 150000
  • Datas no formato ISO Datas sao enviadas e recebidas no formato YYYY-MM-DD. Exemplo: 2026-03-08
  • Timestamps em milissegundos Campos de data/hora (timestamps) utilizam milissegundos desde epoch Unix. Exemplo: 1709856000000

Respostas de erro

Quando uma requisição falha, a API retorna um código HTTP apropriado com detalhes do erro no corpo da resposta.

Código Significado Quando ocorre
400 Bad Request Parâmetros inválidos ou malformados no corpo da requisição
401 Unauthorized Token ausente, expirado ou inválido
404 Not Found O recurso solicitado nao existe ou foi removido
422 Unprocessable Entity Dados sintaticamente corretos mas semanticamente inválidos (ex.: CPF inválido)
json — exemplo de erro 422
{
  "error": "Unprocessable Entity",
  "status": 422,
  "message": "Validation failed",
  "details": [
    {
      "field": "document",
      "message": "CPF informado é inválido"
    }
  ]
}
Boas práticas: Sempre verifique o campo details nas respostas de erro para identificar exatamente qual campo precisa ser corrigido.

Cadastros & Fundações

Gerencie o cadastro de clientes, métodos de pagamento, endereços e catálogo de produtos.

Clientes #

Cadastre e gerencie seus clientes. O cliente é a entidade central para associar cartões, endereços e cobranças.

POST /api/v2/customers
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar um novo cliente na plataforma.

json — request body
{
  "name": "Tony Stark",
  "document": "51190844001",
  "birthdate": "2000-01-01",
  "phone": {
    "countryCode": 55,
    "areaCode": 48,
    "number": 998870001
  },
  "email": "stark@gmail.com",
  "address": {
    "street": "Rua Jair Hamms",
    "streetNumber": "38",
    "lineTwo": "Sala 101",
    "neighborhood": "Pedra Branca",
    "state": "SC",
    "zipCode": "88137084",
    "city": "Palhoca"
  }
}
Campo Tipo Obrigatório Descrição
name string Sim Nome completo do cliente
document string Não CPF ou CNPJ (apenas números). Se informado, deve ser válido (11-14 dígitos).
birthdate string (date) Não Data de nascimento (YYYY-MM-DD)
email string Não Email do cliente
phone.countryCode integer Condicional Código do país (ex: 55). Obrigatório se phone for enviado.
phone.areaCode integer Condicional DDD (11-99). Obrigatório se phone for enviado.
phone.number integer Condicional Número do telefone. Obrigatório se phone for enviado.
address.street string Condicional Rua. Obrigatório se address for enviado.
address.streetNumber string Condicional Número. Obrigatório se address for enviado.
address.lineTwo string Não Complemento
address.neighborhood string Condicional Bairro. Obrigatório se address for enviado.
address.state string Condicional UF (ex: SC). Obrigatório se address for enviado.
address.zipCode string Condicional CEP. Obrigatório se address for enviado.
address.city string Condicional Cidade. Obrigatório se address for enviado.
Headers de Resposta
LocationURL do recurso criado
Content-IDID numérico do cliente criado
StatusDescrição
201Cliente criado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável
Faça um GET na URL do header Location para obter os dados completos do cliente criado.
PUT /api/v2/customers/document/{document}
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Editar um cliente existente pelo documento. O campo name é obrigatório. (Deprecated)

Path: document (string) — CPF ou CNPJ do cliente.

json — request body
{
  "name": "Tony Stark",
  "birthdate": "2000-01-01",
  "phone": {
    "countryCode": 55,
    "areaCode": 48,
    "number": 998870001
  },
  "email": "stark@gmail.com"
}
CampoTipoObrigatórioDescrição
namestringSimNome completo do cliente
documentstringNãoCPF ou CNPJ
birthdatestringNãoData de nascimento (YYYY-MM-DD)
emailstringNãoEmail do cliente
phone.countryCodeintegerCondicionalCódigo do país. Obrigatório se phone for enviado.
phone.areaCodeintegerCondicionalDDD (11-99). Obrigatório se phone for enviado.
phone.numberintegerCondicionalNúmero do telefone. Obrigatório se phone for enviado.
address.streetstringCondicionalRua. Obrigatório se address for enviado.
address.streetNumberstringCondicionalNúmero. Obrigatório se address for enviado.
address.lineTwostringNãoComplemento
address.neighborhoodstringCondicionalBairro. Obrigatório se address for enviado.
address.statestringCondicionalUF. Obrigatório se address for enviado.
address.zipCodestringCondicionalCEP. Obrigatório se address for enviado.
address.citystringCondicionalCidade. Obrigatório se address for enviado.
Este endpoint está marcado como deprecated. O campo name é obrigatório mesmo em atualizações. Os demais campos são opcionais, mas subcampos de phone e address tornam-se obrigatórios quando o objeto pai é enviado.
StatusDescrição
200Cliente atualizado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável (inclui cliente não encontrado)
GET /api/v2/customers/document/{document}
Headers
Authorization: Bearer {seu_token}

Buscar cliente por documento (CPF/CNPJ). (Deprecated)

json — response body
{
  "id": 12345,
  "name": "Tony Stark",
  "document": "51190844001",
  "birthdate": "2000-01-01",
  "email": "stark@gmail.com",
  "phone": {
    "countryCode": "+55",
    "areaCode": "48",
    "number": "998870001"
  },
  "address": {
    "id": 1,
    "street": "Rua Jair Hamms",
    "streetNumber": "38",
    "lineTwo": "Sala 101",
    "neighborhood": "Pedra Branca",
    "city": "Palhoca",
    "state": "SC",
    "zipCode": "88137084"
  },
  "registerDate": "2024-01-15T10:30:00.000+00:00"
}
Campo Tipo Descrição
id integer Identificador do cliente
name string Nome completo
document string CPF/CNPJ
birthdate string (date) Data de nascimento (YYYY-MM-DD)
email string Email
phone object Telefone do cliente (null se não cadastrado)
phone.countryCode string Código do país (ex: "+55")
phone.areaCode string DDD
phone.number string Número do telefone
address object Melhor endereço do cliente (null se não cadastrado)
address.id integer Identificador do endereço
address.street string Rua
address.streetNumber string Número
address.lineTwo string Complemento
address.neighborhood string Bairro
address.city string Cidade
address.state string UF
address.zipCode string CEP
registerDate string (datetime) Data de cadastro do cliente
StatusDescrição
200Cliente retornado com sucesso
401Não autorizado
422Entidade não processável (inclui cliente não encontrado)
GET /api/v2/customers/document/{document}/check
Headers
Authorization: Bearer {seu_token}

Verificar se um cliente já existe pelo documento. (Deprecated)

Este endpoint não retorna body. A existência do cliente é indicada pelo status code da resposta.

200 OK = cliente existe. 204 No Content = cliente não existe. Nenhum body é retornado em ambos os casos.
StatusDescrição
200Cliente existe
204Cliente não existe (No Content)
401Não autorizado

Cartões de Crédito #

Gerencie os cartões de crédito associados a um cliente.

POST /api/v2/customers/document/{document}/credit/cards
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cadastrar um novo cartão de crédito para o cliente. (Deprecated)

json — request body
{
  "cardNumber": "5448280000000007",
  "holder": {
    "name": "Tony Stark",
    "document": "51190844001"
  },
  "expiration": {
    "month": 1,
    "year": 2035
  },
  "cvv": "123"
}
Campo Tipo Obrigatório Descrição
cardNumber string Sim Número completo do cartão (apenas dígitos, 11-21 caracteres)
holder.name string Sim Nome do titular do cartão
holder.document string Não CPF/CNPJ do titular. Se informado, deve ser válido.
expiration.month integer Sim Mês de validade (1-12)
expiration.year integer Sim Ano de validade (2023-2056)
cvv string Não Código de segurança (3 ou 4 dígitos). Se informado, deve ser numérico.
Headers de Resposta
LocationURL do recurso criado
Content-IDID numérico do cartão criado
StatusDescrição
201Cartao cadastrado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável
PUT /api/v2/customers/document/{document}/credit/cards/{id}
Headers
Authorization: Bearer {seu_token}

Definir um cartão como padrão (default) para o cliente. (Deprecated)

Path: document (string) — CPF ou CNPJ do cliente. id (integer) — ID do cartão a ser definido como padrão.

Este endpoint não aceita request body. Apenas os path parameters são utilizados para identificar o cliente e o cartão.
json — response body
{
  "id": 1,
  "bin": "544828",
  "lastFour": "0007",
  "brand": "MASTERCARD",
  "holder": {
    "name": "Tony Stark",
    "document": "51190844001"
  },
  "expiration": {
    "month": "01",
    "year": "2035"
  },
  "token": "tok_abc123",
  "isDefault": true
}
CampoTipoDescrição
idintegerIdentificador do cartão
binstringBIN do cartão (primeiros 6 dígitos)
lastFourstringÚltimos 4 dígitos do cartão
brandstringBandeira (VISA, MASTERCARD, etc.)
holder.namestringNome do titular
holder.documentstringCPF/CNPJ do titular
expiration.monthstringMês de validade
expiration.yearstringAno de validade
tokenstringToken do cartão (pode ser null)
isDefaultbooleanSe é o cartão padrão
StatusDescrição
200Cartão definido como padrão com sucesso
401Não autorizado
500Erro interno (cartão ou cliente não encontrado)
GET /api/v2/customers/document/{document}/credit/cards/best
Headers
Authorization: Bearer {seu_token}

Obter o cartão padrão (preferencial) do cliente. (Deprecated)

json — response body
{
  "id": 1,
  "bin": "544828",
  "lastFour": "0007",
  "brand": "MASTERCARD",
  "holder": {
    "name": "Tony Stark",
    "document": "51190844001"
  },
  "expiration": {
    "month": "01",
    "year": "2035"
  },
  "token": "tok_abc123",
  "isDefault": true
}
Campo Tipo Descrição
id integer Identificador do cartão
bin string BIN do cartão (primeiros 6 dígitos)
lastFour string Últimos 4 dígitos do cartão
brand string Bandeira (VISA, MASTERCARD, etc.)
holder.name string Nome do titular
holder.document string CPF/CNPJ do titular
expiration.month string Mês de validade
expiration.year string Ano de validade
token string Token do cartão (pode ser null)
isDefault boolean Se é o cartão padrão
StatusDescrição
200Cartão retornado com sucesso
204Cliente encontrado mas sem cartão cadastrado (No Content)
401Não autorizado
404Cliente não encontrado
422Entidade não processável
GET /api/v2/customers/document/{document}/credit/cards
Headers
Authorization: Bearer {seu_token}

Listar todos os cartões do cliente. (Deprecated)

json — response body
[
  {
    "id": 1,
    "bin": "544828",
    "lastFour": "0007",
    "brand": "MASTERCARD",
    "holder": {
      "name": "Tony Stark",
      "document": "51190844001"
    },
    "expiration": {
      "month": "01",
      "year": "2035"
    },
    "token": "tok_abc123",
    "isDefault": true
  }
]
Campo Tipo Descrição
[].id integer Identificador do cartão
[].bin string BIN do cartão (primeiros 6 dígitos)
[].lastFour string Últimos 4 dígitos do cartão
[].brand string Bandeira (VISA, MASTERCARD, etc.)
[].holder.name string Nome do titular
[].holder.document string CPF/CNPJ do titular
[].expiration.month string Mês de validade
[].expiration.year string Ano de validade
[].token string Token do cartão (pode ser null)
[].isDefault boolean Se é o cartão padrão
StatusDescrição
200Lista retornada com sucesso
401Não autorizado
422Entidade não processável (inclui cliente não encontrado)

Endereços #

Gerencie os endereços associados a um cliente.

POST /api/v2/customers/document/{document}/addresses
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar um novo endereço para o cliente. (Deprecated)

json — request body
{
  "street": "Rua Jair Hamms",
  "streetNumber": "38",
  "lineTwo": "Sala 101",
  "neighborhood": "Pedra Branca",
  "city": "Palhoca",
  "state": "SC",
  "zipCode": "88137084"
}
Campo Tipo Obrigatório Descrição
street string Sim Nome da rua
streetNumber string Sim Número
lineTwo string Não Complemento
neighborhood string Sim Bairro
city string Sim Cidade
state string Sim UF (ex: SC)
zipCode string Sim CEP (apenas números)
Headers de Resposta
LocationURL do recurso criado
Content-IDID numérico do cliente
StatusDescrição
201Endereço criado com sucesso
400Requisição malformada
401Não autorizado
500Erro interno (ex: cliente não encontrado)
PUT /api/v2/customers/document/{document}/addresses/{id}
Headers
Authorization: Bearer {seu_token}

Definir um endereço como padrão (default) para o cliente. (Deprecated)

Path: document (string) — CPF ou CNPJ do cliente. id (integer) — ID do endereço a ser definido como padrão.

Este endpoint não aceita request body. Apenas os path parameters são utilizados para identificar o cliente e o endereço.
json — response body
{
  "id": 1,
  "street": "Rua Jair Hamms",
  "streetNumber": "38",
  "lineTwo": "Sala 101",
  "neighborhood": "Pedra Branca",
  "city": "Palhoca",
  "state": "SC",
  "zipCode": "88137084"
}
CampoTipoDescrição
idintegerIdentificador do endereço
streetstringRua
streetNumberstringNúmero
lineTwostringComplemento
neighborhoodstringBairro
citystringCidade
statestringUF
zipCodestringCEP
StatusDescrição
200Endereço definido como padrão com sucesso
401Não autorizado
500Erro interno (endereço ou cliente não encontrado)
GET /api/v2/customers/document/{document}/addresses/best
Headers
Authorization: Bearer {seu_token}

Obter o endereço padrão do cliente. (Deprecated)

json — response body
{
  "id": 1,
  "street": "Rua Jair Hamms",
  "streetNumber": "38",
  "lineTwo": "Sala 101",
  "neighborhood": "Pedra Branca",
  "city": "Palhoca",
  "state": "SC",
  "zipCode": "88137084"
}
Campo Tipo Descrição
id integer Identificador do endereço
street string Nome da rua
streetNumber string Número
lineTwo string Complemento
neighborhood string Bairro
city string Cidade
state string UF
zipCode string CEP
StatusDescrição
200Endereço retornado com sucesso
204Cliente sem endereço cadastrado (No Content)
401Não autorizado
GET /api/v2/customers/document/{document}/addresses
Headers
Authorization: Bearer {seu_token}

Listar todos os endereços do cliente. (Deprecated)

json — response body
[
  {
    "id": 1,
    "street": "Rua Jair Hamms",
    "streetNumber": "38",
    "lineTwo": "Sala 101",
    "neighborhood": "Pedra Branca",
    "city": "Palhoca",
    "state": "SC",
    "zipCode": "88137084"
  }
]
Campo Tipo Descrição
[].id integer Identificador do endereço
[].street string Nome da rua
[].streetNumber string Número
[].lineTwo string Complemento
[].neighborhood string Bairro
[].city string Cidade
[].state string UF
[].zipCode string CEP
StatusDescrição
200Lista retornada com sucesso
204Cliente sem endereços cadastrados (No Content)
401Não autorizado

Produtos #

Cadastre e gerencie o catálogo de produtos disponiveis para cobrança.

POST /api/v2/products
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar um novo produto.

json — request body
{
  "productType": "ONETIME",
  "affiliateId": 12345,
  "name": "Produto Exemplo",
  "value": 500,
  "softDescriptor": "Product Plus",
  "maxInstallments": 12,
  "active": true,
  "methods": ["CREDIT_CARD", "PIX"],
  "description": "Este e um produto exemplo.",
  "themeId": 1
}
Produto recorrente: Para productType: "RECURRING", inclua também os campos interval (ex: "MONTHLY") e maxCharges (ex: 12), ambos obrigatórios.
Campo Tipo Obrigatório Descrição
productType string Sim ONETIME ou RECURRING
affiliateId long Sim ID do seller (afiliado)
name string Sim Nome do produto (5-45 caracteres)
value long Sim Preco em centavos (mínimo 5)
maxInstallments integer Sim Número máximo de parcelas
methods array[string] Sim CREDIT_CARD, PIX, BANK_SLIP, TRANSFER, NUPAY
themeId long Sim ID do tema do produto
softDescriptor string Não Descrição na fatura do cartão (1-13 caracteres)
active boolean Não Status ativo
description string Não Descrição do produto (1-150 caracteres)
expirationDate long Não Data de expiração em milissegundos (epoch)
feePassThrough boolean Não Indica se a taxa será repassada ao cliente (default: false)
maxInstallmentsWithoutFees integer Não Quantidade máxima de parcelas sem taxa (0-99)
interval string RECURRING Frequência do plano (ex: MONTHLY). Obrigatório para RECURRING.
maxCharges integer RECURRING Número máximo de cobranças. Obrigatório para RECURRING.
Headers de Resposta
LocationURL do recurso criado (ex: /api/v2/products/{id})
LinkURL para upload de imagem do checkout
StatusDescrição
201Produto criado com sucesso
400Requisição malformada
401Não autorizado
404Seller ou tema não encontrado
422Entidade não processável (SKU duplicado, parcelas inválidas)
500Erro interno do servidor
PUT /api/v2/products/{id}
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Editar um produto existente.

json — request body
{
  "productType": "ONETIME",
  "name": "Produto Exemplo",
  "value": 500,
  "maxInstallments": 12,
  "themeId": 1,
  "addressRequired": true,
  "birthDateRequired": false,
  "methods": ["CREDIT_CARD", "PIX"],
  "softDescriptor": "Product Plus",
  "active": true,
  "description": "Este e um produto exemplo."
}
CampoTipoObrigatórioDescrição
productTypestringSimONETIME ou RECURRING
namestringSimNome do produto (5-45 caracteres)
valuelongSimPreço em centavos (mínimo 5)
maxInstallmentsintegerSimNúmero máximo de parcelas
themeIdlongSimID do tema do produto
addressRequiredbooleanSimIndica se o endereço é obrigatório
birthDateRequiredbooleanSimIndica se a data de nascimento é obrigatória
methodsarray[string]ONETIMECREDIT_CARD, PIX, BANK_SLIP, TRANSFER, NUPAY. Obrigatório para ONETIME.
softDescriptorstringNãoDescrição na fatura (1-13 caracteres)
activebooleanNãoStatus ativo
descriptionstringNãoDescrição do produto (1-150 caracteres)
expirationDatelongNãoData de expiração em milissegundos (epoch)
feePassThroughbooleanNãoIndica se a taxa será repassada ao cliente (default: false)
maxInstallmentsWithoutFeesintegerNãoQuantidade máxima de parcelas sem taxa (0-99)
maxChargesintegerRECURRINGNúmero máximo de cobranças. Obrigatório para RECURRING.
StatusDescrição
200Produto atualizado com sucesso
400Requisição malformada
401Não autorizado
404Produto ou tema não encontrado
500Erro interno do servidor
GET /api/v2/products/{id}
Headers
Authorization: Bearer {seu_token}

Obter produto por ID.

json — response body
{
  "id": 1,
  "type": "ONETIME",
  "name": "Produto Exemplo",
  "value": 500,
  "softDescriptor": "Product Plus",
  "maxInstallments": 12,
  "maxCharges": null,
  "active": true,
  "checkout": {
    "id": 1,
    "name": "Produto Exemplo",
    "description": "Este e um produto exemplo.",
    "amount": 500,
    "methods": ["CREDIT_CARD", "PIX"],
    "active": true,
    "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "addressRequired": true,
    "birthdateRequired": false,
    "feePassThrough": false,
    "maxInstallmentsWithoutFees": 99
  }
}
Campo Tipo Descrição
id integer Identificador do produto
type string ONETIME ou RECURRING
name string Nome do produto
value long Preco em centavos
softDescriptor string Descrição na fatura do cartão
maxInstallments integer Número máximo de parcelas
maxCharges integer Número máximo de cobranças (RECURRING, null para ONETIME)
active boolean Status ativo
checkout object Detalhes do checkout (PagePay) associado ao produto
checkout.id integer ID do checkout
checkout.name string Nome do checkout
checkout.description string Descrição do produto
checkout.amount long Valor em centavos
checkout.methods array[string] Métodos de pagamento aceitos
checkout.active boolean Status ativo do checkout
checkout.uuid string UUID do checkout
checkout.addressRequired boolean Indica se endereço é obrigatório
checkout.birthdateRequired boolean Indica se data de nascimento é obrigatória
checkout.feePassThrough boolean Indica se a taxa é repassada ao cliente
checkout.maxInstallmentsWithoutFees integer Máximo de parcelas sem taxa
StatusDescrição
200Produto retornado com sucesso
401Não autorizado
404Produto não encontrado
500Erro interno do servidor

Tokenização

Proteja dados sensiveis do cartão. Nunca trafegue o PAN diretamente — troque por um token seguro.

Importante: Nunca envie o número completo do cartão na autorização. Sempre tokenize primeiro.
Fluxo de tokenização
1
Cartao
Dados sensiveis do portador
2
API Vault
Armazenamento seguro e criptografado
3
Token Seguro
Referencia segura para uso nas transações

Criar Token #

POST /api/v2/cards/tokens
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Tokenizar um cartão de crédito para uso seguro em transações futuras.

json — request body
{
  "holder": {
    "name": "Tony Stark",
    "document": "51190844001"
  },
  "expiration": {
    "year": 2035,
    "month": 1
  },
  "cardNumber": "5448280000000007"
}
Campo Tipo Obrigatório Descrição
holder.name string Sim Nome do titular
holder.document string Não CPF/CNPJ do titular. Se informado, deve ser válido (11-14 dígitos numéricos).
expiration.year integer Sim Ano de validade (2023-2056)
expiration.month integer Sim Mes de validade (1-12)
cardNumber string Sim Número completo do cartão (11-21 dígitos, validação Luhn)

Resposta: 201 Created

Headers da resposta
Location URL do token criado (ex: /api/v2/cards/tokens/{token})
Status Descrição
201 Token criado com sucesso
400 Requisição malformada
401 Não autorizado
422 Entidade não processável
Dica: Faca um GET na URL retornada no header Location para obter o valor do token.

Exemplo de resposta ao consultar o token via GET na URL do header Location:

json — response body
{
  "token": "643c663f3c244f939ef1f9acc6ccd75d",
  "bin": "544828",
  "lastFour": "0007",
  "brand": "MASTERCARD",
  "holder": {
    "name": "Tony Stark",
    "document": "51190844001"
  },
  "expiration": {
    "month": "1",
    "year": "2035"
  }
}
Campo Tipo Descrição
token string Token seguro gerado para o cartão
bin string BIN do cartão (primeiros 6 dígitos)
lastFour string Últimos 4 dígitos do cartão
brand string Bandeira do cartão (ex: MASTERCARD, VISA)
holder.name string Nome do titular do cartão
holder.document string CPF/CNPJ do titular (pode ser null)
expiration.month string Mes de validade
expiration.year string Ano de validade
Importante: O token retornado deve ser utilizado no campo cardToken.token ao solicitar uma autorização de pagamento.

Consultar Token #

GET /api/v2/cards/tokens/{token}
Headers
Authorization: Bearer {seu_token}

Consultar dados de um token existente.

Parâmetro Tipo Obrigatório Descrição
token string Sim Token do cartão a consultar

Exemplo de resposta:

json — response body
{
  "token": "643c663f3c244f939ef1f9acc6ccd75d",
  "bin": "544828",
  "lastFour": "0007",
  "brand": "MASTERCARD",
  "holder": {
    "name": "Tony Stark",
    "document": "51190844001"
  },
  "expiration": {
    "month": "1",
    "year": "2035"
  }
}
Campo Tipo Descrição
token string Token seguro gerado para o cartão
bin string BIN do cartão (primeiros 6 dígitos)
lastFour string Últimos 4 dígitos do cartão
brand string Bandeira do cartão (ex: MASTERCARD, VISA)
holder.name string Nome do titular do cartão
holder.document string CPF/CNPJ do titular (pode ser null)
expiration.month string Mes de validade
expiration.year string Ano de validade
Status Descrição
200 Token consultado com sucesso
401 Não autorizado
404 Token não encontrado
422 Entidade não processável

Pagamentos

O motor omnichannel de pagamentos. Processe transações via Cartão de Crédito, PIX ou Boleto.

Fluxo de pagamento com cartão de crédito
1
Tokenizar
Transforme o PAN em token seguro
2
Autorizar
Reserve o valor no cartão
3
Capturar
Efetive o pagamento

Cartão de Crédito — Autorização #

Autorize um pagamento com cartão de crédito utilizando o token gerado anteriormente.

POST /api/v2/sellers/{sellerId}/orders/credit-card/authorize
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Autorizar um pagamento com cartão de crédito.

json — request body
{
  "operationType": "AUTHORIZE_ONLY",
  "orderReference": "TEST_1694314800",
  "amount": 500,
  "customer": {
    "birthdate": "1992-02-29",
    "document": "55375716097",
    "name": "Teste Bempaggo",
    "address": {
      "street": "Rua Jair Hamms",
      "city": "Palhoca",
      "streetNumber": "38",
      "zipCode": "88137084",
      "neighborhood": "Pedra Branca",
      "state": "SC"
    }
  },
  "notificationUrl": "https://meusite.com.br/events",
  "payments": [
    {
      "installments": 1,
      "cardToken": {
        "token": "643c663f...",
        "cvv": "123"
      },
      "amount": 500,
      "paymentMethod": "CREDIT_CARD"
    }
  ],
  "metadata": {
    "erp_id": 9999
  }
}
Campo Tipo Obrigatório Descrição
operationType string Não AUTHORIZE_ONLY (padrão) ou AUTHORIZE_AND_CAPTURE
orderReference string Sim Referencia unica do pedido
amount integer Sim Valor total em centavos
customer.name string Sim Nome completo (1-50 caracteres)
customer.document string Não CPF/CNPJ. Se informado, deve ser válido.
customer.birthdate string Não Data de nascimento (YYYY-MM-DD)
customer.address.* object Não Endereco do cliente
notificationUrl string (URI) Não URL para webhooks
softDescriptor string Não Descrição na fatura do cartão (máx. 10 caracteres)
payments[].paymentMethod string Sim CREDIT_CARD
payments[].amount long Sim Valor do pagamento em centavos (mínimo 1)
payments[].installments integer Sim Número de parcelas (1-12)
payments[].cardToken.token string Sim Token do cartão gerado em /v2/cards/tokens
payments[].cardToken.cvv string Não CVV do cartão (3-4 dígitos). Opcional.
payments[].splits array Não Regras de divisão do recebimento (split)
metadata object Não Dados customizados chave-valor
Headers da resposta
Location URL da cobrança
Content-ID ID da cobrança
Link (rel="capture") URL para captura (quando status AUTHORIZED)
Link (rel="refund") URL para estorno (quando status AUTHORIZED ou PAY)
Link (rel="metadata") URL dos metadados do pedido
Link (rel="search") URL para buscar por orderReference (quando informado)
HATEOAS: A API utiliza o padrão HATEOAS. Use os links retornados nos headers para navegar entre as operações. Não construa URLs manualmente.
Status Descrição
201 Autorização criada com sucesso
400 Requisição malformada
401 Não autorizado
404 Seller não encontrado
422 Entidade não processável (sem estabelecimento, referência duplicada, transação não permitida)

Captura #

Apos a autorização, capture o pagamento utilizando o link retornado no header Link (rel="capture").

POST /api/v2/charges/{id}/credit-card/capture
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Capturar uma cobrança previamente autorizada.

Parâmetro Tipo Obrigatório Descrição
id integer Sim ID da cobrança a capturar
Captura parcial: Para capturar apenas parte do valor autorizado, envie um body JSON com o campo amount (valor em centavos). Se nenhum body for enviado, o valor total autorizado será capturado.
Campo (body opcional)TipoObrigatórioDescrição
amountlongNãoValor da captura em centavos. Se nulo, captura o valor total autorizado.

Resposta: 201 Created

Headers da resposta
Location URL da cobrança
Content-ID ID da cobrança
Link (rel="refund") URL para estorno (quando status PAY ou AUTHORIZED)
Status Descrição
201 Captura realizada com sucesso
401 Não autorizado
422 Entidade não processável (cobrança não pode ser capturada, sem estabelecimento)

PIX #

Crie cobranças PIX com QR Code para pagamento instantaneo.

POST /api/v2/sellers/{sellerId}/orders/pix
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar um pedido com pagamento via PIX.

Campo Tipo Obrigatório Descrição
amount integer Sim Valor total em centavos
orderReference string Sim Referencia unica do pedido
customer.document string Sim CPF/CNPJ do cliente
customer.name string Sim Nome completo
customer.birthdate string Sim Data de nascimento (YYYY-MM-DD)
notificationUrl string Não URL para webhooks
payments[].paymentMethod string Sim PIX
payments[].amount integer Sim Valor em centavos
json — request body
{
  "orderReference": "PIX_1694314800",
  "amount": 15000,
  "customer": {
    "birthdate": "1992-02-29",
    "document": "55375716097",
    "name": "Tony Stark"
  },
  "notificationUrl": "https://meusite.com.br/events",
  "payments": [
    {
      "paymentMethod": "PIX",
      "amount": 15000
    }
  ]
}

Resposta: 201 Created

Headers da resposta
Location URL do recurso criado
Content-ID ID numérico do recurso

Exemplo de resposta ao consultar o pedido via GET na URL do header Location:

json — response body
{
  "id": 5678,
  "orderReference": "PIX_1694314800",
  "status": "PENDING",
  "amount": 15000,
  "charges": [
    {
      "id": 1234,
      "status": "PENDING",
      "value": 15000,
      "transactions": [
        {
          "id": "txn_abc123",
          "status": "AWAITING_PAYMENT",
          "pix": {
            "qrCode": "00020126580014br.gov.bcb.pix...",
            "qrCodeBase64": "data:image/png;base64,iVBOR..."
          }
        }
      ]
    }
  ]
}
Campo Tipo Descrição
id integer ID do pedido
orderReference string Referencia unica do pedido
status string Status do pedido (ex: PENDING, PAID)
amount integer Valor total em centavos
charges[].id integer ID da cobrança
charges[].status string Status da cobrança
charges[].transactions[].pix.qrCode string Código copia-e-cola do PIX (EMV)
charges[].transactions[].pix.qrCodeBase64 string Imagem do QR Code em Base64 (PNG)
Status Descrição
201 Pedido PIX criado com sucesso
400 Requisição malformada
401 Não autorizado
422 Entidade não processável

Boleto #

Gere boletos bancarios com data de vencimento e descrição personalizados.

POST /api/v2/sellers/{sellerId}/orders/boleto
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar um pedido com pagamento via Boleto.

Campo Tipo Obrigatório Descrição
orderReference string Sim Referencia unica do pedido (4-32 caracteres)
amount integer Sim Valor total em centavos. Deve ser igual a soma dos payments[].amount
customer.name string Sim Nome completo do cliente
customer.document string Não CPF/CNPJ. Se informado, deve ser válido.
customer.birthdate string Não Data de nascimento (YYYY-MM-DD)
customer.address.* object Sim Endereco do cliente. Obrigatorio para boleto.
notificationUrl string (URI) Não URL para webhooks
metadata object Não Dados customizados chave-valor
payments[].paymentMethod string Sim BOLETO
payments[].amount long Sim Valor do pagamento em centavos (mínimo 1)
payments[].dueDate integer (timestamp) Sim Data de vencimento do boleto (timestamp epoch em milissegundos)
payments[].paymentLimitDate integer (timestamp) Sim Data limite de pagamento (timestamp epoch em milissegundos)
payments[].ourNumber string Não Número que identifica unicamente um boleto para uma conta (5-15 caracteres)
payments[].documentNumber string Não Identificador do boleto
payments[].instructions string Não Instruções do boleto
payments[].splits array Não Regras de divisão do recebimento (split)
payments[].fine object Não Aplicação da multa sobre o boleto
payments[].fine.days integer Sim Dias após a expiração do boleto quando a multa deve ser cobrada
payments[].fine.type string Sim Tipo de cálculo: FLAT (valor fixo) ou PERCENTAGE (percentual)
payments[].fine.amount integer Sim Valor da multa. Veja a regra de casas decimais abaixo.
payments[].interest object Não Aplicação do juros sobre o boleto
payments[].interest.days integer Sim Dias após a expiração do boleto quando o juros deve ser cobrado
payments[].interest.type string Sim Tipo de cálculo: FLAT (valor fixo) ou PERCENTAGE (percentual)
payments[].interest.amount integer Sim Valor dos juros. Veja a regra de casas decimais abaixo.
payments[].interest.frequency string Sim Modo de cobrança dos juros: DAILY, MONTHLY ou ANNUAL
Multa e juros: Os objetos fine e interest são opcionais. Porém, quando enviados, todos os seus campos internos passam a ser obrigatórios.
Casas decimais em fine.amount e interest.amount: O valor depende do type enviado.
  • Quando type for PERCENTAGE, o valor deve ser enviado como inteiro com 5 casas decimais. Ex.: 2% → 200000.
  • Quando type for FLAT, o valor deve ser enviado como inteiro com 2 casas decimais (em centavos). Ex.: R$ 2,00 → 200.
json — request body
{
  "orderReference": "BOL_1694314800",
  "amount": 25000,
  "customer": {
    "birthdate": "1992-02-29",
    "document": "55375716097",
    "name": "Tony Stark",
    "address": {
      "street": "Rua Jair Hamms",
      "streetNumber": "38",
      "neighborhood": "Pedra Branca",
      "city": "Palhoca",
      "state": "SC",
      "zipCode": "88137084"
    }
  },
  "notificationUrl": "https://meusite.com.br/events",
  "payments": [
    {
      "paymentMethod": "BOLETO",
      "amount": 25000,
      "dueDate": 1694314800000,
      "paymentLimitDate": 1694746800000,
      "instructions": "Não receber após o vencimento",
      "fine": {
        "days": 1,
        "type": "FLAT",
        "amount": 200
      },
      "interest": {
        "days": 1,
        "type": "PERCENTAGE",
        "amount": 200000,
        "frequency": "MONTHLY"
      }
    }
  ]
}

Resposta: 201 Created — corpo vazio com headers HATEOAS

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/charges/5678
Content-ID: 5678
Link: </api/v2/orders/1234/metadata>; rel="metadata"
Link: </api/v2/charges/5678/boleto/cancel>; rel="cancel"
Link: </api/v2/charges/itau/abc123/boleto/pdf>; rel="boleto-pdf"
Link: </api/v2/public/boleto/abc123/pdf?token=xyz>; rel="public-boleto-pdf"
Headers da resposta
Location URL da cobrança criada — use GET para consultar os detalhes
Content-ID ID numérico da cobrança
Link rel="metadata" URL para acessar os metadados do pedido
Link rel="cancel" URL para cancelar o boleto
Link rel="boleto-pdf" URL para download do PDF do boleto (autenticada)
Link rel="public-boleto-pdf" URL pública para download do PDF do boleto

Exemplo de resposta ao consultar o pedido via GET na URL do header Location:

json — response body
{
  "id": 9012,
  "orderReference": "BOL_1694314800",
  "status": "PENDING",
  "amount": 25000,
  "charges": [
    {
      "id": 5678,
      "status": "PENDING",
      "value": 25000,
      "transactions": [
        {
          "id": "txn_def456",
          "status": "AWAITING_PAYMENT",
          "boleto": {
            "barcode": "23793.38128 60000.000003 00000.000400 1 84340000025000",
            "url": "https://boleto.zoov.com.br/view/abc123"
          }
        }
      ]
    }
  ]
}
Campo Tipo Descrição
id integer ID do pedido
orderReference string Referencia unica do pedido
status string Status do pedido (ex: PENDING, PAID)
amount integer Valor total em centavos
charges[].id integer ID da cobrança
charges[].status string Status da cobrança
charges[].transactions[].boleto.barcode string Linha digitavel do boleto
charges[].transactions[].boleto.url string URL para visualizacao do boleto
Status Descrição
201 Pedido com boleto criado com sucesso
400 Requisição malformada
401 Não autorizado
422 Entidade não processável

Gestão de Cobranças

Gerencie o ciclo de vida completo das cobranças: crie, capture, estorne e consulte.

Cobrança Direta com Cartão #

Crie uma cobrança direta passando os dados do cartão sem necessidade de tokenização previa.

POST /api/v2/charges/credit/card
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar uma cobrança direta com cartão de crédito.

json — request body
{
  "customer": {
    "document": "97012687096",
    "name": "John Snow"
  },
  "card": {
    "expiration": { "month": "01", "year": "2028" },
    "holder": { "document": "97012687096", "name": "John Snow" },
    "cardNumber": "5356066320271893",
    "cvv": "123"
  },
  "installments": 1,
  "value": 10000,
  "yourReferenceId": 123456,
  "notificationUrl": "https://myserver/events/charges/ORDER0001"
}
Campo Tipo Obrigatório Descrição
customer.namestringSimNome do cliente (1-50 caracteres)
customer.documentstringNãoCPF/CNPJ. Se informado, deve ser válido (11-14 dígitos)
card.cardNumberstringSimNúmero do cartão (11-21 dígitos)
card.cvvstringNãoCVV (3-4 dígitos, opcional)
card.holder.namestringSimNome do titular
card.holder.documentstringNãoDocumento do titular. Se informado, deve ser válido
card.expiration.monthstringSimMês (MM)
card.expiration.yearstringSimAno (YYYY)
installmentsintegerSimParcelas (1-12)
valuelongSimValor em centavos (mínimo 0)
yourReferenceIdlongNãoReferência numérica do lojista (mínimo 1)
notificationUrlstringNãoURL webhook
affiliateIdlongNãoID da loja (mínimo 0)
Sem body na resposta. O endpoint retorna apenas headers. Use o Content-ID para obter o ID da cobrança criada.
Headers de Resposta
LocationURL do recurso criado
Content-IDID numérico da cobrança
Linkrel="refund" — URL para estorno via cartão de crédito
StatusDescrição
201Cobrança criada com sucesso
400Requisição malformada
401Nao autenticado
422Entidade não processável

Estorno Cartão #

POST /api/v2/charges/{id}/credit-card/refund
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Estornar uma cobrança de cartão de crédito.

Envie no body o motivo do estorno (RefundReason):

DUPLICATE_CHARGE IMPROPER_CHARGE COSTUMER_WITHDRAWAL OTHERS
json — request body
{
  "reason": "DUPLICATE_CHARGE",
  "amount": 5000
}
Campo Tipo Obrigatório Descrição
reasonRefundReasonSimMotivo do estorno: DUPLICATE_CHARGE, IMPROPER_CHARGE, COSTUMER_WITHDRAWAL ou OTHERS
amountlongNãoValor parcial em centavos; se omitido, estorna o total
Headers de Resposta
LocationURL do recurso criado
StatusDescrição
201Estorno criado com sucesso
401Nao autenticado
404Cobrança nao encontrada
422Entidade não processável

Devolução PIX #

POST /api/v2/charges/{id}/pix/return
Headers
Authorization: Bearer {seu_token}

Devolver um pagamento PIX. Devolve sempre o valor total — não aceita body.

Parâmetro Tipo Obrigatório Descrição
idlongSimID da cobrança PIX (path)

Nenhum corpo é necessário.

Headers de Resposta
LocationURL do recurso criado
StatusDescrição
201Devolução criada com sucesso
401Não autenticado
422Entidade não processável (cobrança não encontrada, já cancelada, valor excedido)

Cancelar Boleto #

POST /api/v2/charges/{id}/boleto/cancel
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cancelar um boleto pendente.

Parâmetro Tipo Obrigatório Descrição
idintegerSimID da cobrança do boleto

Nenhum corpo e necessário.

StatusDescrição
200Boleto cancelado com sucesso
401Não autenticado
404Cobrança não encontrada
422Entidade não processável
500Erro interno do servidor

Cancelar QR Code PIX #

POST /api/v2/charges/{id}/pix/cancel
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cancelar um QR Code PIX pendente.

Parâmetro Tipo Obrigatório Descrição
idintegerSimID da cobrança PIX

Nenhum corpo é necessário. Cancela o QR Code PIX antes do pagamento.

Headers de Resposta
LocationURL do recurso
StatusDescrição
201QR Code PIX cancelado com sucesso
401Não autenticado
422Entidade não processável
500Erro interno do servidor

Consultar Cobrança #

GET /api/v2/charges/{id}
Headers
Authorization: Bearer {seu_token}

Obter os detalhes de uma cobrança pelo ID.

Parâmetro Tipo Obrigatório Descrição
idintegerSimID da cobrança
json — response body (200)
{
  "id": 12345,
  "status": "PAY",
  "value": 10000,
  "refundedAmount": 0,
  "installments": 1,
  "customer": {
    "id": 101,
    "name": "John Snow",
    "document": "97012687096",
    "email": "john@example.com",
    "phone": null
  },
  "order": {
    "id": 6789,
    "orderReference": "ORDER0001",
    "affiliate": null,
    "orderType": "LOOSE"
  },
  "items": [],
  "transactions": [
    {
      "paymentMethod": "CREDIT_CARD",
      "id": 99001,
      "uuid": "BP1778273165606",
      "status": "APPROVED",
      "type": "LOOSE",
      "value": 10000,
      "paidValue": 10000,
      "refundValue": 0,
      "transactionDate": 1694314800000,
      "transactionReference": "TXN-REF-001",
      "returnCode": "00",
      "returnMessage": "Transação aprovada"
    }
  ]
}
Headers de Resposta
Linkrel="boleto-pdf" — URL do PDF do boleto (quando aplicável)
Linkrel="public-boleto-pdf" — URL pública do PDF do boleto

Campos da resposta (200)

Campo Tipo Descrição
idlongID da cobrança
statusChargeStatusStatus atual
valuelongValor em centavos
refundedAmountlongValor estornado em centavos
installmentsintegerNúmero de parcelas
customer.idintegerID do cliente
customer.namestringNome do cliente
customer.documentstringCPF/CNPJ do cliente
customer.emailstringEmail do cliente
customer.phoneobjectTelefone do cliente (pode ser null)
order.idintegerID do pedido
order.orderReferencestringReferência do pedido
order.affiliateobjectDados da loja (pode ser null)
order.orderTypeOrderTypeTipo do pedido
items[]arrayItens da cobrança (name, unitPrice, quantity, planId)
transactions[].idlongID da transação
transactions[].uuidstringIdentificador único da transação (prefixo BP)
transactions[].statusTransactionStatusStatus da transação
transactions[].typeTransactionTypeTipo da transação
transactions[].paymentMethodstringMétodo de pagamento (CREDIT_CARD, PIX, BOLETO, etc.)
transactions[].valuelongValor da transação em centavos
transactions[].paidValuelongValor pago em centavos
transactions[].refundValuelongValor do estorno em centavos
transactions[].transactionDatelongData da transação (ms epoch)
transactions[].transactionReferencestringReferência da transação
transactions[].returnCodestringCódigo de retorno da adquirente
transactions[].returnMessagestringMensagem de retorno da adquirente
StatusDescrição
200Cobrança retornada com sucesso
401Nao autenticado
404Cobrança nao encontrada

Listar Cobranças #

GET /api/v2/charges
Headers
Authorization: Bearer {seu_token}

Listar cobranças com filtros.

Parâmetro Tipo Obrigatório Descrição
orderReferencestringNãoFiltrar por referência do pedido
paymentDateFromlongNãoData início em milissegundos (epoch)
paymentDateTolongNãoData fim em milissegundos (epoch)
statusChargeStatusNãoFiltrar por status (PAY, AUTHORIZED, PENDING, etc.)
pageintegerNãoNúmero da página
sizeintegerNãoItens por página
json — response body (200)
[
  {
    "id": 12345,
    "status": "PAY",
    "value": 10000,
    "refundedAmount": 0,
    "installments": 1,
    "customer": { "id": 101, "name": "John Snow", "document": "97012687096" },
    "order": { "id": 6789, "orderReference": "ORDER0001" },
    "transactions": [ "..." ]
  }
]
Resposta é um array simples. O endpoint retorna List<ChargeV2Response> diretamente — não é um objeto paginado. Cada elemento segue a mesma estrutura do endpoint Consultar Cobrança.

Campos da resposta (200)

Campo Tipo Descrição
[]arrayArray de ChargeV2Response (mesma estrutura de Consultar Cobrança)
StatusDescrição
200Lista retornada com sucesso
401Nao autenticado

Faturamento

Crie e gerencie faturas com multiplos métodos de pagamento e envio por email.

Criar Fatura #

POST /api/v2/sellers/{sellerId}/invoices
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar uma nova fatura para o cliente.

json — request body
{
  "customerId": 1,
  "invoiceNumber": "FAT-2024-001",
  "dueDate": "1732310753051",
  "notificationUrl": "https://meusite.com.br/events",
  "successUrl": "https://meusite.com.br/sucesso",
  "items": [
    { "productId": 1, "quantity": 1, "unitPriceInCents": 70000 }
  ],
  "acceptedPaymentMethods": [
    {
      "method": "CREDIT_CARD",
      "cardSettings": { "maxInstallments": 10, "feePassThrough": false }
    }
  ]
}
Campo Tipo Obrigatório Descrição
customerIdintegerSimID do cliente
invoiceNumberstringSimNúmero único da fatura
dueDatelongSimData de vencimento (epoch milissegundos)
paymentLimitDatelongNãoData limite de pagamento (epoch milissegundos)
notificationUrlstring (URI)NãoURL webhook (deve ser URI válida)
successUrlstring (URI)NãoURL de redirecionamento após pagamento (deve ser URI válida)
items[].productIdintegerSimID do produto
items[].quantityintegerSimQuantidade
items[].unitPriceInCentslongSimPreço unitário em centavos
acceptedPaymentMethods[].methodPaymentProfilesSimCREDIT_CARD, PIX ou BANK_SLIP
acceptedPaymentMethods[].amountOfflongNãoDesconto em centavos
acceptedPaymentMethods[].cardSettings.maxInstallmentsintegerSimMáximo de parcelas (1-12, obrigatório para CREDIT_CARD)
acceptedPaymentMethods[].cardSettings.feePassThroughbooleanSimRepassar taxa ao cliente (obrigatório para CREDIT_CARD)
acceptedPaymentMethods[].cardSettings.maxInstallmentsWithoutFeesintegerNãoMáximo de parcelas sem juros (0-99)
acceptedPaymentMethods[].cardSettings.softDescriptorstringNãoDescrição na fatura do cartão (máx. 13 caracteres)
acceptedPaymentMethods[].pixSettings.expiresInintegerNãoTempo de expiração do PIX
acceptedPaymentMethods[].pixSettings.descriptionstringNãoDescrição do pagamento PIX
acceptedPaymentMethods[].boletoSettings.instructionsstringNãoInstruções do boleto
fine.valuelongNãoValor da multa por atraso
interest.valuelongNãoValor dos juros por atraso
splits[]arrayNãoRegras de split de pagamento

Resposta: 201 Created — corpo vazio com headers HATEOAS

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/invoices/789
Link: </api/v2/invoices/789/credit-card/pay>; rel="pay-invoice-credit-card"
Headers da resposta
Location URL da fatura criada — use GET para consultar os detalhes
Link rel="pay-invoice-credit-card" URL para pagamento da fatura com cartão de crédito
Resposta sem body. O POST retorna 201 Created sem corpo — apenas os headers Location e Link. Para obter os dados da fatura criada, faça um GET usando a URL do header Location.
StatusDescrição
201Fatura criada com sucesso (sem body, apenas headers)
400Requisição malformada
401Não autenticado
422Entidade não processável (cliente não encontrado, afiliado ausente, plano não encontrado, desconto excede valor)
500Erro interno do servidor

Enviar Fatura por E-mail #

POST /api/v2/invoices/{id}/send-email
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Enviar a fatura por email para o cliente.

Parâmetro Tipo Obrigatório Descrição
idintegerSimID da fatura

Nenhum corpo e necessário. Envia a fatura para o email cadastrado do cliente.

StatusDescrição
200Email enviado com sucesso
401Não autenticado
404Fatura não encontrada
422Fatura em aberto (InvoiceIsOpenException)
500Erro interno do servidor

Obter Fatura #

GET /api/v2/invoices/{id}
Headers
Authorization: Bearer {seu_token}

Obter detalhes de uma fatura pelo ID.

Parâmetro Tipo Obrigatório Descrição
idlongSimID da fatura
Headers de Resposta
Linkrel="payment" — URL de pagamento da fatura
json — response body (200)
{
  "id": 1001,
  "invoiceNumber": "FAT-2024-001",
  "status": "PENDING",
  "customer": {
    "id": 1,
    "name": "João Silva",
    "document": "12345678901",
    "email": "joao@email.com",
    "phone": "11999999999"
  },
  "dueDate": 1732310753051,
  "closeDate": null,
  "amount": 70000,
  "paidAmount": null,
  "paymentUrl": "https://pay.zoov.com.br/invoice/abc123",
  "paymentLimitDate": null,
  "successUrl": "https://meusite.com/sucesso",
  "createdAt": 1732210753051,
  "invoiceSequence": 1,
  "acceptedPaymentMethods": [
    {
      "method": "CREDIT_CARD",
      "amountOff": null,
      "cardSettings": {
        "maxInstallments": 12,
        "feePassThrough": false
      },
      "pixSettings": null
    }
  ],
  "affiliate": null,
  "recurrentInvoiceId": null,
  "orderId": null,
  "fine": null,
  "interest": null,
  "userId": 100
}

Campos da resposta (200)

Campo Tipo Descrição
idlongID da fatura
invoiceNumberstringNúmero único da fatura
statusInvoiceStatusStatus da fatura (PENDING, PAID, CANCELLED, etc.)
customerobjectDados do cliente (id, name, document, email, phone)
customer.idintegerID do cliente
customer.namestringNome do cliente
customer.documentstringCPF/CNPJ do cliente
customer.emailstringEmail do cliente
customer.phonestringTelefone do cliente
dueDatelongData de vencimento (epoch ms)
closeDatelongData de fechamento (epoch ms)
amountlongValor total em centavos
paidAmountlongValor pago em centavos
paymentUrlstringURL de pagamento da fatura
paymentLimitDatelongData limite de pagamento (epoch ms)
successUrlstringURL de redirecionamento após pagamento
createdAtlongData de criação (epoch ms)
invoiceSequenceintegerSequência da fatura
acceptedPaymentMethods[]arrayMétodos de pagamento aceitos (objetos com method, amountOff, cardSettings, pixSettings)
acceptedPaymentMethods[].methodPaymentProfilesMétodo de pagamento
acceptedPaymentMethods[].amountOfflongDesconto em centavos
acceptedPaymentMethods[].cardSettingsobjectConfigurações do cartão (maxInstallments, feePassThrough)
acceptedPaymentMethods[].pixSettingsobjectConfigurações do PIX
affiliateobjectDados do afiliado
recurrentInvoiceIdlongID da fatura recorrente (se aplicável)
orderIdintegerID do pedido (se aplicável)
fineobjectConfiguração de multa
interestobjectConfiguração de juros
userIdlongID do usuário que criou
StatusDescrição
200Fatura retornada com sucesso
401Não autenticado
404Fatura não encontrada
500Erro interno do servidor

Listar Faturas #

GET /api/v2/invoices
Headers
Authorization: Bearer {seu_token}

Listar faturas com filtros opcionais. Retorna resultado paginado via Spring Data.

Parâmetro Tipo Obrigatório Descrição
invoiceNumberstringNãoFiltrar por número da fatura
dueDateFromlongNãoData de vencimento inicial (epoch ms)
dueDateTolongNãoData de vencimento final (epoch ms)
closeDateFromlongNãoData de fechamento inicial (epoch ms)
closeDateTolongNãoData de fechamento final (epoch ms)
paymentDateFromlongNãoData de pagamento inicial (epoch ms)
paymentDateTolongNãoData de pagamento final (epoch ms)
statusInvoiceStatus[]NãoFiltrar por status (PENDING, PAID, CANCELLED, etc.)
documentstringNãoFiltrar por CPF/CNPJ do cliente
pastDuebooleanNãoFiltrar faturas vencidas
pageintegerNãoPágina (padrão 0)
sizeintegerNãoItens por página (padrão 20)
sortstringNãoOrdenação (ex: dueDate,desc)
json — response body (200)
{
  "content": [
    {
      "id": 1001,
      "invoiceNumber": "FAT-2024-001",
      "status": "PENDING",
      "customer": {
        "id": 1,
        "name": "João Silva",
        "document": "12345678901",
        "email": "joao@email.com",
        "phone": "11999999999"
      },
      "dueDate": 1732310753051,
      "closeDate": null,
      "amount": 70000,
      "paidAmount": null,
      "paymentUrl": "https://pay.zoov.com.br/invoice/abc123",
      "successUrl": null,
      "invoiceSequence": 1,
      "pastDue": false,
      "paymentDate": null
    }
  ],
  "pageable": { "pageNumber": 0, "pageSize": 20 },
  "totalElements": 1,
  "totalPages": 1,
  "number": 0,
  "size": 20
}
CampoTipoDescrição
content[]arrayLista de faturas
content[].idlongID da fatura
content[].invoiceNumberstringNúmero da fatura
content[].statusInvoiceStatusStatus da fatura
content[].customerobjectDados do cliente (id, name, document, email, phone)
content[].dueDatelongData de vencimento (epoch ms)
content[].closeDatelongData de fechamento (epoch ms)
content[].amountlongValor total em centavos
content[].paidAmountlongValor pago em centavos
content[].paymentUrlstringURL de pagamento
content[].successUrlstringURL de redirecionamento
content[].invoiceSequenceintegerSequência da fatura
content[].pastDuebooleanSe a fatura está vencida
content[].paymentDatelongData de pagamento (epoch ms)
pageableobjectInformações de paginação
totalElementsintegerTotal de registros
totalPagesintegerTotal de páginas
numberintegerPágina atual
sizeintegerItens por página
StatusDescrição
200Lista retornada com sucesso
401Nao autenticado

Recorrência & Assinaturas

Automatize cobranças recorrentes com faturas periodicas e assinaturas.

Faturas Recorrentes #

Crie faturas que sao geradas automáticamente em intervalos regulares.

POST /api/v2/sellers/{sellerId}/recurring-invoices
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar uma fatura recorrente.

json — request body
{
  "customerId": 1,
  "billingCycleStartDate": 1736944528450,
  "daysUntilDue": 7,
  "billingFrequency": "MONTHLY",
  "collectionMethod": "AUTOMATIC_CHARGE",
  "recurringItems": [
    {
      "quantity": 1,
      "productId": 1,
      "maxBillingCycles": 10,
      "unitPriceInCents": 1027
    }
  ],
  "acceptedPaymentMethods": [
    { "method": "CREDIT_CARD", "cardSettings": { "maxInstallments": 10 } },
    { "method": "PIX", "amountOff": 1500 }
  ]
}
Campo Tipo Obrigatório Descrição
customerIdintegerSimID do cliente
billingCycleStartDatelongSimInício do ciclo (ms epoch)
daysUntilDueintegerSimDias até vencimento
billingFrequencystringSimDAILY, WEEKLY, MONTHLY, YEARLY
collectionMethodstringSimComo cada fatura do ciclo é cobrada. AUTOMATIC_CHARGE ou SEND_INVOICE — veja a explicação abaixo.
recurringItems[].quantityintegerSimQuantidade
recurringItems[].productIdintegerSimID do produto
recurringItems[].maxBillingCyclesintegerSimMáximo de ciclos
recurringItems[].unitPriceInCentsintegerSimPreco em centavos
collectionMethod — cobrança automática ou link de pagamento:
  • AUTOMATIC_CHARGECobrança automática. A cada ciclo, a plataforma tenta liquidar a fatura no vencimento sem ação do cliente. Com cartão de crédito, o débito é feito no cartão já cadastrado; com PIX Automático (após o consentimento na 1ª cobrança), o valor é debitado automaticamente da conta do pagador.
  • SEND_INVOICEEnvio de link. A cada ciclo, a fatura é gerada, mas o pagamento não é debitado automaticamente. O cliente recebe um link de pagamento (disponível também no header Link da resposta) e precisa acessá-lo para concluir o pagamento manualmente — por exemplo, escolhendo PIX, boleto ou cartão naquele ciclo.
Headers de Resposta
LocationURL do recurso criado
Content-IDID numérico da fatura recorrente

Resposta (após GET no recurso criado)

json — response body
{
  "id": 2001,
  "customerId": 1,
  "status": "ACTIVE",
  "billingFrequency": "MONTHLY",
  "collectionMethod": "AUTOMATIC_CHARGE",
  "billingCycleStartDate": 1736944528450,
  "daysUntilDue": 7,
  "recurringItems": [
    {
      "productId": 1,
      "quantity": 1,
      "unitPriceInCents": 1027,
      "maxBillingCycles": 10,
      "currentCycle": 1
    }
  ],
  "nextBillingDate": 1739622928450
}
Campo Tipo Descrição
idintegerID da fatura recorrente
customerIdintegerID do cliente
statusstringStatus da fatura (ACTIVE, CANCELLED, etc.)
billingFrequencystringFrequencia de cobrança (DAILY, WEEKLY, MONTHLY, YEARLY)
collectionMethodstringComo cada fatura do ciclo é cobrada: AUTOMATIC_CHARGE (automática) ou SEND_INVOICE (link de pagamento)
billingCycleStartDatelongInício do ciclo em milissegundos (epoch)
daysUntilDueintegerDias até o vencimento
recurringItems[]arrayLista de itens recorrentes
nextBillingDatelongProxima data de cobrança em milissegundos (epoch)
StatusDescrição
201Fatura recorrente criada com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável

Assinaturas #

Gerencie assinaturas vinculadas a planos de cobrança recorrente.

POST /api/v2/subscriptions/plans/{planId}/credit/card
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar uma assinatura vinculada a um plano, com pagamento via cartao de crédito.

ParâmetroTipoObrigatórioDescrição
planId (path)integerSimID do plano de assinatura
json — request body
{
  "customer": {
    "name": "Tony Stark",
    "document": "51190844001",
    "birthdate": "2000-01-01",
    "email": "stark@gmail.com",
    "phone": {
      "countryCode": 55,
      "areaCode": 48,
      "number": 998870001
    }
  },
  "card": {
    "cardNumber": "5448280000000007",
    "cvv": "123",
    "holder": {
      "name": "Tony Stark",
      "document": "51190844001"
    },
    "expiration": {
      "year": 2026,
      "month": 12
    }
  },
  "startDate": 1751500800000
}
CampoTipoObrigatórioDescrição
customer.namestringSimNome completo do cliente (1-50 caracteres)
customer.documentstringNãoCPF/CNPJ do cliente (11-14 dígitos). Se informado, deve ser válido
customer.birthdatestringNãoData de nascimento (YYYY-MM-DD)
customer.emailstringNãoE-mail do cliente
customer.phoneobjectNãoTelefone do cliente (se informado, sub-campos são obrigatórios)
customer.phone.countryCodeintegerSimCódigo do país (ex: 55)
customer.phone.areaCodeintegerSimDDD (11-99)
customer.phone.numberintegerSimNúmero do telefone
customer.addressobjectNãoEndereço do cliente
card.cardNumberstringSimNúmero do cartão (11-21 dígitos)
card.cvvstringNãoCVV do cartão (3-4 dígitos, opcional)
card.holder.namestringSimNome do titular (1-45 caracteres)
card.holder.documentstringNãoCPF/CNPJ do titular. Se informado, deve ser válido
card.expiration.yearintegerSimAno de validade (2023-2056)
card.expiration.monthintegerSimMês de validade (1-12)
yourReferenceIdlongNãoReferência externa numérica (mínimo 1)
notificationUrlstringNãoURL para receber notificações da assinatura
startDatelongNãoData de início agendado da assinatura em milissegundos desde a época (epoch UTC). Deve ser posterior à data atual. Quando ausente, a primeira cobrança ocorre imediatamente

Resposta: 201 Created — corpo vazio com headers HATEOAS

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/subscriptions/456
Content-ID: 456
Link: </api/v2/transactions/789>; rel="transaction"
Headers da resposta
Location URL da assinatura criada — use GET para consultar os detalhes
Content-ID ID numérico da assinatura
Link rel="transaction" URL da primeira transação da assinatura
StatusDescrição
201Assinatura criada com sucesso
400Requisição malformada
401Não autorizado
404Plano não encontrado
422Entidade não processável (sem estabelecimento, referência duplicada)
POST /api/v2/sellers/{sellerId}/subscriptions/plans/{planId}/credit-card
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar uma assinatura vinculada a um plano e a um seller específico, com pagamento via cartao de crédito. O affiliate é resolvido a partir do sellerId informado na URL.

ParâmetroTipoObrigatórioDescrição
sellerId (path)integerSimID do seller (affiliate) que receberá a assinatura
planId (path)integerSimID do plano de assinatura
json — request body
{
  "customer": {
    "name": "Tony Stark",
    "document": "51190844001",
    "birthdate": "2000-01-01",
    "email": "stark@gmail.com",
    "phone": {
      "countryCode": 55,
      "areaCode": 48,
      "number": 998870001
    }
  },
  "card": {
    "cardNumber": "5448280000000007",
    "cvv": "123",
    "holder": {
      "name": "Tony Stark",
      "document": "51190844001"
    },
    "expiration": {
      "year": 2026,
      "month": 12
    }
  },
  "startDate": 1751500800000
}
CampoTipoObrigatórioDescrição
customer.namestringSimNome completo do cliente (1-50 caracteres)
customer.documentstringNãoCPF/CNPJ do cliente (11-14 dígitos). Se informado, deve ser válido
customer.birthdatestringNãoData de nascimento (YYYY-MM-DD)
customer.emailstringNãoE-mail do cliente
customer.phoneobjectNãoTelefone do cliente (se informado, sub-campos são obrigatórios)
customer.phone.countryCodeintegerSimCódigo do país (ex: 55)
customer.phone.areaCodeintegerSimDDD (11-99)
customer.phone.numberintegerSimNúmero do telefone
customer.addressobjectNãoEndereço do cliente
card.cardNumberstringSimNúmero do cartão (11-21 dígitos)
card.cvvstringNãoCVV do cartão (3-4 dígitos, opcional)
card.holder.namestringSimNome do titular (1-45 caracteres)
card.holder.documentstringNãoCPF/CNPJ do titular. Se informado, deve ser válido
card.expiration.yearintegerSimAno de validade (2023-2056)
card.expiration.monthintegerSimMês de validade (1-12)
yourReferenceIdlongNãoReferência externa numérica (mínimo 1)
notificationUrlstringNãoURL para receber notificações da assinatura
startDatelongNãoData de início agendado da assinatura em milissegundos desde a época (epoch UTC). Deve ser posterior à data atual. Quando ausente, a primeira cobrança ocorre imediatamente

Resposta: 201 Created — corpo vazio com headers HATEOAS

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/subscriptions/456
Content-ID: 456
Link: </api/v2/transactions/789>; rel="transaction"
Headers da resposta
Location URL da assinatura criada — use GET para consultar os detalhes
Content-ID ID numérico da assinatura
Link rel="transaction" URL da primeira transação da assinatura
StatusDescrição
201Assinatura criada com sucesso
400Requisição malformada
401Não autorizado
404Plano ou seller não encontrado
422Entidade não processável (sem estabelecimento, referência duplicada)
DELETE /api/v2/subscriptions/{id}
Headers
Authorization: Bearer {seu_token}

Cancelar uma assinatura existente.

ParâmetroTipoObrigatórioDescrição
id (path)integerSimID da assinatura
Nenhum corpo e necessário. Cancela imediatamente a assinatura e interrompe cobranças futuras.
StatusDescrição
200Assinatura cancelada com sucesso
401Não autorizado
404Assinatura não encontrada
422Assinatura já cancelada (UnsubscribeException)
GET /api/v2/subscriptions
Headers
Authorization: Bearer {seu_token}

Listar assinaturas com filtros e paginação.

ParâmetroTipoObrigatórioDescrição
statusOrderStatus[]NãoFiltrar por status (ACTIVE, INACTIVE, OVERDUE, PENDING, CHARGEBACK, COUNTERCHARGE, CANCELED). Pode repetir o parâmetro para múltiplos valores
orderDateFromlongNãoData inicial do pedido em epoch ms (deve ser usado junto com orderDateTo)
orderDateTolongNãoData final do pedido em epoch ms (deve ser usado junto com orderDateFrom)
customerSearchstringNãoBusca por nome ou documento do cliente
customerIdintegerNãoFiltrar por ID do cliente
affiliateIdlongNãoFiltrar por ID do afiliado/loja
planIdintegerNãoFiltrar por ID do plano
orderReferencestringNãoFiltrar por referência externa do pedido
limitintegerNãoQuantidade de itens por página (padrão: 10)
offsetintegerNãoDeslocamento para paginação (padrão: 0)
json — response body (200)
[
  {
    "id": 3001,
    "orderDate": 1694314800000,
    "status": "ACTIVE",
    "valueInCents": 29900,
    "frequency": "MONTHLY",
    "maxCycle": 12,
    "currentCycle": 3,
    "collectionMethod": "AUTOMATIC_CHARGE",
    "chargeStyle": "STREAM",
    "customer": {
      "id": 101,
      "name": "Tony Stark",
      "email": "stark@gmail.com",
      "document": "51190844001",
      "phone": {
        "countryCode": "55",
        "areaCode": "48",
        "number": "998870001"
      }
    },
    "items": [
      { "id": 55, "name": "Plano Premium" }
    ],
    "affiliate": {
      "id": 1,
      "name": "Loja Principal"
    }
  }
]
CampoTipoDescrição
idintegerID da assinatura
orderDatelongData do pedido (epoch ms)
statusOrderStatusStatus da assinatura (ACTIVE, CANCELLED, etc.)
valueInCentslongValor em centavos
frequencyPlanFrequencyFrequência de cobrança (WEEKLY, BIWEEKLY, MONTHLY, BIMONTHLY, QUARTERLY, SEMESTRAL, YEARLY)
maxCycleintegerNúmero máximo de ciclos de cobrança
currentCycleintegerCiclo atual (pode ser null)
collectionMethodCollectionMethodTypesMétodo de cobrança (AUTOMATIC_CHARGE, SEND_INVOICE)
chargeStyleChargeStylesEstilo de cobrança (STREAM, BOOKLET)
customerobjectDados do cliente
customer.idintegerID do cliente
customer.namestringNome do cliente
customer.emailstringE-mail do cliente
customer.documentstringCPF/CNPJ do cliente
customer.phoneobjectTelefone do cliente
itemsarrayPlanos vinculados à assinatura (id, name)
affiliateobjectDados do afiliado/loja (pode ser null)
affiliate.idlongID do afiliado
affiliate.namestringNome do afiliado
StatusDescrição
200Lista retornada com sucesso
401Não autorizado
GET /api/v2/subscriptions/{id}
Headers
Authorization: Bearer {seu_token}

Obter os detalhes de uma assinatura.

ParâmetroTipoObrigatórioDescrição
id (path)integerSimID da assinatura
json — response body
{
  "id": 3001,
  "orderDate": 1694314800000,
  "cancelationDate": null,
  "status": "ACTIVE",
  "amount": 29900,
  "yourReferenceId": "123456",
  "installments": 1,
  "affiliate": {
    "id": 1,
    "name": "Loja Principal"
  },
  "customer": {
    "id": 101,
    "name": "Tony Stark",
    "email": "stark@gmail.com",
    "document": "51190844001",
    "phone": {
      "countryCode": "55",
      "areaCode": "48",
      "number": "998870001"
    }
  },
  "items": [
    { "id": 55, "name": "Plano Premium" }
  ],
  "frequency": "MONTHLY",
  "maxCycle": 12,
  "currentCycle": 3,
  "collectionMethod": "AUTOMATIC_CHARGE",
  "chargeStyle": "STREAM"
CampoTipoDescrição
idintegerID da assinatura
orderDatelongData do pedido (epoch ms)
cancelationDatelongData de cancelamento (epoch ms, null se ativa)
statusOrderStatusStatus da assinatura (ACTIVE, CANCELLED, etc.)
amountlongValor em centavos
yourReferenceIdstringReferência externa
installmentsintegerNúmero de parcelas
affiliateobjectDados do afiliado/loja (pode ser null)
affiliate.idlongID do afiliado
affiliate.namestringNome do afiliado
customerobjectDados do cliente (pode ser null)
customer.idintegerID do cliente
customer.namestringNome do cliente
customer.emailstringE-mail do cliente
customer.documentstringCPF/CNPJ do cliente
customer.phoneobjectTelefone do cliente
itemsarrayPlanos vinculados à assinatura (id, name)
frequencyPlanFrequencyFrequência de cobrança (WEEKLY, BIWEEKLY, MONTHLY, BIMONTHLY, QUARTERLY, SEMESTRAL, YEARLY)
maxCycleintegerNúmero máximo de ciclos de cobrança
currentCycleintegerCiclo atual (pode ser null)
collectionMethodCollectionMethodTypesMétodo de cobrança (AUTOMATIC_CHARGE, SEND_INVOICE)
chargeStyleChargeStylesEstilo de cobrança (STREAM, BOOKLET)
Headers de Resposta
Linkrel="charges" — URL para listar cobranças da assinatura
Linkrel="customer" — URL do cliente vinculado
StatusDescrição
200Assinatura retornada com sucesso
401Não autorizado
404Assinatura não encontrada

PIX Automático

Recorrência nativa do PIX (padrão do Banco Central): o cliente autoriza uma única vez e as cobranças seguintes são debitadas automaticamente, sem novo QR Code a cada ciclo.

Visão Geral #

O PIX Automático é o padrão de recorrência do PIX regulamentado pelo Banco Central. Diferente do PIX comum — em que cada cobrança gera um QR Code que o cliente precisa pagar manualmente — aqui o cliente concede uma autorização de débito recorrente (o consentimento) apenas na primeira cobrança. A partir daí, cada cobrança do ciclo é debitada automaticamente da conta do pagador, sem qualquer ação dele.

Aspecto PIX comum PIX Automático
Autorização do clienteA cada cobrançaUma única vez (consentimento)
Cobranças seguintesNovo QR Code manualDébito automático por ciclo
Ideal paraPagamento avulsoMensalidades, assinaturas, planos
Retentativa em caso de falhaNão se aplicaAutomática (até 3 tentativas em 7 dias)
Habilitação: o PIX Automático precisa estar liberado para a sua conta. Fale com o time da Zoov Payment para ativar o recurso antes de começar a integração.
Somente novas assinaturas: o PIX Automático vale apenas para assinaturas criadas a partir da adoção deste fluxo (fatura recorrente). Assinaturas existentes que já foram criadas com PIX imediato (QR Code pago a cada ciclo) não migram para o débito recorrente automaticamente e continuam no fluxo antigo. Para usar o PIX Automático com um cliente já existente, crie uma nova assinatura utlizando o fluxo de fatura recorrente.

Como funciona #

Fluxo do PIX Automático
1
Criar autorização
Fatura recorrente aceitando PIX
2
Cliente autoriza
Paga o 1º PIX e aprova o débito recorrente
3
Débitos automáticos
Cada ciclo é debitado sem ação do cliente
4
Webhooks
Você acompanha consentimento e cada liquidação

Ao pagar a primeira fatura via PIX, o cliente recebe um QR Code (copia-e-cola) que faz duas coisas ao mesmo tempo: liquida o primeiro pagamento e concede a autorização de recorrência (jornada de autorização + pagamento em uma etapa única). É nesse momento que a recorrência é registrada no Banco Central. Concluída essa etapa, a Zoov Payment passa a gerar e debitar as cobranças seguintes automaticamente, na frequência definida na fatura recorrente — a primeira cobrança fica pendente e as demais já nascem agendadas.

Criar a autorização #

O PIX Automático é iniciado a partir de uma Fatura Recorrente que aceita PIX em acceptedPaymentMethods. Não há endpoint separado para a recorrência. Com o recurso habilitado na sua conta, a autorização de débito recorrente é registrada automaticamente no momento em que a primeira fatura é paga via PIX — é aí que o QR Code é gerado (veja Como funciona).

O que aciona o PIX Automático: não é o collectionMethod, e sim o recurso estar habilitado na conta somado a uma fatura recorrente paga via PIX. O collectionMethod (AUTOMATIC_CHARGE ou SEND_INVOICE) define apenas como as faturas são operadas — a recorrência PIX funciona com ambos.
POST /api/v2/sellers/{sellerId}/recurring-invoices
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar uma fatura recorrente que aceita PIX (base para a recorrência PIX Automático).

json — request body
{
  "customerId": 1,
  "billingCycleStartDate": 1736944528450,
  "daysUntilDue": 7,
  "billingFrequency": "MONTHLY",
  "collectionMethod": "AUTOMATIC_CHARGE",
  "recurringItems": [
    {
      "quantity": 1,
      "productId": 1,
      "maxBillingCycles": 12,
      "unitPriceInCents": 4990
    }
  ],
  "acceptedPaymentMethods": [
    { "method": "PIX" }
  ]
}
Campo Tipo Obrigatório Descrição
collectionMethodstringSimComo cada fatura do ciclo é cobrada: AUTOMATIC_CHARGE (débito automático) ou SEND_INVOICE (link de pagamento a cada ciclo). Não é o que aciona o PIX Automático — a recorrência PIX funciona com qualquer um dos dois. Detalhes em Faturas Recorrentes.
acceptedPaymentMethods[].methodstringSimInclua PIX. Para PIX, informe apenas method (o objeto cardSettings só é exigido para CREDIT_CARD).
billingFrequencystringSimFrequência da recorrência. No PIX Automático: WEEKLY, MONTHLY, QUARTERLY, SEMESTRAL ou YEARLY.
recurringItems[].maxBillingCyclesintegerSimNúmero máximo de ciclos a serem cobrados.
Consulte a seção Faturas Recorrentes para a lista completa de campos e resposta. A criação retorna 201 Created com Location e headers Link (assinatura, faturas e link de pagamento) — o QR Code não vem nesta resposta. Ele é gerado quando a primeira fatura é paga via PIX.

Ciclo de vida da autorização #

O consentimento (a autorização de débito recorrente) passa pelos seguintes estados. Importante: a fatura só se torna ativa quando a primeira cobrança é efetivamente paga — aprovar o consentimento sozinho não confirma pagamento.

Estado do consentimento Significado Efeito na fatura
CriadoAutorização gerada, aguardando o cliente aprovar/pagar.Pendente
AprovadoCliente concedeu o débito recorrente.Pendente até a 1ª cobrança ser paga
RejeitadoCliente ou banco recusou a autorização.Cancelada
ExpiradoAutorização não foi concluída no prazo.Cancelada
CanceladoRecorrência encerrada (pelo cliente ou lojista).Cancelada

A cada ciclo, uma cobrança é agendada e debitada automaticamente. Se um débito falhar, o PIX Automático faz retentativa automática (até 3 tentativas ao longo de 7 dias) antes de marcar a cobrança como não paga.

Webhooks #

Como as cobranças acontecem sem interação do cliente, os webhooks são a forma de acompanhar a recorrência. As notificações chegam na URL configurada em notificationUrl (mesmo mecanismo descrito em Webhooks & Eventos). Você recebe eventos em dois momentos:

Evento Quando ocorre O que fazer
Status do consentimentoQuando a autorização é criada, aprovada, rejeitada, expira ou é cancelada.Atualize o estado da recorrência no seu sistema (ver tabela acima).
Liquidação da cobrançaQuando uma cobrança do ciclo é efetivamente paga.Confirme o pagamento e libere/renove o serviço do cliente.
Importante: confirme o pagamento apenas quando a cobrança estiver liquidada (paga). Notificações de agendamento ou de tentativa em andamento não significam que o valor foi debitado. Ao receber o webhook, faça um GET na API para obter o status atualizado antes de liberar o serviço.

Marketplace & Split

Distribua automáticamente os valores entre multiplos vendedores em uma transação.

Exemplo com Split #

json — pedido com split
{
  "orderReference": "ORDER-SPLIT-001",
  "amount": 150000,
  "splitMode": "ACQUIRER",
  "payments": [{
    "paymentMethod": "CREDIT_CARD",
    "cardToken": { "cvv": "123", "token": "9fab5bfd..." },
    "amount": 150000,
    "installments": 10,
    "splits": [
      { "amount": 100000, "sellerId": 1 },
      { "amount": 50000, "sellerId": 2 }
    ]
  }]
}
Importante: A soma dos valores do split DEVE ser igual ao valor total do pedido.
CampoTipoObrigatórioDescrição
splitModeSplitModesSimModo do split (DATABASE ou ACQUIRER)
payments[].splits[].sellerIdlongSimID do vendedor/recebedor (mínimo 1)
payments[].splits[].amountlongSimValor em centavos para este recebedor (mínimo 1)
payments[].splits[].absorbFeebooleanNãoSe TRUE, o recebedor absorve as taxas de intermediação
Headers de Resposta
LocationURL do recurso criado
Content-IDID numérico do pedido
LinkLinks HATEOAS para recursos relacionados
StatusDescrição
201Pedido com split criado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável

Fatura com Split #

Crie uma fatura distribuindo o valor entre múltiplos vendedores. No split de fatura a divisão é feita por percentual (campo splits[].percentage), diferente do split de pedido que utiliza valor em centavos.

POST /api/v2/sellers/{sellerId}/invoices
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Criar uma fatura avulsa com split de pagamento entre vendedores.

json — fatura com split
{
  "customerId": 1,
  "invoiceNumber": "FAT-2024-SPLIT-001",
  "dueDate": "1732310753051",
  "notificationUrl": "https://meusite.com.br/events",
  "successUrl": "https://meusite.com.br/sucesso",
  "items": [
    { "productId": 1, "quantity": 1, "unitPriceInCents": 100000 }
  ],
  "acceptedPaymentMethods": [
    {
      "method": "CREDIT_CARD",
      "cardSettings": { "maxInstallments": 10, "feePassThrough": false }
    }
  ],
  "splits": [
    { "sellerId": 1, "percentage": 70 }
    { "sellerId": 2, "percentage": 30 }
  ]
}
Importante: A soma dos valores de splits[].percentage DEVE ser igual a 100%.
CampoTipoObrigatórioDescrição
splits[]arrayNãoRegras de split de pagamento da fatura
splits[].sellerIdlongSimID do vendedor/recebedor
splits[].percentagedecimalSimPercentual destinado ao recebedor (a soma de todos deve ser 100)
splits[].absorbFeebooleanNãoSe TRUE, o recebedor absorve as taxas de intermediação (default: false)

Resposta: 201 Created — corpo vazio com headers HATEOAS

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/invoices/789
Link: </api/v2/invoices/789/credit-card/pay>; rel="pay-invoice-credit-card"
Headers da resposta
Location URL da fatura criada — use GET para consultar os detalhes
Link rel="pay-invoice-credit-card" URL para pagamento da fatura com cartão de crédito
StatusDescrição
201Fatura com split criada com sucesso
401Não autorizado
422Entidade não processável (ex.: soma dos percentuais diferente de 100%)

Sellers e Receivers #

Cadastre vendedores (sellers) e recebedores (receivers) para operar split de pagamento em marketplace.

Vendedor (seller) vs Recebedor (receiver): ambos usam o mesmo formato de cadastro (CPF ou CNPJ), mas com papéis distintos na plataforma:
  • Vendedor (seller) — pode iniciar uma venda (pedidos, faturas, assinaturas etc.) e também participar do split como recebedor de parte do valor.
  • Recebedor (receiver)não pode iniciar uma venda; participa apenas como destinatário de uma parcela do valor em operações de split já iniciadas por um vendedor.

KYC: tanto o vendedor quanto o recebedor passam pelo processo completo de KYC (validação de identidade e dados cadastrais) antes de ficarem aptos a operar. Após a criação via API, o cadastro inicia com status PENDING até a conclusão desse onboarding.

POST /api/v2/sellers/cnpj
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cadastrar seller por CNPJ.

json — request body
{
  "owner": {
    "name": {
      "firstName": "João",
      "lastName": "Silva"
    },
    "document": "51190844001",
    "birthdate": "1990-01-15",
    "email": "joao@email.com",
    "phone": { "countryCode": "55", "areaCode": "48", "number": "998870001" },
    "address": {
      "street": "Rua Principal", "streetNumber": "100",
      "neighborhood": "Centro", "city": "Florianópolis",
      "state": "SC", "zipCode": "88000000"
    }
  },
  "businessName": "Empresa Exemplo LTDA",
  "document": "12345678000190",
  "openingDate": "2020-03-15",
  "businessEmail": "contato@empresa.com",
  "businessPhone": { "countryCode": "55", "areaCode": "48", "number": "33001234" },
  "businessAddress": {
    "street": "Av Comercial", "streetNumber": "500",
    "neighborhood": "Centro", "city": "Florianópolis",
    "state": "SC", "zipCode": "88000000"
  },
  "mcc": 5411,
  "bankAccount": {
    "bankCode": "001",
    "bankBranch": "1234",
    "accountNumber": "56789",
    "accountCheckDigit": "0",
    "accountType": "CHECKING"
  }
}
CampoTipoObrigatórioDescrição
owner.name.firstNamestringSimPrimeiro nome do proprietário
owner.name.lastNamestringSimSobrenome do proprietário
owner.documentstringSimCPF do proprietário (11 dígitos numéricos)
owner.birthdatestringSimData de nascimento (YYYY-MM-DD)
owner.emailstringSimE-mail do proprietário
owner.phoneobjectSimTelefone (countryCode, areaCode, number)
owner.addressobjectSimEndereço do proprietário (street, streetNumber, neighborhood, city, state, zipCode)
businessNamestringSimRazão social da empresa
documentstringSimCNPJ (14 caracteres alfanuméricos)
openingDatestringSimData de abertura da empresa (YYYY-MM-DD)
businessEmailstringSimE-mail da empresa
businessPhoneobjectSimTelefone da empresa (countryCode, areaCode, number)
businessAddressobjectSimEndereço comercial (street, streetNumber, neighborhood, city, state, zipCode)
mccintegerSimCódigo MCC (Merchant Category Code)
bankAccountobjectSimConta bancária (bankCode, bankBranch, accountNumber, accountCheckDigit, accountType)
softDescriptorstringNãoNome exibido na fatura do cartão
notificationUrlstring (URI)NãoURL para receber webhooks de eventos do seller
webLinksobjectNãoLinks da empresa (websiteUrl, facebookUrl, instagramUrl, socialXUrl)
monthlyRevenueInCentslongNãoFaturamento mensal estimado em centavos

Resposta: 201 Created — corpo vazio

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/sellers/12345
Headers da resposta
Location URL do seller criado — use GET para consultar os detalhes
StatusDescrição
201Seller criado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável (documento duplicado, MCC inválido, etc.)
POST /api/v2/sellers/cpf
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cadastrar seller por CPF.

json — request body
{
  "name": {
    "firstName": "Tony",
    "lastName": "Stark"
  },
  "document": "51190844001",
  "birthdate": "1990-05-29",
  "email": "tony@email.com",
  "phone": {
    "countryCode": "55",
    "areaCode": "48",
    "number": "998870001"
  },
  "address": {
    "street": "Rua Principal", "streetNumber": "100",
    "neighborhood": "Centro", "city": "Florianópolis",
    "state": "SC", "zipCode": "88000000"
  },
  "mcc": 5411,
  "bankAccount": {
    "bankCode": "001",
    "bankBranch": "1234",
    "accountNumber": "56789",
    "accountCheckDigit": "0",
    "accountType": "CHECKING"
  }
}
CampoTipoObrigatórioDescrição
name.firstNamestringSimPrimeiro nome
name.lastNamestringSimSobrenome
documentstringSimCPF (11 dígitos numéricos)
birthdatestringSimData de nascimento (YYYY-MM-DD)
emailstringSimE-mail de contato
phone.countryCodestringNãoCódigo do país (1-3 dígitos, ex: "55")
phone.areaCodestringSimDDD (2 dígitos)
phone.numberstringSimNúmero do telefone (6-9 dígitos)
addressobjectSimEndereço (street, streetNumber, neighborhood, city, state, zipCode)
mccintegerSimCódigo MCC (Merchant Category Code)
bankAccount.bankCodestringSimCódigo do banco (3-4 dígitos, ex: "001")
bankAccount.bankBranchstringSimNúmero da agência (1-9 caracteres)
bankAccount.bankBranchCheckDigitstringNãoDígito verificador da agência (1-2 caracteres)
bankAccount.accountNumberstringSimNúmero da conta (1-11 caracteres)
bankAccount.accountCheckDigitstringSimDígito verificador da conta (1-2 caracteres)
bankAccount.accountTypeGatewayAccountTypesSimTipo da conta (CHECKING, SAVINGS)
softDescriptorstringNãoNome exibido na fatura do cartão
notificationUrlstring (URI)NãoURL para receber webhooks de eventos do seller
webLinksobjectNãoLinks da empresa (websiteUrl, facebookUrl, instagramUrl, socialXUrl)
monthlyRevenueInCentslongNãoFaturamento mensal estimado em centavos

Resposta: 201 Created — corpo vazio

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/sellers/12345
Headers da resposta
Location URL do seller criado — use GET para consultar os detalhes
StatusDescrição
201Seller criado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável (documento duplicado, MCC inválido, etc.)
POST /api/v2/receivers/cnpj
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cadastrar receiver por CNPJ. Utiliza o mesmo formato de corpo do seller CNPJ.

Resposta: 201 Created — corpo vazio

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/receivers/12345
Headers da resposta
Location URL do receiver criado — use GET para consultar os detalhes
StatusDescrição
201Receiver criado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável (documento duplicado, MCC inválido, etc.)
POST /api/v2/receivers/cpf
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cadastrar receiver por CPF. Utiliza o mesmo formato de corpo do seller CPF.

Resposta: 201 Created — corpo vazio

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/receivers/12345
Headers da resposta
Location URL do receiver criado — use GET para consultar os detalhes
StatusDescrição
201Receiver criado com sucesso
400Requisição malformada
401Não autorizado
422Entidade não processável (documento duplicado, MCC inválido, etc.)
GET /api/v2/sellers
Headers
Authorization: Bearer {seu_token}

Listar sellers cadastrados com paginação e filtros opcionais.

ParâmetroTipoObrigatórioDescrição
searchField (query)stringNãoBusca por nome ou documento
status (query)arrayNãoFiltrar por status: ACTIVE, PENDING, INACTIVE, CANCELED
document (query)stringNãoFiltrar por CPF ou CNPJ
limit (query)integerNãoItens por página (default: 10)
offset (query)integerNãoDeslocamento da paginação (default: 0)
json — response body
[
  {
    "id": 1,
    "name": "Tony Stark",
    "email": "tony@email.com",
    "document": "51190844001",
    "status": "ACTIVE",
    "mcc": 5411,
    "bank": {
      "bankCode": "001",
      "name": "Banco do Brasil"
    }
  }
]
CampoTipoDescrição
[].idlongID do seller
[].namestringNome do seller
[].emailstringE-mail de contato
[].documentstringCPF ou CNPJ
[].statusAffiliateStatusStatus: ACTIVE, PENDING, INACTIVE, CANCELED
[].mccintegerCódigo MCC
[].bankobjectBanco vinculado (bankCode, name)
StatusDescrição
200Lista retornada com sucesso
401Não autorizado
GET /api/v2/sellers/{id}
Headers
Authorization: Bearer {seu_token}

Obter seller por ID.

ParâmetroTipoObrigatórioDescrição
id (path)integerSimID do seller
json — response body
{
  "id": 1,
  "name": "Tony Stark",
  "businessName": "Empresa Exemplo LTDA",
  "document": "12345678000190",
  "address": {
    "street": "Av Comercial",
    "streetNumber": "500",
    "neighborhood": "Centro",
    "city": "Florianópolis",
    "state": "SC",
    "zipCode": "88000000"
  },
  "isSeller": true,
  "status": "ACTIVE"
}
CampoTipoDescrição
idlongID do seller
namestringNome do seller
businessNamestringRazão social
documentstringCPF ou CNPJ
addressobjectEndereço (street, streetNumber, lineTwo, neighborhood, zipCode, city, state)
isSellerbooleanSe é vendedor (true para sellers)
statusAffiliateStatusStatus: ACTIVE, PENDING, INACTIVE, CANCELED
StatusDescrição
200Seller retornado com sucesso
401Não autorizado
404Seller não encontrado
GET /api/v2/receivers
Headers
Authorization: Bearer {seu_token}

Listar receivers cadastrados com paginação e filtros opcionais.

ParâmetroTipoObrigatórioDescrição
searchField (query)stringNãoBusca por nome ou documento
status (query)arrayNãoFiltrar por status: ACTIVE, PENDING, INACTIVE, CANCELED
document (query)stringNãoFiltrar por CPF ou CNPJ
limit (query)integerNãoItens por página (default: 10)
offset (query)integerNãoDeslocamento da paginação (default: 0)
json — response body
[
  {
    "id": 2,
    "name": "Parceiro Exemplo",
    "email": "parceiro@email.com",
    "document": "12345678000190",
    "status": "PENDING",
    "mcc": 5411,
    "bank": {
      "bankCode": "001",
      "name": "Banco do Brasil"
    }
  }
]
CampoTipoDescrição
[].idlongID do receiver
[].namestringNome do receiver
[].emailstringE-mail de contato
[].documentstringCPF ou CNPJ
[].statusAffiliateStatusStatus: ACTIVE, PENDING, INACTIVE, CANCELED
[].mccintegerCódigo MCC
[].bankobjectBanco vinculado (bankCode, name)
StatusDescrição
200Lista retornada com sucesso
401Não autorizado
GET /api/v2/receivers/{id}
Headers
Authorization: Bearer {seu_token}

Obter receiver por ID.

ParâmetroTipoObrigatórioDescrição
id (path)integerSimID do receiver
json — response body
{
  "id": 1,
  "name": "Tony Stark",
  "businessName": "Empresa Exemplo LTDA",
  "document": "12345678000190",
  "address": {
    "street": "Av Comercial",
    "streetNumber": "500",
    "neighborhood": "Centro",
    "city": "Florianópolis",
    "state": "SC",
    "zipCode": "88000000"
  },
  "isSeller": false,
  "status": "ACTIVE"
}
CampoTipoDescrição
idlongID do receiver
namestringNome do receiver
businessNamestringRazão social
documentstringCPF ou CNPJ
addressobjectEndereço (street, streetNumber, lineTwo, neighborhood, zipCode, city, state)
isSellerbooleanSe é vendedor (false para receivers)
statusAffiliateStatusStatus: ACTIVE, PENDING, INACTIVE, CANCELED
StatusDescrição
200Receiver retornado com sucesso
401Não autorizado
404Receiver não encontrado

Split Pós-Venda #

Aplique ou cancele a divisão de recebimento em cobranças já realizadas, sem precisar criar um novo pedido. O split opera sobre a última transação da cobrança.

Regras de negócio

Pré-condições para gerar o split — a API retorna 422 se qualquer uma das condições abaixo não for atendida:
  • A cobrança deve ter a última transação com status APPROVED.
  • Cada sellerId deve existir e ter CPF/CNPJ cadastrado.
  • Cada amount deve ser maior que zero.
  • A soma de todos os amount deve ser exatamente igual ao valor da transação.
  • Exatamente um recebedor deve ter main: true.
  • Ao menos um recebedor deve ter liableFee: true.
  • Exatamente um recebedor deve ter liableChargeback: true.
  • O mesmo sellerId não pode aparecer em mais de uma regra.
O cancelamento (DELETE) só é possível se o split tiver sido gerado com sucesso anteriormente. Caso contrário, a API retorna 422.

Listar Splits de uma Cobrança #

GET /api/v2/charges/{id}/splits
Headers
Authorization: Bearer {seu_token}

Retorna a lista de splits configurados para a cobrança informada.

ParâmetroTipoDescrição
id (path)longID da cobrança

Resposta 200 OK — lista de splits:

json — 200 OK
[
  {
    "affiliate": {
      "id": 42,
      "name": "Loja Principal",
      "businessName": "Empresa Exemplo LTDA",
      "document": "12345678000190",
      "isSeller": true,
      "status": "ACTIVE"
    },
    "amount": 100000,
    "absorbFee": true
  },
  {
    "affiliate": {
      "id": 99,
      "name": "Parceiro Secundário",
      "businessName": "Parceiro LTDA",
      "document": "98765432000111",
      "isSeller": true,
      "status": "ACTIVE"
    },
    "amount": 50000,
    "absorbFee": false
  }
]
CampoTipoDescrição
affiliate.idlongID do seller/recebedor
affiliate.namestringNome do seller/recebedor
affiliate.businessNamestringRazão social
affiliate.documentstringCPF ou CNPJ
affiliate.isSellerbooleanIndica se é um seller
affiliate.statusstringStatus do seller (ACTIVE, INACTIVE, etc.)
amountlongValor destinado ao recebedor, em centavos
absorbFeebooleanSe o recebedor absorve as taxas de intermediação
StatusDescrição
200Lista de splits retornada com sucesso
204Cobrança não possui splits configurados
401Não autorizado
404Cobrança não encontrada

Gerar Split de uma Transação Existente #

POST /api/v2/charges/{id}/split
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Envia as regras de divisão da última transação da cobrança para a MovingPay.

json — request body
{
  "splits": [
    {
      "sellerId": 42,
      "amount": 100000,
      "main": true,
      "liableFee": true,
      "liableChargeback": true
    },
    {
      "sellerId": 99,
      "amount": 50000,
      "main": false,
      "liableFee": false,
      "liableChargeback": false
    }
  ]
}
CampoTipoObrigatórioDescrição
splits[]arraySimLista de regras de divisão (mínimo 1 item)
splits[].sellerIdlongSimID do seller/recebedor (mínimo 1)
splits[].amountlongSimValor destinado ao recebedor, em centavos (mínimo 1)
splits[].mainbooleanSimIndica o recebedor principal da transação. Apenas um pode ser true
splits[].liableFeebooleanSimDefine se o recebedor arcará com as taxas (MDR) da transação
splits[].liableChargebackbooleanSimDefine se o recebedor será responsável em caso de chargeback

Resposta 201 Created:

json — 201 Created
{
  "processKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
CampoTipoDescrição
processKeystringChave do processo de split na MovingPay, usada para rastreio e cancelamento

Resposta 422 Unprocessable Entity (erros de validação):

json — 422 Unprocessable Entity
[
  {
    "code": "422",
    "message": "A soma dos valores do split deve ser igual ao valor da transação."
  }
]
StatusDescrição
201Split gerado com sucesso
401Não autorizado
404Cobrança não encontrada
422Regras de divisão inválidas
502Erro de comunicação com a MovingPay

Cancelar Split de uma Transação #

DELETE /api/v2/charges/{id}/split
Headers
Authorization: Bearer {seu_token}

Cancela o split da última transação da cobrança na MovingPay e limpa o estado local.

ParâmetroTipoDescrição
id (path)longID da cobrança cujo split deve ser cancelado
StatusDescrição
200Split cancelado com sucesso
401Não autorizado
404Cobrança não encontrada
422Não foi possível cancelar o split
502Erro de comunicação com a MovingPay

Segurança

Adicione uma camada extra de seguranca com autenticação 3D Secure.

Fluxo 3DS #

Fluxo de autenticação 3DS
1
Autorizar
Envie dados do dispositivo com 3DS
2
Challenge
Redirecione o cliente se necessário
3
Webhook
Receba a confirmacao via notificação

Autorização com 3DS #

POST /api/v2/sellers/{sellerId}/orders/credit-card/three-d-secure/authorize
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Autorizar pagamento com autenticação 3D Secure.

json — request body
{
  "mode": "DEBIT",
  "value": 10000,
  "installments": 1,
  "orderReference": "3DS_1694314800",
  "notificationUrl": "https://meusite.com.br/events",
  "customer": {
    "name": "Tony Stark",
    "document": "51190844001",
    "birthdate": "2000-01-01",
    "email": "stark@gmail.com",
    "phone": {
      "countryCode": 55,
      "areaCode": 48,
      "number": 998870001
    },
    "address": {
      "street": "Rua Jair Hamms",
      "streetNumber": "38",
      "neighborhood": "Pedra Branca",
      "city": "Palhoca",
      "state": "SC",
      "zipCode": "88137084"
    }
  },
  "card": {
    "cardNumber": "4918019199883839",
    "cvv": "123",
    "expiration": { "month": 12, "year": 2034 },
    "holder": { "name": "Tony Stark", "document": "51190844001" }
  },
  "threeDSecure": {
    "device": {
      "deviceType3ds": "BROWSER",
      "screenWidth": 1920,
      "screenHeight": 1080,
      "colorDepth": 24,
      "javaEnabled": false,
      "javascriptEnabled": true,
      "language": "pt-BR",
      "timeZoneOffset": -3
    },
    "onFailure": "CONTINUE",
    "ipAddress": "192.168.1.100",
    "userAgent": "Mozilla/5.0...",
    "embedded": false,
    "successUrl": "https://meusite.com.br/sucesso",
    "failureUrl": "https://meusite.com.br/falha",
    "billing": {
      "address": {
        "street": "Rua Jair Hamms", "streetNumber": "38",
        "zipCode": "88137084", "neighborhood": "Pedra Branca",
        "city": "Palhoca", "state": "SC"
      },
      "phone": { "country": "BRAZIL", "areaCode": "48", "number": "998870001" },
      "email": "stark@gmail.com"
    }
  }
}

Campos principais da requisição

CampoTipoObrigatórioDescrição
modeGatewayTransactionDeployTypesSimModo da transação (DEBIT ou CREDIT)
valuelongSimValor em centavos (mínimo 0)
installmentsintegerSimNúmero de parcelas (1-12, use 1 para débito)
orderReferencestringSimReferência única do pedido (4-32 caracteres)
notificationUrlstring (URI)SimURL de notificação webhook (deve ser URI válida)
softDescriptorstringNãoDescrição na fatura do cartão (máx. 10 caracteres)
splits[]arrayNãoRegras de split (soma dos amounts deve ser igual ao value)

Campos do cartão (objeto card)

CampoTipoObrigatórioDescrição
card.cardNumberstringSimNúmero do cartão (11-21 dígitos)
card.cvvstringNãoCódigo de segurança (3-4 dígitos, opcional)
card.expiration.monthintegerSimMês de expiração (1-12)
card.expiration.yearintegerSimAno de expiração (2023-2056)
card.holder.namestringSimNome do titular (1-45 caracteres)
card.holder.documentstringNãoCPF/CNPJ do titular. Se informado, deve ser válido

Campos 3DS adicionais (objeto threeDSecure)

Campo Tipo Obrigatório Descrição
device.deviceType3dsThreeDSecurityDeviceTypesSimTipo do dispositivo (BROWSER)
device.screenWidthintegerSimLargura da tela em pixels (mínimo 0)
device.screenHeightintegerSimAltura da tela em pixels (mínimo 0)
device.colorDepthintegerSimProfundidade de cor
device.javaEnabledbooleanSimJava habilitado no navegador
device.javascriptEnabledbooleanSimJavaScript habilitado no navegador
device.languagestringSimIdioma do navegador (RFC BCP47, ex: "pt-BR")
device.timeZoneOffsetintegerSimOffset UTC em horas
device.deviceFingerprintstringNãoFingerprint do dispositivo
onFailureOnFailureTypesSimAção em caso de falha (CONTINUE ou DECLINE)
ipAddressstringSimIP do cliente (IPv4)
userAgentstringSimUser agent do navegador
successUrlstring (URL)SimURL de redirecionamento em caso de sucesso
failureUrlstring (URL)SimURL de redirecionamento em caso de falha
embeddedbooleanNãoSe o challenge será embutido na página (opcional)
billing.address.*objectSimEndereço de cobrança (street, streetNumber, zipCode, neighborhood, city, state)
billing.phone.countryGatewayCountryTypesSimPaís (ex: BRAZIL)
billing.phone.areaCodestringSimDDD
billing.phone.numberstringSimNúmero do telefone
billing.emailstringSimE-mail de cobrança
Headers de Resposta
LocationURL da cobrança criada
LinkURL do challenge, se necessário (redirecione o cliente para esta URL)

Response body (201)

CampoTipoDescrição
creqstringToken do challenge request
authenticationTransactionIdstringID da transação de autenticação 3DS
jwtstringJWT token
transactionIdstringIdentificador do pedido/transação
acsUrlstringURL do ACS para challenge
validateUrlobjectURL para validação/confirmação
StatusDescrição
201Autorização 3DS criada com sucesso (retorna ThreeDSecureV2Response)
400Requisição malformada
401Não autorizado
404Seller não encontrado
422Entidade não processável
Sandbox: No sandbox, use mode: "DEBIT". Os cartões 4918019199883839 (challenge) e 4918019160034602 (frictionless) podem ser usados para testes.

Pré-autorização com 3DS #

POST /api/v2/sellers/{sellerId}/orders/credit-card/three-d-secure/pre-authorize
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Pré-autorizar pagamento com autenticação 3D Secure. Reserva o valor no cartão sem capturar — a captura deve ser feita posteriormente.

O request body é idêntico ao endpoint de autorização 3DS (OnetimeChargeThreeDSecureV2Request). A diferença é que a pré-autorização apenas reserva o valor — a captura é feita em uma etapa posterior.
Headers de Resposta
LocationURL da cobrança criada

Response body (201)

CampoTipoDescrição
creqstringToken do challenge request
authenticationTransactionIdstringID da transação de autenticação 3DS
jwtstringJWT token
transactionIdstringIdentificador do pedido/transação
acsUrlstringURL do ACS para challenge
validateUrlobjectURL para validação/confirmação
StatusDescrição
201Pré-autorização 3DS criada com sucesso (retorna ThreeDSecureV2Response)
400Requisição malformada
401Não autorizado
404Seller não encontrado
422Entidade não processável

Webhooks & Eventos

Receba notificações em tempo real sobre mudancas de status.

Como funciona #

Quando o status de um pedido ou cobrança muda, a Zoov Payment envia uma requisição POST via HTTPS para a URL configurada no campo notificationUrl.

  • Protocolo POST HTTPS com Content-Type: text/plain e body "Bempaggo"
  • Payload minimo O payload nao contem dados do pedido. Consulte a API para verificar a mudanca de status.
  • Recomendacao de URL Use IDs únicos na URL (ex: https://meusite.com/events/ORDER123) para identificar o recurso.
Importante: Ao receber o webhook, faca uma consulta GET na API para obter o status atualizado do recurso. Nao confie apenas no recebimento do webhook.

Recebendo Webhooks #

Quando o status de uma cobrança muda, a Zoov Payment envia uma requisição POST para a URL configurada no campo notificationUrl. O corpo da requisição e uma string simples.

HTTP
POST https://meusite.com.br/api/eventos/cobranças/12345
Content-Type: text/plain

Bempaggo

Abaixo um exemplo de como receber e processar o webhook no seu backend (Node.js):

JavaScript
app.post('/api/eventos/cobranças/:chargeId', async (req, res) => {
  const chargeId = req.params.chargeId;

  // Consultar a API para obter o status atualizado
  const response = await fetch(
    `https://api.zoov.com.br/api/v2/charges/${chargeId}`,
    { headers: { 'Authorization': `Bearer ${API_TOKEN}` } }
  );
  const charge = await response.json();

  // Atualizar seu sistema com o novo status
  await updateChargeStatus(chargeId, charge.status);

  res.sendStatus(200);
});
O webhook NAO contem dados do evento. Sempre consulte a API para obter o status atualizado. Retorne HTTP 200 para confirmar o recebimento.

Enviar evento por ID #

POST /api/v2/events/{eventId}
Headers
Authorization: Bearer {seu_token}

Reenvia um evento específico para a URL de notificação configurada.

Parâmetros de caminho

Parâmetro Tipo Obrigatório Descrição
eventId long Sim ID do evento a reenviar

Resposta: 201 Created — corpo vazio

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/events/5001
Content-ID: 5001
Headers da resposta
Location URL do evento reenviado — use GET para consultar o resultado
Content-ID ID do evento

Códigos de resposta

Código Descrição
201Evento reenviado com sucesso (sem body)
401Não autorizado — token inválido ou ausente
404Evento não encontrado

Enviar eventos do pedido #

POST /api/v2/events/orders/{orderId}
Headers
Authorization: Bearer {seu_token}

Dispara um novo evento de webhook para o pedido informado. O pedido deve ter uma notificationUrl configurada.

Parâmetros de caminho

Parâmetro Tipo Obrigatório Descrição
orderId integer Sim ID do pedido
Headers de Resposta
LocationURL do evento criado

Códigos de resposta

Código Descrição
201Evento criado e enviado com sucesso (sem body)
401Não autorizado — token inválido ou ausente
422Pedido sem notificationUrl configurada

Redisparo de eventos #

POST /api/v2/events?orderId={orderId}
Headers
Authorization: Bearer {seu_token}

Reenvia todos os eventos pendentes de webhook associados a um pedido.

Parâmetros de query

Parâmetro Tipo Obrigatório Descrição
orderId integer Sim ID do pedido cujos eventos serão reenviados

Resposta: 201 Created — corpo vazio com links para cada evento reenviado

http response — 201 Created
HTTP/1.1 201 Created
Location: /api/v2/events/5001
Link: </api/v2/events/5001>; rel="5001"
Link: </api/v2/events/5002>; rel="5002"
Link: </api/v2/events/5003>; rel="5003"
Headers da resposta
Location URL do primeiro evento reenviado
Link rel="{eventId}" Um link para cada evento reenviado — use GET para consultar cada resultado

Códigos de resposta

Código Descrição
201Eventos reenviados com sucesso (sem body)
200Nenhum evento pendente para reenviar
401Não autorizado — token inválido ou ausente

Obter evento #

GET /api/v2/events/{eventId}
Headers
Authorization: Bearer {seu_token}

Retorna os detalhes de um evento específico.

Parâmetros de caminho

Parâmetro Tipo Obrigatório Descrição
eventId long Sim ID do evento

Exemplo de resposta

JSON
{
  "eventId": 5001,
  "eventCreated": "2024-09-10T03:00:00.000+00:00",
  "eventResultCreated": "2024-09-10T03:00:01.000+00:00",
  "httpCode": 200,
  "orderDate": "2024-09-09T18:00:00.000+00:00"
}

Campos da resposta (WebEventResponse)

Campo Tipo Descrição
eventIdlongIdentificador único do evento
eventCreatedDateData/hora de criação do evento
eventResultCreatedDateData/hora em que o webhook foi executado
httpCodeintegerCódigo HTTP retornado pelo endpoint de destino
orderDateDateData/hora do pedido associado

Códigos de resposta

Código Descrição
200Evento retornado com sucesso
401Não autorizado — token inválido ou ausente

Listar eventos #

GET /api/v2/events?orderReferenceOrId={value}
Headers
Authorization: Bearer {seu_token}

Retorna a lista de eventos filtrados pelo ID ou referência do pedido.

Parâmetros de query

Parâmetro Tipo Obrigatório Descrição
orderReferenceOrId string Sim ID ou código de referência do pedido

Exemplo de resposta

JSON
[
  {
    "eventId": 5001,
    "eventCreated": "2024-09-10T03:00:00.000+00:00",
    "eventResultCreated": "2024-09-10T03:00:01.000+00:00",
    "httpCode": 200,
    "orderDate": "2024-09-09T18:00:00.000+00:00"
  },
  {
    "eventId": 5002,
    "eventCreated": "2024-09-10T04:00:00.000+00:00",
    "eventResultCreated": "2024-09-10T04:00:02.000+00:00",
    "httpCode": 500,
    "orderDate": "2024-09-09T18:00:00.000+00:00"
  }
]
CampoTipoDescrição
eventIdlongIdentificador único do evento
eventCreatedDateData/hora de criação do evento
eventResultCreatedDateData/hora em que o webhook foi executado
httpCodeintegerCódigo HTTP retornado pelo endpoint de destino
orderDateDateData/hora do pedido associado

Códigos de resposta

Código Descrição
200Lista de eventos retornada com sucesso
401Não autorizado — token inválido ou ausente

Eventos por pedido #

GET /api/v2/events/order/{orderId}
Headers
Authorization: Bearer {seu_token}

Retorna todos os eventos associados a um pedido específico.

Parâmetros de caminho

Parâmetro Tipo Obrigatório Descrição
orderId string Sim ID do pedido

Exemplo de resposta

JSON
[
  {
    "eventId": 5001,
    "eventCreated": "2024-09-10T03:00:00.000+00:00",
    "eventResultCreated": "2024-09-10T03:00:01.000+00:00",
    "httpCode": 200,
    "orderDate": "2024-09-09T18:00:00.000+00:00"
  }
]
CampoTipoDescrição
eventIdlongIdentificador único do evento
eventCreatedDateData/hora de criação do evento
eventResultCreatedDateData/hora em que o webhook foi executado
httpCodeintegerCódigo HTTP retornado pelo endpoint de destino
orderDateDateData/hora do pedido associado

Códigos de resposta

Código Descrição
200Eventos do pedido retornados com sucesso
401Não autorizado — token inválido ou ausente

Webhooks — Seller & Transfer

Sistema de notificações v2 baseado em configuração via API. Envie eventos de vendedores e transferências com payload estruturado para qualquer URL com autenticação flexível.

Configuração de Webhook #

Configure uma URL de destino para receber notificações de eventos específicos. Cada configuração é vinculada a um tipo de evento e à empresa do usuário autenticado.

POST /api/v2/webhook-configurations
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Cria uma nova configuração de webhook para a empresa associada ao usuário autenticado.

Corpo da requisição

CampoTipoObrigatórioDescrição
eventstring (enum)SimTipo de evento: SELLER_CREATED, SELLER_STATUS_UPDATED, TRANSFER_CREATED, TRANSFER_STATUS_UPDATED
notificationUrlstring (URI)SimURL HTTPS que receberá as notificações via POST
authTypestring (enum)SimTipo de autenticação: NONE, BEARER, BASIC, API_KEY, CUSTOM
authorizationHeaderstringNãoValor do header Authorization (para authType BEARER)
apiKeystringNãoChave de API (para authType API_KEY)
usernamestringNãoUsuário (para authType BASIC)
passwordstringNãoSenha (para authType BASIC)
customHeadersstring (JSON)NãoHeaders adicionais em formato JSON (para authType CUSTOM)
timeoutSecondsintegerNãoTimeout em segundos por chamada (padrão: 30)
retryCountintegerNãoNúmero máximo de tentativas em caso de falha (padrão: 3)

Exemplo de requisição

JSON
{
  "event": "SELLER_CREATED",
  "notificationUrl": "https://meusite.com.br/webhooks/seller",
  "authType": "BEARER",
  "authorizationHeader": "meu-token-secreto",
  "timeoutSeconds": 30,
  "retryCount": 3
}

Resposta: 201 Created — corpo vazio com header Location apontando para a configuração criada.

Códigos de resposta

CódigoDescrição
201Configuração criada com sucesso (sem body)
401Não autorizado — token inválido ou ausente
422Já existe uma configuração para esse evento nesta empresa
GET /api/v2/webhook-configurations/{id}
Headers
Authorization: Bearer {seu_token}

Retorna os detalhes de uma configuração de webhook.

Parâmetros de caminho

ParâmetroTipoObrigatórioDescrição
idlongSimID da configuração de webhook

Exemplo de resposta

JSON
{
  "id": 42,
  "event": "SELLER_CREATED",
  "notificationUrl": "https://meusite.com.br/webhooks/seller",
  "authType": "BEARER",
  "timeoutSeconds": 30,
  "retryCount": 3,
  "isActive": true
}

Campos da resposta

CampoTipoDescrição
idlongIdentificador único da configuração
eventstringTipo de evento configurado
notificationUrlstringURL de destino das notificações
authTypestringTipo de autenticação configurado
timeoutSecondsintegerTimeout em segundos
retryCountintegerNúmero máximo de tentativas
isActivebooleanSe a configuração está ativa

Códigos de resposta

CódigoDescrição
200Configuração retornada com sucesso
401Não autorizado — token inválido ou ausente
404Configuração não encontrada
DELETE /api/v2/webhook-configurations/{id}
Headers
Authorization: Bearer {seu_token}

Remove uma configuração de webhook da empresa do usuário autenticado.

Parâmetros de caminho

ParâmetroTipoObrigatórioDescrição
idlongSimID da configuração de webhook a remover

Códigos de resposta

CódigoDescrição
200Configuração removida com sucesso
401Não autorizado — token inválido ou ausente
404Configuração não encontrada

Eventos Seller #

Notificações disparadas automaticamente quando um vendedor é criado ou tem seu status alterado na plataforma.

  • SELLER_CREATED Disparado quando um novo vendedor é cadastrado com sucesso.
  • SELLER_STATUS_UPDATED Disparado quando o status de um vendedor é alterado (ex.: de PENDING para ACTIVE).

Payload do evento (SellerWebhookPayload)

CampoTipoDescrição
affiliateMasterIdlongID interno do vendedor na plataforma
affiliateIdlongID do afiliado no tenant
documentstringCPF ou CNPJ do vendedor
namestringNome ou razão social do vendedor
statusstringStatus atual: ACTIVE, PENDING, INACTIVE, CANCELED
personTypestringTipo de pessoa: CPF ou CNPJ
eventstringNome do evento disparado
timestampstring (ISO 8601)Data/hora em que o evento foi gerado (UTC)

Exemplo — SELLER_CREATED

JSON
{
  "affiliateMasterId": 1001,
  "affiliateId": 2001,
  "document": "12345678000190",
  "name": "Empresa Exemplo LTDA",
  "status": "PENDING",
  "personType": "CNPJ",
  "event": "SELLER_CREATED",
  "timestamp": "2025-06-11T12:00:00.000Z"
}

Exemplo — SELLER_STATUS_UPDATED

JSON
{
  "affiliateMasterId": 1001,
  "affiliateId": 2001,
  "document": "12345678000190",
  "name": "Empresa Exemplo LTDA",
  "status": "ACTIVE",
  "personType": "CNPJ",
  "event": "SELLER_STATUS_UPDATED",
  "timestamp": "2025-06-11T14:30:00.000Z"
}
O evento SELLER_STATUS_UPDATED é disparado pelo serviço de sincronização de afiliados. Configure esse webhook para ser notificado em tempo real quando a Zoov aprovar ou rejeitar um vendedor.

Eventos Transfer #

Notificações disparadas quando uma transferência (repasse financeiro) é criada ou tem seu status alterado. O processamento é assíncrono.

  • TRANSFER_CREATED Disparado quando uma nova transferência é identificada pela Zoov.
  • TRANSFER_STATUS_UPDATED Disparado quando o status de uma transferência muda (ex.: de PENDENTE para LIQUIDADO). O campo previousSituacao indica o status anterior.

Payload do evento (TransferWebhookPayload)

CampoTipoDescrição
externalIdstringID externo da transferência
midlongID do merchant (vendedor) associado
situacaostringStatus atual da transferência
previousSituacaostringStatus anterior (presente em TRANSFER_STATUS_UPDATED, null em TRANSFER_CREATED)
valorBrutodecimalValor bruto da transferência
valorLiquidodecimalValor líquido após descontos
previsaoCreditostring (YYYY-MM-DD)Data prevista para o crédito
dataCreditostring (YYYY-MM-DD)Data efetiva do crédito (quando disponível)
bancoDestinostringCódigo do banco de destino
nomeBancoDestinostringNome do banco de destino
razaoSocialstringRazão social do beneficiário
cpfCnpjstringCPF ou CNPJ do beneficiário
tipoProcessamentostringTipo de processamento da transferência
arranjoPagamentostringArranjo de pagamento utilizado
chavePixstringChave PIX do beneficiário (quando aplicável)
tipoChavePixstringTipo da chave PIX: CPF, CNPJ, EMAIL, PHONE, EVP
eventstringNome do evento disparado
timestampstring (ISO 8601)Data/hora em que o evento foi gerado (UTC)

Exemplo — TRANSFER_CREATED

JSON
{
  "externalId": "TRF-2025-001234",
  "mid": 5001,
  "situacao": "PENDENTE",
  "previousSituacao": null,
  "valorBruto": 1500.00,
  "valorLiquido": 1425.00,
  "previsaoCredito": "2025-06-15",
  "dataCredito": null,
  "bancoDestino": "0001",
  "nomeBancoDestino": "Banco do Brasil",
  "razaoSocial": "Empresa Exemplo LTDA",
  "cpfCnpj": "12345678000190",
  "tipoProcessamento": "PIX",
  "arranjoPagamento": "PIX",
  "chavePix": "12345678000190",
  "tipoChavePix": "CNPJ",
  "event": "TRANSFER_CREATED",
  "timestamp": "2025-06-11T12:00:00.000Z"
}

Exemplo — TRANSFER_STATUS_UPDATED

JSON
{
  "externalId": "TRF-2025-001234",
  "mid": 5001,
  "situacao": "LIQUIDADO",
  "previousSituacao": "PENDENTE",
  "valorBruto": 1500.00,
  "valorLiquido": 1425.00,
  "previsaoCredito": "2025-06-15",
  "dataCredito": "2025-06-15",
  "bancoDestino": "0001",
  "nomeBancoDestino": "Banco do Brasil",
  "razaoSocial": "Empresa Exemplo LTDA",
  "cpfCnpj": "12345678000190",
  "tipoProcessamento": "PIX",
  "arranjoPagamento": "PIX",
  "chavePix": "12345678000190",
  "tipoChavePix": "CNPJ",
  "event": "TRANSFER_STATUS_UPDATED",
  "timestamp": "2025-06-15T09:15:00.000Z"
}
Os eventos de transferência são processados de forma assíncrona. O campo previousSituacao estará preenchido apenas em TRANSFER_STATUS_UPDATED — em TRANSFER_CREATED o valor será null.

Banking / BaaS

Consulte saldo, transferências, ajustes, recebíveis e antecipações da conta do vendedor.

Pré-requisito. Todos os endpoints exigem que o vendedor (sellerId) tenha configuração BaaS ativa. Caso contrário, a API responde 404 Not Found.

Obter Saldo do Vendedor #

GET /api/v2/baas/{sellerId}/balance
Headers
Authorization: Bearer {seu_token}

Obtém o saldo da conta do vendedor (disponível, bloqueado e futuro).

Parâmetro Tipo Obrigatório Descrição
sellerIdlongSimID do vendedor (path)
json — response body (200)
{
  "currentAvailableBalance": 125000,
  "blockedBalance": 5000,
  "futureBalance": 80000,
  "balance": 125000,
  "availableBalance": 80000
}

Campos da resposta (200)

Campo Tipo Descrição
currentAvailableBalancelongSaldo disponível atual em centavos
blockedBalancelongSaldo bloqueado em centavos
futureBalancelongSaldo futuro em centavos
balancelongDeprecated — espelha currentAvailableBalance. Use o novo campo.
availableBalancelongDeprecated — espelha futureBalance. Use o novo campo.
StatusDescrição
200Saldo retornado com sucesso
401Não autenticado
404Vendedor não encontrado ou sem configuração BaaS
500Erro interno do servidor

Listar Parcelas de Transação por UUID #

GET /api/v2/baas/{sellerId}/transactions/{uuid}/installments
Headers
Authorization: Bearer {seu_token}

Lista as parcelas (settlement) de uma transação a partir do UUID da transação.

Parâmetro Tipo Obrigatório Descrição
sellerIdlongSimID do vendedor (path)
uuidstringSimUUID da transação (path)
json — response body (200)
{
  "transactions": [
    {
      "id": 987654321,
      "transactionId": 7891011,
      "businessName": "Loja Exemplo LTDA",
      "paymentDate": "2024-12-08",
      "installment": 1,
      "grossAmount": 10000,
      "mdr": 400,
      "antecipationFee": 200,
      "additionalCost": 0,
      "netAmount": 9400,
      "status": "paid",
      "splitRuleId": null
    }
  ],
  "hasSplit": false
}

Campos da resposta (200)

Campo Tipo Descrição
hasSplitbooleanIndica se a transação possui split de pagamento
transactionsarrayLista de parcelas
transactions[].idlongID externo da parcela
transactions[].transactionIdlongID externo da transação
transactions[].businessNamestringRazão social do recebedor
transactions[].paymentDatestringData prevista/efetiva de pagamento
transactions[].installmentintegerNúmero da parcela
transactions[].grossAmountintegerValor bruto em centavos
transactions[].mdrintegerMDR em centavos
transactions[].antecipationFeeintegerTaxa de antecipação em centavos
transactions[].additionalCostintegerCustos adicionais em centavos
transactions[].netAmountintegerValor líquido em centavos
transactions[].statusenumStatus da parcela. Valores possíveis: paid, waiting_funds, refunded, blocked, splited
transactions[].splitRuleIdstringID da regra de split (preenchido apenas quando hasSplit = true)
StatusDescrição
200Parcelas retornadas com sucesso
401Não autenticado
404Transação não encontrada ou vendedor sem BaaS
500Erro interno do servidor

Listar Transferências do Vendedor #

GET /api/v2/baas/{sellerId}/transfers
Headers
Authorization: Bearer {seu_token}

Lista as transferências (sacados) da conta do vendedor. Por padrão filtra do último ano até hoje.

Parâmetro Tipo Obrigatório Descrição
sellerIdlongSimID do vendedor (path)
pageintegerNãoNúmero da página (default 0)
sizeintegerNãoItens por página (default 10)
json — response body (200)
[
  {
    "id": null,
    "transferExpectedOn": "2024-11-08T18:46:08Z",
    "transferDate": null,
    "type": null,
    "description": "Pagamento de vendas via POS / E-commerce",
    "resource": "transfer",
    "transferNumber": "TR-000123",
    "bankAccount": {
      "bankName": null,
      "bankCode": "260",
      "type": "conta_corrente",
      "accountNumber": "999999-9",
      "agencyNumber": "0001",
      "agencyCheckDigit": null,
      "holderName": null
    },
    "status": "pendente",
    "grossAmount": 10000,
    "amount": 9392,
    "discounts": 608,
    "createdAt": "2024-11-08T18:46:08Z"
  }
]

Campos da resposta (200)

Campo Tipo Descrição
[].idstringIdentificador da transferência (pode ser nulo)
[].transferExpectedOninstantPrevisão de crédito
[].transferDateinstantData efetiva do crédito (nulo enquanto pendente)
[].typestringTipo da transferência
[].descriptionstringDescrição
[].resourcestringRecurso (sempre transfer)
[].transferNumberstringCódigo da transferência
[].bankAccountobjectDados da conta destino
[].bankAccount.bankNamestringNome do banco
[].bankAccount.bankCodestringCódigo do banco destino
[].bankAccount.typeenumTipo de conta. Valores possíveis: conta_pagamento, conta_corrente
[].bankAccount.accountNumberstringNúmero da conta com dígito (formato NNNNNN-D)
[].bankAccount.agencyNumberstringNúmero da agência
[].bankAccount.agencyCheckDigitstringDígito da agência
[].bankAccount.holderNamestringNome do titular
[].statusenumSituação da transferência. Valores possíveis: pendente, agendado, processando, enviado, gerando, gerado, cancelado, concluido, devolvido, falha, outros
[].grossAmountlongValor bruto em centavos
[].amountlongValor líquido em centavos
[].discountslongDescontos em centavos
[].createdAtinstantData de criação
StatusDescrição
200Lista retornada com sucesso (array vazio quando não houver transferências)
401Não autenticado
404Vendedor não encontrado ou sem configuração BaaS
500Erro interno do servidor

Obter Transferência por ID #

GET /api/v2/baas/{sellerId}/transfers/{transferId}
Headers
Authorization: Bearer {seu_token}

Detalha as parcelas que compõem uma transferência específica, com dados de cada item (taxas, bandeira, split, etc.).

Parâmetro Tipo Obrigatório Descrição
sellerIdlongSimID do vendedor (path)
transferIdstringSimID da transferência (path) — obtido em transferNumber de Listar Transferências
json — response body (200)
[
  {
    "orderReference": "ORDER0001",
    "installmentNsu": 987654321,
    "transactionNsu": "123456",
    "tefNsu": "000000123",
    "grossAmount": 10000,
    "amount": 9392,
    "mdr": 408,
    "rav": 200,
    "fee": 0,
    "installment": 1,
    "totalInstallments": 1,
    "paymentDate": "2024-11-08T18:46:08Z",
    "originalPaymentDate": "2024-11-08T18:46:08Z",
    "paymentMethod": "CREDIT_CARD",
    "cardBrand": "VISA",
    "isSplitTransaction": false,
    "isMainAffiliate": false,
    "isParticipantAffiliate": false,
    "captureType": "ONLINE",
    "transactionId": 7891011
  }
]

Campos da resposta (200)

Campo Tipo Descrição
[].orderReferencestringReferência do pedido
[].installmentNsulongNSU da parcela
[].transactionNsustringNSU da transação
[].tefNsustringTEF NSU
[].grossAmountlongValor bruto em centavos
[].amountintegerValor líquido em centavos
[].mdrintegerMDR (taxa) em centavos
[].ravintegerRAV — taxa de antecipação em centavos
[].feeintegerTaxa de serviço adicional em centavos
[].installmentintegerNúmero da parcela liquidada
[].totalInstallmentsintegerTotal de parcelas da venda
[].paymentDateoffsetDateTimeData em que foi liquidado
[].originalPaymentDateoffsetDateTimeData prevista originalmente
[].paymentMethodenumMétodo de pagamento. Valores possíveis: CREDIT_CARD, PIX, BANK_SLIP
[].cardBrandenumBandeira do cartão. Valores possíveis: VISA, MASTERCARD, ELO, AMEX
[].isSplitTransactionbooleanIndica se a transação tem split
[].isMainAffiliatebooleanIndica se o seller é o principal (dono da transação)
[].isParticipantAffiliatebooleanIndica se o seller é um participante do split
[].captureTypeenumForma de captura: ONLINE ou POINT_OF_SALE
[].transactionIdlongID externo da transação
StatusDescrição
200Itens da transferência retornados com sucesso
401Não autenticado
404Transferência ou vendedor não encontrados
500Erro interno do servidor

Listar Ajustes do Vendedor #

GET /api/v2/baas/{sellerId}/adjustments
Headers
Authorization: Bearer {seu_token}

Lista os lançamentos / ajustes contábeis do vendedor (créditos, débitos, vencidos e a vencer).

Parâmetro Tipo Obrigatório Descrição
sellerIdlongSimID do vendedor (path)
pageintegerNãoNúmero da página (default 0)
sizeintegerNãoItens por página (default 10)
json — response body (200)
{
  "total": 42,
  "perPage": 10,
  "page": 1,
  "lastPage": 5,
  "lancamentos": {
    "credito": 25,
    "debito": 12,
    "vencidos": 2,
    "aVencer": 3
  },
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "origemLancamento": "VENDA",
      "transactionNsu": "123456",
      "installment": 1,
      "installments": 1,
      "tipoLancamento": "credito",
      "adjustDate": "2024-11-08",
      "dueDate": "2024-12-08",
      "dataLancamento": "2024-11-08T18:46:08Z",
      "paymentDate": "2024-11-08T18:46:08Z",
      "updatedAt": "2024-11-08T18:46:08Z",
      "codigoLancamento": "L0001",
      "totalAmount": "10000",
      "netAmount": "9392",
      "paidAmount": 9392,
      "description": "Crédito de venda",
      "situation": "PAGO",
      "orderReference": "ORDER0001",
      "chargeId": 12345,
      "transactionId": 7891011,
      "externalTransactionId": 99887766
    }
  ]
}

Campos da resposta (200)

Campo Tipo Descrição
totalintegerTotal de itens
perPageintegerItens por página
pageintegerPágina atual
lastPageintegerÚltima página
lancamentosobjectResumo de contadores por categoria
lancamentos.creditointegerQuantidade de créditos
lancamentos.debitointegerQuantidade de débitos
lancamentos.vencidosintegerQuantidade de itens vencidos
lancamentos.aVencerintegerQuantidade de itens a vencer
dataarrayLista de ajustes (AdjustmentItemResponse)
data[].uuidstringUUID do ajuste
data[].origemLancamentostringOrigem do lançamento
data[].transactionNsustringNSU da transação
data[].installmentintegerNúmero da parcela
data[].installmentsintegerTotal de parcelas
data[].tipoLancamentoenumTipo do lançamento. Valores possíveis: credito, debito
data[].adjustDatestringData do ajuste
data[].dueDatestringData de vencimento
data[].dataLancamentooffsetDateTimeData do lançamento
data[].paymentDateoffsetDateTimeData de pagamento
data[].updatedAtoffsetDateTimeÚltima atualização
data[].codigoLancamentostringCódigo do lançamento
data[].totalAmountstringValor total
data[].netAmountstringValor líquido
data[].paidAmountintegerValor pago
data[].descriptionstringDescrição
data[].situationstringSituação
data[].orderReferencestringReferência do pedido (quando vinculado)
data[].chargeIdlongID da cobrança
data[].transactionIdlongID da transação interna
data[].externalTransactionIdlongID externo da transação
StatusDescrição
200Ajustes retornados com sucesso
401Não autenticado
404Vendedor não encontrado ou sem BaaS
500Erro interno do servidor
502Falha de comunicação com o serviço de pagamento

Listar Transferências Futuras #

GET /api/v2/baas/{sellerId}/future-transfers
Headers
Authorization: Bearer {seu_token}

Lista as transferências futuras (recebíveis a vencer) do vendedor. Suporta filtro opcional por intervalo de data de pagamento.

Parâmetro Tipo Obrigatório Descrição
sellerIdlongSimID do vendedor (path)
pageintegerNãoNúmero da página (default 0)
sizeintegerNãoItens por página (default 10)
paymentDateStartlongNãoInício do intervalo de data de pagamento (Unix ms). Obrigatório se paymentDateEnd for enviado.
paymentDateEndlongNãoFim do intervalo de data de pagamento (Unix ms). Obrigatório se paymentDateStart for enviado.
json — response body (200)
{
  "availableAmount": 125000,
  "anticipationCost": 300,
  "mdr": 400,
  "totalValue": 150000,
  "blockedValue": 5000,
  "totalItems": 42,
  "perPage": 10,
  "page": 1,
  "lastPage": 5,
  "items": [
    {
      "transactionNsu": "123456",
      "installmentNsu": 987654321,
      "installments": 1,
      "installment": 1,
      "saleAmount": 10000,
      "installmentAmount": 10000,
      "fee": 400,
      "anticipationFee": 200,
      "brandFee": 50,
      "interchangeFee": "1.50",
      "settlementNetAmount": 9400,
      "settlementStatus": "waiting_funds",
      "paymentDate": "2024-12-08",
      "originalPaymentDate": null,
      "saleDate": "2024-11-08",
      "finishDate": null,
      "cardBrand": "VISA",
      "splitRuleId": null,
      "transactionId": 7891011,
      "chargeId": 12345,
      "orderReference": "ORDER0001"
    }
  ]
}

Campos da resposta (200)

Campo Tipo Descrição
availableAmountlongTotal disponível em centavos
anticipationCostlongCusto total da antecipação em centavos
mdrlongMDR consolidado em centavos
totalValuelongValor total em centavos
blockedValuelongValor bloqueado em centavos
totalItemslongTotal de itens encontrados
perPageintegerItens por página
pageintegerPágina atual
lastPageintegerÚltima página
itemsarrayLista de recebíveis futuros
items[].transactionNsustringNSU da transação
items[].installmentNsulongNSU da parcela
items[].installmentsintegerTotal de parcelas
items[].installmentintegerNúmero da parcela
items[].saleAmountlongValor da venda em centavos
items[].installmentAmountlongValor da parcela em centavos
items[].feelongTaxa em centavos
items[].anticipationFeelongTaxa de antecipação em centavos
items[].brandFeelongTaxa de bandeira em centavos
items[].interchangeFeestringTaxa de intercâmbio
items[].settlementNetAmountlongValor líquido em centavos
items[].settlementStatusenumStatus da liquidação. Valores possíveis: paid, waiting_funds, refunded, blocked, splited
items[].paymentDatestringData prevista de pagamento
items[].originalPaymentDatestringData original de pagamento
items[].saleDatestringData da venda
items[].finishDatestringData de finalização
items[].cardBrandstringBandeira do cartão
items[].splitRuleIdstringID da regra de split (quando aplicável)
items[].transactionIdlongID da transação
items[].chargeIdlongID da cobrança
items[].orderReferencestringReferência do pedido
StatusDescrição
200Transferências futuras retornadas com sucesso
400Filtro de data inconsistente (apenas um de paymentDateStart/paymentDateEnd enviado)
401Não autenticado
404Vendedor não encontrado ou sem BaaS
500Erro interno do servidor

Totalizadores do Saldo Pago #

GET /api/v2/baas/{sellerId}/receivables/totals
Headers
Authorization: Bearer {seu_token}

Retorna apenas os totalizadores agregados do saldo pago do vendedor (sem listar os itens).

Parâmetro Tipo Obrigatório Descrição
sellerIdlongSimID do vendedor (path)
json — response body (200)
{
  "availableAmount": 125000,
  "anticipationCost": 300,
  "mdr": 400,
  "totalValue": 150000,
  "blockedValue": 5000,
  "totalItems": 42
}

Campos da resposta (200)

Campo Tipo Descrição
availableAmountlongTotal disponível em centavos
anticipationCostlongCusto total de antecipação em centavos
mdrlongMDR consolidado em centavos
totalValuelongValor total em centavos
blockedValuelongValor bloqueado em centavos
totalItemslongQuantidade total de itens
StatusDescrição
200Totalizadores retornados com sucesso
401Não autenticado
404Vendedor não encontrado, sem BaaS ou sem saldo pago
500Erro interno do servidor

Chargeback — Alertas

Consulte os alertas de chargeback recebidos dos provedores de prevenção (Ethoca, Verifi) para as transações da sua empresa.

Listar alertas #

GET /api/v2/chargeback-alerts
Headers
Authorization: Bearer {seu_token}

Retorna, de forma paginada, os alertas de chargeback da empresa autenticada. O escopo é sempre a empresa vinculada ao token — não é possível consultar alertas de outra empresa. Os resultados são ordenados por data de criação do alerta, do mais recente para o mais antigo.

Parâmetros de query

Parâmetro Tipo Obrigatório Descrição
statusarray<enum>NãoUm ou mais status a filtrar. Repita o parâmetro para múltiplos valores (?status=NEW&status=CONCILIATED). Valores: NEW, CONCILIATED, NOT_FOUND, REFUNDED, RESOLVED
conciliatedbooleanNãoFiltra apenas alertas conciliados (true) ou não conciliados (false) com uma transação
refundedbooleanNãoFiltra apenas alertas com estorno efetuado (true) ou sem estorno (false)
cardBrandstringNãoBandeira do cartão. Comparação exata, ex.: MASTERCARD, VISA
referenceIdstringNãoCódigo de referência do pedido informado na venda. Comparação exata
alertStartDatelongNãoInício do período de recebimento do alerta, em timestamp Unix (milissegundos). Só o dia é considerado, a hora é ignorada
alertEndDatelongNãoFim do período de recebimento do alerta, em timestamp Unix (milissegundos). Só o dia é considerado, a hora é ignorada
pageintegerNãoPágina desejada, começando em 0. Padrão: 0
sizeintegerNãoQuantidade de alertas por página. Padrão: 15
alertStartDate e alertEndDate devem ser enviados juntos. Informar apenas um dos dois retorna 400 Bad Request. O intervalo é inclusivo nas duas pontas.

Exemplo de requisição

cURL
curl -X GET \
  'https://api.zoov.com.br/api/v2/chargeback-alerts?status=NEW&status=CONCILIATED&cardBrand=MASTERCARD&page=0&size=15' \
  -H 'Authorization: Bearer {seu_token}'

Exemplo de resposta

JSON
{
  "content": [
    {
      "id": 10482,
      "alertId": "cb_9f3a21e0",
      "alertType": "CONFIRMED_FRAUD",
      "provider": "CHARGEBLAST",
      "subprovider": "ETHOCA",
      "status": "RESOLVED",
      "conciliated": true,
      "refunded": true,
      "resolved": true,
      "transactionId": 884213,
      "chargeId": 551097,
      "amount": 149.90,
      "currency": "BRL",
      "cardBrand": "MASTERCARD",
      "cardBin": "516292",
      "cardLastFour": "4417",
      "externalOrder": "PEDIDO-2024-8871",
      "descriptor": "ZOOV*LOJA EXEMPLO",
      "transactionDate": "2024-09-08T14:22:31.000+00:00",
      "createdAt": "2024-09-10T03:11:00.000+00:00",
      "updatedAt": "2024-09-10T03:12:04.000+00:00",
      "message": "Alerta conciliado e estornado com sucesso"
    }
  ],
  "totalElements": 1,
  "totalPages": 1,
  "number": 0,
  "size": 15,
  "numberOfElements": 1,
  "first": true,
  "last": true,
  "empty": false
}

Campos de content[]

CampoTipoDescrição
idlongIdentificador do alerta na Zoov Payment
alertIdstringIdentificador do alerta no provedor de origem
alertTypestringTipo do alerta informado pelo provedor (ex.: fraude confirmada, disputa de cliente)
providerstringProvedor que enviou o alerta
subproviderstringRede de origem do alerta (ex.: ETHOCA, VERIFI)
statusenumSituação atual do alerta. Veja a tabela abaixo
conciliatedbooleanIndica se o alerta foi associado a uma transação da sua empresa
refundedbooleanIndica se o estorno da transação foi efetuado
resolvedbooleanIndica se o alerta foi encerrado junto ao provedor
transactionIdlongID da transação conciliada. null enquanto não houver conciliação
chargeIdlongID da cobrança da transação conciliada. null enquanto não houver conciliação
amountdecimalValor do alerta
currencystringMoeda do valor, ex.: BRL
cardBrandstringBandeira do cartão
cardBinstringBIN (primeiros dígitos) do cartão
cardLastFourstringÚltimos quatro dígitos do cartão
externalOrderstringCódigo de referência do pedido — o mesmo valor aceito no filtro referenceId
descriptorstringDescritor exibido na fatura do portador
transactionDateDateData/hora da transação que originou o alerta
createdAtDateData/hora em que o alerta foi recebido
updatedAtDateData/hora da última atualização do alerta
messagestringMensagem do último processamento do alerta, útil para diagnóstico

Status do alerta

StatusDescrição
NEWAlerta recebido, ainda não conciliado
CONCILIATEDAlerta associado a uma transação da sua empresa
NOT_FOUNDNenhuma transação correspondente foi encontrada
REFUNDEDTransação estornada em decorrência do alerta
RESOLVEDAlerta estornado e encerrado junto ao provedor

Códigos de resposta

Código Descrição
200Lista de alertas retornada com sucesso. Sem resultados, content vem vazio
400Parâmetros inválidos — ex.: apenas uma das datas do período informada
401Não autorizado — token inválido ou ausente

Referência Técnica

Dicionario de dados, status, enums e códigos de retorno.

Status e Enums #

OrderStatus

Valor Descrição
ACTIVEPedido ativo
INACTIVEPedido inativo
OVERDUEInadimplente
PENDINGPendente
CHARGEBACKChargeback
COUNTERCHARGEContestação
CANCELEDCancelado

ChargeStatus

Valor Descrição
PAYPaga (autorizada e capturada)
PENDINGPendente
SCHEDULEAgendada
ACCREDITAbonada
REFUNDEstornada
MANUAL_DISCHARGEBaixa manual
CHARGEBACKChargeback
COUNTERCHARGEContestação
IN_PROGRESSEm processamento
AUTHORIZEDAutorizada (aguardando captura)
FAILFalha
CANCELEDCancelada

TransactionStatus

Valor Descrição
IN_PROGRESSEm andamento
APPROVEDAprovada
REFUNDEstornada
AUTHORIZEDAutorizada
MANUAL_DISCHARGEBaixa manual
MANUAL_REFUNDEstorno manual
NOT_AUTHORIZEDNão autorizada pelo emissor
NOT_APPROVEDNão aprovada (falha na captura)
CHARGEBACKChargeback
COUNTERCHARGEContestação
CANCELEDCancelada
AWAITING_PAYMENTAguardando pagamento (PIX/Boleto)
UNDER_PAYMENTPagamento menor que o valor esperado
OVER_PAYMENTPagamento maior que o valor esperado
FAILFalha
INVALIDTransação inválida

RefundReason

Valor Descrição
DUPLICATE_CHARGECobrança duplicada
IMPROPER_CHARGECobrança indevida
COSTUMER_WITHDRAWALDesistencia do cliente
OTHERSOutros

Cartões de Teste #

Utilize os cartões abaixo para testar diferentes cenarios no ambiente Sandbox.

Cenário Bandeira Número Validade CVV
Aprovado (a vista) Visa 4548812049400004 12/34 123
Aprovado (parcelado) Mastercard 5067230000009011 01/28 123
Aprovado (parcelado) Visa 4761120000000148 01/28 123
Recusado Visa 1111111111111117 12/34 123
3DS Challenge Visa 4918019199883839 12/34 123
3DS Frictionless Visa 4918019160034602 12/34 123
Tokenização 5448280000000007 01/35 123

Códigos ABECS #

Códigos de retorno padronizados pela ABECS (Associação Brasileira das Empresas de Cartões de Crédito e Serviços).

Código Descrição Tipo
55 PIN inválido REVERSÍVEL
63 Violação de segurança IRREVERSÍVEL
59 Suspeita de fraude REVERSÍVEL
14 Cartão inválido IRREVERSÍVEL
54 Cartão expirado IRREVERSÍVEL
41 Cartão perdido IRREVERSÍVEL
43 Cartão roubado IRREVERSÍVEL
51 Saldo insuficiente REVERSÍVEL
57 Transação não permitida IRREVERSÍVEL

Ferramentas para Desenvolvedores

Tudo que você precisa para acelerar a integração.

Endpoints de Simulação #

Utilize os endpoints abaixo no ambiente Sandbox para simular pagamentos e testar webhooks.

POST /api/v2/simulations/charges/{id}/payment
Headers
Authorization: Bearer {seu_token}

Simula o pagamento de uma cobrança de boleto no ambiente sandbox. Atualiza o status da transação para APPROVED e da cobrança para PAY.

Parâmetros de caminho

Parâmetro Tipo Obrigatório Descrição
id long Sim ID da cobrança de boleto a simular
Nenhum corpo é necessário. Basta enviar a requisição POST com o ID da cobrança. A cobrança deve ser do tipo boleto.

Códigos de resposta

Código Descrição
202Pagamento de boleto simulado com sucesso
401Não autorizado — token inválido ou ausente
404Retornado em ambiente de produção (endpoint indisponível)
POST /api/v2/simulations/charges/{id}/payment/pix
Headers
Authorization: Bearer {seu_token}

Simula o pagamento de uma cobrança PIX no ambiente sandbox. Atualiza a transação PIX como paga.

Parâmetros de caminho

Parâmetro Tipo Obrigatório Descrição
id long Sim ID da cobrança PIX a simular
Nenhum corpo é necessário. Basta enviar a requisição POST com o ID da cobrança. A cobrança deve ser do tipo PIX.

Códigos de resposta

Código Descrição
202Pagamento PIX simulado com sucesso
401Não autorizado — token inválido ou ausente
404Retornado em ambiente de produção (endpoint indisponível)
Os endpoints de simulação de pagamento estão disponíveis apenas no ambiente sandbox. Em produção, retornam 404.
POST /api/v2/sellers/{sellerId}/simulation
Headers
Authorization: Bearer {seu_token}
Content-Type: application/json

Simulador de taxas. Exibe as taxas de intermediação cobradas para todas as formas de pagamento (PIX, Boleto e Cartão de Crédito) com base no valor informado.

Parâmetros de caminho

Parâmetro Tipo Obrigatório Descrição
sellerId long Sim ID do seller

Request body

json — request body
{
  "grossAmount": 10000
}
CampoTipoObrigatórioDescrição
grossAmountlongSimValor da cobrança em centavos

Response body (SimulationV2Response)

CampoTipoDescrição
pixobjectSimulação de taxas para PIX
pix.totalPercentageFeeBigDecimalTaxa percentual total
pix.totalFixFeeCentsintegerTaxa fixa em centavos
pix.sellerTakingFeesobjectValores quando o seller absorve as taxas
pix.customerTakingFeesobjectValores quando o cliente absorve as taxas
boletoobjectSimulação de taxas para Boleto (mesma estrutura do pix)
creditCardarrayLista de simulações por parcela/bandeira
creditCard[].totalPercentageFeeBigDecimalTaxa percentual total
creditCard[].installmentsintegerNúmero de parcelas
creditCard[].brandGatewayBrandTypesBandeira do cartão
creditCard[].sellerTakingFeesobjectValores quando o seller absorve as taxas
creditCard[].customerTakingFeesobjectValores quando o cliente absorve as taxas

Estrutura de SellerTakingFees / CustomerTakingFees

CampoTipoDescrição
saleAmountlongValor da venda em centavos
installmentAmountlongValor da parcela em centavos
amountToReceivelongValor líquido a receber em centavos
feeAmountlongValor da taxa em centavos

Códigos de resposta

Código Descrição
200Simulação retornada com sucesso
401Não autorizado — token inválido ou ausente
422Erro ao processar a simulação

SDK de Pagamentos Android #

Biblioteca oficial Zoov para integrar pagamentos presenciais em aplicações Android. Suporta Tap on Phone (NFC) para cartões de crédito e débito, além de PIX via QR Code.

Requisitos: Android Studio Arctic Fox+, Java 17, dispositivo com NFC (API 30+).
SETUP Instalação

Copie o arquivo zoovlib-release.aar para app/libs/ e adicione as dependências ao build.gradle.

Estrutura do projeto

text
zoov-payment/
├── app/
│   ├── libs/
│   │   └── zoovlib-release.aar
│   └── src/main/
│       ├── java/.../MainActivity.kt
│       └── AndroidManifest.xml
├── docs/
└── README.md

Dependências (build.gradle)

gradle
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar'])
    implementation 'com.google.android.play:integrity:1.3.0'
    implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:3.14.9'
    implementation 'com.google.code.gson:gson:2.10.1'
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
    implementation 'org.bouncycastle:bcprov-jdk15to18:1.80'
    implementation 'org.bouncycastle:bcpkix-jdk15to18:1.80'
    implementation 'org.apache.commons:commons-lang3:3.14.0'
}

Permissões (AndroidManifest.xml)

xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.CAMERA" />
SETUP Configuração

Adicione as credenciais do terminal ao build.gradle.kts do módulo app. Em produção, substitua pelos valores fornecidos pela Zoov.

kotlin
android {
    defaultConfig {
        buildConfigField("String", "ZOOV_CLIENT_TOKEN", "\"your_token\"")
        buildConfigField("String", "ZOOV_CLIENT_ID", "\"your_id\"")
        buildConfigField("String", "ZOOV_AUTH_ID", "\"your_auth_id\"")
        buildConfigField("String", "ZOOV_TERMINAL_ID", "\"terminal_id\"")
        buildConfigField("String", "ZOOV_TAX_PAYER_ID", "\"cnpj\"")
        buildConfigField("String", "ZOOV_NETWORK_ID", "\"network_id\"")
        buildConfigField("String", "ZOOV_NETWORK_PWD", "\"network_pwd\"")
        buildConfigField("String", "ZOOV_MERCHANT_ID", "\"merchant_id\"")
        buildConfigField("String", "ZOOV_HOSTNAME_SERVER", "\"api.zoov.com.br\"")
        buildConfigField("String", "ZOOV_TCP_PORT", "\"443\"")
        buildConfigField("String", "PIX_BASE_URL", "\"https://api.zoov.com.br/pix/v2\"")
        buildConfigField("String", "PIX_JWT", "\"jwt_token\"")
        buildConfigField("String", "PIX_SELLER_ID", "\"1\"")
    }
}

Parâmetros de configuração

Parâmetro Obrigatório Descrição
ZOOV_CLIENT_TOKENSimToken de autenticação do cliente
ZOOV_CLIENT_IDSimIdentificador do cliente
ZOOV_AUTH_IDSimID de autenticação
ZOOV_TERMINAL_IDSimIdentificador do terminal
ZOOV_TAX_PAYER_IDSimCNPJ do estabelecimento
ZOOV_NETWORK_IDSimID da rede adquirente
ZOOV_NETWORK_PWDSimSenha da rede
ZOOV_MERCHANT_IDSimIdentificador do lojista
ZOOV_HOSTNAME_SERVERSimHostname do servidor
ZOOV_TCP_PORTSimPorta TCP do servidor
PIX_BASE_URLPIXURL base da API PIX
PIX_JWTPIXToken JWT para PIX
PIX_SELLER_IDPIXID do seller para PIX
Os parâmetros PIX_* são obrigatórios apenas se o método PIX estiver habilitado em enabledPaymentMethods.
CODE Iniciar Pagamento

Use ZoovPaymentActivity.createIntent() para iniciar o fluxo de pagamento. O SDK exibe a interface de pagamento e retorna o resultado via ActivityResult.

kotlin
import com.zoov.lib.ZoovPaymentActivity
import com.zoov.lib.data.enums.ZoovPaymentMethod

class MainActivity : ComponentActivity() {

    private val paymentLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        handlePaymentResult(result.resultCode, result.data)
    }

    private fun iniciarPagamento(amountInCents: Long) {
        val intent = ZoovPaymentActivity.createIntent(
            activity = this,
            clientToken = BuildConfig.ZOOV_CLIENT_TOKEN,
            clientId = BuildConfig.ZOOV_CLIENT_ID,
            authId = BuildConfig.ZOOV_AUTH_ID,
            terminalId = BuildConfig.ZOOV_TERMINAL_ID,
            taxPayerId = BuildConfig.ZOOV_TAX_PAYER_ID,
            networkId = BuildConfig.ZOOV_NETWORK_ID,
            networkPwd = BuildConfig.ZOOV_NETWORK_PWD,
            merchantId = BuildConfig.ZOOV_MERCHANT_ID,
            hostnameServer = BuildConfig.ZOOV_HOSTNAME_SERVER,
            tcpPort = BuildConfig.ZOOV_TCP_PORT,
            amountInCents = amountInCents,
            enabledPaymentMethods = setOf(
                ZoovPaymentMethod.CREDIT_CARD,
                ZoovPaymentMethod.DEBIT_CARD,
                ZoovPaymentMethod.PIX
            ),
            pixBaseUrl = BuildConfig.PIX_BASE_URL,
            pixJwt = BuildConfig.PIX_JWT,
            pixSellerId = BuildConfig.PIX_SELLER_ID
        )
        paymentLauncher.launch(intent)
    }
}

Parâmetros de createIntent()

Parâmetro Tipo Obrigatório Descrição
activityActivitySimActivity que inicia o pagamento
clientTokenStringSimToken de autenticação do cliente
clientIdStringSimIdentificador do cliente
authIdStringSimID de autenticação
terminalIdStringSimIdentificador do terminal
taxPayerIdStringSimCNPJ do estabelecimento
networkIdStringSimID da rede adquirente
networkPwdStringSimSenha da rede
merchantIdStringSimIdentificador do lojista
hostnameServerStringSimHostname do servidor
tcpPortStringSimPorta TCP do servidor
amountInCentsLong?NãoValor em centavos (null = input manual)
enabledPaymentMethodsSet?NãoMétodos habilitados (padrão: todos)
pixBaseUrlString?PIXURL base da API PIX
pixJwtString?PIXToken JWT para PIX
pixSellerIdString?PIXID do seller para PIX

Métodos de pagamento

EnumDescrição
ZoovPaymentMethod.CREDIT_CARDCartão de crédito via NFC (parcelamento até 12x)
ZoovPaymentMethod.DEBIT_CARDCartão de débito via NFC
ZoovPaymentMethod.PIXPIX via QR Code
CODE Resultado do Pagamento

Trate o resultado do pagamento via ActivityResult ou BroadcastReceiver.

Via ActivityResult

kotlin
private fun handlePaymentResult(resultCode: Int, data: Intent?) {
    when (resultCode) {
        ZoovPaymentActivity.RESULT_PAYMENT_SUCCESS -> {
            val amount = data?.getLongExtra(
                ZoovPaymentActivity.EXTRA_RESULT_AMOUNT, 0L)
            val authCode = data?.getStringExtra(
                ZoovPaymentActivity.EXTRA_RESULT_AUTH_CODE)
            val transactionId = data?.getStringExtra(
                ZoovPaymentActivity.EXTRA_RESULT_TRANSACTION_ID)
            // Pagamento aprovado — salve os dados no backend
        }
        ZoovPaymentActivity.RESULT_PAYMENT_ERROR -> {
            val errorCode = data?.getIntExtra(
                ZoovPaymentActivity.EXTRA_RESULT_ERROR_CODE, 0)
            val errorMessage = data?.getStringExtra(
                ZoovPaymentActivity.EXTRA_RESULT_ERROR_MESSAGE)
            // Erro — exiba mensagem ao usuário
        }
        ZoovPaymentActivity.RESULT_PAYMENT_CANCELLED -> {
            // Usuário cancelou o pagamento
        }
    }
}

Via BroadcastReceiver

kotlin
private val paymentReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == ZoovPaymentActivity.ACTION_PAYMENT_RESULT) {
            val resultType = intent.getIntExtra(
                ZoovPaymentActivity.EXTRA_RESULT_TYPE, 0)
            when (resultType) {
                ZoovPaymentActivity.RESULT_PAYMENT_SUCCESS -> {
                    // Pagamento aprovado
                }
                ZoovPaymentActivity.RESULT_PAYMENT_ERROR -> {
                    // Erro no pagamento
                }
            }
        }
    }
}

Códigos de resultado

ConstanteValorDescrição
RESULT_PAYMENT_SUCCESS1Pagamento aprovado
RESULT_PAYMENT_ERROR2Erro no pagamento
RESULT_PAYMENT_CANCELLED3Cancelado pelo usuário

Extras do Intent

ConstanteTipoDescrição
EXTRA_RESULT_AMOUNTLongValor em centavos
EXTRA_RESULT_AUTH_CODEStringCódigo de autorização
EXTRA_RESULT_TRANSACTION_IDStringID da transação
EXTRA_RESULT_RECEIPTStringComprovante
EXTRA_RESULT_ERROR_CODEIntCódigo do erro
EXTRA_RESULT_ERROR_MESSAGEStringMensagem do erro
REF Códigos de Erro

Referência completa dos códigos de erro retornados pelo SDK.

Código Descrição Ação recomendada
-1Erro de comunicaçãoVerifique a conexão com a internet
-2TimeoutTente novamente
-3Timeout de processamentoTente novamente
-4Operação canceladaUsuário cancelou
-5Permissão de câmera negadaSolicite acesso à câmera
-6SDK não inicializadoVerifique as credenciais
-7SDK não ativadoVerifique configuração do terminal
-8Exceção na inicializaçãoVerifique as credenciais
-9Exceção na ativaçãoVerifique a configuração
-10Erro no cartão/pinpadVerifique o cartão
-11QR Code PIX expiradoGere novo QR Code
-12Cliente PIX não configuradoConfigure credenciais PIX
-13Dados PIX inválidosVerifique resposta da API
-14Erro ao criar pedido PIXVerifique credenciais PIX
-15Pagamento PIX canceladoPagamento cancelado pelo usuário
-16Pagamento PIX estornadoPagamento foi devolvido
Debug: Use adb logcat -s MainActivity para monitorar os logs de pagamento em tempo real.