To get auto quotes, send a POST /v1/quote-requests request with line set to personal_auto. Prefill what you already know about the applicant, such as their name or a VIN, and ask them for the rest. If you don’t know an optional value, omit the field instead of guessing.
Get the applicant’s agreement
Before you request quotes, the applicant must agree to Truvo’s quote disclosure. GET /v1/capabilities returns it as quote_disclosure. Show the applicant its text as written, and ask whether they agree. If they agree, send its version as quote_disclosure_version, with quote_disclosure_accepted set to true. If the version isn’t the current one, the request fails with 422. The quote disclosure lists each rule and its error.
Minimal request
Generate one Idempotency-Key for each new quote request, and reuse it when you retry. To retry, rerun the curl command without regenerating KEY. Over MCP, pass the key as request_key.
Set TRUVO_API_KEY to your sandbox key and replace quote_disclosure_version with the version the applicant agreed to:
KEY=$(uuidgen)curl -X POST https://api.truvo.com/v1/quote-requests \-H "Authorization: Bearer $TRUVO_API_KEY" \-H "Truvo-Version: 2026-09-26" \-H "Idempotency-Key: $KEY" \-H "Content-Type: application/json" \-d '{"line": "personal_auto","quote_disclosure_version": "2026-10-06.1","quote_disclosure_accepted": true,"application": {"applicant": {"name": {"first_name": "Test","last_name": "Applicant One"},"email": "alex@example.com","phone": "512-555-0123"},"garaging_address": {"line1": "100 Example Way","city": "Austin","state": "TX","postal_code": "78701"},"drivers": [{"name": {"first_name": "Test","last_name": "Applicant One"},"date_of_birth": "1990-04-12","gender": "female"}],"vehicles": [{"year": 2019,"make": "Toyota","model": "Camry","ownership": "owned","use": "pleasure","annual_mileage": 8000,"comprehensive_deductible_minor": 100000,"collision_deductible_minor": 100000}],"protection": {"bodily_injury_per_person_minor": 10000000,"bodily_injury_per_accident_minor": 30000000,"property_damage_minor": 5000000}}}'
Truvo returns 202 with a quote request. Poll the quote request to get its quotes.
Request fields
| Label | Meaning |
|---|---|
| Required | The request fails with 422 without the field. |
| Required if | The request fails with 422 without the field when the condition after the label is true. |
| Recommended | Optional. Carriers use the value to price the quote, so send it when you have it. If you omit it, they receive a default or no value. |
| No label | Optional. If Truvo applies a default, the table lists it. |
Top-level fields · application · applicant · garaging_address · drivers[] · vehicles[] · protection · current_insurance
Top-level fields
| Field | Type | Description |
|---|---|---|
lineRequired | string | The insurance line. Value: personal_auto. |
quote_disclosure_versionRequired | string | The version of the quote disclosure that the applicant agreed to. GET /v1/capabilities returns it as quote_disclosure.version. |
quote_disclosure_acceptedRequired | boolean | Set to true after the applicant agrees to the quote disclosure. Their agreement covers the quote, a credit check, and contact by phone, text, and email. If the value isn’t true, the request fails with 422. |
applicationRequired | object | The applicant, drivers, vehicles, and coverage to quote. GET /v1/capabilities returns its JSON Schema as the line’s required_facts_schema. |
application
| Field | Type | Description |
|---|---|---|
applicantRequired | object | The applicant’s name and contact details. Truvo uses the first driver’s date_of_birth as the applicant’s date of birth. |
garaging_addressRequired | object | The address that carriers receive as both the mailing address and the garaging address. Use a street address, not a PO box. |
driversRequired | array of 1 to 10 objects | The drivers to include in the quote. The first driver is the named insured. |
vehiclesRequired | array of 1 to 10 objects | The vehicles to insure. Each vehicle requires a vin, or a year, make, and model. |
protectionRequired | object | The policy’s liability limits and coverage options. |
residence_ownershipRecommended | string | Whether the household owns or rents its home. Use not_owned if you know only that the applicant doesn’t own their home. If omitted or not_owned, Truvo doesn’t send carriers a value, and a carrier may apply its own default.Values: owned, rented, not_owned. |
credit_ratingRecommended | string | The applicant’s self-reported credit score range: excellent is 720 or higher, good is 680 to 719, average is 580 to 679, and poor is below 580. Sending it doesn’t give consent to a credit check. If omitted, Truvo doesn’t send carriers a value, and a carrier may apply its own default.Values: excellent, good, average, poor. |
current_insurance | object | The household’s current auto insurance. |
application.applicant
| Field | Type | Description |
|---|---|---|
nameRequired | object | The applicant’s name. |
name.first_nameRequired | string, 1 to 100 characters | The first name, such as Alex. |
name.last_nameRequired | string, 1 to 100 characters | The last name, such as Smith. |
emailRequired | string (email), up to 254 characters | The applicant’s email address. |
phoneRequired | string, 1 to 32 characters | The applicant’s US phone number, including its area code, such as 512-555-0123. The sandbox accepts 512-555-0123; for live quotes, use the applicant’s number. A live request with a number that nobody could answer, such as a fictional number in the 555-0100 to 555-0199 range, fails with 422. |
application.garaging_address
| Field | Type | Description |
|---|---|---|
line1Required | string, 1 to 200 characters | The street address, such as 100 Example Way. |
cityRequired | string, 1 to 100 characters | The city, such as Austin. |
stateRequired | string | The two-letter state code, such as TX. |
postal_codeRequired | string | The ZIP code, such as 78701 or 78701-1234. |
line2 | string or null, 1 to 200 characters | A second address line, such as a unit number. |
application.drivers[]
| Field | Type | Description |
|---|---|---|
nameRequired | object | The driver’s name. |
name.first_nameRequired | string, 1 to 100 characters | The first name, such as Alex. |
name.last_nameRequired | string, 1 to 100 characters | The last name, such as Smith. |
date_of_birthRequired | string (date) | The driver’s date of birth, in YYYY-MM-DD format. |
genderRequired | string | The driver’s gender. Values: female, male, non-binary. |
relationshipRequired if the driver isn’t the first in drivers | string | The driver’s relationship to the first driver. Omit it for the first driver, or the request fails with 422.Values: spouse, child, parent, sibling, domestic_partner, other. |
marital_statusRecommended | string | The driver’s marital status. If relationship is spouse, defaults to married; sending single returns 422. If omitted for any other driver, Truvo doesn’t send carriers a value, and a carrier may apply its own default.Values: single, married. |
educationRecommended | string | The highest level of education the driver completed. If omitted, Truvo doesn’t send carriers a value, and a carrier may apply its own default. Values: no_high_school_diploma, high_school_diploma, some_college, associate_degree, bachelor_degree, master_degree, doctorate_degree. |
has_incidents_last_5_yearsRecommended | boolean | Whether the driver has had any tickets, at-fault accidents, or claims in the last 5 years. If omitted, Truvo doesn’t send carriers a value, and a carrier may apply its own default. |
age_first_licensed | integer, 1 to 100 | The driver’s age in years when they first received a driver’s license. Must not exceed the driver’s current age. |
application.vehicles[]
| Field | Type | Description |
|---|---|---|
ownershipRequired | string | Whether the applicant owns, finances, or leases the vehicle. Values: owned, financed, leased. |
useRequired | string | The vehicle’s primary use. pleasure is personal use, and work_school is commuting to work or school.Values: pleasure, work_school, business, artisan, farm. |
annual_mileageRequired | integer, up to 100000 | The number of miles the vehicle is driven in a year. Must be greater than 0 and at most 100000. |
yearRequired if vin is omitted | integer, 1900 to 2100 | The vehicle’s model year. |
makeRequired if vin is omitted | string, 1 to 100 characters | The vehicle’s make, such as Toyota. |
modelRequired if vin is omitted | string, 1 to 100 characters | The vehicle’s model, such as Camry. |
comprehensive_deductible_minorRequired if protection.coverage_package is omitted | integer | The comprehensive deductible for this vehicle, in US cents: 50000 is $500. The menu includes values from all states. The applicant’s state may accept only some of them.
|
collision_deductible_minorRequired if protection.coverage_package is omitted | integer | The collision deductible for this vehicle, in US cents: 50000 is $500. The menu includes values from all states. The applicant’s state may accept only some of them.
|
vinRecommended | string | The vehicle’s full 17-character VIN. If you send it, year, make, and model are optional. If omitted, carriers rate the vehicle by its year, make, and model, and a carrier that requires the full VIN returns no quote. |
trim | string, 1 to 100 characters | The vehicle’s trim, such as Premium. If both vin and trim are omitted, Truvo uses the first trim listed for the year, make, and model, and reports it in assumptions. |
driver_index | integer, 0 or more | The assigned driver’s zero-based index in drivers, such as 0 for the first driver. Must be less than the number of drivers. If omitted, Truvo assigns the vehicle to the first driver and reports it in assumptions. |
application.protection
| Field | Type | Description |
|---|---|---|
bodily_injury_per_person_minorRequired if coverage_package is omitted or the per-accident limit is sent | integer | The bodily injury limit per person, in US cents: 2500000 is $25,000. Send both limits as one of the allowed pairs. The menu includes pairs from all states. The applicant’s state may accept only some of them.
|
bodily_injury_per_accident_minorRequired if coverage_package is omitted or the per-person limit is sent | integer | The bodily injury limit per accident, in US cents: 5000000 is $50,000. Send both limits as one of the allowed pairs. The menu includes pairs from all states. The applicant’s state may accept only some of them.
|
property_damage_minorRequired if coverage_package is omitted | integer | The property damage limit, in US cents: 2500000 is $25,000. The menu includes values from all states. The applicant’s state may accept only some of them.
|
tort_typeRequired if garaging_address.state is PA | string | Whether the applicant keeps the full or a limited right to sue for injury. Values: full, limited. |
stacked_uninsured_motoristRequired if garaging_address.state is FL, NM, NV, or PA | boolean | Whether uninsured motorist limits stack across the applicant’s vehicles. |
stacked_underinsured_motoristRequired if garaging_address.state is PA | boolean | Whether underinsured motorist limits stack. |
coverage_package | string | The coverage package used for omitted liability limits and vehicle deductibles. full adds comprehensive and collision coverage, each with a $1,000 deductible. minimum, liability, and standard are liability only. A limit or deductible in the request overrides the package. assumptions lists each field that the package set. If a vehicle sends only one of its two deductibles, Truvo sets the other to the same amount, or to the next lower amount that deductible allows, and assumptions lists it.Values: minimum, liability, standard, full. |
application.current_insurance
| Field | Type | Description |
|---|---|---|
insuredRecommended | boolean | Whether the applicant has auto insurance now. If false, Truvo doesn’t send carriers the other current_insurance fields. If omitted, Truvo doesn’t send carriers a value, and a carrier may apply its own default. |
carrierRecommended | string | The current auto insurer. Use other if it isn’t listed. Ignored if insured is false. If omitted, Truvo doesn’t send carriers a value, and a carrier may apply its own default.
|
continuous_coverage_monthsRecommended | integer, 0 or more | The number of months of continuous auto coverage. Use 0 for none. Ignored if insured is false. If omitted, Truvo doesn’t send carriers a value, and a carrier may apply its own default. |
liability_limitRecommended | string | The current policy’s liability limits, in thousands of dollars. 100/300/100 is $100,000 bodily injury per person, $300,000 bodily injury per accident, and $100,000 property damage. 300_csl is a $300,000 combined single limit. Use not_sure if the applicant doesn’t know them. Ignored if insured is false. If omitted or not_sure, Truvo doesn’t send carriers a value, and a carrier may apply its own default.
|
Responses
| Request | Response |
|---|---|
| Has every required field | 202 with a quote request. Its assumptions lists each default that Truvo applied. |
Is missing a required field of application | 422 needs_information. field_errors lists each missing field with the code required. |
Is missing line, application, or a disclosure field | 422 invalid_input. field_errors identifies the field. |
| Has an invalid value | 422 invalid_input. field_errors lists each invalid field, with allowed_values when the API can list the values the field accepts. |
A request that fails with 422 isn’t stored, so you can send the corrected request with the same Idempotency-Key or a new one.
After Truvo accepts a request, a carrier can still report missing_information in market_outcomes if it needs more information than the request included. See Why did a request finish with no quotes?.
Omitted recommended fields
If you omit a recommended field with no default, the quote request lists it in assumptions with value set to null, unless Truvo ignores the field. Truvo ignores carrier, continuous_coverage_months, and liability_limit if current_insurance.insured is false. The following entry is for a driver’s omitted education:
{"path": "application.drivers.0.education","value": null,"source": "auto_rating_fact","label": "Truvo does not send a value for this fact. A carrier may use its own default."}
To have carriers rate on the applicant’s actual value, create a new quote request that includes the field. Sandbox premiums are preset, so they don’t change when you send or omit these fields.
Default values
assumptions also reports each value that Truvo set for an optional field you omitted, such as the driver assigned to a vehicle:
{"path": "application.vehicles.0.driver_index","value": 0,"source": "single_driver","label": "Truvo assigns this vehicle to the only driver on the request."}
If a coverage_package sets a liability limit, the entry’s value is null, because the request doesn’t state the limit. Live quotes report carrier-provided limits and deductibles in coverage.subjects. If the carrier didn’t return a limit or deductible, the corresponding field is null. A sandbox quote lists a liability limit only if the request sent it.
Missing required fields
If drivers or vehicles is missing or empty, field_errors lists the array and the required fields of its first item. The following response is for a request whose application is empty:
{"error": {"code": "needs_information","message": "The quote request needs more information.","field_errors": [{"path": "application.applicant.name.first_name","message": "This fact is required.","code": "required"},{"path": "application.applicant.name.last_name","message": "This fact is required.","code": "required"},{"path": "application.applicant.email","message": "This fact is required.","code": "required"},{"path": "application.applicant.phone","message": "This fact is required.","code": "required"},{"path": "application.garaging_address.line1","message": "This fact is required.","code": "required"},{"path": "application.garaging_address.city","message": "This fact is required.","code": "required"},{"path": "application.garaging_address.state","message": "This fact is required.","code": "required"},{"path": "application.garaging_address.postal_code","message": "This fact is required.","code": "required"},{"path": "application.drivers","message": "This fact is required.","code": "required"},{"path": "application.drivers.0.name.first_name","message": "This fact is required.","code": "required"},{"path": "application.drivers.0.name.last_name","message": "This fact is required.","code": "required"},{"path": "application.drivers.0.date_of_birth","message": "This fact is required.","code": "required"},{"path": "application.drivers.0.gender","message": "This fact is required.","code": "required"},{"path": "application.protection.bodily_injury_per_person_minor","message": "This fact is required.","code": "required"},{"path": "application.protection.bodily_injury_per_accident_minor","message": "This fact is required.","code": "required"},{"path": "application.protection.property_damage_minor","message": "This fact is required.","code": "required"},{"path": "application.vehicles","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.ownership","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.use","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.year","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.make","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.model","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.annual_mileage","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.comprehensive_deductible_minor","message": "This fact is required.","code": "required"},{"path": "application.vehicles.0.collision_deductible_minor","message": "This fact is required.","code": "required"}],"retry_action": {"type": "supply_facts","summary": "Supply the missing facts and send the request again."},"doc_url": "https://docs.truvo.com/v1/errors/needs_information"},"request_id": "req_0c20599c4a3269e0"}