Integration guide for RTB ping/post and click-lead endpoints
The Truvo Buyer API supports two integration patterns:
All production endpoints require an API key sent via the X-API-Key header:
X-API-Key: your-vendor-api-key
Keys are provisioned per-vendor. Contact tech@truvoinsure.com to request credentials.
https://buyer.truvoinsure.com
pingId.
pingId. We confirm acceptance.
Pings expire after 30 minutes. Posts received after expiry will be rejected.
POST /api/quotewizard/ping
curl -X POST https://buyer.truvoinsure.com/api/quotewizard/ping \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{
"Contact": {
"FirstName": "Jane",
"LastName": "Doe",
"State": "TX",
"Zip": "75001",
"City": "Dallas"
},
"Drivers": [{
"BirthDate": "1990-05-15",
"Gender": "Female",
"LicenseStatus": "Valid",
"CreditRating": "Good"
}],
"Vehicles": [{
"Year": 2021,
"Make": "Honda",
"Model": "Civic"
}],
"Insurance": {
"CurrentlyInsured": "Yes",
"InsuranceCarrier": "GEICO"
},
"Additional": {
"OwnHome": "Yes",
"DriverCount": 1,
"VehicleCount": 1
},
"Tracking": {
"Test": false,
"LeadId": "ext-lead-123",
"ConsumerIP": "203.0.113.42"
}
}'
import requests
resp = requests.post(
"https://buyer.truvoinsure.com/api/quotewizard/ping",
headers={
"X-API-Key": "your-api-key",
"Content-Type": "application/json",
},
json={
"Contact": {"FirstName": "Jane", "LastName": "Doe", "State": "TX", "Zip": "75001", "City": "Dallas"},
"Drivers": [{"BirthDate": "1990-05-15", "Gender": "Female", "LicenseStatus": "Valid", "CreditRating": "Good"}],
"Vehicles": [{"Year": 2021, "Make": "Honda", "Model": "Civic"}],
"Insurance": {"CurrentlyInsured": "Yes", "InsuranceCarrier": "GEICO"},
"Additional": {"OwnHome": "Yes", "DriverCount": 1, "VehicleCount": 1},
"Tracking": {"Test": False, "LeadId": "ext-lead-123", "ConsumerIP": "203.0.113.42"},
},
)
print(resp.json())
# {"status": "SUCCESS", "bid": 5.0, "pingId": "QW-M1XYZ-A3B2C1"}
const resp = await fetch("https://buyer.truvoinsure.com/api/quotewizard/ping", {
method: "POST",
headers: {
"X-API-Key": "your-api-key",
"Content-Type": "application/json",
},
body: JSON.stringify({
Contact: { FirstName: "Jane", LastName: "Doe", State: "TX", Zip: "75001", City: "Dallas" },
Drivers: [{ BirthDate: "1990-05-15", Gender: "Female", LicenseStatus: "Valid", CreditRating: "Good" }],
Vehicles: [{ Year: 2021, Make: "Honda", Model: "Civic" }],
Insurance: { CurrentlyInsured: "Yes", InsuranceCarrier: "GEICO" },
Additional: { OwnHome: "Yes", DriverCount: 1, VehicleCount: 1 },
Tracking: { Test: false, LeadId: "ext-lead-123", ConsumerIP: "203.0.113.42" },
}),
});
const data = await resp.json();
// { status: "SUCCESS", bid: 5.0, pingId: "QW-M1XYZ-A3B2C1" }
{
"status": "SUCCESS",
"bid": 5.00,
"pingId": "QW-M1XYZ-A3B2C1"
}
A bid of 0 means no bid — do not send a post for this lead.
POST /api/quotewizard/post
Include the PingId from the ping response along with the full lead payload:
curl -X POST https://buyer.truvoinsure.com/api/quotewizard/post \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{
"PingId": "QW-M1XYZ-A3B2C1",
"Contact": {
"FirstName": "Jane",
"LastName": "Doe",
"Email": "jane.doe@example.com",
"Phone": "2145551234",
"Address": "123 Main St",
"City": "Dallas",
"State": "TX",
"Zip": "75001"
},
"Drivers": [{
"BirthDate": "1990-05-15",
"Gender": "Female",
"LicenseStatus": "Valid",
"MaritalStatus": "No",
"CreditRating": "Good",
"DUI": "No",
"DoesRequireSR22": "No",
"IncidentCount": 0
}],
"Vehicles": [{
"VIN": "1HGCV1F34LA000001",
"Year": 2021,
"Make": "Honda",
"Model": "Civic",
"SubModel": "LX"
}],
"Insurance": {
"CurrentlyInsured": "Yes",
"InsuranceCarrier": "GEICO",
"InsuredTimeframe": "TwelveOrMoreMonths"
},
"Additional": {
"OwnHome": "Yes",
"AutoHomeBundle": "No",
"MilitaryStatus": "No",
"DriverCount": 1,
"VehicleCount": 1
},
"Tracking": {
"Test": false,
"LeadId": "ext-lead-123",
"TrustedForm": "https://cert.trustedform.com/abc123",
"ConsumerIP": "203.0.113.42",
"SubId": "campaign-456"
}
}'
{"status": "SUCCESS"}
Or if rejected:
{"status": "REJECT"}
| Field | Type | Required | Description |
|---|---|---|---|
| FirstName | string | Yes | Consumer first name |
| LastName | string | Yes | Consumer last name |
| string | Post only | Email address | |
| Phone | string | Post only | Phone number (digits only) |
| Address | string | No | Street address |
| City | string | No | City |
| State | string | Yes | Two-letter state code |
| Zip | string | Yes | 5-digit zip code |
| Field | Type | Required | Description |
|---|---|---|---|
| BirthDate | string | Yes | YYYY-MM-DD format |
| Age | integer | No | Driver age |
| Gender | string | Yes | "Male" or "Female" |
| LicenseStatus | string | No | "Valid", "Permit", "Temporary", "Suspended" |
| MaritalStatus | string | No | "Yes" (married) or "No" (single) |
| CreditRating | string | No | "Excellent", "Good", "Fair", "Poor" |
| DUI | string | No | "Yes" or "No" |
| DoesRequireSR22 | string | No | "Yes" or "No" |
| IncidentCount | integer | No | Number of incidents in last 3 years |
| Field | Type | Required | Description |
|---|---|---|---|
| VIN | string | No | 17-character VIN |
| Year | integer | Yes | Model year |
| Make | string | Yes | Vehicle make |
| Model | string | Yes | Vehicle model |
| SubModel | string | No | Vehicle submodel / trim |
| Field | Type | Required | Description |
|---|---|---|---|
| CurrentlyInsured | string | No | "Yes" or "No" |
| InsuranceCarrier | string | No | Current carrier name |
| InsuredTimeframe | string | No | "LessThanSixMonths", "SixToElevenMonths", "TwelveOrMoreMonths", etc. |
| Field | Type | Required | Description |
|---|---|---|---|
| OwnHome | string | No | "Yes" or "No" |
| AutoHomeBundle | string | No | "Yes" or "No" |
| MilitaryStatus | string | No | "Yes", "No", or "Unknown" |
| DriverCount | integer | No | Total number of drivers |
| VehicleCount | integer | No | Total number of vehicles |
| Field | Type | Required | Description |
|---|---|---|---|
| Test | boolean | No | Set true for test leads (bid = $0) |
| LeadId | string | No | Your external lead identifier |
| TrustedForm | string | No | TrustedForm certificate URL |
| ConsumerIP | string | No | Consumer's IP address |
| SubId | string | No | Campaign / sub-source identifier |
| Status | Meaning |
|---|---|
| 200 | Success — check status field in response body |
| 401 | Missing API key |
| 403 | Invalid API key |
| 404 | Unknown vendor |
| 422 | Validation error — payload doesn't match schema |
| 500 | Server error — retry with exponential backoff |
Post responses use {"status": "REJECT"} (HTTP 200) for business-logic rejections
(expired ping, duplicate post, etc.) — not HTTP error codes.
Set "Test": true in the Tracking object to send test pings. Test pings always return a bid of $0.00 and won't create real leads.