Skip to navigation

Request an auto quote

View as Markdown

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

LabelMeaning
RequiredThe request fails with 422 without the field.
Required ifThe request fails with 422 without the field when the condition after the label is true.
RecommendedOptional. 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 labelOptional. If Truvo applies a default, the table lists it.

Top-level fields · application · applicant · garaging_address · drivers[] · vehicles[] · protection · current_insurance

Top-level fields

FieldTypeDescription
line
Required
stringThe insurance line.
Value: personal_auto.
quote_disclosure_version
Required
stringThe version of the quote disclosure that the applicant agreed to. GET /v1/capabilities returns it as quote_disclosure.version.
quote_disclosure_accepted
Required
booleanSet 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.
application
Required
objectThe applicant, drivers, vehicles, and coverage to quote. GET /v1/capabilities returns its JSON Schema as the line’s required_facts_schema.

application

FieldTypeDescription
applicant
Required
objectThe applicant’s name and contact details. Truvo uses the first driver’s date_of_birth as the applicant’s date of birth.
garaging_address
Required
objectThe address that carriers receive as both the mailing address and the garaging address. Use a street address, not a PO box.
drivers
Required
array of 1 to 10 objectsThe drivers to include in the quote. The first driver is the named insured.
vehicles
Required
array of 1 to 10 objectsThe vehicles to insure. Each vehicle requires a vin, or a year, make, and model.
protection
Required
objectThe policy’s liability limits and coverage options.
residence_ownership
Recommended
stringWhether 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_rating
Recommended
stringThe 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_insuranceobjectThe household’s current auto insurance.

application.applicant

FieldTypeDescription
name
Required
objectThe applicant’s name.
name.first_name
Required
string, 1 to 100 charactersThe first name, such as Alex.
name.last_name
Required
string, 1 to 100 charactersThe last name, such as Smith.
email
Required
string (email), up to 254 charactersThe applicant’s email address.
phone
Required
string, 1 to 32 charactersThe 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

FieldTypeDescription
line1
Required
string, 1 to 200 charactersThe street address, such as 100 Example Way.
city
Required
string, 1 to 100 charactersThe city, such as Austin.
state
Required
stringThe two-letter state code, such as TX.
postal_code
Required
stringThe ZIP code, such as 78701 or 78701-1234.
line2string or null, 1 to 200 charactersA second address line, such as a unit number.

application.drivers[]

FieldTypeDescription
name
Required
objectThe driver’s name.
name.first_name
Required
string, 1 to 100 charactersThe first name, such as Alex.
name.last_name
Required
string, 1 to 100 charactersThe last name, such as Smith.
date_of_birth
Required
string (date)The driver’s date of birth, in YYYY-MM-DD format.
gender
Required
stringThe driver’s gender.
Values: female, male, non-binary.
relationship
Required if the driver isn’t the first in drivers
stringThe 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_status
Recommended
stringThe 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.
education
Recommended
stringThe 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_years
Recommended
booleanWhether 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_licensedinteger, 1 to 100The driver’s age in years when they first received a driver’s license. Must not exceed the driver’s current age.

application.vehicles[]

FieldTypeDescription
ownership
Required
stringWhether the applicant owns, finances, or leases the vehicle.
Values: owned, financed, leased.
use
Required
stringThe 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_mileage
Required
integer, up to 100000The number of miles the vehicle is driven in a year. Must be greater than 0 and at most 100000.
year
Required if vin is omitted
integer, 1900 to 2100The vehicle’s model year.
make
Required if vin is omitted
string, 1 to 100 charactersThe vehicle’s make, such as Toyota.
model
Required if vin is omitted
string, 1 to 100 charactersThe vehicle’s model, such as Camry.
comprehensive_deductible_minor
Required if protection.coverage_package is omitted
integerThe 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.
0 $0
5000 $50
10000 $100
15000 $150
20000 $200
25000 $250
30000 $300
35000 $350
40000 $400
45000 $450
47500 $475
50000 $500
55000 $550
60000 $600
70000 $700
75000 $750
80000 $800
97500 $975
100000 $1,000
150000 $1,500
200000 $2,000
250000 $2,500
300000 $3,000
500000 $5,000
collision_deductible_minor
Required if protection.coverage_package is omitted
integerThe 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.
0 $0
5000 $50
10000 $100
15000 $150
20000 $200
25000 $250
30000 $300
35000 $350
40000 $400
45000 $450
47500 $475
50000 $500
55000 $550
60000 $600
70000 $700
75000 $750
80000 $800
90000 $900
95000 $950
97500 $975
100000 $1,000
150000 $1,500
200000 $2,000
250000 $2,500
300000 $3,000
500000 $5,000
vin
Recommended
stringThe 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.
trimstring, 1 to 100 charactersThe 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_indexinteger, 0 or moreThe 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

