Portabilidade + Refinanciamento
Fluxo para trazer dívida de outra instituição (portabilidade) ou renegociar uma operação ativa (refinanciamento) no consignado militar. Ambas usam reservation_type: refinancing no collateral_data do /debt.
Margem Livre (new_credit) cria nova dedução em folha. Refinanciamento (refinancing) reaproveita uma reserva existente — seja interna QI (refin puro) ou externa (portabilidade).
refinanced_credit_operations fica na raiz do payload do /debt, não dentro de collaterals[].collateral_data. Em collateral_data ficam só os dados do colateral militar (registration_code, token, reservation_type, reservation_method).
Quando usar cada um
- Refinanciamento puro
- Portabilidade pura
- Compra de dívida (port enrustida)
Cliente já tem operação ativa na QI Tech. Quer renegociar prazo/taxa, eventualmente liberar troco.
collaterals[].collateral_data.reservation_type:refinancingcollaterals[].collateral_data.reservation_method:issuingrefinanced_credit_operations(na raiz):[{"operation_key": "UUID da CO QI original"}]modality.code:"0202"(obrigatório)- Troco (se houver) vai pro borrower via PIX/TED no desembolso
Cliente tem dívida em outro banco. Quer migrar pra QI sem liberar valor adicional.
collaterals[].collateral_data.reservation_type:refinancing(mesmo enum)collaterals[].collateral_data.reservation_method:issuingrefinanced_credit_operations(na raiz): referencia o contrato externo comoriginal_contract_number+original_financial_institution_document_number+due_balance+original_deadlinemodality.code:"0202"- Saldo devedor externo é quitado via operação-ponte (QI orquestra internamente)
O Exército não tem CTC (câmara de transferência de cobrança — só existe pro INSS). A QI implementa o equivalente operacional como "compra de dívida com portabilidade enrustida": para cada dívida externa que o militar quer trazer pra QI, o parceiro emite uma dupla de operações na CO. Pode ser N duplas no mesmo run (uma por contrato externo), e opcionalmente um refinanciamento consolidador ao final.
Padrão observado em produção (Larca EB): ~60-100 duplas/dia, com média de 1.5 duplas por militar. Ver Conta Interna para Desembolso — todas as operações dessa modalidade desembolsam numa conta interna em nome do militar, não na conta externa.
Anatomia de uma dupla
Op A — debt_purchase (operação-ponte que carrega o saldo da dívida externa)
POST /debtoperation_type: "debt_purchase"- Sem
collateralsmilitary_payroll — é uma operação livre na CO disbursement_bank_account: conta interna em nome do militar- Saldo desembolsado fica na conta interna pra QI quitar o contrato externo
Op B — refinancing com portabilidade enrustida (quita o debt_purchase da Op A e carrega a port)
POST /debtoperation_type: "refinancing"collaterals[].collateral_type: "military_payroll"collaterals[].collateral_data.reservation_type: "refinancing"(enum único pra port+refin no Exército)collaterals[].collateral_data.token: token Zetra do militar (obrigatório)refinanced_credit_operations(na raiz, fora de collateral):operation_key:credit_operation_keyda Op A (quita odebt_purchase)original_contract_number,original_financial_institution_document_number,due_balance,original_deadline: dados do contrato externo original (carrega a semântica de port)
disbursement_bank_account: mesma conta interna em nome do militar
Externamente parece um refin puro; internamente esse refin carrega a port pela presença dos campos do contrato externo no mesmo refinanced_credit_operations.
Repetindo N× (várias dívidas externas)
Pra cada contrato externo que o militar quer trazer, emita uma dupla nova: Op A1 + Op B1, Op A2 + Op B2, …, Op An + Op Bn. Cada Op B quita seu Op A correspondente e carrega os dados do seu contrato externo.
Refinanciamento consolidador (opcional)
Após emitir as N duplas, o parceiro pode emitir uma operação adicional que refinancia todas as Op Bs num único contrato consolidado:
POST /debtoperation_type: "refinancing"collaterals[].collateral_data.reservation_type: "refinancing"refinanced_credit_operations(na raiz): array comoperation_keyde cada Op B das duplas anterioresdisbursement_bank_account: conta interna em nome do militar
Em produção (Larca EB), 30 consolidadores em 60 dias, com n_refinanced variando de 2 a 5.
O que a QI orquestra internamente
Para cada dupla:
- Desembolsa Op A na conta interna do militar (
bank_code 329) - Quita o contrato externo (PIX/TED da conta interna → banco origem)
- Confirma desaverbação Zetra do contrato antigo (webhook
credit_operation.collateralcomreservation_status: deleted) - Averba a Op B (webhook
credit_operation.collateralcomsuccessfully_reservedna nova) - Repasse de troco (se
final_disbursement_amount > 0) da conta interna → conta externa do militar
No consolidador: desaverba todas as Op Bs originais e averba a nova consolidada.
Pré-requisitos
balance_keyrecebido na Consulta de Margem.- Para refinanciamento puro:
operation_keyda CO QI original. - Para portabilidade:
original_contract_number+original_financial_institution_document_number+due_balance+original_deadlinedo contrato externo.
1. Simulação
Request Body — Refinanciamento puro
{
"borrower": { "person_type": "natural", "individual_document_number": "45507529710" },
"financial": {
"first_due_date": "2026-07-01",
"installment_face_value": 400.00,
"disbursement_date": "2026-06-01",
"number_of_installments": 36,
"monthly_interest_rate": 0.0195,
"interest_type": "pre_price_days",
"credit_operation_type": "ccb"
},
"collaterals": [
{
"collateral_type": "military_payroll",
"percentage": 1,
"collateral_data": {
"reservation_type": "refinancing",
"reservation_method": "issuing",
"registration_code": "146254221",
"token": "12345678"
}
}
],
"modality": { "code": "0202" },
"refinanced_credit_operations": [
{ "operation_key": "9c8e7d6b-1234-4abc-9def-000000000001" }
]
}
Request Body — Portabilidade / Compra-de-dívida
{
"borrower": { "person_type": "natural", "individual_document_number": "45507529710" },
"financial": {
"first_due_date": "2026-07-01",
"installment_face_value": 480.00,
"disbursement_date": "2026-06-01",
"number_of_installments": 48,
"monthly_interest_rate": 0.0185,
"interest_type": "pre_price_days",
"credit_operation_type": "ccb"
},
"collaterals": [
{
"collateral_type": "military_payroll",
"percentage": 1,
"collateral_data": {
"reservation_type": "refinancing",
"reservation_method": "issuing",
"registration_code": "146254221",
"token": "12345678"
}
}
],
"modality": { "code": "0202" },
"refinanced_credit_operations": [
{
"original_contract_number": "00498765/BR",
"original_financial_institution_document_number": "00000000000191",
"due_balance": 12500.00,
"original_deadline": "2027-08-15"
}
]
}
Campos chave
| Campo | Localização | Descrição |
|---|---|---|
collaterals[].collateral_data.reservation_type | dentro do collateral | refinancing (cobre refin + port) |
collaterals[].collateral_data.reservation_method | dentro do collateral | issuing (averba após formalização) ou creation (averba já no /debt) |
collaterals[].collateral_data.registration_code | dentro do collateral | Matrícula do militar (Zetra) |
collaterals[].collateral_data.token | dentro do collateral | Token Zetra do militar (obrigatório) |
refinanced_credit_operations[].operation_key | raiz do payload | UUID da CO QI original (refin puro / Op A da compra de dívida) |
refinanced_credit_operations[].original_contract_number | raiz do payload | Contrato externo (portabilidade) |
refinanced_credit_operations[].original_financial_institution_document_number | raiz do payload | CNPJ banco origem (portabilidade) |
refinanced_credit_operations[].due_balance | raiz do payload | Saldo devedor externo |
refinanced_credit_operations[].original_deadline | raiz do payload | Vencimento original |
modality.code | raiz | "0202" (obrigatório em refin/port) |
Response
Síncrona. final_disbursement_amount é o troco que vai pro borrower (zero = portabilidade pura sem troco).
2. Emissão
Mesmo payload da simulação, acrescentando:
- Borrower completo (KYC).
disbursement_bank_account(pro troco, se houver).purchaser_document_number.
Request Body — Portabilidade completa
{
"borrower": {
"name": "JOÃO DA SILVA",
"email": "joao@email.com",
"phone": { "number": "900000000", "area_code": "11", "country_code": "+55" },
"address": {
"city": "São Paulo", "state": "SP", "number": "215",
"street": "Gilberto Sabino", "complement": "",
"postal_code": "12345012", "neighborhood": "Pinheiros"
},
"role_type": "issuer",
"birth_date": "1985-03-12",
"mother_name": "MARIA DA SILVA",
"person_type": "natural",
"individual_document_number": "45507529710",
"gender": "male",
"nationality": "brasileiro",
"is_pep": false,
"marital_status": "single"
},
"financial": {
"first_due_date": "2026-07-01",
"installment_face_value": 480.00,
"disbursement_date": "2026-06-01",
"number_of_installments": 48,
"monthly_interest_rate": 0.0185,
"interest_type": "pre_price_days",
"credit_operation_type": "ccb"
},
"collaterals": [
{
"collateral_type": "military_payroll",
"percentage": 1,
"collateral_data": {
"reservation_type": "refinancing",
"reservation_method": "issuing",
"registration_code": "146254221",
"token": "12345678"
}
}
],
"modality": { "code": "0202" },
"refinanced_credit_operations": [
{
"original_contract_number": "00498765/BR",
"original_financial_institution_document_number": "00000000000191",
"due_balance": 12500.00,
"original_deadline": "2027-08-15"
}
],
"disbursement_bank_account": {
"name": "JOÃO DA SILVA",
"bank_code": "104",
"account_type": "checking_account",
"account_digit": "1",
"branch_number": "3880",
"account_number": "000736703806",
"document_number": "45507529710",
"transfer_method": "pix"
},
"purchaser_document_number": "32402502000135"
}
3. Payloads da compra de dívida (dupla + consolidador)
A modalidade "compra de dívida" exige uma sequência de chamadas no /debt. Sempre desembolsando na conta interna do militar (ver Conta Interna para Desembolso). Os exemplos abaixo cobrem 1 dupla + 1 consolidador. Em produção, esse padrão se repete N vezes (uma dupla por contrato externo).
Op A — debt_purchase (ponte que carrega o saldo externo)
Request Body — Op A (debt_purchase)
{
"borrower": {
"name": "JOÃO DA SILVA",
"email": "joao@email.com",
"phone": { "number": "900000000", "area_code": "11", "country_code": "+55" },
"address": {
"city": "Brasília", "state": "DF", "number": "215",
"street": "Eixo Monumental", "complement": "",
"postal_code": "70000000", "neighborhood": "Asa Sul"
},
"role_type": "issuer",
"birth_date": "1985-03-12",
"mother_name": "MARIA DA SILVA",
"person_type": "natural",
"individual_document_number": "45507529710",
"gender": "male",
"nationality": "brasileiro",
"is_pep": false,
"marital_status": "single"
},
"financial": {
"first_due_date": "2026-07-01",
"installment_face_value": 420.00,
"disbursement_date": "2026-06-01",
"number_of_installments": 48,
"monthly_interest_rate": 0.0185,
"interest_type": "pre_price_days",
"credit_operation_type": "ccb"
},
"operation_type": "debt_purchase",
"disbursement_bank_account": {
"name": "JOÃO DA SILVA",
"bank_code": "329",
"account_type": "checking_account",
"account_branch": "0001",
"account_number": "1167955",
"account_digit": "1",
"document_number": "45507529710",
"transfer_method": "ted"
},
"purchaser_document_number": "32402502000135"
}
Resposta: credit_operation_key da Op A (vamos chamar de OP_A_KEY). Use no refinanced_credit_operations[].operation_key da Op B abaixo.
Op B — refinancing com port enrustida (quita Op A + carrega contrato externo)
Request Body — Op B (refinancing port-enrustido)
{
"borrower": { "person_type": "natural", "individual_document_number": "45507529710" },
"financial": {
"first_due_date": "2026-07-01",
"installment_face_value": 480.00,
"disbursement_date": "2026-06-01",
"number_of_installments": 48,
"monthly_interest_rate": 0.0185,
"interest_type": "pre_price_days",
"credit_operation_type": "ccb"
},
"operation_type": "refinancing",
"collaterals": [
{
"collateral_type": "military_payroll",
"percentage": 1,
"collateral_data": {
"reservation_type": "refinancing",
"reservation_method": "creation",
"registration_code": "146254221",
"token": "12345678"
}
}
],
"modality": { "code": "0202" },
"refinanced_credit_operations": [
{
"operation_key": "OP_A_KEY",
"original_contract_number": "00498765/BR",
"original_financial_institution_document_number": "00000000000191",
"due_balance": 12500.00,
"original_deadline": "2027-08-15"
}
],
"disbursement_bank_account": {
"name": "JOÃO DA SILVA",
"bank_code": "329",
"account_type": "checking_account",
"account_branch": "0001",
"account_number": "1167955",
"account_digit": "1",
"document_number": "45507529710",
"transfer_method": "ted"
},
"purchaser_document_number": "32402502000135"
}
refinanced_credit_operations[0] (na raiz) carrega AMBOS os links — operation_key (interno, quita Op A) E os campos do contrato externo (original_contract_number, original_financial_institution_document_number, due_balance, original_deadline). Esse é o "port enrustido": o registro carrega as duas semânticas no mesmo array.
Resposta: credit_operation_key da Op B. Repita o par Op A + Op B para cada dívida externa que o militar quer trazer.
(Opcional) Refinanciamento consolidador — refina várias Op Bs em uma só
Request Body — refinanciamento consolidador
{
"borrower": { "person_type": "natural", "individual_document_number": "45507529710" },
"financial": {
"first_due_date": "2026-08-01",
"installment_face_value": 1200.00,
"disbursement_date": "2026-07-02",
"number_of_installments": 48,
"monthly_interest_rate": 0.0175,
"interest_type": "pre_price_days",
"credit_operation_type": "ccb"
},
"operation_type": "refinancing",
"collaterals": [
{
"collateral_type": "military_payroll",
"percentage": 1,
"collateral_data": {
"reservation_type": "refinancing",
"reservation_method": "creation",
"registration_code": "146254221",
"token": "12345678"
}
}
],
"modality": { "code": "0202" },
"refinanced_credit_operations": [
{ "operation_key": "OP_B1_KEY" },
{ "operation_key": "OP_B2_KEY" },
{ "operation_key": "OP_B3_KEY" }
],
"disbursement_bank_account": {
"name": "JOÃO DA SILVA",
"bank_code": "329",
"account_type": "checking_account",
"account_branch": "0001",
"account_number": "1167955",
"account_digit": "1",
"document_number": "45507529710",
"transfer_method": "ted"
},
"purchaser_document_number": "32402502000135"
}
O consolidador refinancia as N Op Bs num único contrato. QI desaverba todas as Op Bs originais no Zetra e averba a nova consolidada.
O que acontece após o /debt
Pra portabilidade, a QI executa internamente:
- Emite a CCB nova → webhook
debt(waiting_signature). - Aciona o credit-transfer pra quitar o contrato externo → webhook
credit_transfer.received_portabilityquando o banco origem confirma. - Aguarda desaverbação do Zetra na operação original → webhook
credit_operation.collateralcomreservation_status: deletedna operação antiga. - Averba a nova operação → webhook
credit_operation.collateralcomsuccessfully_reservedna operação nova. - Desembolsa o troco (se houver) → webhook
debt(disbursed).
→ Próximo passo: Formalização
Webhooks específicos de port/refin
| Webhook | Quando dispara |
|---|---|
credit_transfer.received_portability | Banco origem confirmou portabilidade (port apenas) |
credit_transfer_status_change | Atualização credit-transfer (pending → accepted → confirmed) |
credit_operation.collateral (reservation_status: deleted) | Desaverbação da operação original confirmada |
Falhas específicas
| Enumerador | Quando | Ação |
|---|---|---|
origin_contract_not_found | Contrato externo referenciado não existe ou foi quitado | Verificar dados; pode cancelar operação |
waiting_for_origin_contract_closure | QI averba só após confirmar quitação do externo | Aguardar (retry automático) |
expired_portability | Janela de portabilidade fechou no Zetra | Re-tentar com novo contrato origem |
INVALID_MODALITY_CODE | refin/port sem modality.code: "0202" | Adicionar o modality.code |
Auto-cancelamento
Operações em status canceled por mais de 7 dias são automaticamente convertidas em canceled_permanently pelo sistema. Aplica-se igualmente a margem livre, refin e port.