Skip to main content

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.

The quote is indicative

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

ENDPOINT
/v1/insurance/quote
METHOD
POST

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:

Request Body — off-the-shelf product
{
"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:

Request Body — customized selection
{
"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

FieldTypeRequiredDescription
productsarrayrequiredThe product selection to price, a top-level field of the request — the same format used by the order. One entry per product.
customerobjectoptionalInsured 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

FieldTypeRequiredDescription
product_keystringrequiredProduct key from the catalog.
commission_dataobjectoptionalThe desired commission form (see below). When omitted, the default_rate of the product's commission_bounds band applies.
termobjectrequiredThe 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.
servicesarrayoptionalExplicit coverages. When omitted or empty, every coverage with a default configuration for your integration is filled in automatically.
risk_objectobjectconditionalThe 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

FieldTypeRequiredDescription
commission_typestringrequiredpercentage_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.
valuenumberrequiredThe 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

FieldTypeRequiredDescription
service_keystringrequiredCoverage 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_basisstringconditionalInsured amount basis: monetary_amount, percentage_of_risk_value or unit_amount_times_count. Stating the basis makes its matching value field required.
insured_amountnumberconditionalInsured amount in BRL. Required when the basis is monetary_amount.
insured_amount_percentagenumberconditionalPercentage 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_amountnumberconditionalAmount 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_countintegerconditionalNumber of indemnity units (e.g. 60 dailies). Required, together with unit_amount, when the basis is unit_amount_times_count.
deductible_dataobjectoptionalDeductible, 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_daysintegeroptionalWaiting period in days, within the coverage's waiting_period_options.

risk_object object

FieldTypeRequiredDescription
typestringrequiredRisk object type: credit_operation, vehicle or person.
insurable_valuenumberconditionalValue 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.
attributesobjectoptionalRisk 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.

FieldTypeRequiredDescription
document_numberstringoptionalInsured person's CPF or CNPJ.
namestringoptionalFull name.
emailstringoptionalEmail.
phone_numberstringoptionalPhone number in E.164 format.
date_of_birthstringoptionalThe 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_codestringoptionalInsured person's occupation code (CBO).
addressobjectoptionalThe insured person's address, in the same shape used on the order.

Response

STATUS
200
Response Body
{
"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

FieldTypeDescription
total_order_amountnumberSum of the gross premiums of the priced (priced) products, IOF-inclusive.
productsarrayResult 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).
eligibilitystringEligibility verdict of the quote: eligible, declined (some eligibility rule failed) or not_evaluated (customer was not sent — not an approval).

Object in products

FieldTypeDescription
product_keystringKey of the evaluated product.
name / provider_namestringCommercial name of the product and of the insurer.
product_categorystringProduct category: insurance, capitalization or benefit.
insurance_classobjectInsurance line of business: { name, class_number, group_number }. null for non-insurance products.
regulator_registrationstringRegistration of the product with the regulator.
contract_instrument_typestringThe 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.
resultstringpriced or rejected. Present on every line.
termobjectThe term you submitted, echoed back. Present when priced.
gross_premium_amountnumberGross premium of the product, with IOF — the exact sum of the coverage premiums. Present when priced.
iof_amountnumberIOF of the product. Present when priced.
net_premium_amountnumberNet premium of the product, without IOF. Present when priced.
servicesarrayPriced coverages, each with its premium. Present when priced.
decline_reasonsarrayRejection 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

FieldTypeDescription
service_keystringCoverage key.
service_typeobjectCoverage type: { code, name }.
service_categorystringCoverage category: insurance, capitalization or benefit.
regulator_registrationstringThe coverage's own SUSEP registration. null when the coverage inherits the product's.
insured_amountnumberResolved insured amount — the percentage already applied over the risk object's value, the per-unit pair already multiplied out. You never recompute it.
unit_amountnumberAmount per indemnity unit. null when the coverage is not unit-priced.
unit_countintegerNumber of indemnity units. null when the coverage is not unit-priced.
deductible_dataobjectApplied deductible: { deductible_type, value }. null when the coverage has no deductible.
waiting_period_daysintegerApplied waiting period, in days. null when the coverage has no waiting period — which is not the same as a 0-day one.
service_attributesobjectFixed coverage attributes, echoed from the catalog.
gross_premium_amountnumberGross 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.

Rejected line
{
"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"
}
]
}
CodeMeaning
NOT_ENTITLEDYour integration is not enabled to sell this product.
INACTIVE_PRODUCTThe product is inactive (or the key is unknown).
INACTIVE_SERVICEA selected coverage is inactive.
UNKNOWN_SERVICEA service_key does not belong to this product.
MISSING_MANDATORY_SERVICEThe selection omits a mandatory coverage of the product.
DEPENDENCY_VIOLATIONThe selection violates the coverage dependencies (include/exclude).
OUT_OF_OPTION_SPACEInsured 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_BASISThe 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_PRICEABLEThe 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_PREMIUMThe 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.
INELIGIBLEAn 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_COMMISSIONThe effective commission derived from commission_data is outside the product's commission_bounds band.
DELEGATED_UNSUPPORTEDProduct with pricing delegated to the insurer — reserved, not yet supported.
STALE_DEFAULTA 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.

StatusCodeDescription
400QIT000001Malformed 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 / 403Authentication or authorization failure.
429Request rate limit exceeded — retry with backoff.
503Pricing engine unavailable — the quote fails fast, with no cached price. Retry the call.