APP Integration
Summary
This guide describes how to issue a debt (credit operation) for a natural person through the BNPL / e-commerce flow using the POST /signed_debt endpoint.
This flow supports QR Code payments, allowing you to collect the required disbursement information directly from the QR Code, including the beneficiary's document number, account number, account digit, branch number, and the disbursement amount.
A natural-person issuance represents a standard loan. In this scenario:
- The
financial.disbursed_amountfield specifies the principal amount to be disbursed to the borrower. It must equal the amount registered in the Pix QR Code informed indisbursement_bank_accounts. borrower.person_typemust be set tonatural.- The
refinanced_credit_operationsfield must not be provided.
The structure of the borrower, additional_data.contract (opt-in signatures), disbursement_bank_accounts, and the remaining request objects is described in the following sections.
The cash payout (financial.disbursed_amount) must be equal to the amount registered in the Pix QR Code. Decode the QR Code first using POST /pix/decode_qrcode_payload (step 1) to retrieve the amount, then use that value as disbursed_amount on the debt issuance.
1. QR Code decoding
Request
Request Body
{
"qr_code_type": "dynamic_instant",
"qr_code_payload": "00020101021226850014br.gov.bcb.pix2563qrcodepix.bb.com.br/pix/v2/d373e385-dfe7-49f6-b9ec-14ba60a9b8285204000053039865802BR5925TESTE62070503***63047B7D",
"pix_key": "teste.cobrancapix@gmail.com.br",
"receiver_conciliation_id": "fgnb4NTt7pOUBGfrcporERwVVqr0f8PWRfK",
"amount": "9367.61",
"status": "ATIVA"
}
Response Body
| Field | Type | Description | Available |
|---|---|---|---|
qr_code_type | string | QR Code type: static, dynamic_instant, or dynamic_term. | All |
qr_code_payload | string | Original EMV payload received in the request. | All |
pix_key | string | Recipient's Pix key extracted from the QR Code payload. | All |
transfer_amount | string | Transfer amount, when specified in the QR Code. | static |
additional_data | string | Additional data contained in the static QR Code. | static |
receiver_conciliation_id | string | Recipient's reconciliation identifier (txid). | dynamic_* |
amount | string | Original charge amount. | dynamic_* |
status | string | Status of the dynamic charge. | dynamic_* |
For dynamic QR Codes, the QR Code status is returned according to the enumeration table below.
Errors
QR Code with invalid format
{
"data": "{\"title\": \"Invalid Qr Code Format\", \"description\": \"The Qr Code format is invalid, please enter a valid Qr Code\", \"translation\": \"O formato do Qr Code é inválido, por favor insira um Qr Code válido\", \"extra_fields\": {}, \"code\": \"PXT000070\"}"
}
QR Code type not identified in payload
{
"data": "{\"title\": \"Invalid Qr Code Type\", \"description\": \"The Qr Code payload given did not provide a propper Qr Code type\", \"translation\": \"O payload de QR Code fornecido não contêm um tipo de Qr Code Válido\", \"extra_fields\": {}, \"code\": \"PXT000071\"}"
}
Error requesting QR Code payload from the registry institution
{
"data": "{\"title\": \"Error in Qr Code Payload Request\", \"description\": \"An error occurred while requesting the qr code payload to the registry institution\", \"translation\": \"Um erro ocorreu durante a requisição do payload do qr code para a instituição de registro\", \"extra_fields\": {}, \"code\": \"PXT000069\"}"
}
2. Debt issuance
Request
Request Body
{
"additional_data": {
"contract": {
"contract_number": null,
"signed": true,
"signatures": [
{
"signer": {
"name": "Alan Mathison Turing",
"phone": {
"number": "912345678",
"area_code": "11",
"country_code": "055"
},
"email": "alan.turing@email.com",
"document_number": "96969879003"
},
"signature": {
"ip_address": "168.211.22.84",
"timestamp": "27-10-2025 11:07:15",
"signature_file": {
"file_url": "http://qitech.com.br/signature.pdf",
"file_type": "pdf"
},
"geolocation": {
"long": "-46.63611",
"lat": "-23.5475"
},
"fingerprint_device": null
}
}
]
}
},
"financial": {
"number_of_installments": 2,
"credit_operation_type": "ccb",
"interest_type": "pre_price_days",
"monthly_interest_rate": 0.07,
"disbursed_amount": 150000,
"fine_configuration": {
"contract_fine_rate": 0.02,
"monthly_rate": 0.15,
"interest_base": "calendar_days"
},
"interest_grace_period": 0,
"disbursement_date": "2026-04-11",
"first_due_date": "2026-05-10",
"principal_grace_period": 0
},
"purchaser_document_number": "32402502000135",
"requester_identifier_key": "40822732-c4ce-41fb-9ee5-5e0304cd04a7",
"document_template_key": "518a0b57-2ce3-4309-94e5-6a95bc056d12",
"borrower": {
"email": "alan.turing@email.com",
"document_identification": "494598fd-c226-4332-a500-591ae3884673",
"document_identification_back": "494598fd-c226-4332-a500-591ae3884673",
"birth_date": "1998-06-03",
"person_type": "natural",
"is_pep": false,
"mother_name": "Mother's full name",
"profession": "Public server",
"individual_document_number": "82744088021",
"address": {
"city": "São Paulo",
"neighborhood": "CENTRO",
"street": "Avenida Feliz",
"complement": "",
"postal_code": "49026100",
"state": "SP",
"number": ""
},
"phone": {
"country_code": "055",
"number": "912345678",
"area_code": "11"
},
"document_identification_number": "47003534819",
"name": "Alan Mathison Turing"
},
"disbursement_bank_accounts": [
{
"qr_code_url": "00020126930014br.gov.bcb.pix2571qrcode-h.sandbox.qitech.app/bacen/cobv/3fecc731adf542659b84be038ec4151e5204000053039865802BR5925LogcardMeiosDePagamentoLt6008SaoPaulo61080145200062070503***6304A936"
}
]
}
Natural-person issuance uses borrower.person_type: "natural" and an individual_document_number (CPF). financial.disbursed_amount must equal the amount registered in the Pix QR Code sent inside disbursement_bank_accounts — decode the QR Code first via POST /pix/decode_qrcode_payload. Omit refinanced_credit_operations (those are only used when settling existing operations in a refinancing).
Body parameters
| Field | Type | Description | Max chars |
|---|---|---|---|
additional_data * | object | Contract metadata and signature evidence under additional_data.contract (contract number, signed flag, signatures[] with signer and evidence). | - |
borrower * | object | Borrower object — Natural person taking out the credit operation. | - |
disbursement_bank_accounts * | array | Disbursement bank accounts — array containing the QR Code that receives the disbursement (single item in this flow). | - |
financial * | object | Financial object — Financial terms; use disbursed_amount for the cash payout to the borrower. | - |
purchaser_document_number * | string | Assignee (purchaser) CNPJ (digits only, no formatting). | - |
requester_identifier_key | string | Client tracking key for the request. | 50 |
document_template_key | string | Key of the contract template to be used for the operation. | UUID |
Borrower object
| Field | Type | Description | Max chars |
|---|---|---|---|
name * | string | Borrower full name | 100 |
email | string | Borrower email | 254 |
phone | object | Phone object — Contact phone | - |
is_pep * | boolean | PEP indicator (http://www.portaldatransparencia.gov.br/download-de-dados/pep) | - |
address * | object | Address object — Borrower address | - |
role_type | enum | Borrower role in the contract. Default: issuer. | - |
birth_date * | date | Borrower birth date (YYYY-MM-DD) | - |
mother_name * | string | Mother's full name | 100 |
nationality | string | Nationality | 50 |
profession | string | Borrower profession | 100 |
person_type * | string | Person type — must be natural for individuals | - |
individual_document_number * | string | Borrower CPF (digits only) | 11 |
document_identification * | string | DOCUMENT_KEY of the borrower's photo ID PDF (RG or CNH), uploaded beforehand | UUID |
document_identification_back | string | DOCUMENT_KEY of the back of the photo ID (uploaded beforehand) | UUID |
document_identification_number | string | Borrower ID document number (RG or CNH), digits only | 20 |
Address object
| Field | Type | Description | Max chars |
|---|---|---|---|
city * | string | City | 100 |
state * | string | State (two uppercase letters) | 2 |
number * | string | Street number | 10 |
street * | string | Street name | 100 |
complement * | string | Address complement (free text) | 100 |
postal_code * | string | Postal code (https://www.buscacep.correios.com.br/) | 8 |
neighborhood * | string | Neighborhood | 100 |
Phone object
| Field | Type | Description | Max chars |
|---|---|---|---|
number * | string | Phone number | 10 |
area_code * | string | Area code (https://ddd.guiamais.com.br/) | 2 |
country_code * | string | Country code (https://ddi.guiamais.com.br/) | 3 |
Disbursement bank accounts
In this flow, the disbursement is settled by paying the dynamic Pix QR Code provided by the merchant. Instead of sending the beneficiary bank coordinates, send the QR Code payload inside disbursement_bank_accounts — QI Tech decodes it and routes the disbursement to the QR Code owner.
disbursement_bank_accounts is an array with a single item containing only the QR Code payload:
| Field | Type | Description | Max chars |
|---|---|---|---|
qr_code_url * | string | EMV payload of the dynamic Pix QR Code to be paid. | 250 |
The amount registered in the QR Code must match financial.disbursed_amount. Decode the QR Code with POST /pix/decode_qrcode_payload (step 1) to retrieve the amount, then use that value as disbursed_amount on the debt issuance.
Financial object
The financial object describes the credit operation's financial terms.
| Field | Type | Description | Max chars |
|---|---|---|---|
disbursed_amount * | float | Cash payout disbursed to the borrower (principal of the credit operation) | - |
interest_type | enum | Interest type — Amortization and interest calculation | - |
credit_operation_type | enum | Credit operation type — Agreement type | - |
monthly_interest_rate | float | Monthly prefixed interest rate as a decimal | - |
disbursement_date | date | Disbursement date (YYYY-MM-DD) | - |
first_due_date | date | First installment due date (YYYY-MM-DD) | - |
interest_grace_period | int | Interest grace period (months) | - |
principal_grace_period | int | Principal grace period | - |
number_of_installments | int | Number of installments | - |
fine_configuration | object | Fine configuration — Late interest and penalty | - |
Fine configuration object
Fine configuration defines late penalty and interest for the credit operation.
| Field | Type | Description | Max chars |
|---|---|---|---|
contract_fine_rate | float | Late penalty rate | - |
interest_base | enum | Interest base — Interest calculation basis | - |
monthly_rate | float | Monthly late interest rate | - |
Enumerators
Person type
| Value | Description |
|---|---|
natural | Natural person |
legal | Legal entity |
Account type
| Value | Description |
|---|---|
checking_account | Checking account |
deposit_account | Deposit account |
guaranteed_account | Guaranteed account |
investment_account | Investment account |
payment_account | Payment account |
saving_account | Savings account |
salary_account | Salary account |
Interest type
| Value | Description |
|---|---|
pre_price_days | Price method (equal installments) with daily prefixed interest |
pre_price | Price method (equal installments) with prefixed interest in fixed 30-day periods |
pre_sac | SAC (constant amortization) with daily prefixed interest |
post_sac | SAC with prefixed rate plus post-fixed index (CDI, IPCA, or IGP-M), daily |
post_price | Price method with prefixed rate plus post-fixed index in fixed 30-day periods |
post_price_days | Price method with prefixed rate plus post-fixed index, daily |
Credit operation type
| Value | Description |
|---|---|
ccb | Bank credit note (Cédula de Crédito Bancário) |
cce | Export credit note (Cédula de Crédito à Exportação) |
nce | Export credit note (Nota de Crédito à Exportação) |
For the BNPL / e-commerce flow, ccb is the value used in practice.
Interest base
| Value | Description |
|---|---|
workdays | Business days, 252-day year |
calendar_days | Calendar days, 360-day year |
calendar_days_365 | Calendar days, 365-day year |
Response (HTTP 200)
The synchronous response echoes the request body with fields completed by the platform (for example contract.contract_number and requester_identifier_key).
Response Body
{
"additional_data": {
"contract": {
"contract_number": "TEST7886216399",
"signed": true,
"signatures": [
{
"signer": {
"name": "Alan Mathison Turing",
"phone": { "number": "912345678", "area_code": "11", "country_code": "055" },
"email": "alan.turing@email.com",
"document_number": "96969879003"
},
"signature": {
"ip_address": "168.211.22.84",
"timestamp": "27-10-2025 11:07:15",
"signature_file": { "file_url": "http://qitech.com.br/signature.pdf", "file_type": "pdf" },
"geolocation": { "long": "-46.63611", "lat": "-23.5475" },
"fingerprint_device": null
}
}
]
}
},
"financial": {
"number_of_installments": 2,
"credit_operation_type": "ccb",
"interest_type": "pre_price_days",
"monthly_interest_rate": 0.07,
"disbursed_amount": 150000,
"fine_configuration": { "contract_fine_rate": 0.02, "monthly_rate": 0.15, "interest_base": "calendar_days" },
"interest_grace_period": 0,
"disbursement_date": "2026-04-11",
"first_due_date": "2026-05-10",
"principal_grace_period": 0
},
"purchaser_document_number": "32402502000135",
"requester_identifier_key": "40822732-c4ce-41fb-9ee5-5e0304cd04a7",
"document_template_key": "518a0b57-2ce3-4309-94e5-6a95bc056d12",
"borrower": {
"email": "alan.turing@email.com",
"document_identification": "494598fd-c226-4332-a500-591ae3884673",
"document_identification_back": "494598fd-c226-4332-a500-591ae3884673",
"birth_date": "1998-06-03",
"person_type": "natural",
"is_pep": false,
"mother_name": "Mother's full name",
"profession": "Public server",
"individual_document_number": "82744088021",
"address": { "city": "São Paulo", "neighborhood": "CENTRO", "street": "Avenida Feliz", "complement": "", "postal_code": "49026100", "state": "SP", "number": "" },
"phone": { "country_code": "055", "number": "912345678", "area_code": "11" },
"document_identification_number": "47003534819",
"name": "Alan Mathison Turing"
},
"disbursement_bank_accounts": [
{
"qr_code_url": "00020126930014br.gov.bcb.pix2571qrcode-h.sandbox.qitech.app/bacen/cobv/3fecc731adf542659b84be038ec4151e5204000053039865802BR5925LogcardMeiosDePagamentoLt6008SaoPaulo61080145200062070503***6304A936"
}
]
}
Webhook (webhook_type: debt)
Once the operation is processed, QI Tech notifies your endpoint with the consolidated debt data, including the issued amount, IOF breakdown, prefixed interest rate, and installment schedule.
Webhook Body
{
"webhook_type": "debt",
"key": "4e1ed268-9f29-44ce-9991-3bdf036aeacd",
"status": "waiting_disbursement",
"event_datetime": "2026-04-14 03:38:14",
"data": {
"borrower": {
"name": "Alan Mathison Turing",
"document_number": "82744088021",
"related_party_key": "71b28fde-5d75-48b4-9c3f-ee531dccac66"
},
"contract": {
"document_key": null,
"number": "TEST7886216399",
"urls": [],
"signature_information": [
{
"signer_name": "Alan Mathison Turing",
"signer_document_number": "82744088021",
"signer_role": "issuer",
"signer_email": null,
"signer_external_key": null,
"signature_url": null
}
]
},
"requester_identifier_key": "40822732-c4ce-41fb-9ee5-5e0304cd04a7",
"iof_charge_method": "financed",
"collaterals": [],
"contract_fees": [ { "fee_type": "spread", "fee_amount": 453.39 } ],
"external_contract_fees": [ { "fee_type": "tac", "fee_amount": 0, "tax_amount": 0, "net_fee_amount": 0 } ],
"external_contract_fee_amount": 0,
"net_external_contract_fee_amount": 0,
"contract_fee_amount": 453.39,
"issue_amount": 151131.6,
"assignment_amount": 151584.99,
"cet": "7,6600%",
"annual_cet": "142,4473%",
"number_of_installments": 2,
"base_iof": 557.3,
"additional_iof": 574.3,
"total_iof": 1131.6,
"ipoc_code": "324025020203182744088021TEST7886216399",
"prefixed_interest_rate": {
"annual_rate": 1.252191589,
"created_at": "2026-04-14T03:38:10",
"daily_rate": 0.0022578334,
"interest_base": "calendar_days",
"monthly_rate": 0.07
},
"installments": [
{
"business_due_date": "2026-05-11",
"calendar_days": 29,
"due_date": "2026-05-10",
"due_interest": 0,
"due_principal": 151131.6,
"has_interest": true,
"installment_key": "c00dbecc-efb9-4384-8db3-dadba82f2d70",
"installment_number": 1,
"installment_status": "created",
"installment_type": "principal",
"pre_fixed_amount": 10214.91484159,
"principal_amortization_amount": 73277.28515841,
"tax_amount": 174.25338411,
"total_amount": 83492.2,
"workdays": 18
},
{
"business_due_date": "2026-06-10",
"calendar_days": 31,
"due_date": "2026-06-10",
"due_interest": 0,
"due_principal": 77854.31484159,
"has_interest": true,
"installment_key": "d3a2f42d-80cb-4891-b2be-ce80ffd383b2",
"installment_number": 2,
"installment_status": "created",
"installment_type": "principal",
"pre_fixed_amount": 5637.88515841,
"principal_amortization_amount": 77854.31484159,
"tax_amount": 383.04322902,
"total_amount": 83492.2,
"workdays": 22
}
],
"total_pre_fixed_amount": 15852.8
}
}
3. Debt inquiry
You can query the debt later to retrieve information or track its current status.
Request
Path params
| Field | Type | Description | Max chars |
|---|---|---|---|
requester_identifier_key * | string | Client tracking key sent on debt issuance | 50 |
If you have the credit_operation_key (UUID) instead, use GET /v2/credit_operation/{credit_operation_key}.
Response
Response Body
{
"credit_operation_key": "0773a1b1-675a-4a10-80a2-a10308c7281e",
"issue_amount": 151131.6,
"origin_key": "0773a1b1-675a-4a10-80a2-a10308c7281e",
"total_iof": 1131.6,
"assigned_at": null,
"disbursement_start_date": "2026-04-11",
"disbursement_end_date": "2026-04-11",
"issue_date": "2026-04-11",
"requester_identifier_key": "40822732-c4ce-41fb-9ee5-5e0304cd04a7",
"installments": [
{
"due_date": "2026-05-10",
"calendar_days": 29,
"due_principal": 151131.6,
"has_interest": true,
"installment_key": "c00dbecc-efb9-4384-8db3-dadba82f2d70",
"installment_number": 1,
"installment_status": "created",
"installment_type": "principal",
"pre_fixed_amount": 10214.91484159,
"principal_amortization_amount": 73277.28515841,
"tax_amount": 174.25338411,
"total_amount": 83492.2
}
]
}
4. Technical specifications and enums
Installments object
| Field | Type | Description |
|---|---|---|
calendar_days | integer | Number of calendar days between installments |
due_date | string | Installment due date in calendar days |
due_principal | float | Remaining principal on the installment due date before its payment |
has_interest | boolean | If true, interest applies to the installment |
installment_number | integer | Installment number |
pre_fixed_amount | float | Fixed interest amount paid on the installment |
principal_amortization_amount | float | Principal amount paid on the installment |
tax_amount | float | Base IOF amount of installment |
total_amount | float | Installment total value |
due_interest | float | Remaining interest after the installment due date before its payment |
workdays | integer | Business days between installments |
Interest rate object
| Field | Description |
|---|---|
annual_rate | Annual fixed/floating interest rate expressed as a decimal |
daily_rate | Daily fixed/floating interest rate expressed as a decimal |
interest_base | Interest base — Interest calculation basis |
monthly_rate | Monthly fixed/floating interest rate expressed as a decimal |
Tax configuration object
| Field | Description |
|---|---|
base_rate | Base IOF rate value |
additional_rate | Additional IOF rate value |
Refund Flow
This guide explains how to process full and partial refunds for credit operations originated through the BNPL / e-commerce flow using the POST /signed_debt endpoint.
The refund flow consists of two major steps:
- Chargeback notification — a webhook is sent whenever a chargeback is processed, regardless of whether it represents a full or partial refund. The webhook contains all the information required to identify and process the chargeback.
- Renegotiation — after successfully processing the webhook, you may initiate a renegotiation to generate a new installment schedule that reflects the refunded amount. The renegotiation terms are fully configurable and should follow your business rules and policies.
Webhook — Refund received
Overview
As soon as an identified refund is received, QI Tech will send a webhook containing the refund details, including whether it is a full or partial refund and the amount credited to the FIDC account.
Based on this information, you can apply your business policies and determine how to proceed with the refund requested by your customer.
Webhook Body
{
"origin_key": "d5c88545-4d17-4679-b262-ae170618078a",
"refund_date": "2026-06-26",
"webhook_type": "laas.transitory_conciliation.refund",
"amount": "200.00",
"event_datetime": "2026-06-12T11:52:22"
}
Renegotiation — Simulation
Overview
Before creating a proposal, you can simulate the refund values for the operation. The simulation returns the affected installments, the present value of the discount and the total amount.
The refund flow uses two amortization types:
equal_amount— partial refund. Distributespayment_amountacross the open installments, reducing the outstanding balance. The operation stays active with remaining installments still open.full_settle— full refund. Fully settles the operation on thereference_date. The operation moves tosettledand no installments remain.
Request
Request Body
- equal_amount (partial)
- full_settle (total)
{
"debt_key": "72760166-4ddf-41fb-8a8c-605f8f4fc35c",
"amortization_type": "equal_amount",
"reference_date": "2026-04-13",
"payment_amount": 50.00
}
{
"debt_key": "72760166-4ddf-41fb-8a8c-605f8f4fc35c",
"amortization_type": "full_settle",
"reference_date": "2026-04-13",
"payment_amount": 1043.55
}
Body parameters
| Field | Type | Description | Max length |
|---|---|---|---|
debt_key * | string | Unique credit operation key (DEBT-KEY) | UUID |
amortization_type * | string | Refund modality | Amortization type values |
payment_amount * | float | Refund amount in BRL. In equal_amount, the partial amount to be amortized. In full_settle, must cover the total outstanding balance on the reference_date. | 15,2 |
reference_date | string | Reference date used to compute the present value (YYYY-MM-DD). Cannot be earlier than the disbursement date. | 10 |
discount_percentage | float | Optional discount percentage over the present value. Cannot be sent together with discount_amount. | - |
discount_amount | float | Optional discount amount over the present value. Cannot be sent together with discount_percentage. | - |
Amortization type values
| Value | Description |
|---|---|
equal_amount | Partial refund. payment_amount is distributed proportionally across the open installments; the operation remains active with remaining installments open. |
full_settle | Full refund. Fully settles the operation on the reference_date. The operation moves to settled and no installments remain. |