Empréstimos
Módulo do empréstimo, a entidade central da plataforma LaaS. Nesta jornada ele é usado para emitir o contrato de consignado privado a partir dos parâmetros aprovados na simulação, formalizá-lo (geração da CCB e assinatura eletrônica pelo tomador) e conduzi-lo pelas transições de averbação e desembolso.
Rota base v5/loans.
A API converte o payload em parâmetros de simulação e executa o cálculo completo antes de persistir. Os valores do payload são entradas para o cálculo, não valores gravados literalmente: principal, IOF, CET, parcelas, datas e cenários de desembolso vêm do resultado. Na criação, o contrato nasce com status = draft (código 0) e stage = proposal.
Autenticação
Todos os endpoints exigem API Key. A emissão exige permissão de criação de empréstimos; formalização, assinatura, desembolso e averbação exigem permissão de edição; as rotas GET exigem permissão de consulta. O nível de acesso do usuário (unidade, parceiro, agência, agente, usuário) limita quais contratos ele enxerga. Ver Autenticação.
Rotas implementadas
| Rota | Verbo | Resumo |
|---|---|---|
/v5/loans | POST | Emite o contrato (recalcula a simulação a partir do payload). |
/v5/loans/{id} | GET | Obtém o contrato. |
/v5/loans/{loanId}/signature-requests | POST | Solicita a formalização: enfileira a geração da CCB e do link de assinatura eletrônica. Processado em segundo plano. |
/v5/loans/{id}/document-requests/current | GET | Acompanha a última geração de documento solicitada para o contrato. |
/v5/loans/{loanId}/signature-requests/current | GET | Obtém a assinatura eletrônica mais recente do contrato, com o link do tomador e a jornada de formalização. |
/v5/loans/{loanId}/signature-requests/current/sync | POST | Atualiza a assinatura mais recente consultando o provedor de assinatura. |
/v5/loans/{loanId}/signature-requests/current/journeys | POST | Gera uma nova jornada de formalização para a assinatura em andamento. Ver Jornadas. |
/v5/loans/{id}/signatures | PUT | Registra a assinatura manualmente (status = signed). |
/v5/loans/{id}/endorsements | PUT | Registra a averbação (status = endorsement). No consignado privado, a averbação na Dataprev é feita em segundo plano (status = endorsement_processing até a confirmação). |
/v5/loan-private-payrolls/{loanId}/contract-information | GET | Mostra os documentos e dados da assinatura que serão enviados à Dataprev. |
/v5/loan-private-payrolls/{loanId}/contract-information | POST | Envia à Dataprev a CCB assinada e as evidências da formalização, tiradas da assinatura concluída, depois da averbação. Processado em segundo plano. |
/v5/loans/{id}/disbursements | PUT | Registra o desembolso, integra com o banco liquidante e gera as cobranças (status = integrated). |
/v5/loans/{loanId}/disbursements | GET | Lista os comandos de desembolso enviados ao pagador para o contrato. |
O recurso expõe ainda rotas de ajuste e reapresentação do desembolso e as rotas usadas pelo pagador para validar e confirmar o comando de desembolso, que não fazem parte desta jornada e não estão documentadas aqui. As consultas externas vinculadas ao contrato (bureau, autorregulação) ficam em Consultas.
Convenções gerais reutilizadas nesta página: Tratamento de erros, Objeto de domínio, Campo de status, Referências organizacionais. Valores fixos em Domínios › Empréstimos.
Ciclo de vida nesta jornada
POST /v5/loans ──────────────► status = draft, stage = proposal
│
├─ 1. POST /{loanId}/signature-requests ─► gera CCB + link de assinatura em segundo plano
│ └─► status = awaiting_formalization (evento loan.signature_requested)
│ └─ tomador assina ──► status = signed (grava signatureDate, evento loan.signed)
│ (alternativa: PUT /{id}/signatures registra a assinatura manualmente)
├─ 2. PUT /{id}/endorsements ─► status = endorsement_processing (consignado privado, Dataprev em segundo plano)
│ └─► status = endorsement (grava endorsementDate)
└─ 3. PUT /{id}/disbursements ► status = integrated (banco liquidante + cobranças)
└─ bloqueia qualquer nova transição (1010002)
As três rotas de transição recusam contratos já integrated (1010002). Por isso a sequência é formalizar (assinar) → averbar → desembolsar, a mesma ordem das requisições da collection (Assinar, Averbar e Desembolsar Operação). Assinatura manual e averbação não exigem status anterior específico, então podem ser repetidas para corrigir a data enquanto o contrato não for desembolsado.
No consignado privado, a empresa pode configurar um prazo para a desaverbação automática: um contrato averbado que não foi desembolsado dentro desse prazo tem a averbação excluída na Dataprev e é cancelado. Ver Desaverbação automática.
Campos da entidade
O empréstimo contém todos os campos financeiros documentados em Simulações › Campos da entidade (valores, taxas, IOF, CET, regras do produto, installments[], disbursementOptions[]) e acrescenta os campos abaixo. A coluna "Entrada" indica o campo equivalente no payload de POST /v5/loans.
Identificação e ciclo de vida
| Campo | Entrada | Tipo | Descrição |
|---|---|---|---|
id | — | string (uuid) | Identificador do contrato. É o {id} das rotas de transição. |
code | — | integer | Código sequencial por empresa. |
key | — | string (uuid) | Chave pública. |
contractNumber | contractNumber | string | Número do contrato. Se omitido, gerado com o prefixo do produto + code (ex.: SM00000001). |
stage | stage | object (code/key/name) | proposal até o desembolso; passa a contract quando o desembolso altera a data e recalcula as parcelas. Ver LoanStage. |
step | — | object (code/key/name) | Etapa operacional (formalization). Passa a awaiting_sync (1830) se o envio ao banco falhar no desembolso. Ver LoanStep. |
status | — | object (Status) | Nasce draft. Ver LoanStatus. |
statusReason | — | object (code/key/name) | Motivo do status, quando aplicável (cancelamento). |
issueDate | — | string (date) | Data de emissão (dia da criação). |
signatureDate | — | string (date-time) | null | Preenchido por PUT /{id}/signatures. |
disbursementDate | disbursementDate | string (date) | Prevista na criação; efetiva após PUT /{id}/disbursements. |
endorsementDate | endorsementDate | string (date) | null | Preenchido por PUT /{id}/endorsements. |
payoffDate | — | string (date) | null | Data de liquidação total (fluxos de pagamento). |
Tomador e partes
| Campo | Entrada | Tipo | Descrição |
|---|---|---|---|
parties[] | borrower (objeto único) e/ou parties[] | array | Partes envolvidas. borrower é adicionado com type = borrower. Cada item: id, nid, name, tradeName, birthDate, type, personType, documentType, documentNumber, registrationType, registrationNumber, motherName, fatherName, profession, nationality, maritalStatus, gender, income, address, phone, email, refCode, note. |
parties[].address | borrower.address | object | id, prefix, street, number, complement, district, city, state, country, postalCode, note, type, status. Informe o CEP em postalCode e o bairro em district. |
parties[].phone | borrower.phone | object | id, countryCode, areaCode, number, fullNumber (montado), extension, note, type, status. |
Pagamento e desembolso
| Campo | Entrada | Tipo | Descrição |
|---|---|---|---|
paymentMethod | paymentMethod | object (code/key/name) | Método de pagamento das parcelas. Padrão do produto: direct_loan. Ver LoanPaymentMethod. |
paymentBankAccount, paymentPix | idem | object | null | Conta/Pix de pagamento, quando aplicável. |
disbursementMethod | disbursementMethod | object (code/key/name) | Padrão do produto: ted. Ver LoanDisbursementMethod. |
disbursementBankAccount | disbursementBankAccount | object | null | type, bank, branch, number, digit. Informe a conta separada em number e digit, e o tipo em type com a chave checking_account ou savings_account. Ver BankAccountType. |
disbursementPix | disbursementPix | object | null | Chave Pix de desembolso, para disbursementMethod = pix. |
Acompanhamento financeiro (zerados na emissão)
| Campo | Tipo | Descrição |
|---|---|---|
totalReceivedAmount, overdueAmount, lateDays, lastPaymentDate | decimal / decimal / integer / date | null | Evoluem com os pagamentos. |
accruedInterestAmount, unearnedInterestAmount | decimal | Juros apropriados e a apropriar. |
latePenaltyAmount, lateInterestAmount, latePenaltyRate, lateInterestRate | decimal | Multa e mora acumuladas em atraso e as taxas aplicadas. |
presentValueAmount, writtenOffAmount, chargeDiscountAmount, insuranceAmount, simulationAmount | decimal | Valores auxiliares de gestão da carteira. |
isRenegotiated, isDefault, defaultDate, recoveryAmount | boolean / boolean / date | null / decimal | Renegociação e inadimplência. |
riskRating, riskRatingDate, eclStage, probabilityOfDefault, lossGivenDefault, exposureAtDefaultAmount, expectedCreditLossAmount | — | Risco e perda esperada (processos de crédito). |
isAssigned, assignmentDate, assignee | boolean / date | null / Referência | Cessão do contrato. |
receivableRegistryId, receivableRegistryStatus | string | null / CodeKeyName | Registro em registradora de recebíveis. |
collateralType, collateralAmount | CodeKeyName / decimal | Garantia vinculada (ex.: FGTS). |
employerDocumentType, employerDocumentNumber, correspondentDocumentType, correspondentDocumentNumber | — | Empregador e correspondente, quando informados (o payload aceita employerDocumentType/employerDocumentNumber). |
files[], currency, batch, refCode, salesChannel, lastCalculatedAt, note | — | Anexos, moeda (BRL), lote, referência externa, canal de vendas, último recálculo e observações. |
POST /v5/loans
Emite o contrato. O payload aceita os mesmos parâmetros financeiros da simulação (e os mesmos dois modos: fixar installmentAmount ou disbursementAmount), mais o tomador (borrower) e a conta de desembolso.
Autenticação: API Key. Exige permissão de criação de empréstimos.
Payload de entrada
Campos enviados pelas quatro requisições de emissão da collection (por Valor de Parcela, por Valor de Parcela com garantia, por Valor do Desembolso e por Valor do Principal). Elas diferem só no valor de referência (installmentAmount, disbursementAmount ou principalAmount, envie apenas um) e no bloco privatePayroll, que na emissão com garantia traz também fgtsBalanceId, hasCollateral, fgtsWithdrawalType e collateralSeveranceRate. As datas vêm do script de pré-requisição: desembolso hoje e primeiro vencimento um mês depois.
Visualizar parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
borrower.name | string | Sim | Nome completo. |
borrower.birthDate | string (date) | Sim | Data de nascimento. |
borrower.personType | string | Sim | natural_person. O tomador do consignado privado é sempre gravado como pessoa física. |
borrower.documentType | string | Sim | cpf. |
borrower.documentNumber | string | Sim | CPF, somente dígitos. Deve ser o mesmo do termo e do vínculo consultados. |
borrower.identityDocumentNumber | string | null | Não | Número do documento de identidade (RG). |
borrower.identityIssuingAgency | string | null | Não | Órgão emissor do documento de identidade. |
borrower.identityIssuingState | string | null | Não | UF de emissão do documento de identidade. |
borrower.motherName | string | null | Não | Nome da mãe. |
borrower.profession | string | null | Não | Profissão. |
borrower.nationality | string | null | Não | Nacionalidade. |
borrower.maritalStatus | string | null | Não | key de MaritalStatus. |
borrower.gender | string | null | Não | key de Gender. |
borrower.income | decimal | null | Não | Renda declarada. |
borrower.address.postalCode | string | null | Não | CEP. |
borrower.address.street | string | null | Não | Logradouro. |
borrower.address.number | string | null | Não | Número. |
borrower.address.complement | string | null | Não | Complemento. |
borrower.address.district | string | null | Não | Bairro. |
borrower.address.city | string | null | Não | Cidade. |
borrower.address.state | string | null | Não | UF. |
borrower.address.country | string | null | Não | País. |
borrower.phone.countryCode | string | null | Não | Código do país (55). |
borrower.phone.areaCode | string | null | Não | DDD. |
borrower.phone.number | string | null | Não | Número do telefone. |
borrower.phone.type | string | null | Não | Tipo do telefone (mobile). |
borrower.email | string | null | Não | E-mail do tomador. Obrigatório para gerar o link de assinatura eletrônica (1010026). |
product | string | Sim | key do produto de empréstimo. Use private_payroll. Alternativa: productId (uuid). Desconhecido → 1010003. |
disbursementDate | string (date) | Sim | Data prevista do desembolso. |
firstDueDate | string (date) | Sim | Primeiro vencimento desejado. Ajustado pelas regras do produto (ver Simulações). |
numberOfInstallments | integer | Sim | Quantidade de parcelas. Inválido → 1010004. |
installmentAmount | decimal | Um dos três | Valor fixo da parcela (modo term_rate_installment). |
disbursementAmount | decimal | Um dos três | Valor líquido em conta (modo term_rate_disbursement). |
principalAmount | decimal | Um dos três | Valor contratado (modo term_rate_principal). |
monthlyRate | decimal | Sim | Taxa mensal em fração (0.018 = 1,8%). Inválida → 1010005. |
privatePayroll.employeeDataId | string (uuid) | Sim | id da consulta de dados do trabalhador. Copia para o contrato a matrícula, o empregador, a elegibilidade e a margem. Não encontrada → 9504102. Ver bloco privatePayroll. |
privatePayroll.fgtsBalanceId | string (uuid) | null | Com garantia | id da consulta de saldo FGTS, base da garantia. Não encontrada → 9504104. |
privatePayroll.hasCollateral | boolean | null | Não | true declara a garantia de FGTS. Os valores dados em garantia são calculados pela API; sem cobertura de 100% do valor contratado → 9504106. |
privatePayroll.fgtsWithdrawalType | string | null | Não | severance_withdrawal (saque-rescisão) ou birthday_withdrawal (saque-aniversário, sem o saldo do FGTS na garantia). Ver LoanPrivatePayrollFgtsWithdrawalType. |
privatePayroll.collateralSeveranceRate | decimal | null | Não | Percentual das verbas rescisórias dado em garantia, em fração. null usa o percentual disponível da consulta de dados do trabalhador. Acima do disponível → 9504105. |
disbursementBankAccount.bank | string | Sim | Código do banco (001). |
disbursementBankAccount.branch | string | Sim | Agência, sem dígito. |
disbursementBankAccount.number | string | Sim | Número da conta, sem dígito. |
disbursementBankAccount.digit | string | Sim | Dígito da conta. |
disbursementBankAccount.type | string | Sim | checking_account (conta corrente) ou savings_account (poupança). Ver BankAccountType. |
refCode | string | null | Não | Referência externa do contrato no seu sistema. |
note | string | null | Não | Observação. |
Outros campos aceitos (não usados na collection)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
disbursementMethod | string | null | Não | ted (padrão do produto), pix, tef, card. |
disbursementPix | object | null | Não | Chave Pix, quando disbursementMethod = pix. No consignado privado, chave CNPJ é recusada (9504107) e chave CPF precisa ser o CPF do tomador (9504108). |
description | string | null | Não | Descrição do contrato. |
resultOptions.disableInstallments | boolean | null | Não | true omite installments[] da resposta. |
| Demais campos | — | Não | contractNumber, type, operationType, payrollEntity, parties[], graceType, graceDays, iofIsFinanced, interestType, interestBase, amortizationSystem, paymentFrequencyType, fees[], originContracts[], numberOfDisbursementOptions, paymentMethod, paymentBankAccount, paymentPix, employerDocumentType, employerDocumentNumber, files[], currency, batch, salesChannel, unitId, partnerId, branchId, agentId, userId. Em geral desnecessários no consignado privado, pois o produto define os padrões. |
borrower.fatherName | string | null | Não | Nome do pai. |
borrower.refCode, borrower.note | string | null | Não | Referência externa e observação do tomador. |
Bloco privatePayroll
Liga o contrato às consultas feitas na Dataprev e declara se a operação tem garantia de FGTS. É este bloco — e não collaterals[] — que alimenta a averbação; sem ele o contrato não passa da validação 9503102.
Visualizar parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
employeeDataId | string (uuid) | Sim | id da consulta de dados do trabalhador. Copia para o contrato o CPF, a matrícula, a inscrição do empregador, a elegibilidade, a margem, o motivo de desligamento e o percentual de verba rescisória disponível. Não encontrada → 9504102. |
fgtsBalanceId | string (uuid) | null | Com garantia | id da consulta de saldo FGTS. Copia o saldo disponível e a multa rescisória apurados, que são a base da garantia. Não encontrada → 9504104. |
hasCollateral | boolean | null | Não | true declara que a operação tem garantia de FGTS. Sem ele (ou com false), o contrato é averbado sem garantia e os demais campos de garantia são ignorados. |
fgtsWithdrawalType | string | null | Não | Modalidade de saque do FGTS do trabalhador: severance_withdrawal (saque-rescisão) ou birthday_withdrawal (saque-aniversário). No saque-aniversário o saldo do FGTS não entra na garantia, só a multa rescisória. Valor desconhecido é ignorado. Ver LoanPrivatePayrollFgtsWithdrawalType. |
collateralSeveranceRate | decimal | null | Não | Percentual das verbas rescisórias dado em garantia, em fração (0.35 = 35%). Sem ele, a API usa o percentual disponível apurado na consulta de dados do trabalhador. Acima do disponível (ou de 35%) → 9504105. |
Os valores de saldo do FGTS e de multa rescisória dados em garantia não são enviados: com hasCollateral = true, a API os apura a partir da consulta de saldo FGTS (fgtsBalanceId), respeitando a modalidade de saque, o motivo de desligamento do vínculo e os limites legais de cada garantia, e os distribui até cobrir o valor contratado (principalAmount). Se as garantias disponíveis não cobrirem 100% do valor contratado, a emissão é recusada com 9504106. Ver Garantia de FGTS na averbação.
O bloco é gravado como um registro próprio do contrato (o registro de consignado privado), e é lá que ficam o resultado da averbação, do envio do contrato e da desaverbação. Ele não aparece no corpo de resposta de /v5/loans; nesta API, ele é devolvido por POST /v5/loan-private-payrolls/{loanId}/contract-information e exibido na aba Consignado Privado do portal.
Exemplo de Requisição e Resposta
- Body (por Valor de Parcela)
- Body (com garantia)
- Body (por Valor do Desembolso)
- Body (por Valor do Principal)
- cURL
- 201 - Created
- 400 - Erro
- 401 - Não autorizado
- 403 - Proibido
Visualizar Body
{
"borrower": {
"name": "{{workerName}}",
"birthDate": "1985-08-19",
"personType": "natural_person",
"documentType": "cpf",
"documentNumber": "{{workerCpf}}",
"identityDocumentNumber": "12342323",
"identityIssuingAgency": "SSP",
"identityIssuingState": "SP",
"motherName": "Maria Inclusao Massa Extra",
"profession": "Programador",
"nationality": "Brasileiro",
"maritalStatus": "married",
"gender": "male",
"income": 15000.00,
"address": {
"postalCode": "01310-100",
"street": "Avenida Paulista",
"number": "1578",
"complement": "Apto 101",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
},
"phone": {
"countryCode": "55",
"areaCode": "11",
"number": "987654321",
"type": "mobile"
},
"email": "trabalhador@exemplo.com"
},
"product": "private_payroll",
"disbursementDate": "{{disbursementDate}}",
"firstDueDate": "{{firstDueDate}}",
"numberOfInstallments": 96,
"installmentAmount": 100,
"monthlyRate": 0.018,
"privatePayroll": {
"employeeDataId": "{{employeeDataId}}"
},
"disbursementBankAccount": {
"bank": "001",
"branch": "1234",
"number": "123456",
"digit": "6",
"type": "checking_account"
},
"refCode": "",
"note": ""
}
Visualizar Body
{
"borrower": {
"name": "{{workerName}}",
"birthDate": "1985-08-19",
"personType": "natural_person",
"documentType": "cpf",
"documentNumber": "{{workerCpf}}",
"identityDocumentNumber": "12342323",
"identityIssuingAgency": "SSP",
"identityIssuingState": "SP",
"motherName": "Maria Inclusao Massa Extra",
"profession": "Programador",
"nationality": "Brasileiro",
"maritalStatus": "married",
"gender": "male",
"income": 15000.00,
"address": {
"postalCode": "01310-100",
"street": "Avenida Paulista",
"number": "1578",
"complement": "Apto 101",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
},
"phone": {
"countryCode": "55",
"areaCode": "11",
"number": "987654321",
"type": "mobile"
},
"email": "trabalhador@exemplo.com"
},
"product": "private_payroll",
"disbursementDate": "{{disbursementDate}}",
"firstDueDate": "{{firstDueDate}}",
"numberOfInstallments": 96,
"installmentAmount": 100,
"monthlyRate": 0.018,
"privatePayroll": {
"employeeDataId": "{{employeeDataId}}",
"fgtsBalanceId": "{{fgtsBalanceId}}",
"hasCollateral": true,
"fgtsWithdrawalType": "severance_withdrawal",
"collateralSeveranceRate": null
},
"disbursementBankAccount": {
"bank": "001",
"branch": "1234",
"number": "123456",
"digit": "6",
"type": "checking_account"
},
"refCode": "",
"note": ""
}
Visualizar Body
{
"borrower": {
"name": "{{workerName}}",
"birthDate": "1985-08-19",
"personType": "natural_person",
"documentType": "cpf",
"documentNumber": "{{workerCpf}}",
"identityDocumentNumber": "12342323",
"identityIssuingAgency": "SSP",
"identityIssuingState": "SP",
"motherName": "Maria Inclusao Massa Extra",
"profession": "Programador",
"nationality": "Brasileiro",
"maritalStatus": "married",
"gender": "male",
"income": 15000.00,
"address": {
"postalCode": "01310-100",
"street": "Avenida Paulista",
"number": "1578",
"complement": "Apto 101",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
},
"phone": {
"countryCode": "55",
"areaCode": "11",
"number": "987654321",
"type": "mobile"
},
"email": "trabalhador@exemplo.com"
},
"product": "private_payroll",
"disbursementDate": "{{disbursementDate}}",
"firstDueDate": "{{firstDueDate}}",
"numberOfInstallments": 96,
"disbursementAmount": 8705.00,
"monthlyRate": 0.018,
"privatePayroll": {
"employeeDataId": "{{employeeDataId}}"
},
"disbursementBankAccount": {
"bank": "001",
"branch": "1234",
"number": "123456",
"digit": "6",
"type": "checking_account"
},
"refCode": "",
"note": ""
}
Visualizar Body
{
"borrower": {
"name": "{{workerName}}",
"birthDate": "1985-08-19",
"personType": "natural_person",
"documentType": "cpf",
"documentNumber": "{{workerCpf}}",
"identityDocumentNumber": "12342323",
"identityIssuingAgency": "SSP",
"identityIssuingState": "SP",
"motherName": "Maria Inclusao Massa Extra",
"profession": "Programador",
"nationality": "Brasileiro",
"maritalStatus": "married",
"gender": "male",
"income": 15000.00,
"address": {
"postalCode": "01310-100",
"street": "Avenida Paulista",
"number": "1578",
"complement": "Apto 101",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
},
"phone": {
"countryCode": "55",
"areaCode": "11",
"number": "987654321",
"type": "mobile"
},
"email": "trabalhador@exemplo.com"
},
"product": "private_payroll",
"disbursementDate": "{{disbursementDate}}",
"firstDueDate": "{{firstDueDate}}",
"numberOfInstallments": 96,
"principalAmount": 8705.00,
"monthlyRate": 0.018,
"privatePayroll": {
"employeeDataId": "{{employeeDataId}}"
},
"disbursementBankAccount": {
"bank": "001",
"branch": "1234",
"number": "123456",
"digit": "6",
"type": "checking_account"
},
"refCode": "",
"note": ""
}
curl --request POST \
--url '{{baseUrl}}/v5/loans' \
--header 'X-Api-Key: {{x_api_key}}' \
--header 'Content-Type: application/json' \
--data '{
"borrower": {
"name": "{{workerName}}",
"birthDate": "1985-08-19",
"personType": "natural_person",
"documentType": "cpf",
"documentNumber": "{{workerCpf}}",
"identityDocumentNumber": "12342323",
"identityIssuingAgency": "SSP",
"identityIssuingState": "SP",
"motherName": "Maria Inclusao Massa Extra",
"profession": "Programador",
"nationality": "Brasileiro",
"maritalStatus": "married",
"gender": "male",
"income": 15000.00,
"address": {
"postalCode": "01310-100",
"street": "Avenida Paulista",
"number": "1578",
"complement": "Apto 101",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
},
"phone": {
"countryCode": "55",
"areaCode": "11",
"number": "987654321",
"type": "mobile"
},
"email": "trabalhador@exemplo.com"
},
"product": "private_payroll",
"disbursementDate": "{{disbursementDate}}",
"firstDueDate": "{{firstDueDate}}",
"numberOfInstallments": 96,
"installmentAmount": 100,
"monthlyRate": 0.018,
"privatePayroll": {
"employeeDataId": "{{employeeDataId}}"
},
"disbursementBankAccount": {
"bank": "001",
"branch": "1234",
"number": "123456",
"digit": "6",
"type": "checking_account"
},
"refCode": "",
"note": ""
}'
Objeto recém-criado: status = draft, signatureDate/endorsementDate nulos, valores recalculados. Abaixo, a resposta da emissão por parcela, com installments[] e disbursementOptions[] reduzidos a um item.
O bloco privatePayroll enviado não volta neste corpo: ele é gravado como o registro de consignado privado do contrato (ver bloco privatePayroll). collaterals[] e additionalData[] ficam vazios quando a garantia é declarada por privatePayroll.Visualizar Response
Produto inválido (1010003), validações financeiras (1010004–1010011), erro de cálculo (1010012), tipo inválido (1010013), tomador ausente/sem CPF, ou exceção não tratada (9999999).Visualizar Response
API Key ausente, inválida ou expirada.
Usuário autenticado sem permissão de criação de empréstimos. Corpo vazio.
GET /v5/loans/{id}
Obtém o contrato, no mesmo formato da resposta de POST /v5/loans. É a forma de acompanhar o contrato depois das etapas processadas em segundo plano (formalização, averbação e desembolso), como alternativa aos eventos de webhook.
Autenticação: API Key. Exige permissão de consulta de empréstimos.
- cURL
- 200 - Sucesso
- 400 - Erro
curl --request GET \
--url 'https://{base-url}/v5/loans/01a0c239-c330-7361-ad20-fbeb57e97322' \
--header 'X-Api-Key: {api_key}'
Mesmo formato do exemplo 201 de POST /v5/loans, com o status e as datas atuais do contrato.
Empréstimo não encontrado ou fora do nível de acesso (1010001).
{ "messages": [ { "code": "1010001", "text": "Empréstimo não encontrado" } ] }
Formalização: CCB e assinatura eletrônica
A formalização gera a Cédula de Crédito Bancário (CCB) do contrato e um envelope de assinatura eletrônica em que o tomador é o signatário. As duas etapas são processadas em segundo plano: a chamada só registra o pedido e responde na hora.
POST /v5/loans/{loanId}/signature-requests ──► pedido de documento (status = pending)
│
│ em segundo plano
├─ cancela assinaturas ainda abertas do contrato ("Substituída por um novo link de assinatura")
├─ gera a CCB em PDF e anexa ao contrato (files[]) ──────────► evento loan.document_created
├─ cria o envelope de assinatura com o tomador e obtém o link de assinatura
├─ gera a jornada de formalização do tomador
└─ contrato passa a status = awaiting_formalization ──────────► evento loan.signature_requested
│
└─ tomador conclui a assinatura ──► status = signed, signatureDate = conclusão ──► evento loan.signed
Para acompanhar:
- Consulte
GET /v5/loans/{id}/document-requests/currentaté o pedido sair depending/processing/retrying— ou assine os eventosloan.signature_requestedeloan.document_failed. - Com o pedido em
succeeded, obtenha o link do tomador e a jornada emGET /v5/loans/{loanId}/signature-requests/current. - Quando o tomador assina, o contrato passa sozinho a
signede o eventoloan.signedé publicado. Não é preciso chamarPUT /{id}/signatures.
A jornada de formalização é a página que o tomador abre para revisar e assinar a CCB; ela é criada junto com a assinatura e devolvida em journeyUrl. Os detalhes das jornadas estão em Jornadas.
A geração da CCB sem assinatura eletrônica é uma operação do portal e segue o mesmo modelo: cria um pedido de documento do tipo ccb, acompanhado pela mesma rota document-requests/current.
Pedido de documento
Objeto devolvido por POST /v5/loans/{loanId}/signature-requests e por GET /v5/loans/{id}/document-requests/current.
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | Identificador do pedido. |
nid | integer | Identificador numérico do pedido. |
type | object (code/key/name) | signature_request (CCB e link de assinatura) ou ccb (só a CCB). Ver LoanDocumentRequestType. |
loanId | string (uuid) | Contrato do pedido. |
status | object (Status) | pending, processing, succeeded, retrying ou failed. Em failed, status.note traz o motivo. Ver LoanDocumentRequestStatus. |
attemptCount / maxAttempts | integer | Tentativas feitas e limite de tentativas. |
nextAttemptAt | string (date-time) | null | Próxima tentativa, quando o pedido está aguardando processamento ou reagendado. |
lastError | string | null | Último erro registrado. Quando há mais de um motivo, vêm separados por |. |
completedAt | string (date-time) | null | Conclusão do pedido, com sucesso ou falha. |
fileId | string (uuid) | null | Arquivo da CCB gerada. |
signatureId | string (uuid) | null | Envelope de assinatura criado (só em signature_request). |
createdAt | string (date-time) | Registro do pedido. |
open | boolean | true enquanto o pedido ainda não terminou. |
Falhas inesperadas durante o processamento são repetidas automaticamente, com espera crescente, até maxAttempts; nesse intervalo o pedido fica em retrying. Recusas de regra (por exemplo, configuração ausente ou provedor de assinatura que não devolve o link) encerram o pedido em failed na hora. Ao chegar a failed, o evento loan.document_failed é publicado.
POST /v5/loans/{loanId}/signature-requests
Solicita a formalização do contrato: enfileira a geração da CCB e do link de assinatura eletrônica e responde 201 com o pedido de documento, sem aguardar o processamento.
Autenticação: API Key. Exige permissão de edição de empréstimos.
Comportamento
- Valida que o contrato pode ser assinado: ainda sem
signatureDate, e nãointegratednemcanceled(1010027). - Valida o tomador: precisa existir com CPF (
1010025) e ter e-mail (1010026), usado pelo provedor de assinatura. - Se já houver um pedido do mesmo tipo em aberto para o contrato, devolve esse pedido em vez de criar outro. Caso contrário, registra um novo pedido com
status = pending. - Em segundo plano, executa as etapas do diagrama acima. Uma nova solicitação substitui a assinatura anterior que ainda estiver aberta: o link antigo deixa de valer.
Erros do processamento em segundo plano — por exemplo, o endereço da página da jornada não configurado para a empresa (1174005) ou o provedor de assinatura não devolver o link (1010028) — não voltam nesta resposta: o texto do erro fica em lastError e em status.note do pedido.
Exemplo de Requisição e Resposta
- cURL
- 201 - Created
- 400 - Erro
- 401 - Não autorizado
- 403 - Proibido
Não há corpo.
curl --request POST \
--url 'https://{base-url}/v5/loans/01a0c239-c330-7361-ad20-fbeb57e97322/signature-requests' \
--header 'X-Api-Key: {api_key}'
Visualizar Response
{
"id": "01a1f0d2-4a1b-7c3e-9d2f-1b2c3d4e5f60",
"nid": 1000012,
"type": { "code": 2, "key": "signature_request", "name": "Geração da CCB e Link de Assinatura" },
"loanId": "01a0c239-c330-7361-ad20-fbeb57e97322",
"status": { "code": 1, "key": "pending", "name": "Pendente", "date": "2026-10-17T13:02Z", "color": "#FFEB3B", "note": null },
"attemptCount": 0,
"maxAttempts": 3,
"nextAttemptAt": "2026-10-17T13:02Z",
"lastError": null,
"completedAt": null,
"fileId": null,
"signatureId": null,
"createdAt": "2026-10-17T13:02Z",
"open": true
}
Não encontrado (1010001); contrato já assinado, integrado ou cancelado (1010027); tomador sem CPF (1010025); tomador sem e-mail (1010026); ou exceção não tratada (9999999).
{ "messages": [ { "code": "1010026", "text": "E-mail do tomador é obrigatório para gerar o link de assinatura" } ] }
API Key ausente, inválida ou expirada.
Usuário de integração sem permissão de edição de empréstimos. Corpo vazio.
GET /v5/loans/{id}/document-requests/current
Devolve o último pedido de documento do contrato, de qualquer tipo, no formato de Pedido de documento. Use para acompanhar a formalização por consulta periódica, com intervalo de alguns segundos, até open = false.
Autenticação: API Key. Exige permissão de consulta de empréstimos.
- cURL
- 200 - Sucesso
- 404 - Sem pedido
- 400 - Erro
curl --request GET \
--url 'https://{base-url}/v5/loans/01a0c239-c330-7361-ad20-fbeb57e97322/document-requests/current' \
--header 'X-Api-Key: {api_key}'
Visualizar Response
{
"id": "01a1f0d2-4a1b-7c3e-9d2f-1b2c3d4e5f60",
"nid": 1000012,
"type": { "code": 2, "key": "signature_request", "name": "Geração da CCB e Link de Assinatura" },
"loanId": "01a0c239-c330-7361-ad20-fbeb57e97322",
"status": { "code": 3, "key": "succeeded", "name": "Concluído", "date": "2026-10-17T13:02Z", "color": "#4CAF50", "note": null },
"attemptCount": 1,
"maxAttempts": 3,
"nextAttemptAt": null,
"lastError": null,
"completedAt": "2026-10-17T13:02Z",
"fileId": "01a1f0d2-5b7e-7a10-8c44-0f1e2d3c4b5a",
"signatureId": "01a1f0d2-5c90-7d21-b6a3-9e8f7a6b5c4d",
"createdAt": "2026-10-17T13:02Z",
"open": false
}
O contrato existe, mas nenhum documento foi solicitado ainda. Corpo vazio.
Empréstimo não encontrado ou fora do nível de acesso (1010001).
GET /v5/loans/{loanId}/signature-requests/current
Devolve a assinatura eletrônica mais recente do contrato, com o link do tomador e a jornada de formalização. Responde 404 (corpo vazio) quando o contrato ainda não tem assinatura.
Autenticação: API Key. Exige permissão de consulta de empréstimos.
Resposta
| Campo | Tipo | Descrição |
|---|---|---|
signatureId | string (uuid) | Envelope de assinatura. |
code | integer | Código do envelope. |
provider | object (code/key/name) | Provedor de assinatura (ex.: unico_sign). |
status | object (Status) | Situação do envelope: running (aguardando assinatura), partially_signed, completed, refused, canceled, expired ou failed. Ver Domínios › Assinatura Eletrônica. |
completedAt | string (date-time) | null | Conclusão do envelope. |
ccbFileId / ccbFileUrl | string | null | CCB enviada para assinatura. |
signers[] | array | Signatários: id, name, documentNumber, email, signUrl (link de assinatura), status, expiresAt, signedAt, refusedAt, refusalReason, verification (resultado da verificação de identidade, quando o provedor faz) e identityDocuments[]. |
documents[] | array | Documentos devolvidos pelo provedor ao final (CCB assinada, evidências, selfie, documento com foto): id, title, role, origin, fileId, fileName, fileExtension. |
journeyId | string (uuid) | null | Jornada de formalização ligada à assinatura. |
journeyUrl | string | null | Endereço da jornada, para enviar ao tomador. |
journeyStatus | object (Status) | null | Situação da jornada. Ver Jornadas. |
Visualizar Response
{
"signatureId": "01a1f0d2-5c90-7d21-b6a3-9e8f7a6b5c4d",
"code": 418,
"provider": { "code": 400, "key": "unico_sign", "name": "Unico Sign" },
"status": { "code": 2, "key": "running", "name": "Em Assinatura", "date": "2026-10-17T13:02Z", "color": "#2196F3", "note": null },
"completedAt": null,
"ccbFileId": "01a1f0d2-5b7e-7a10-8c44-0f1e2d3c4b5a",
"ccbFileUrl": "https://{storage-url}/ccb-SM00030515.pdf",
"signers": [
{
"id": "01a1f0d2-5c91-7e02-a1b2-c3d4e5f60718",
"name": "JOAO TESTE ELEGIVEL PADRAO",
"documentNumber": "99900010140",
"email": "joao.teste@email.com",
"signUrl": "https://{provedor-assinatura}/sign/abc123",
"status": { "code": 2, "key": "sent", "name": "Notificado", "date": "2026-10-17T13:02Z", "color": "#2196F3", "note": null },
"expiresAt": "2026-10-24T13:02Z",
"signedAt": null,
"refusedAt": null,
"refusalReason": null,
"verification": null,
"identityDocuments": []
}
],
"documents": [],
"journeyId": "01a1f0d2-5d12-7f33-b4c5-d6e7f8091a2b",
"journeyUrl": "https://{journey-url}/j/Xk3pQ9",
"journeyStatus": { "code": 1, "key": "pending", "name": "Aguardando Acesso", "date": "2026-10-17T13:02Z", "color": "#9E9E9E", "note": null }
}
POST /v5/loans/{loanId}/signature-requests/current/sync
Consulta o provedor de assinatura e atualiza a assinatura mais recente do contrato (status do envelope, dos signatários e documentos devolvidos). Se a consulta mostrar a assinatura concluída, o contrato passa a signed como descrito na formalização. Normalmente desnecessário: as atualizações do provedor chegam sozinhas. Use quando o status parecer parado.
Não há corpo. Responde 200 no formato de GET .../signature-requests/current. Assinaturas em rascunho ou canceladas são devolvidas sem consulta ao provedor.
Autenticação: API Key. Exige permissão de edição de empréstimos.
| Situação | Código |
|---|---|
| Empréstimo não encontrado | 1010001 |
| Contrato sem assinatura eletrônica | 1010029 |
POST /v5/loans/{loanId}/signature-requests/current/journeys
Gera uma nova jornada de formalização para a assinatura em andamento — por exemplo, quando a jornada anterior expirou ou foi cancelada — sem gerar nova CCB nem novo envelope. Responde 201 no formato de GET .../signature-requests/current, com o novo journeyId/journeyUrl. Não há corpo.
Autenticação: API Key. Exige permissão de edição de empréstimos.
| Situação | Código |
|---|---|
| Empréstimo não encontrado | 1010001 |
| Contrato sem assinatura eletrônica | 1010029 |
| Assinatura não está aguardando assinatura (concluída, recusada, cancelada ou expirada) | 1010033 |
| Nenhum signatário pendente com link de assinatura | 1010028 |
Quando a assinatura não está mais aberta, solicite uma nova formalização com POST /v5/loans/{loanId}/signature-requests. O funcionamento das jornadas está em Jornadas.
PUT /v5/loans/{id}/signatures
Registra a data de assinatura do contrato e define status = signed (com status.date = signatureDate).
Use esta rota quando a assinatura acontece fora da plataforma. Quando a formalização é feita por POST /v5/loans/{loanId}/signature-requests, a conclusão da assinatura eletrônica já grava signatureDate e define status = signed sozinha.
Autenticação: API Key. Exige permissão de edição de empréstimos.
Parâmetros de rota
Visualizar parâmetros
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | string (uuid) | Sim | Identificador do empréstimo devolvido em POST /v5/loans. |
Payload de entrada
Campos enviados pela requisição Assinar Operação da collection, na mesma ordem.
Visualizar parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
signatureDate | string (date-time) | null | Não | Data/hora da assinatura. Gravada em signatureDate e usada como status.date. |
Outros campos aceitos (não usados na collection)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
note | string | null | Não | Observação. Não é gravada pela assinatura. |
A assinatura grava signatureDate, define status = signed e atualiza o log. Única validação de negócio: bloqueio se já integrated (1010002). Não há checagem do status anterior, então a chamada pode ser repetida para corrigir a data.
Exemplo de Requisição e Resposta
- Body
- cURL
- 200 - Sucesso
- 400 - Erro
- 401 - Não autorizado
- 403 - Proibido
Visualizar Body
{
"signatureDate": "{{signatureDate}}"
}
curl --request PUT \
--url '{{baseUrl}}/v5/loans/{{loanId}}/signatures' \
--header 'X-Api-Key: {{x_api_key}}' \
--header 'Content-Type: application/json' \
--data '{
"signatureDate": "{{signatureDate}}"
}'
Objeto atualizado, com Resposta resumida — os demais campos seguem o exemplo completo do signatureDate gravado e status = signed.Visualizar Response
201 de POST /v5/loans.
Empréstimo não encontrado ou fora do nível de acesso (1010001); já integrated (1010002); ou exceção não tratada (9999999).Visualizar Response
API Key ausente, inválida ou expirada.
Usuário autenticado sem permissão de edição de empréstimos. Corpo vazio.
PUT /v5/loans/{id}/disbursements
Registra o desembolso: fixa a data efetiva, recalcula o cronograma se a data mudou, integra com o banco liquidante e gera as cobranças de cada parcela. Define status = integrated.
Autenticação: API Key. Exige permissão de edição de empréstimos.
Parâmetros de rota
Visualizar parâmetros
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | string (uuid) | Sim | Identificador do empréstimo. |
Payload de entrada
Campos enviados pela requisição Desembolsar Operação da collection, na mesma ordem.
Visualizar parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
disbursementDate | string (date) | null | Não | Data efetiva do desembolso. Se omitida ou vazia, a API apenas define status = integrated com a data já prevista. |
Outros campos aceitos (não usados na collection)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
note | string | null | Não | Observação. |
Comportamento
recebe disbursementDate
│
├─ contrato já integrated ────────────► 400 1010002
├─ contrato já em stage = contract ───► 400 1010014
│
├─ data vazia ou igual à prevista ────► status = integrated
│
└─ data diferente (e numberOfDisbursementOptions > 1)
├─ procura o cenário em disbursementOptions[] com essa data
│ └─ não existe ──► 400 1010015 (nenhuma data de desembolso encontrada)
├─ aplica os valores do cenário (principal, IOF, líquido, taxas, tarifas)
├─ recalcula installments, firstDueDate, lastDueDate, calendarDays, businessDays
├─ stage = contract
└─ status = integrated
│
▼
envia a ordem de desembolso ao banco liquidante
├─ sucesso ──► gera as cobranças (uma por parcela; idempotente) ──► grava ──► 200
└─ falha ────► step = awaiting_sync (1830) ──► 400 (contrato fica pendente de sincronização)
Na emissão a API já calculou numberOfDisbursementOptions cenários, um por dia a partir da data prevista. Se o dinheiro sair em outro dia dentro dessa janela, a API adota o cenário daquele dia em vez de recalcular do zero, garantindo que os valores apresentados ao tomador sejam exatamente os praticados. Fora da janela, o desembolso é recusado com 1010015.
Exemplo de Requisição e Resposta
- Body
- cURL
- 200 - Sucesso
- 400 - Erro
- 401 - Não autorizado
- 403 - Proibido
Visualizar Body
{
"disbursementDate": "{{disbursementDate}}"
}
curl --request PUT \
--url '{{baseUrl}}/v5/loans/{{loanId}}/disbursements' \
--header 'X-Api-Key: {{x_api_key}}' \
--header 'Content-Type: application/json' \
--data '{
"disbursementDate": "{{disbursementDate}}"
}'
Objeto atualizado. O exemplo ilustra um desembolso em data diferente da prevista: Resposta resumida — os demais campos seguem o exemplo completo do stage = contract, valores e vencimentos substituídos pelos do cenário correspondente.Visualizar Response
201 de POST /v5/loans.
Não encontrado (1010001); já integrated (1010002); já em stage = contract (1010014); data fora dos cenários (1010015); banco liquidante não configurado (1010016); erro devolvido pelo banco liquidante (contrato fica em awaiting_sync); ou exceção não tratada (9999999).Visualizar Response
API Key ausente, inválida ou expirada.
Usuário autenticado sem permissão de edição de empréstimos. Corpo vazio.
Se o banco liquidante falhar, o contrato fica com step = awaiting_sync. Trate esse caso na integração: consulte o contrato e repita o desembolso quando o banco estiver disponível. As cobranças são geradas uma única vez, então a repetição é segura.
GET /v5/loans/{loanId}/disbursements
Lista os comandos de desembolso do contrato. Quando o desembolso é feito por um pagador externo, cada envio do desembolso gera um comando com uma chave própria (key), que o pagador valida antes de pagar e confirma depois de pagar. A lista permite acompanhar esse ciclo e auditar as tentativas.
Autenticação: API Key. Exige permissão de consulta de empréstimos.
Ciclo do comando
desembolso enviado ao pagador ──► status = pending ──► sent
│
├─ pagador valida a chave e as condições ──► validated
│ └─ condições alteradas, valor ou documento divergentes ──► rejected
│
└─ pagador confirma ──► completed (contrato desembolsado, evento loan.disbursed)
└─► failed (evento loan.disbursement_failed)
- Um novo envio cancela os comandos ainda abertos do mesmo contrato (
canceled, nota "Substituído por nova solicitação de desembolso"). Depois que um comando évalidatedoucompleted, não é possível enviar outro. - O cancelamento do contrato, inclusive pela desaverbação automática, cancela os comandos abertos.
Resposta
Lista (vazia quando não houve desembolso), da mais recente para a mais antiga. Cada item:
| Campo | Tipo | Descrição |
|---|---|---|
id, nid, code | string (uuid), integer, integer | Identificadores do comando. |
loan, loanId | object (Referência), string (uuid) | Contrato. |
provider | object (code/key/name) | null | Pagador que recebeu o comando. |
key | string (uuid) | Chave do comando, validada pelo pagador. |
disbursementDate, disbursementAmount, principalAmount, numberOfInstallments, installmentAmount, firstDueDate | — | Condições do contrato no momento do envio. |
borrowerName, borrowerDocumentNumber | string | Tomador. |
disbursementMethod, disbursementBankAccount, disbursementPix | — | Para onde o valor deve ser pago. |
expiresAt | string (date-time) | Validade prevista da chave (24 horas após a criação). |
sentAt | string (date-time) | null | Envio ao pagador. |
validatedAt, lastValidatedAt, lastValidationIp, validationCount | — | Primeira e última validação feitas pelo pagador. |
disbursedAt, confirmedAt, confirmationIp | — | Pagamento e confirmação informados pelo pagador. |
note, data | string | null | Observação e dados adicionais enviados pelo pagador na confirmação. |
status | object (Status) | Ver LoanDisbursementStatus. Em rejected/failed/canceled, status.note traz o motivo. |
createdAt, createdBy, updatedAt | — | Auditoria do comando. |
Visualizar Response
[
{
"id": "01a1f3a0-7b2c-7d10-9e8f-0a1b2c3d4e5f",
"nid": 2105,
"code": 87,
"loan": { "code": 30515, "key": null, "name": "SM00030515" },
"loanId": "01a0c239-c330-7361-ad20-fbeb57e97322",
"provider": { "code": 9601, "key": "pagador_exemplo", "name": "Pagador Exemplo" },
"key": "01a1f3a0-7b2d-74c1-8a90-112233445566",
"disbursementDate": "2026-10-17",
"disbursementAmount": 2141.570000,
"principalAmount": 2215.840000,
"numberOfInstallments": 96,
"installmentAmount": 50.000000,
"firstDueDate": "2026-12-21",
"borrowerName": "JOAO TESTE ELEGIVEL PADRAO",
"borrowerDocumentNumber": "99900010140",
"disbursementMethod": { "code": 1, "key": "ted", "name": "TED" },
"disbursementBankAccount": {
"type": { "code": 1, "key": "checking_account", "name": "Conta Corrente" },
"bank": "001",
"branch": "1234",
"number": "12345",
"digit": "6"
},
"disbursementPix": null,
"expiresAt": "2026-10-18T14:10Z",
"sentAt": "2026-10-17T14:10Z",
"validatedAt": "2026-10-17T14:12Z",
"lastValidatedAt": "2026-10-17T14:12Z",
"lastValidationIp": "203.0.113.10",
"validationCount": 1,
"disbursedAt": "2026-10-17T14:15Z",
"confirmedAt": "2026-10-17T14:15Z",
"confirmationIp": "203.0.113.10",
"note": null,
"data": null,
"status": { "code": 8, "key": "completed", "name": "Concluído", "date": "2026-10-17T14:15Z", "color": "#388E3C", "note": "Confirmado pelo provedor" },
"createdAt": "2026-10-17T14:10Z",
"createdBy": { "code": 19, "key": null, "name": "Integração Exemplo" },
"updatedAt": "2026-10-17T14:15Z"
}
]
| Situação | Código |
|---|---|
| Empréstimo não encontrado ou fora do nível de acesso | 1010001 |
PUT /v5/loans/{id}/endorsements
Registra a averbação do contrato na folha do empregador: grava endorsementDate e define status = endorsement. No consignado privado, a averbação na Dataprev é assíncrona: a chamada responde com o contrato em endorsement_processing e o resultado chega depois.
Autenticação: API Key. Exige permissão de edição de empréstimos.
Parâmetros de rota
Visualizar parâmetros
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | string (uuid) | Sim | Identificador do empréstimo. |
Payload de entrada
Campos enviados pela requisição Averbar Operação da collection, na mesma ordem.
Visualizar parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
endorsementDate | string (date) | null | Não | Data em que a averbação foi confirmada pelo empregador ou pelo sistema de folha. |
Outros campos aceitos (não usados na collection)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
note | string | null | Não | Observação (por exemplo, o protocolo da averbação). |
A averbação não altera valores nem parcelas do contrato.
Averbação na Dataprev
Quando o empréstimo é do tipo consignado privado, esta rota não apenas registra a data: a API envia o contrato à Dataprev e só conclui a averbação com a confirmação do provedor. Esse envio é feito em segundo plano. Para os demais tipos de empréstimo, nada é enviado e a rota continua síncrona: apenas registra a averbação e responde com status = endorsement.
Comportamento
- A API faz as validações que não dependem da Dataprev (ver Validações).
- Marca o contrato com
status = endorsement_processing(código61, "Processando Averbação"), publica o eventoloan.endorsement_requestede responde200imediatamente, sem aguardar a Dataprev. - Em segundo plano, envia o contrato à Dataprev. Falhas temporárias do provedor (tempo esgotado, indisponibilidade) são repetidas automaticamente algumas vezes, com espera crescente; quando a cota da Dataprev é excedida, o envio é adiado até o horário indicado pelo provedor. Recusas de negócio encerram o processamento na hora.
- Se a Dataprev confirmar, o contrato passa a
status = endorsement(código62, "Averbado"), comendorsementDatepreenchida, e o eventoloan.endorsedé publicado. - Se a Dataprev recusar, o contrato volta ao status que tinha antes da averbação, com
status.noteiniciando por "Averbação recusada:" seguido do motivo, e o eventoloan.endorsement_failedé publicado.
Enquanto o contrato está em endorsement_processing, uma nova chamada de averbação é recusada com 1010023 ("Averbação do empréstimo já está em processamento"). Acompanhe o resultado por GET /v5/loans/{id} ou pelos eventos loan.endorsed e loan.endorsement_failed.
São enviados o tomador (CPF, nome, matrícula), o empregador (tipo e número de inscrição), o contrato (número, datas de início e fim, competência e data do primeiro desconto), os valores (contratado, liberado, parcela, IOF), as taxas mensal e anual, o CET mensal e anual e a garantia de FGTS.
Os valores monetários e os percentuais são enviados com duas casas decimais — a Dataprev recusa precisão maior (OT, tamanho de campo incorreto).
O numeroProposta não é enviado: ele só existe quando a operação nasce de uma proposta registrada na jornada iniciada pelo trabalhador na CTPS Digital, que esta rota não usa. Enviar um número qualquer resulta em SB (proposta não existente).
Os campos exigidos por esse envio já são validados na emissão e na edição do empréstimo, com os códigos 9503102 a 9503113 — um contrato de consignado privado não chega à averbação sem eles. Ver Tratamento de erros.
Garantia de FGTS na averbação
Os valores de garantia saem do bloco privatePayroll do contrato e da consulta de saldo FGTS ligada a ele, não de collaterals[]:
| Campo enviado | Origem |
|---|---|
temGarantias | privatePayroll.hasCollateral |
valorSaldoDisponivelGarantiaFgts | Parte do saldo do FGTS dada em garantia, apurada pela API a partir da consulta de saldo FGTS |
valorMultaRescisoriaGarantiaFgts | Parte da multa rescisória dada em garantia, apurada pela API a partir da consulta de saldo FGTS |
percVerbaRescisoriaGarantia | privatePayroll.collateralSeveranceRate (ou o percentual disponível da consulta), convertido de fração para percentual |
Declarada a garantia, a Dataprev exige cobertura integral e exata: a soma das garantias tem de bater com o valor do empréstimo, nem a menos nem a mais. Garantia insuficiente e garantia excedente devolvem a mesma recusa (FI), informando o valor esperado:
{ "messages": [
{ "code": "FI", "text": "Valores de garantia inválidos: para cobertura de 100%, as garantias informadas (8705.00) deveriam ser 2215.84 (100% do empréstimo de 2215.84)" },
{ "code": "9503101", "text": "Erro ao averbar o empréstimo na Dataprev" }
] }
Na conta da Dataprev entram os valores enviados mais a margem que ela apura do próprio cadastro do trabalhador — por isso o total que ela informa costuma ser maior que a soma dos dois campos enviados. Se a recusa persistir, confira o valor contratado e a consulta de saldo FGTS usada na emissão.
A competência do primeiro desconto é a do mês anterior ao firstDueDate, isto é, a competência da folha cujo repasse vence no primeiro vencimento. Ela precisa cair numa folha ainda aberta: um primeiro vencimento em competência já encerrada devolve HT (competência de início de desconto inválida).
Resultado gravado
Confirmada a averbação, o retorno da Dataprev é gravado no registro de consignado privado do contrato:
| Retorno da Dataprev | Campo |
|---|---|
hashOperacao | endorsementProtocol |
numeroContrato | endorsementContractNumber |
competenciaInicioDesconto | endorsementFirstDiscountPeriod |
codigoSucesso | endorsementSuccessCode |
mensagem | endorsementMessage |
Junto com eles, endorsementStatus passa a endorsed e endorsementDate recebe o instante da confirmação. Uma nova averbação sobrescreve os valores anteriores.
{
"endorsementStatus": { "code": 30, "key": "endorsed", "name": "Averbada" },
"endorsementDate": "2026-09-21T04:52Z",
"endorsementProtocol": "1661201801",
"endorsementContractNumber": "SM00030523",
"endorsementFirstDiscountPeriod": 202611,
"endorsementSuccessCode": "BD",
"endorsementMessage": "Inclusão efetuada com sucesso"
}
Até então esses cinco dados eram gravados em additionalData do empréstimo, com as chaves dataprev_endorsement_*. Os contratos já averbados mantêm esses registros; nada os migra para a nova estrutura.
Validações
| Situação | Código |
|---|---|
Contrato já integrated | 1010002 |
Contrato com endorsementDate preenchida ou status = endorsement | 1010022 |
Averbação já em processamento (status = endorsement_processing) | 1010023 |
| Consignado privado sem provedor registrado para a processadora | 1010016 |
| Contrato sem a consulta de dados do trabalhador | 9503102 |
| Trabalhador inelegível para o consignado privado | 9503115 |
| Trabalhador bloqueado para empréstimo consignado | 9503116 |
| Falha de comunicação com a Dataprev | 9503101 |
| Dataprev não confirmou a averbação | 9503114 |
No consignado privado, 9503101 e 9503114 não voltam na resposta da chamada: são registrados depois, na nota do status do contrato ("Averbação recusada: ..."), junto com o evento loan.endorsement_failed. As demais validações continuam síncronas.
Exemplo de Requisição e Resposta
- Body
- cURL
- 200 - Sucesso
- 400 - Erro
- 401 - Não autorizado
- 403 - Proibido
Visualizar Body
{
"endorsementDate": "{{endorsementDate}}"
}
curl --request PUT \
--url '{{baseUrl}}/v5/loans/{{loanId}}/endorsements' \
--header 'X-Api-Key: {{x_api_key}}' \
--header 'Content-Type: application/json' \
--data '{
"endorsementDate": "{{endorsementDate}}"
}'
No consignado privado, o objeto volta com Resposta resumida — os demais campos seguem o exemplo completo do status = endorsement_processing; endorsementDate só é preenchida quando a Dataprev confirma, e o contrato passa a endorsement. Nos demais produtos, o objeto volta já com endorsementDate gravada e status = endorsement.Visualizar Response
201 de POST /v5/loans.
Não encontrado (1010001); já integrated (1010002); já averbado (1010022); averbação em processamento (1010023); ou exceção não tratada (9999999).Visualizar Response
API Key ausente, inválida ou expirada.
Usuário autenticado sem permissão de edição de empréstimos. Corpo vazio.
GET /v5/loan-private-payrolls/{loanId}/contract-information
Mostra o que será enviado à Dataprev antes do envio: os documentos e os dados da assinatura concluída do empréstimo. É o que a tela exibe ao clicar em Enviar contrato na aba Consignado Privado.
Autenticação: API Key. Exige permissão de consulta de empréstimos.
Parâmetros
Visualizar parâmetros
| Parâmetro | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
loanId | rota | string (uuid) | Sim | Identificador do empréstimo. |
signatureId | query | string (uuid) | Não | Assinatura a usar. Sem ele, vale a assinatura concluída mais recente do empréstimo. |
Origem dos dados
Nada é digitado: tudo sai da assinatura eletrônica concluída do empréstimo, do signatário que é o tomador.
| Enviado à Dataprev | Origem na assinatura |
|---|---|
Contrato (contratoEmprestimo) | Documento assinado da CCB |
| Registro biométrico facial | Selfie coletada pelo provedor |
| Documento oficial com foto (frente e verso) | Documento de identificação coletado pelo provedor. Quando não há verso, como na CNH, o mesmo arquivo vai como frente e verso, porque a Dataprev exige os dois (GA) |
| Data e hora da assinatura | Momento em que o tomador assinou a CCB |
| IP, latitude e longitude | Evidências de autenticidade da assinatura da CCB |
| Dispositivo | Identificação do dispositivo ou navegador registrada na assinatura |
Com selfie e documento com foto, a formalização enviada é documento oficial com foto. A Dataprev só aceita imagem na selfie e no documento com foto (recusa PDF com PV). Quando o provedor entrega o documento como PDF com a foto embutida, como a CNH da Unico, a imagem é extraída do PDF antes do envio. Dossiês de evidências e demais anexos da assinatura não são enviados, porque a Dataprev não tem campo para eles.
Resposta
| Campo | Tipo | Descrição |
|---|---|---|
signatureId | string (uuid) | Assinatura usada. |
signatureTitle | string | Título do envelope de assinatura. |
signatureProvider | object (code/key/name) | Provedor da assinatura. |
signatureCompletedAt | string (date-time) | null | Conclusão do envelope. |
signerName / signerDocumentNumber | string | Tomador que assinou. |
signedAt | string (date-time) | null | Momento da assinatura da CCB. |
signatureIp | string | null | IP da assinatura. |
latitude / longitude | number | null | Geolocalização da assinatura. |
device | string | null | Dispositivo da assinatura. |
formalization | object (code/key/name) | official_document quando há selfie e documento com foto; none quando faltam. |
documents[] | array | Documentos que serão enviados: documentId, role (papel do documento na assinatura), title, fileId, fileName, extension, size. |
{
"signatureId": "01a1232c-ee24-7c6c-be41-c5ba672bc029",
"signatureTitle": "Assinatura CT00000003",
"signerName": "RAFAEL CESAR SOUZA",
"signedAt": "2026-10-10T00:19:57.107Z",
"signatureIp": "2804:b54:2300:1bd3:a94d:fb4d:418e:ade5",
"latitude": -19.98440314,
"longitude": -44.05018599,
"device": null,
"formalization": { "code": 1, "key": "official_document", "name": "Documento oficial com foto e selfie" },
"documents": [
{ "role": { "code": 2, "key": "signed", "name": "Documento Assinado" }, "title": "Cédula de Crédito Bancário CT00000003 - Assinado", "fileName": "ccb-assinada.pdf" },
{ "role": { "code": 10, "key": "face_image", "name": "Imagem Facial" }, "title": "Selfie - RAFAEL CESAR SOUZA", "fileName": "selfie.jpg" },
{ "role": { "code": 11, "key": "document_front", "name": "Documento de Identificação - Frente" }, "title": "CNH - RAFAEL CESAR SOUZA", "fileName": "cnh.jpg" }
]
}
POST /v5/loan-private-payrolls/{loanId}/contract-information
Envia à Dataprev o contrato assinado (CCB) e as evidências da formalização de um consignado privado já averbado. Os documentos e dados são os mesmos mostrados pelo GET acima, tirados da assinatura concluída. O envio é manual, por esta rota ou pelo botão Enviar contrato da aba Consignado Privado.
Autenticação: API Key. Exige permissão de edição de empréstimos.
Payload de entrada
Visualizar parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
signatureId | string (uuid) | null | Não | Assinatura a usar. Sem ele, vale a assinatura concluída mais recente do empréstimo. |
Comportamento
- A API confere se o empréstimo está averbado (
endorsementStatus = endorsed), localiza a assinatura concluída e monta o pacote do envio. - Valida que a assinatura tem a CCB assinada, a data e o IP da assinatura e a selfie com o documento oficial com foto.
- Marca
contractInformationStatus = requested, enfileira o envio e responde200com o registro de consignado privado, sem aguardar a Dataprev. - Em segundo plano, envia à Dataprev o contrato, as imagens e as evidências, junto com CPF, matrícula, empregador e o número do contrato devolvido pela averbação. Falhas temporárias do provedor são repetidas automaticamente; quando a cota da Dataprev é excedida, o envio é adiado.
- Se a Dataprev aceitar,
contractInformationStatuspassa asent, comcontractInformationSentAte o código devolvido emcontractInformationSuccessCode, e o eventoprivate_payroll_loan.contract_information_sent(2050) é publicado. - Se a Dataprev recusar,
contractInformationStatuspassa aerror, o motivo fica emcontractInformationMessagee o eventoprivate_payroll_loan.contract_information_failed(2051) é publicado.
Enquanto o envio está em requested, uma nova chamada é recusada com 9503137. Depois de sent ou error, a rota pode ser chamada de novo para reenviar.
Resultado gravado
Gravado no registro de consignado privado do contrato, devolvido por esta rota:
| Campo | Tipo | Descrição |
|---|---|---|
contractInformationStatus | object (code/key/name) | pending (10), requested (20), sent (30) ou error (40). |
contractInformationSentAt | string (date-time) | null | Momento em que a Dataprev aceitou o envio. |
contractInformationSuccessCode | string | null | Código devolvido pela Dataprev no aceite. |
contractInformationMessage | string | null | Motivo da recusa, quando houver. |
Validações
| Situação | Código |
|---|---|
| Empréstimo sem registro de consignado privado | 1010025 |
| Empréstimo ainda não averbado na Dataprev | 9503131 |
| Nenhuma assinatura concluída para o empréstimo | 9503138 |
| Envio já em processamento | 9503137 |
| Assinatura sem a CCB assinada | 9503132 |
| Arquivo da CCB assinada não encontrado | 9503133 |
| Assinatura sem data e hora | 9503134 |
| Assinatura sem IP | 9503135 |
| Assinatura sem selfie e documento oficial com foto | 9503136 |
| Falha de comunicação ou recusa da Dataprev | 9503130 |
9503130 não volta na resposta da chamada: é registrado depois em contractInformationMessage, junto com o evento private_payroll_loan.contract_information_failed.
Exemplo de Requisição e Resposta
- Body
- cURL
- 200 - Sucesso
- 400 - Erro de validação
- 401 - Não autorizado
- 403 - Proibido
Visualizar Body
{
"signatureId": "01a1232c-ee24-7c6c-be41-c5ba672bc029"
}
curl --request POST \
--url 'https://{base-url}/v5/loan-private-payrolls/01a0c239-c330-7361-ad20-fbeb57e97322/contract-information' \
--header 'X-Api-Key: {api_key}' \
--header 'Content-Type: application/json' \
--data '{}'
Registro de consignado privado do empréstimo, com o envio enfileirado (resposta reduzida):
{
"endorsementStatus": { "code": 30, "key": "endorsed", "name": "Averbada" },
"endorsementContractNumber": "CT00000003",
"contractInformationStatus": { "code": 20, "key": "requested", "name": "Solicitado" },
"contractInformationSentAt": null,
"contractInformationSuccessCode": null,
"contractInformationMessage": null
}
{ "messages": [
{ "code": "9503138", "text": "Nenhuma assinatura concluída encontrada para o empréstimo" }
] }
API Key ausente, inválida ou expirada.
Usuário autenticado sem permissão de edição de empréstimos. Corpo vazio.
Desaverbação automática
No consignado privado, um contrato averbado e não desembolsado compromete a margem do trabalhador. Para liberar essa margem, a empresa pode configurar um prazo em dias: passado esse prazo desde a averbação sem que o dinheiro tenha sido pago, a plataforma exclui a averbação na Dataprev e cancela o contrato, sem nenhuma chamada do integrador.
A configuração fica no grupo de configurações da Dataprev (Crédito do Trabalhador) da empresa e é feita pela equipe da Semear:
| Configuração | Chave | Descrição |
|---|---|---|
| Dias sem Desembolso para Desaverbar | endorsement_exclusion_days | Prazo, em dias contados da averbação. Vazio ou zero desliga a desaverbação automática. |
| Motivo da Desaverbação Automática | endorsement_exclusion_reason | Motivo informado à Dataprev. Padrão: withdrawal. Ver LoanPrivatePayrollExclusionReason. |
Quem é elegível
Só contratos de consignado privado com a averbação confirmada (endorsementStatus = endorsed), com o contrato em status = endorsement ou awaiting_disbursement e sem comando de desembolso já validado ou concluído pelo pagador. Se o contrato mudar de situação antes do envio — por exemplo, o desembolso for validado pelo pagador — a exclusão termina com erro e o contrato segue normalmente. Uma exclusão que terminou com erro não é tentada de novo automaticamente.
Efeitos
- A exclusão é enviada à Dataprev em segundo plano, com as mesmas novas tentativas e o mesmo limite de chamadas das demais operações da Dataprev. Enquanto isso,
exclusionStatus = requested. - Confirmada pela Dataprev:
- o registro de consignado privado passa a
endorsementStatus = excluded, comexclusionStatus = sente os dados do retorno (ver tabela abaixo); - os comandos de desembolso abertos são cancelados;
- o contrato passa a
status = canceled, comstatus.note"Desaverbado automaticamente após N dia(s) sem desembolso"; - são publicados os eventos
private_payroll_loan.exclusion_completed(2052) eloan.canceled(1004).
- o registro de consignado privado passa a
- Recusada pela Dataprev, ou abandonada porque o contrato deixou de ser elegível:
exclusionStatus = error, o motivo fica emexclusionMessage, o contrato não é cancelado e o eventoprivate_payroll_loan.exclusion_failed(2053) é publicado.
Campos gravados no registro de consignado privado
| Campo | Tipo | Descrição |
|---|---|---|
exclusionReason | object (code/key/name) | Motivo informado à Dataprev. |
exclusionStatus | object (code/key/name) | requested (20), sent (30) ou error (40). |
excludedAt | string (date-time) | null | Momento em que a Dataprev confirmou a exclusão. |
exclusionPeriod | integer | null | Competência da exclusão devolvida pela Dataprev (AAAAMM). |
exclusionSuccessCode | string | null | Código devolvido pela Dataprev no aceite. |
exclusionMessage | string | null | Mensagem da Dataprev, ou o motivo da recusa. |
Trate o evento loan.canceled (ou private_payroll_loan.exclusion_completed) para retirar a proposta da sua esteira: depois da desaverbação, o contrato não pode mais ser desembolsado. Para manter um contrato vivo, desembolse antes do prazo configurado.
Observações
- Ordem averbação/desembolso: ver aviso em Ciclo de vida.
- Conta bancária: use
number,digitetype(checking_account/savings_account) emdisbursementBankAccount. - Endereço do tomador: use
postalCodeedistrictemborrower.address. - Modalidade de saque do FGTS: use
severance_withdrawaloubirthday_withdrawal. Outros valores (comoseverance-withdrawal, com hífen) não são reconhecidos e são ignorados. - Tipo de pessoa: o tomador do consignado privado é sempre gravado como pessoa física (
natural_person).