Introduction
Welcome to the AutoComplete Partner API! Dealer partners can use this API to create zero-effort insurance-shopping experiences for their customers.
For each customer you submit, AutoComplete will generate and return a personalized insurance-shopping link (e.g. "https://app.autocomplete.io/aBcDeF"). When visiting that link, your customer will see his/her own contact, household, and vehicle details — in addition to your dealer info — already pre-populated.
You can use this personalized shopping link in one of several ways:
- Embed this link into your digital retail experience,
- Send this link to your customer through your own CRM system or sales process, or
- Have AutoComplete engage your customer directly.
We refer to options (1) and (2) as Dealer-Initiated Messaging, and option (3) as AutoComplete-Initiated Messaging.
Example Use Case
Example submission to
POST /people
:
{
"first_name": "Jon",
"middle_name": "Aegon",
"last_name": "Snow",
"date_of_birth": "1986-12-26",
"gender": "male",
"marital_status": "married",
"education": "bachelors",
"employment_status": "employed",
"residence_ownership_type": "own",
"age_first_licensed": 16,
"phone_numbers": [
{
"number": "+15551230000",
"type": "mobile",
"sms_consent": true
},
{
"number": "+15551231111",
"type": "home"
}
],
"emails": [
{
"email": "jon.snow@nightswatch.com",
"preferred": true
}
],
"addresses": [
{
"type": "physical",
"address_1": "555 Main St.",
"city": "Pleasantville",
"state": "CA",
"postal_code": "94105"
},
{
"type": "mailing",
"address_1": "PO Box 100",
"city": "San Francisco",
"state": "CA",
"postal_code": "94105"
}
],
"drivers_license": {
"number": "D1234567",
"state": "CA",
"status": "active",
"issued_date": "2015-11-11",
"expiration_date": "2025-11-11"
},
"new_vehicles": [
{
"vin": "WAULH54B0YN028245",
"year": 2022,
"make": "Audi",
"model": "A4",
"trim": "45 TFSI",
"ownership_start": "2022-03-09",
"ownership_type": "leased",
"lease_duration": 36,
"annual_mileage": 12000,
"odometer": 57,
"cost_new": 3990000,
"lienholder": "Toyota Financial Services",
"primary_use": "pleasure",
"rideshare": false,
"addresses": [
{
"type": "garaging",
"address_1": "555 Main St",
"city": "Pleasantville",
"state": "CA",
"postal_code": "94105-1023"
},
{
"type": "lienholder",
"address_1": "1 Toyota Way",
"city": "Plano",
"state": "TX",
"postal_code": "75024"
}
]
}
],
"trade_ins": [
{
"vin": "5TD2A23C645204309",
"year": 2015,
"make": "Toyota",
"model": "Camry",
"odometer": 78001
}
],
"policies": [
{
"policy_type": "auto",
"carrier_name": "geico",
"carrier_policy_number": "604-80-35-635",
"effective_date": "2021-12-20",
"expiry_date": "2022-05-20"
}
],
"related_people": [
{
"first_name": "Ygritte",
"last_name": "Wildling",
"date_of_birth": "1987-02-09",
"marital_status": "married",
"relationship": "spouse"
}
],
"source": {
"dealer_id": "4119799d-215f-4f49-b38a-0b94c2448399",
"type": "cdk",
"external_customer_number": "928880",
"external_deal_number": "41706"
},
}
Example response:
{
"id": "ec694d9a-a3f8-4a55-95ff-de97d1bc945a",
"first_name": "Jon",
"last_name": "Snow",
...
"flow": {
"flow_id": "uVwXyZ",
"flow_url": "https://app.autocomplete.io/uVwXyZ", // Jon's personalized shopping link
}
}
Example error:
{
"status_code": 400,
"message": "Field 'new_vehicles' cannot be empty."
}
Let's say your customer, Jon Snow, wants to trade in an old Toyota Camry for a new Audi A4.
Once that deal is desked, you submit all of Jon's DMS (dealer management system) data to the AutoComplete API using the POST /people
endpoint.
Using the information you just submitted plus data from third-party partners, AutoComplete creates a personalized shopping link for Jon containing his contact information, household drivers, new and existing vehicles, and prior coverages. The quality of this personalization is determined by the level of detail you submit, which means you should submit as many available fields as possible.
If you've configured your integration for Dealer-Initiated Messaging, AutoComplete simply returns Jon's personalized link (e.g. "https://app.autocomplete.io/aBcDeF") back to you. On the other hand, if you've configured your integration for AutoComplete-Initiated Messaging, AutoComplete will engage with Jon directly via his preferred contact method.
Finally, Jon visits his personalized link, where he confirms his personal information, compares quotes, and purchases a policy.
Optional Responses
By default, any submissions to the POST /people
endpoint will only return the customer's personalized flow_id
and flow_url
("uVwXyZ" and "https://app.autocomplete.io/uVwXyZ", respectively, in the example above). However, you can obtain additional responses, if desired:
Current Insurance
To request the customer's current insurance information when calling
/people
:
{
"first_name": "Jon",
"last_name": "Snow",
...
"return_current_insurance": true,
}
As part of the shopping process, AutoComplete attempts to retrieve the customer's current insurance policy from insurer databases. This data helps AutoComplete select more suitable insurers and insurance policies for the customer, but can also be useful for dealers (a) to confirm that the customer is actively insured, as required by law, and (b) to confirm that the customer has adequate levels of asset coverage to meet lienholder requirements.
To indicate that you would like us to return the current insurance details (if available), set the optional parameter return_current_insurance
to true
.
Initial Quote
To request an initial quote for the customer when calling
/people
:
{
"first_name": "Jon",
"last_name": "Snow",
...
"return_initial_quote": true,
}
AutoComplete can also generate a preliminary, "initial" insurance quote for any new customer. This initial quote will obviously not reflect any customizations that would require further user interaction, such as additional household cars or drivers not already contained in your submitted payload. However, this initial quote can still be useful to gauge customer interest and calculate potential savings.
To indicate you would like us to return an initial quote, set the optional parameter return_initial_quote
to true
. Please note that your customer must have already consented to an insurance quote before you submit this request.
Receiving Results
AutoComplete typically requires 15 to 60 seconds to obtain this optional data. As such, we will return this data to you asynchrously. We support two methods — you can either:
- poll the results periodically using the
GET /people/<flow_id>/results
endpoint, or - set up an asynchronous callback URL.
To set up a callback, please provide AutoComplete a URL and authorization token during your integration setup. AutoComplete will make a POST
request to your specified URL as soon as results are available. The structure of the webhook payload is identical to the returned from GET .../results
.
Technical Overview
Example Request:
import requests
api_key = # <Your API Key>
api_secret = # <Your API Secret>
headers = {'Content-Type': 'application/json'}
r = requests.get('https://api.autocomplete.io/people', auth=(api_key, api_secret), headers=headers)
The AutoComplete Partner API is served exclusively over HTTPS, requests are authenticated using Basic Authentication with your API Key and API Secret, and all request bodies and responses are JSON-encoded. We also use standard HTTP headers, verbs, and response codes.
Requests are rate limited to one request per second.
Endpoints
POST /people
Example with minimum required fields:
import requests
api_key = # <Your API Key>
api_secret = # <Your API Secret>
headers = {'Content-Type': 'application/json'}
data = {
"first_name": "Jon",
"last_name": "Snow",
"date_of_birth": "1986-12-26",
"phone_numbers": [
{
"number": "+15551230000",
"type": "mobile"
}
],
"addresses": [
{
"address_1": "555 Main St",
"city": "Pleasantville",
"state": "CA",
"postal_code": "94105"
}
],
"new_vehicles": [
{
"vin": "WAULH54B0YN028245"
}
],
"source": {
"dealer_id": "4119799d-215f-4f49-b38a-0b94c2448399"
}
}
r = requests.post('https://api.autocomplete.io/people', auth=(api_key, api_secret), headers=headers, json=data)
if r.status_code == 200:
print(r.text)
Upload all customer information using this endpoint. All fields are preferred, only some fields are required.
Minimum Required Fields
Parameter | Notes |
---|---|
first_name | |
last_name | |
date_of_birth | |
phone_numbers | Must contain at least one valid phone number when configured for AutoComplete-Initiated Messaging |
addresses | Must contain at least one valid address |
new_vehicles | Must contain at least one vehicle, with vin |
source | Indicates the dealer of origin |
For all preferred fields, see Models - Person.
GET /people/<flow_id>/results
Example:
import requests
api_key = # <Your API Key>
api_secret = # <Your API Secret>
headers = {'Content-Type': 'application/json'}
flow_id = 'uVwXyZ' # From the /people endpoint
r = requests.get(f'https://api.autocomplete.io/people/{flow_id}/results', auth=(api_key, api_secret), headers=headers, json=data)
if r.status_code == 200:
print(r.text)
Example response:
{
"flow_id": "uVwXyZ",
"current_insurance_status": "found",
"current_insurance": {
"policy_type": "auto",
"carrier_name": "Allstate",
"carrier_policy_number": "5789000AZ",
"effective_date": "2023-01-01",
"expiry_date": "2023-06-01",
"coverages": {
"bodily_injury_liability": {
"per_person_limit": 3000000,
"per_incident_limit": 6000000
},
"property_damage_liability": {
"per_incident_limit": 2500000
},
"comprehensive": {
"deductible": 100000
},
"collision": {
"deductible": 100000
}
}
},
"initial_quote_status": "success",
"initial_quote": {
"carrier_name": "Progressive",
"effective_monthly_price": 12399,
}
}
If requested as part of the original submission, retrieve the customer's current insurance policy and/or initial insurance quote. See the Optional Responses section for more information.
Parameter | Type | Description |
---|---|---|
flow_id | string | Used to associate responses to customers when returned by an asynchronous callback |
current_insurance_status | string | Possible values: pending , found , not_found . Note that a status of not_found only indicates that AutoComplete failed to locate the customer's current insurance — not that the customer definitively has no current insurance. |
current_insurance | Policy | If found, the customer's current auto insurance policy |
initial_quote_status | string | Possible values: pending , found , not_found |
initial_quote | If found, the winning initial quote carrier and price |
Models
Person
This is the model used to represent a customer.
Parameter | Type | Description |
---|---|---|
first_name | string | |
middle_name | string | |
last_name | string | |
date_of_birth | string | "YYYY-MM-DD" format |
gender | string | Valid options: male , female , non_binary |
marital_status | string | Valid options: single , married , other |
relationship | string | Required when the Person is an element of an array, such as in the .related_people field. Valid options: spouse , sibling , parent , parent_in_law , child , child_in_law , housemate , other |
education | string | Highest level of education achieved. Valid options: associates , bachelors , doctorate , no_high_school_diploma , high_school , masters , medical_school , law_school , vocational_certificate , other |
employment_status | string | Valid options: employed , retired , student , unemployed |
residence_ownership_type | string | Valid options: own , rent |
age_first_licensed | integer | |
phone_numbers | Array<PhoneNumber> | |
emails | Array<Email> | |
addresses | Array<Address> | |
drivers_license | <DriversLicense> | |
policies | Array<Policy> | |
new_vehicles | Array<Vehicle> | Used only when submitting to POST /people |
trade_ins | Array<Vehicle> | Used only when submitting to POST /people |
vehicles | Array<Vehicle> | Never submitted. Only available when reading from GET /people |
related_people | Array<Person> | |
flow | <Flow> | Never submitted |
source | <Source> | Used only when submitting to POST /people |
PhoneNumber
Example:
{
"number": "+15551230000",
"type": "mobile",
"sms_consent": true
}
Parameter | Type | Description |
---|---|---|
number | string | Formatted as "+[Country Code][Number]", e.g. "+15551230000" |
type | string | Valid options: mobile , home , work |
sms_consent | boolean |
Example:
{
"email": "john.doe@gmail.com",
"preferred": true
}
Parameter | Type | Description |
---|---|---|
email |
string | e.g. "john@gmail.com" |
preferred | boolean |
Address
Example:
{
"type": "mailing",
"address_1": "1650 17th St NW",
"address_2": "Suite 100",
"city": "Washington",
"state": "DC",
"postal_code": "20500"
}
All addresses are assumed to be in the United States.
Parameter | Type | Description |
---|---|---|
type | string | Valid options: mailing , physical , garaging , lienholder . Defaults to physical |
address_1 | string | The first line of the address, e.g. "530 Howard St" |
address_2 | string | The second line of the address, e.g. "Unit 470" |
city | string | e.g. "San Francisco" |
state | string | Two-letter postal abbreviation, e.g. "CA" |
postal_code | string | e.g. "94105" or "94105-0907" |
DriversLicense
Example:
{
"number": "D123456",
"state": "CA",
"status": "active",
"issued_date": "2018-10-25",
"expiration_date": "2028-10-25"
}
Parameter | Type | Description |
---|---|---|
number | string | Alphanumeric, e.g. "D1234567" |
state | string | Two-letter postal abbreviation, e.g. "CA" |
status | string | Valid options: active , suspended , revoked , expired |
issued_date | string | "YYYY-MM-DD" format |
expiration_date | string | "YYYY-MM-DD" format |
Policy
Example:
{
"policy_type": "auto",
"carrier_name": "geico",
"carrier_policy_number": "604-80-35-635",
"effective_date": "2021-12-20",
"expiry_date": "2022-05-20"
}
Parameter | Type | Description |
---|---|---|
policy_type | string | Valid options: see Enums - Policy Type |
carrier_name | string | Valid options: see Enums - Carrier |
carrier_policy_number | string | e.g. "6048035635" |
effective_date | string | "YYYY-MM-DD" format |
expiry_date | string | "YYYY-MM-DD" format |
Vehicle
Example:
{
"vin": "2T3RWRFV3KW021971",
"year": 2019,
"make": "Toyota",
"model": "RAV4",
"trim": "XLE",
"ownership_start": "2019-08-21",
"ownership_type": "leased",
"lease_duration": 36,
"finance_duration": null,
"annual_mileage": 12000,
"odometer": 48,
"cost_new": 3999500,
"primary_use": "work",
"lienholder": "Toyota Financial Services",
"anti_lock_brakes": true,
"anti_theft_device": true,
"rideshare": false,
"addresses": [
{
"type": "garaging",
"address_1": "530 Howard St",
"address_2": "Ste 470",
"city": "San Francisco",
"state": "CA",
"postal_code": "94105"
},
{
"type": "lienholder",
"address_1": "PO BOX 105386",
"city": "Atlanta",
"state": "GA",
"postal_code": "30348-5386"
}
]
}
Parameter | Type | Description |
---|---|---|
vin | string | 17 alphanumeric characters |
year | integer | e.g. 2021 |
make | string | Valid options: see Enums - Vehicle Make |
model | string | e.g. "RAV4" |
trim | string | e.g. "XLE" |
ownership_start | string | "YYYY-MM-DD" format |
ownership_type | string | Only available when reading from GET /people . Valid options: owned , financed , leased , trade_in , other |
lease_duration | integer | Only applicable when .type == "leased" . In months |
finance_duration | integer | Only applicable when .type == "financed" . In months |
annual_mileage | integer | In miles |
odometer | integer | In miles |
cost_new | integer | In cents |
primary_use | string | Valid options: work , pleasure , school , business , agricultural |
lienholder | string | e.g. "Toyota Financial Services" |
anti_lock_brakes | boolean | |
anti_theft_device | boolean | |
rideshare | boolean | |
addresses | Array<Address> |
Flow
Example:
{
"flow_id": "aBcDeF",
"flow_url": "https://app.autocomplete.io/aBcDeF",
}
The flow_url
is the personalized insurance-shopping link for that customer.
Parameter | Type | Description |
---|---|---|
flow_id | string | e.g. "aBcDeF" |
flow_url | string | e.g. "https://app.autocomplete.io/aBcDeF" |
Source
Example describing a customer originating from CDK:
{
"dealer_id": "4119799d-215f-4f49-b38a-0b94c2448399", // AutoComplete-assigned
"type": "cdk",
"external_customer_number": "928880", // CDK refers to this field as <CustNo>
"external_deal_number": "41706", // CDK refers to this field as <DealNo>
}
Example describing a customer originating from DealerTrack:
{
"dealer_id": "88753dfc-5ede-49cd-92b4-7b63d235d16c", // AutoComplete-assigned
"type": "dealertrack",
"external_customer_number": "1028648", // DealerTrack refers to this field as <CustomerNumber>
"external_deal_number": "6302", // DealerTrack refers to this field as <DealNumber>
}
Informs AutoComplete about the origin of customer information. This is usually a specific combination of dealer, DMS type, and customer number.
Parameter | Type | Description |
---|---|---|
dealer_id | string | AutoComplete's internal UUID of the origin dealer, e.g. "4119799d-215f-4f49-b38a-0b94c2448399" |
type | string | Valid options: automate , cdk , dealertrack , reynolds |
external_customer_number | string | The customer identifier used by the DMS |
external_deal_number | string | The deal identifier used by the DMS |
Enums
When submitting, all values are case-insensitive. Spaces and underscores are interchangeable.
For example, "american_family"
, "american family"
, and "AMERICAN FAMILY"
will all be accepted as a valid alternatives for "American Family"
. However, responses returned from the API will always be formatted as shown.
Carrier
"AAA"
"Acuity"
"Adirondack"
"Allmerica"
"Allstate"
"Ally Insurance"
"American Family"
"American National"
"American Strategic"
"Amica Mutual"
"AmTrust Insurance"
"Arrowhead"
"ASI Progressive"
"Aspire Advantage"
"Aspire Savings"
"AssuranceAmerica"
"Auto Owners"
"Bear River"
"Branch"
"Bristol West"
"Chubb"
"Cincinnati"
"Clarendon"
"Clearcover"
"CNA Insurance"
"Commonwealth"
"Country Financial"
"Cover"
"Dairyland"
"Direct General"
"Electric"
"Elephant"
"Encompass"
"Encova"
"Equity Insurance"
"Erie"
"Esurance"
"Farmers"
"Farmers Union Insurance"
"Fiesta"
"First Chicago"
"Foremost"
"Freedom National"
"GAINSCO"
"GEICO"
"Germania"
"GMAC"
"Good2Go"
"Grange"
"Hallmark"
"Hanover"
"Heritage"
"Hippo"
"Home State County Mutual"
"Homesite"
"Horace Mann"
"Infinity"
"Infinity RSVP"
"Infinity Special"
"Integrity"
"Kemper"
"Kentucky Farm Bureau"
"Leader"
"Liberty Mutual"
"Mapfre"
"Markel Insurance"
"Mendota Insurance"
"Mercury"
"Meritplan"
"Metlife"
"Metromile"
"Mile Auto"
"National General"
"National General"
"Nationwide"
"Newport"
"NYCM"
"Plymouth Rock"
"Progressive"
"QBE"
"Redpoint"
"Root"
"Safe Auto"
"Safeco"
"Safeway"
"Secura"
"SelectQuote"
"Shelter"
"Starr Indemnity"
"State Auto"
"State Farm"
"Stillwater"
"Sun Coast"
"Texas Farm Bureau"
"The General"
"The Hartford"
"Titan"
"Travelers"
"TSC Direct"
"21st Century"
"Universal"
"USA Underwriters"
"USAA"
"West Bend Mutual"
"Westfield"
Policy Type
"auto"
"boat"
"business_owners"
"combo"
"commercial_auto"
"commercial_umbrella"
"condo"
"earthquake"
"farmowner"
"fire"
"flood"
"homeowners"
"landlord"
"life"
"motorcycle"
"personal_articles"
"recreational_vehicle"
"renters"
"snowmobile"
"term_life"
"trailer"
"umbrella"
"universal_life"
"whole_life"
Vehicle Make
"Acura"
"Alfa Romeo"
"Aston Martin"
"Audi"
"BMW"
"Bentley"
"Bugatti"
"Buick"
"Cadillac"
"Chevrolet"
"Chrysler"
"Dodge"
"Ferrari"
"Fiat"
"Fisker Automotive"
"Ford"
"GMC"
"Genesis"
"Honda"
"Hummer"
"Hyundai"
"Infiniti"
"Jaguar"
"Jeep"
"Karma"
"Kia"
"Lamborghini"
"Land Rover"
"Lexus"
"Lincoln"
"Lordstown"
"Lotus"
"Lucid"
"Maserati"
"Maybach"
"Mazda"
"McLaren"
"Mercedes Benz"
"Mercury"
"Mini"
"Mitsubishi"
"Nikola"
"Nissan"
"Oldsmobile"
"Polestar"
"Pontiac"
"Porsche"
"Plymouth"
"RAM"
"Rivian"
"Rolls Royce"
"Saab"
"Saturn"
"Scion"
"Smart"
"Subaru"
"Suzuki"
"Tesla"
"Toyota"
"Volkswagen"
"Volvo"
Response Codes
Response Code | Definition |
---|---|
200 (OK) | The request was processed as expected, and the response includes some data. |
204 (No Content) | The request was processed as expected, but the response is empty. |
400 (Bad Request) | A parameter, format, or structure of the request is incorrect. |
401 (Unauthorized) | The authentication credentials are missing or incorrect. |
403 (Forbidden) | The provided credentials do not have access to this endpoint or resource. |
404 (Not Found) | Either the endpoint does not exist, or the requested resource does not exist. |
429 (Too Many Requests) | The number of requests have exceeded the rate limit, see Rate Limits. |
5XX | An uncaught server error has occurred. This usually indicates a system-level failure. Please contact us if you see this repeatedly. |
Errors
Sample error response:
{
"status_code": 400,
"message": "Field name 'vehicle.vin' must be a 17-character alphanumeric string."
}
The category of error will generally be indicated by the HTTP response code. Additionally, the API will attempt to return a human-readable error message.