FieldTypeDescription
bodily_injury_per_person_minor
Required if coverage_package is omitted or the per-accident limit is sent
integerThe 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.
1000000 / 2000000 ($10,000 / $20,000)
1500000 / 3000000 ($15,000 / $30,000)
2000000 / 4000000 ($20,000 / $40,000)
2500000 / 5000000 ($25,000 / $50,000)
2500000 / 6500000 ($25,000 / $65,000)
2500000 / 10000000 ($25,000 / $100,000)
3000000 / 6000000 ($30,000 / $60,000)
3000000 / 6500000 ($30,000 / $65,000)
3500000 / 7000000 ($35,000 / $70,000)
5000000 / 5000000 ($50,000 / $50,000)
5000000 / 10000000 ($50,000 / $100,000)
5000000 / 20000000 ($50,000 / $200,000)
6000000 / 12000000 ($60,000 / $120,000)
7500000 / 15000000 ($75,000 / $150,000)
10000000 / 10000000 ($100,000 / $100,000)
10000000 / 20000000 ($100,000 / $200,000)
10000000 / 30000000 ($100,000 / $300,000)
15000000 / 30000000 ($150,000 / $300,000)
25000000 / 30000000 ($250,000 / $300,000)
25000000 / 50000000 ($250,000 / $500,000)
30000000 / 30000000 ($300,000 / $300,000)
30000000 / 50000000 ($300,000 / $500,000)
30000000 / 60000000 ($300,000 / $600,000)
50000000 / 50000000 ($500,000 / $500,000)
50000000 / 100000000 ($500,000 / $1,000,000)
75000000 / 75000000 ($750,000 / $750,000)
100000000 / 100000000 ($1,000,000 / $1,000,000)
500000000 / 500000000 ($5,000,000 / $5,000,000)
bodily_injury_per_accident_minor
Required if coverage_package is omitted or the per-person limit is sent
integerThe 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.
1000000 / 2000000 ($10,000 / $20,000)
1500000 / 3000000 ($15,000 / $30,000)
2000000 / 4000000 ($20,000 / $40,000)
2500000 / 5000000 ($25,000 / $50,000)
2500000 / 6500000 ($25,000 / $65,000)
2500000 / 10000000 ($25,000 / $100,000)
3000000 / 6000000 ($30,000 / $60,000)
3000000 / 6500000 ($30,000 / $65,000)
3500000 / 7000000 ($35,000 / $70,000)
5000000 / 5000000 ($50,000 / $50,000)
5000000 / 10000000 ($50,000 / $100,000)
5000000 / 20000000 ($50,000 / $200,000)
6000000 / 12000000 ($60,000 / $120,000)
7500000 / 15000000 ($75,000 / $150,000)
10000000 / 10000000 ($100,000 / $100,000)
10000000 / 20000000 ($100,000 / $200,000)
10000000 / 30000000 ($100,000 / $300,000)
15000000 / 30000000 ($150,000 / $300,000)
25000000 / 30000000 ($250,000 / $300,000)
25000000 / 50000000 ($250,000 / $500,000)
30000000 / 30000000 ($300,000 / $300,000)
30000000 / 50000000 ($300,000 / $500,000)
30000000 / 60000000 ($300,000 / $600,000)
50000000 / 50000000 ($500,000 / $500,000)
50000000 / 100000000 ($500,000 / $1,000,000)
75000000 / 75000000 ($750,000 / $750,000)
100000000 / 100000000 ($1,000,000 / $1,000,000)
500000000 / 500000000 ($5,000,000 / $5,000,000)
property_damage_minor
Required if coverage_package is omitted
integerThe 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.
500000 $5,000
1000000 $10,000
1500000 $15,000
2000000 $20,000
2500000 $25,000
3000000 $30,000
3500000 $35,000
4000000 $40,000
5000000 $50,000
6500000 $65,000
7500000 $75,000
10000000 $100,000
20000000 $200,000
25000000 $250,000
30000000 $300,000
50000000 $500,000
75000000 $750,000
100000000 $1,000,000
tort_type
Required if garaging_address.state is PA
stringWhether the applicant keeps the full or a limited right to sue for injury.
Values: full, limited.
stacked_uninsured_motorist
Required if garaging_address.state is FL, NM, NV, or PA
booleanWhether uninsured motorist limits stack across the applicant’s vehicles.
stacked_underinsured_motorist
Required if garaging_address.state is PA
booleanWhether underinsured motorist limits stack.
coverage_packagestringThe 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

FieldTypeDescription
insured
Recommended
booleanWhether 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.
carrier
Recommended
stringThe 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.
state_farm, progressive, geico, allstate, usaa, liberty_mutual, farmers, nationwide, travelers, amfam, aaa, hartford, erie, safeco, other
continuous_coverage_months
Recommended
integer, 0 or moreThe 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_limit
Recommended
stringThe 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.
15/30/5, 15/30/25, 20/40/15, 25/50/10, 25/50/15, 25/50/20, 25/50/25, 25/50/50, 30/60/15, 30/60/25, 30/65/25, 50/100/25, 50/100/50, 50/100/100, 100/300/50, 100/300/100, 250/500/50, 250/500/100, 250/500/250, 100_csl, 300_csl, 500_csl, not_sure

Responses

RequestResponse
Has every required field202 with a quote request. Its assumptions lists each default that Truvo applied.
Is missing a required field of application422 needs_information. field_errors lists each missing field with the code required.
Is missing line, application, or a disclosure field422 invalid_input. field_errors identifies the field.
Has an invalid value422 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?.

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"
}