Skip to content

Cobranças e clientes — /invoices e /billing (descontinuado)

WARNING

Prefira a API v1 para cadastro de clientes. As cobranças ainda não têm equivalente na v1 — use estes endpoints até que exista.

Todas 🔒 (Authorization: Bearer <token>) e operam sobre a conta ativa. Valores monetários em reais (decimal). search em cobranças por CPF/CNPJ dispara uma sincronização com o banco emissor.

Recursos duplicados: /invoices/billing/charges, /clients/billing/clients, /invoices_groups/billing/charge-groups.


Cobranças

GET /invoices · /billing/charges

Entrada (query, todos opcionais):

CampoTipoObservação
searchstring (≤100)NSU, documento ou nome do cliente
status_idint/listaum ou vários separados por vírgula
payment_methodstring/listaPIX, BOLETO, BOLEPIX, CREDIT_CARD
client_idintexistente
per_pageint 1–500default 15
pageintdefault 1
order_bystringcreated_at, due_date, payment_date, id
order_dirstringasc, desc
created_at_start/_endYYYY-MM-DD
due_date_start/_endYYYY-MM-DD
payment_date_start/_endYYYY-MM-DD

Saída: 200. Em /billing/* e *v2*: { data: [cobranças], meta: {...}, ... }. Nas demais: coleção de cobranças. Cada item: { id, code, value, amount_paid, payment_date, status:{...}, description, payment_method, due_date, client:{id,name,email,document}, pix:{txid,qrcode,status,...}|null, boleto:{txid,barcode,digitableLine,status,...}|null, created_by, created_at }.

POST /invoices · /billing/charges

Cria a cobrança e gera Pix/Boleto/Bolepix/Cartão conforme payment_method.

Entrada (corpo JSON):

CampoTipoRegras
value ou amountnumberobrigatório (um dos dois), ≥ 0.01
payment_methodstringobrigatório, enum: PIX, BOLETO, BOLEPIX, CREDIT_CARD
due_datedateobrigatório, ≥ hoje
client_idintse informado, usa o cliente existente
name, email, documentstringobrigatórios se não enviar client_id (phone opcional) — cliente é criado
webhookurlopcional — URL para os eventos desta cobrança
descriptionstring ≤500opcional
details, instructionsstringopcionais
amount_ratenumberopcional (juros/mora)
type_ratestringABSOLUTE ou PERCENTAGE
discountnumberopcional
days_discountnumberdias antes do vencimento; a data resultante não pode ser < hoje
type_discountstringABSOLUTE ou PERCENTAGE
tag / tag_id / establishment_idintopcional, existente
charge_group_idintopcional, existente
payment_plan_idintopcional
installmentsint 1–120opcional
address.{street,number,district,city,state,zipcode}stringobrigatórios se payment_method = CREDIT_CARD
card.{card_number,brand,cvv,expiry_month,expiry_year,cardholder_name,document}stringobrigatórios se CREDIT_CARD; brandvisa,mastercard

Saída: 200 — a cobrança criada, com pix e/ou boleto embutidos. 400/422 em falha bancária ou validação (uma cobrança com status = failed é registrada).

GET /invoices/{id} · /billing/charges/{id}

Entrada: path id (id ou code da cobrança). Saída: 200, envelope data = a cobrança (com client, tag, pix, boleto, createdBy), message: "Detalhes da Cobrança". 404 se não existir.

PUT/PATCH /invoices/{id} · /billing/charges/{id}

Só cobranças pendentes. Regenera o Pix se o valor mudar; regera o PDF.

Entrada (corpo JSON, opcionais): value|amount (≥0.01), amount_rate, type_rate (ABSOLUTE/PERCENTAGE), discount (≥0), due_date (≥ hoje), description (≤500), details, instructions, webhook (url), payment_method (enum), tag_id.

Saída: 200, chave charge = cobrança atualizada, message: "Cobrança atualizada com sucesso!"404 se não existir; erro se não estiver pendente.

DELETE /invoices/{id} · /billing/charges/{id}

Entrada: path id. Saída: 200, data = a cobrança, message: "Cobrança apagado com sucesso!" (marca status = DELETED).

GET /billing/charges/{id}/download-pdf

Entrada: path id (id ou code). Saída: 200, Content-Type: application/pdf, Content-Disposition: attachment; filename="fatura_{id}.pdf". Erro 500 se falhar a geração.

POST /invoices/{id}/notify

Entrada: path id (id ou code). Saída: 200, data: { charge_id, email }, message: "Notificação enviada com sucesso!"400 se o cliente não tiver e-mail; 404 se a cobrança não existir.

POST /billing/charges/{id}/notify · POST /billing/charges/notify

Enfileira notificações multicanal. Com {id} na URL notifica uma cobrança; sem, use ids[]/id no corpo.

Entrada (corpo JSON):

CampoTipoRegras
ids ou idarray/valorids ou codes (só na rota sem {id})
channelsarrayobrigatório, ≥1, itens em email,whatsapp,sms
messagestring ≤1000opcional

Saída: 200, data: { count }, message: "Notificações enfileiradas com sucesso!"400 sem cobrança informada; 404 se nenhuma for encontrada.

GET /reports/invoices

Entrada (query): group_by (obrigatório, days|months), date_start (obrigatório, data), date_end (obrigatório, ≥ date_start). Saída: 200, data = linhas agregadas { reference_date, status_id, status:{id,title,description}, total_qtd, total_amount_paid, total_value }, message: "Relatório de cobranças gerado com sucesso."

POST /invoices/with-plan

Gera as parcelas de um plano de pagamento. Entrada (corpo JSON): payment_plan_id (obrigatório, da própria conta) + os mesmos campos de POST /invoices (value/amount, payment_method, due_date, client_id ou name+email+document+phone, tag, installments, ...). Saída: 201, data = array de cobranças geradas, message: "Parcelas do plano geradas com sucesso!"

POST /billing/simulate-payment/{id}/charges — restrito

Marca uma cobrança como paga em ambiente de teste (contas 1, 2, 3). Entrada: path id (id ou code). Saída: 200, data = a cobrança, message: "Pagamento simulado com sucesso!"403 fora das contas de teste; 400 se já estava paga.

POST /billing/simulate-payment

Simula valores por método — não cria nada. Entrada (corpo JSON): amount (obrigatório, ≥0.01), installments (obrigatório, 1–12). Saída: 200, data:

json
{
 "pix": { "method": "pix", "installments": 1, "installment_value": 100, "total_amount": 100.99 },
 "boleto": { "method": "boleto", "installments": 1, "installment_value": 100, "total_amount": 102.5 },
 "credit_card": { "method": "credit_card", "installments": 3, "installment_value": 33.33, "total_amount": 99.99, "original_amount": 100 },
 "simulation_details": { "requested_amount": 100, "requested_installments": 3, "preferred_method": "credit_card", "installments_summary": "3x de R$ 33,33" }
}

Grupos de cobrança — /invoices_groups · /billing/charge-groups

GET /invoices_groups

Entrada (query): per_page (default 15), page (default 1), search (nome). Saída: 200, { data: [grupos de cobrança], meta: {...} }.

POST /invoices_groups

Entrada (corpo JSON): name (obrigatório, ≤255), slug (opcional, ≤100, único), description (opcional), json (opcional, JSON válido). Saída: 201, grupo de cobrança, message: "Grupo de cobrança criado com sucesso!"

GET /invoices_groups/{id}

Entrada: path id. Saída: 200, grupo de cobrança. 404 se não existir.

PUT/PATCH /invoices_groups/{id}

Entrada (corpo JSON, opcionais): name (≤255), description, json (JSON), code (≤50, único), slug (≤255, único). Saída: 200, grupo de cobrança, message: "Grupo de cobrança atualizado com sucesso!"

DELETE /invoices_groups/{id}

Entrada: path id. Saída: 200 { "message": "Grupo de cobrança removido com sucesso!" }.


Clientes — /clients · /billing/clients

cliente (Administration): { id, code, name, email, phone, document, type, gender, birthdate, status, address:{...}|null, metadata, created_at, updated_at }.

GET /clients

Entrada (query): per_page (15), page (1), search (nome/documento), type (individual/company), gender, status, created_at_start/_end, updated_at_start/_end, birthdate_start/_end. Saída: 200, { data: [clientes], meta: {...} }.

POST /clients

Entrada (corpo JSON):

CampoTipoRegras
namestringobrigatório, ≤255
emailstringobrigatório, e-mail, ≤255
documentstringobrigatório, CPF ou CNPJ válido
typestringobrigatório, individual ou company
phonestringopcional, ≤20
genderstringopcional, male/female
birthdatedateopcional
addressobjectopcional; se enviado, street, city, state obrigatórios; também number, zip, country, observation
metadataarrayopcional; itens { label (obrigatório), value }
fb_id, fb_access_tokenstringopcionais

Saída: 200 — o cliente criado (status = ACTIVE).

GET /clients/{code}

Entrada: path code (código único do cliente). Saída: 200, cliente (com address), message: "Informações sobre o cliente". 404 se não existir.

PUT/PATCH /clients/{code}

Entrada (corpo JSON, todos sometimes): name, email, phone, type, gender, birthdate, address (mesma estrutura do POST), metadata, fb_id, fb_access_token. Aceita code ou id no path. Saída: 201, cliente, message: "Cliente atualizado com sucesso!" 404 se não existir.

DELETE /clients/{code}

Entrada: path code ou id. Saída: 204, data = cliente, message: "Cliente apagado com sucesso!" (marca status = DELETED e remove das listagens).


Planos de pagamento — /payment-plans

GET /payment-plans

Entrada: header Authorization. Saída: 200, data = array de planos, message: "Planos de Pagamento listados com sucesso!"

POST /payment-plans

Entrada (corpo JSON):

CampoTipoRegras
descriptionstringobrigatório, ≤255
intervalintobrigatório, ≥1
interval_typestringobrigatório, months/weeks/days
installments_countintobrigatório, ≥1

Saída: 201, data = plano, message: "Plano de Pagamento criado com sucesso!"

GET /payment-plans/{id}

Entrada: path id. Saída: 200, data = plano, message: "Detalhes do Plano de Pagamento". 404 se não existir.

PUT/PATCH /payment-plans/{id}

Entrada (corpo JSON): mesmos campos de POST (todos obrigatórios). Saída: 200, data = plano, message: "Plano de Pagamento atualizado com sucesso!"

DELETE /payment-plans/{id}

Entrada: path id. Saída: 200, message: "Plano de Pagamento removido com sucesso!"


Cada link: { id, title, description, amount, currency, is_variable_amount, min_amount, max_amount, status:{value,label}, payment_methods[], expires_at, max_uses, uses_count, success_url, cancel_url, webhook_url, reference_code, public_url, created_at, updated_at }.

Entrada (query): id, status, search (título/descrição/reference_code), created_start/created_end, updated_start/updated_end, due_date_start/due_date_end, created_by, updated_by, order (asc/desc, default desc), per_page (15), page (1). Saída: 200, { data: [links de pagamento], meta: {...}, summary: { all: {value,label,count,amount}, <status>: {...} }, message }.

POST /billing/payment-links

Entrada (corpo JSON):

CampoTipoRegras
titlestringobrigatório, ≤255
payment_methodsarrayobrigatório, ≥1, itens em PIX,BOLETO,CARD
amountnumberobrigatório se is_variable_amount = false; ≥0
is_variable_amountboolopcional (default false)
min_amountnumberobrigatório se is_variable_amount = true; ≥0
max_amountnumberopcional, ≥0, > min_amount
currencystring(3)opcional (default BRL)
descriptionstringopcional
expires_atdateopcional, futura
max_usesintopcional, ≥1
success_url, cancel_url, webhook_urlurlopcionais
pass_transaction_fee_to_customerboolopcional
send_client_idboolopcional
reference_codestring ≤255opcional (gerado se ausente)
client_idintopcional, existente
installmentsint 1–12opcional

Saída: 200, link de pagamento, message: "Link de pagamento criado com sucesso."

Entrada: path id (o identificador público do link). Saída: 200, link de pagamento (com creator, updater, customer), message: "Link de pagamento recuperado com sucesso." 404 se não existir.

Entrada (corpo JSON, opcionais): payment_methods (itens PIX/BOLETO/CARD; não pode remover método já usado em pagamento), pass_transaction_fee_to_customer, send_client_id, expires_at (futura), max_uses (≥1), success_url, cancel_url, installments (1–12). Link expirado não pode ser atualizado. Saída: 200, link de pagamento, message: "Link de pagamento atualizado com sucesso."

Entrada: path id (o identificador público do link). Saída: 200, message: "Link de pagamento removido com sucesso."

Entrada: path id; query per_page (15). Saída: 200, { data: [pagamentos], meta: {...}, message } — todos os pagamentos do link (ordem desc por criação).

Entrada: path id; query per_page (15). Saída: 200, { data: [pagamentos], meta: {...}, message } — apenas status = paid.


Transferência interna — POST /transfers/internal

Executa um Pix real de uma conta Sicredi para uma conta Sicoob (isento de taxas).

Entrada (corpo JSON):

CampoTipoRegras
tokenstringobrigatório — token da conta de destino (Sicoob), existente
amountnumberobrigatório, ≥0.01
descriptionstring ≤255opcional

Saída: 200, data: { txid, amount, status: "REALIZED" }, message: "Transferência Realizada com sucesso via Pix (Isenta de Taxas)." Erros: 403 se a origem não for Sicredi; 400 se o destino não for Sicoob, sem chave Pix, saldo insuficiente ou transação duplicada nos últimos 30 min; 500 em falha de comunicação bancária.