Create quote
Prices a selection of products and coverages for a customer. The quote is a calculator: nothing is persisted and no resource is created. The order uses exactly the same products[] list and is re-priced with the same engine at submission.
Quote and order both run against the current configuration — there is no quote token, no rate snapshot and no validity window. If the rate or the product configuration changes between the quote and the submission, the price changes: the price calculated at order submission is the one that counts.
A quote can combine multiple products, each insuring its own risk object. The typical case: a car sold with financing produces an order with the credit life product (risk object = the credit operation) and the auto product (risk object = the vehicle).
Request
For off-the-shelf products — sold as-is, with your integration's default coverages and default commission — the product entry only needs product_key, term and risk_object. This is the ideal scenario for partners selling fixed products, with no customization:
{
"products": [
{
"product_key": "9d1f8c7a-3b21-4e60-8a2f-1c5d7e9b0a44",
"term": {
"start_date": "2026-07-16",
"end_date": "2028-07-15"
},
"risk_object": {
"type": "credit_operation",
"insurable_value": 50000.00,
"attributes": {
"installment_amount": 1050.00,
"number_of_installments": 48
}
}
}
],
"customer": {
"date_of_birth": "1987-03-22",
"occupation_code": "211205"
}
}
With services omitted, every coverage with a default configuration for your integration is filled in automatically; with commission_data omitted, the default_rate of the product's commission_bounds band applies.
To customize the selection — choosing coverages, insured amount, deductible, waiting period or the commission — send services and commission_data explicitly:
{
"products": [
{
"product_key": "9d1f8c7a-3b21-4e60-8a2f-1c5d7e9b0a44",
"commission_data": {
"commission_type": "percentage_of_gross_premium",
"value": 0.1000
},
"term": {
"start_date": "2026-07-16",
"end_date": "2028-07-15"
},
"services": [
{
"service_key": "0a3c5e7f-2b4d-4a6c-8e0f-1a3b5c7d9e2f",
"insured_amount_basis": "monetary_amount",
"insured_amount": 50000.00
}
],
"risk_object": {
"type": "credit_operation",
"insurable_value": 50000.00,
"attributes": {
"installment_amount": 1050.00,
"number_of_installments": 48
}
}
}
],
"customer": {
"date_of_birth": "1987-03-22",
"occupation_code": "211205"
}
}
Request attributes
| Field | Type | Required | Description |
|---|---|---|---|
products | array | required | The product selection to price, a top-level field of the request — the same format used by the order. One entry per product. |
customer | object | optional | Insured person's data used in pricing and in the eligibility evaluation, as a flat object (no wrapper). When omitted, eligibility is not evaluated (eligibility returns not_evaluated) — and products whose rate depends on customer data are rejected with NOT_PRICEABLE. |
Object in products
| Field | Type | Required | Description |
|---|---|---|---|
product_key | string | required | Product key from the catalog. |
commission_data | object | optional | The desired commission form (see below). When omitted, the default_rate of the product's commission_bounds band applies. |
term | object | required | The product's term, in absolute dates: { "start_date": "YYYY-MM-DD", "end_date": "YYYY-MM-DD" }. Required on every entry — there is no duration form and no selection-level default term. Products in the same order may have different terms. |
services | array | optional | Explicit coverages. When omitted or empty, every coverage with a default configuration for your integration is filled in automatically. |
risk_object | object | conditional | The object this product insures. Required for valued-risk products (credit_operation, vehicle); omitted when the subject of the insurance is the person (person). |
commission_data object
| Field | Type | Required | Description |
|---|---|---|---|
commission_type | string | required | percentage_of_gross_premium (rate over the gross premium), monetary_amount (fixed commission in BRL, target value) or total_gross_premium_amount (desired final price to the customer, target value). The three forms are mutually exclusive. |
value | number | required | The value of the chosen form: a rate with 4 places (e.g. 0.1000), an amount in BRL (e.g. 61.73) or a total price (e.g. 650.00). |
In any form, the resulting effective rate is validated against the product's commission_bounds band — a violation rejects the line with OUT_OF_BOUNDS_COMMISSION. In the value-based forms (monetary_amount, total_gross_premium_amount), the value is a target: the realized amount may vary by cents due to rounding.
Object in services
| Field | Type | Required | Description |
|---|---|---|---|
service_key | string | required | Coverage key from the catalog. It is the only required field of the item: omit the rest and your default configuration for the coverage applies. |
insured_amount_basis | string | conditional | Insured amount basis: monetary_amount, percentage_of_risk_value or unit_amount_times_count. Stating the basis makes its matching value field required. |
insured_amount | number | conditional | Insured amount in BRL. Required when the basis is monetary_amount. |
insured_amount_percentage | number | conditional | Percentage of the risk object's value, in (0, 1] (1.0000 = 100%). Required when the basis is percentage_of_risk_value; resolved against the line's risk object insurable_value. |
unit_amount | number | conditional | Amount per indemnity unit (e.g. BRL 100 per daily benefit). Required, together with unit_count, when the basis is unit_amount_times_count. It must belong to the coverage's indemnity_unit_options envelope. |
unit_count | integer | conditional | Number of indemnity units (e.g. 60 dailies). Required, together with unit_amount, when the basis is unit_amount_times_count. |
deductible_data | object | optional | Deductible, in the typed shape { "deductible_type": "monetary_amount", "value": 1500.00 }. The deductible_type must match the coverage's deductible_options envelope, and the value must belong to the option space. |
waiting_period_days | integer | optional | Waiting period in days, within the coverage's waiting_period_options. |
risk_object object
| Field | Type | Required | Description |
|---|---|---|---|
type | string | required | Risk object type: credit_operation, vehicle or person. |
insurable_value | number | conditional | Value of the risk object. Required for credit_operation and vehicle; not applicable to person. Caps the insured amount of the coverages tied to the risk value — coverages with a stipulated limit respect only their own maximum_insured_amount. |
attributes | object | optional | Risk object attributes used in pricing, specific per line of business (e.g. for a credit operation, installment_amount and number_of_installments). |
customer object
The object is flat — there is no data wrapper.
| Field | Type | Required | Description |
|---|---|---|---|
document_number | string | optional | Insured person's CPF or CNPJ. |
name | string | optional | Full name. |
email | string | optional | Email. |
phone_number | string | optional | Phone number in E.164 format. |
date_of_birth | string | optional | The insured person's date of birth, as YYYY-MM-DD. The age used in pricing and in the eligibility rules (e.g. maximum age at end of term) is derived from it on every call — there is no age field. |
occupation_code | string | optional | Insured person's occupation code (CBO). |
address | object | optional | The insured person's address, in the same shape used on the order. |
Response
{
"total_order_amount": 617.28,
"products": [
{
"product_key": "9d1f8c7a-3b21-4e60-8a2f-1c5d7e9b0a44",
"name": "Prestamista Master",
"provider_name": "QI Seguradora",
"product_category": "insurance",
"insurance_class": {
"name": "credit_life",
"class_number": "0977",
"group_number": "09"
},
"contract_instrument_type": "ticket",
"regulator_registration": "15414.900388/2015-21",
"result": "priced",
"term": {
"start_date": "2026-07-16",
"end_date": "2028-07-15"
},
"gross_premium_amount": 617.28,
"iof_amount": 2.35,
"net_premium_amount": 614.93,
"services": [
{
"service_key": "0a3c5e7f-2b4d-4a6c-8e0f-1a3b5c7d9e2f",
"service_type": {
"code": "credit_life",
"name": "Prestamista (Credit Life)"
},
"service_category": "insurance",
"regulator_registration": null,
"insured_amount": 50000.00,
"unit_amount": null,
"unit_count": null,
"deductible_data": {
"deductible_type": "monetary_amount",
"value": 1500.00
},
"waiting_period_days": 30,
"service_attributes": {},
"gross_premium_amount": 617.28
}
]
}
],
"eligibility": "eligible"
}
Response attributes
| Field | Type | Description |
|---|---|---|
total_order_amount | number | Sum of the gross premiums of the priced (priced) products, IOF-inclusive. |
products | array | Result per product. Each line is evaluated independently: a rejected product never poisons its siblings in the quote (in the order, any rejected line makes the whole order start as rejected). |
eligibility | string | Eligibility verdict of the quote: eligible, declined (some eligibility rule failed) or not_evaluated (customer was not sent — not an approval). |
Object in products
| Field | Type | Description |
|---|---|---|
product_key | string | Key of the evaluated product. |
name / provider_name | string | Commercial name of the product and of the insurer. |
product_category | string | Product category: insurance, capitalization or benefit. |
insurance_class | object | Insurance line of business: { name, class_number, group_number }. null for non-insurance products. |
regulator_registration | string | Registration of the product with the regulator. |
contract_instrument_type | string | The product's contract instrument: ticket or policy. Echoed here so you learn the instrument — and therefore which acceptance methods are legal — before collecting acceptance on the order. |
result | string | priced or rejected. Present on every line. |
term | object | The term you submitted, echoed back. Present when priced. |
gross_premium_amount | number | Gross premium of the product, with IOF — the exact sum of the coverage premiums. Present when priced. |
iof_amount | number | IOF of the product. Present when priced. |
net_premium_amount | number | Net premium of the product, without IOF. Present when priced. |
services | array | Priced coverages, each with its premium. Present when priced. |
decline_reasons | array | Rejection reasons, one { code, detail } entry per underlying failure — two coverages of the same line breaching their option spaces produce two entries under the same code. Present only when rejected. |
Object in services
| Field | Type | Description |
|---|---|---|
service_key | string | Coverage key. |
service_type | object | Coverage type: { code, name }. |
service_category | string | Coverage category: insurance, capitalization or benefit. |
regulator_registration | string | The coverage's own SUSEP registration. null when the coverage inherits the product's. |
insured_amount | number | Resolved insured amount — the percentage already applied over the risk object's value, the per-unit pair already multiplied out. You never recompute it. |
unit_amount | number | Amount per indemnity unit. null when the coverage is not unit-priced. |
unit_count | integer | Number of indemnity units. null when the coverage is not unit-priced. |
deductible_data | object | Applied deductible: { deductible_type, value }. null when the coverage has no deductible. |
waiting_period_days | integer | Applied waiting period, in days. null when the coverage has no waiting period — which is not the same as a 0-day one. |
service_attributes | object | Fixed coverage attributes, echoed from the catalog. |
gross_premium_amount | number | Gross premium of the coverage, rounded to 2 places. |
Rejection reasons
When result is rejected, the line carries only product_key, result and decline_reasons — nothing is being offered, so nothing is described: no name, no classification, no term, no premiums and no services. Always branch on result, never on which fields happen to be present.
Evaluation happens in stages (structure → pricing → eligibility): the returned reasons always belong to the same stage — the first one to fail — collected in full.
{
"product_key": "9d1f8c7a-3b21-4e60-8a2f-1c5d7e9b0a44",
"result": "rejected",
"decline_reasons": [
{
"code": "OUT_OF_OPTION_SPACE",
"detail": "deductible 2000.00 is not in the option list for coverage credit_life"
}
]
}
| Code | Meaning |
|---|---|
NOT_ENTITLED | Your integration is not enabled to sell this product. |
INACTIVE_PRODUCT | The product is inactive (or the key is unknown). |
INACTIVE_SERVICE | A selected coverage is inactive. |
UNKNOWN_SERVICE | A service_key does not belong to this product. |
MISSING_MANDATORY_SERVICE | The selection omits a mandatory coverage of the product. |
DEPENDENCY_VIOLATION | The selection violates the coverage dependencies (include/exclude). |
OUT_OF_OPTION_SPACE | Insured amount, deductible or waiting period outside the coverage's option space — including a type that diverges from the envelope, a value outside the list/range/step, or a value sent for a coverage with no deductible/waiting period (null envelope). |
INVALID_INSURED_AMOUNT_BASIS | The insured amount basis is not compatible with the line — e.g. a coverage tied to the risk value on a line without insurable_value. Applies to any basis. |
NOT_PRICEABLE | The engine could not produce a price: a rating input is not resolvable (e.g. the rate depends on customer data and it was not sent). |
ZERO_PREMIUM | The whole line priced at zero cost. A single free coverage is valid (it comes out with gross_premium_amount: 0.00); the whole line at zero is rejected. |
INELIGIBLE | An eligibility rule failed (e.g. maximum age at maturity). The entry's detail names the rule and the values that failed it. |
OUT_OF_BOUNDS_COMMISSION | The effective commission derived from commission_data is outside the product's commission_bounds band. |
DELEGATED_UNSUPPORTED | Product with pricing delegated to the insurer — reserved, not yet supported. |
STALE_DEFAULT | A default configuration of your integration points to a coverage that is no longer active — contact support to update the default. |
Possible errors
Every error (non-2xx) returns the standard body { "title", "description", "translation", "code" } — treat only the code field programmatically.
| Status | Code | Description |
|---|---|---|
400 | QIT000001 | Malformed request: invalid schema, empty products, product without term, insured amount basis without its corresponding value field, insurable_value missing for credit_operation/vehicle, structurally malformed deductible_data, a customer.date_of_birth outside the calendar or in the future. |
401 / 403 | — | Authentication or authorization failure. |
429 | — | Request rate limit exceeded — retry with backoff. |
503 | — | Pricing engine unavailable — the quote fails fast, with no cached price. Retry the call. |