Progressive
Quotes from the second-largest US auto insurer across every line it publishes — auto, the specialty vehicle band (motorcycle, boat, RV, ATV, snowmobile,…
Quotes from the second-largest US auto insurer across every line it publishes — auto, the specialty vehicle band (motorcycle, boat, RV, ATV, snowmobile, golf cart, PWC, classic car), home, renters, condo and mobile home, the agency-placed specialty products, and the commercial auto and small-business lines it leads the country in — plus the directory of independent agents who write them.
Domain: progressive.com
Also known as: Progressive, progressive, Progressive Insurance, Progressive Direct, Progressive Commercial
Prefer the capability
bowmark.insurance covers this provider and routes around it when it is having a bad day. Reach for this page when you need progressive.com specifically.
Call it directly
bowmark.providers.progressive.findAgent(query: ProgressiveAgentQuery, limit?: number): Promise<ProgressiveAgent[]>
bowmark.providers.progressive.getBusinessQuote(query: ProgressiveBusinessQuoteQuery): Promise<ProgressiveBusinessQuote>
bowmark.providers.progressive.getHomeownersQuote(query: ProgressiveHomeownersQuoteQuery): Promise<ProgressiveHomeownersQuote>
bowmark.providers.progressive.getRentersQuote(query: ProgressiveRentersQuoteQuery): Promise<ProgressiveRentersQuote>
bowmark.providers.progressive.getMotorcycleQuote(query: ProgressiveMotorcycleQuoteQuery): Promise<ProgressiveMotorcycleQuote>
bowmark.providers.progressive.getPwcQuote(query: ProgressivePwcQuoteQuery): Promise<ProgressivePwcQuote>
bowmark.providers.progressive.listHomeownersCompanies(query?: ProgressiveCarrierQuery, limit?: number): Promise<ProgressiveHomeCarrier[]>Functions
| Function | What it does |
|---|---|
findAgent | Finds the independent agencies appointed to sell Progressive near a ZIP, nearest first — name, street address, phone, coordinates, distance and the agency's own page. |
getBusinessQuote | Returns real small-business premiums from Progressive's commercial marketplace — a business owners policy, general liability, professional liability, workers' comp or business interruption… |
getHomeownersQuote | Returns real homeowners premiums for a property address — the panel of carriers Progressive brokers home through (Homesite, ASI, StillWater, Plymouth Rock…), each with its… |
getRentersQuote | Returns a real renters premium from Progressive for a residence address — the annual total, the same figure as a monthly equivalent, the deductible, every coverage the policy carries… |
getMotorcycleQuote | Returns real motorcycle premiums from Progressive, the largest US motorcycle insurer — every rate package the carrier offers for one bike and one rider, cheapest first, each with its… |
getPwcQuote | Returns real personal-watercraft premiums from Progressive for one jet ski and one operator — every rate package the carrier offers, cheapest first, each with its paid-in-full total, every… |
listHomeownersCompanies | Lists every carrier Progressive places property business with and what each one writes — the answer to "whose policy am I actually being sold", which a HomeQuote Explorer rate never states… |
Types
// Progressive's OWN shapes — not a capability contract.
type ProgressiveAgentProduct =
| "auto" | "auto-snapshot" | "atv" | "boat" | "commercial-auto" | "commercial-truck"
| "condo" | "dirt-bike" | "golf-cart" | "home" | "manufactured-home" | "moped"
| "motorcycle" | "renters" | "rv" | "sand-and-gravel" | "segway" | "snowmobile"
| "tow-truck" | "umbrella";
interface ProgressiveAgentQuery {
zip: string; // 5-digit US ZIP — the only required input
product?: ProgressiveAgentProduct; // the line the agency must be appointed to write; default "auto"
language?: "english" | "spanish"; // default "english"
}
// Nulls mean "the site does not report this for this agency", never "we failed to
// read it" — so an agency with no published phone is distinguishable from a bad parse.
interface ProgressiveAgent {
name: string;
street: string | null;
city: string | null;
state: string | null; // two-letter
zip: string | null; // the AGENCY's ZIP, not the searched one
address: string | null; // the one-line address as rendered
phone: string | null; // digits from the tel: link
latitude: number | null;
longitude: number | null;
distanceMiles: number | null; // from the searched ZIP, as the site computes it
topReferral: boolean; // Progressive's own placement badge, not our ranking
url: string | null; // the agency's page on progressiveagent.com
}
type ProgressivePropertyLine =
| "homeowners" | "renters" | "condo" | "dwelling-fire" | "manufactured-home";
interface ProgressiveCarrierQuery {
line?: ProgressivePropertyLine; // omit for every carrier across every line
}
// ── the specialty-lines quote (motorcycle) ────────────────────────────────────
// Progressive's specialty vehicle vocabulary, published by the quote flow itself.
// Boat, RV and snowmobile are deliberately ABSENT: they are separate flows, not a
// type away.
type ProgressiveMotorcycleType =
| "motorcycle" | "atv" | "dirt-bike" | "moped" | "golf-cart"
| "lsv" | "autocycle" | "compact-tractor" | "personal-transporter" | "e-bike";
interface ProgressiveMotorcycleQuoteQuery {
// The CALLER's own details. Progressive gates page 1 on a name and date of birth
// and the final page on an email, so these are required arguments — never a
// default, never ours. A bare ZIP mints a quote number but prices nothing.
identity: { firstName: string; lastName: string; dob: string; email: string; phone: string };
// This line rates below ZIP granularity, so the street line is a rating input.
address: { street: string; city: string; state?: string; zip: string };
bike: {
year: number | string;
make: string; // matched against Progressive's own book
model?: string; // "Road King" finds "FLHR ROAD KING"; omit for the first listed
type?: ProgressiveMotorcycleType; // default "motorcycle"
ownership?: "own" | "financed" | "shopping";
purchaseYear?: number | string; // default: the model year
antilockBrakes?: boolean;
modified?: boolean;
trike?: boolean;
};
rider: {
gender: "M" | "F";
maritalStatus: "single" | "married" | "separated" | "widowed";
yearsExperience: number; // one of the two largest levers on this line
motorcycleEndorsement: boolean; // the other one
safetyCourseTaken?: boolean;
licenseStatus?: "valid" | "permit" | "suspended" | "none" | "foreign";
education?: "some-high-school" | "high-school" | "some-college" | "associates"
| "bachelors" | "masters" | "doctorate";
residence?: "own" | "own-mobile" | "rent" | "live-with-parents";
accidentsOrClaims?: boolean;
ticketsOrViolations?: boolean;
currentlyInsured?: boolean;
priorProgressive?: boolean;
};
}
interface ProgressiveBillPlan {
schedule: string; // "pif" is paid-in-full; the rest are instalments
planType: string | null;
total: number; // what the policy costs on THIS plan — the comparable number
downPayment: number | null;
monthlyRate: number | null;
futurePayments: number | null;
}
interface ProgressiveCoverageLine {
code: string; // Progressive's own code, e.g. BIPDGP, UMUIM, MEDPAY
description: string | null; // the site's own plain-English gloss, when it publishes one
premium: number; // 0 = included at no cost or not selected, never a failed read
}
interface ProgressiveRatePackage {
code: string; // EC / CH / PL
name: string; // Basic / Choice / Plus
paidInFull: number | null; // the headline price; null when no such plan exists
billPlans: ProgressiveBillPlan[];
coverages: ProgressiveCoverageLine[];
}
interface ProgressiveMotorcycleQuote {
quoteNumber: string; // Progressive's own number for this application
state: string;
zip: string;
offeringId: string | null; // the rating version, e.g. DI_MC_OH_20260522
company: string | null; // which legal entity is quoting
// The bike as PROGRESSIVE resolved it — the cascade snaps to the carrier's book,
// so what was rated is not always what was asked for.
vehicle: {
year: string; make: string; model: string; typeCode: string;
engineSizeCc: number | null; makeSymbol: string | null;
};
packages: ProgressiveRatePackage[]; // cheapest first; tab order is not a ranking
}
// ── the personal-watercraft quote ─────────────────────────────────────────────
// The same marine wizard Progressive quotes BOATS through, reached by one product
// code, and it asks no craft-type question at all — a jet ski is distinguished from
// a bowrider purely by the make and model matched in its book. Hence no craft type
// here, and hence the shared ProgressiveRatePackage above.
interface ProgressivePwcQuoteQuery {
// The CALLER's own details. Never a default, never ours.
identity: { firstName: string; lastName: string; dob: string; email: string; phone: string };
address: { street: string; city: string; state?: string; zip: string }; // state derived from ZIP
craft: ProgressivePwcCraft;
operator: ProgressivePwcOperator;
}
interface ProgressivePwcCraft {
year: number | string; // the first step of Progressive's own cascade
make: string; // as its MARINE book spells it — SeaDoo, Yamaha, Kawasaki
model?: string; // omit to take the first model the book offers
marketValue: number; // whole dollars, motors included. THE largest lever — no default
purchaseYear?: number | string;
ownership?: "own" | "financed" | "shopping";
use?: "pleasure" | "racing" | "business" | "rented" | "primary-residence";
multipleOwners?: "none" | "one-other" | "two-or-more";
insureTrailer?: boolean; // Progressive bundles roadside assistance with it
originalOwner?: boolean;
performanceEnhanced?: boolean; // a real rating question on this estate
garagingZip?: string; // where it is kept in season; defaults to the address ZIP
}
interface ProgressivePwcOperator {
yearsExperience: number; // years operating a watercraft — no auto equivalent, so required
gender?: "M" | "F";
maritalStatus?: "single" | "married" | "separated" | "widowed";
safetyCourseTaken?: boolean; // a published discount on this line
licenseStatus?: "valid" | "permit" | "suspended" | "none" | "foreign";
education?: "some-high-school" | "high-school" | "some-college" | "associates"
| "bachelors" | "masters" | "doctorate";
residence?: "own" | "own-mobile" | "rent" | "other";
accidentsOrClaims?: boolean;
ticketsOrViolations?: boolean;
currentlyInsured?: boolean;
priorProgressive?: boolean;
association?: "none" | "us-power-squadron" | "usaa" | "uscg-auxiliary"; // MARINE bodies, not the bike ones
}
interface ProgressivePwcQuote {
quoteNumber: string;
state: string;
zip: string;
offeringId: string | null;
company: string | null;
// The craft as PROGRESSIVE resolved it — the cascade snaps to its own book.
craft: {
year: string; make: string; model: string;
propulsionType: string | null; // "N" is the jet drive every PWC carries; reported, not interpreted
marketValue: number | null; hullMaterial: string | null;
};
packages: ProgressiveRatePackage[]; // cheapest first
assumed: string[]; // every question answered on the caller's behalf
}
// ── the property quotes (homeowners, renters) ─────────────────────────────────
// Homeowners is BROKERED: Progressive hands the walk to a Bolt tenant and one call
// returns a multi-carrier comparison. Renters never leaves Progressive's own estate,
// so it is one carrier's real number.
interface ProgressiveHomeAddress {
street: string;
city: string;
state: string; // two-letter
zip: string; // 5-digit
}
interface ProgressiveHomeownersQuoteQuery {
// A homeowners policy rates on the STRUCTURE, so this is the one genuinely
// required input — Bolt resolves the whole property record from it.
address: ProgressiveHomeAddress;
// The CALLER's own details. The applicant page refuses to price without them.
identity: { firstName: string; lastName: string; dob: string; email: string; phone: string };
maritalStatus?: "single" | "married" | "separated" | "divorced" | "widowed"; // default "single"
effectiveDate?: string; // ISO YYYY-MM-DD; defaults to a week out
yearsAtAddress?: number; // default 5. Below 3 the site asks for a previous address
}
interface ProgressiveHomeCoverage {
name: string;
// The site's own RENDERED string ("$350,000", "Included", a percentage) — several
// lines are not dollar figures, and inventing a number for those would be a parse.
value: string | null;
}
interface ProgressiveHomePackage {
name: string; // Basic / Popular / Deluxe / Custom
premiumAnnual: number; // ANNUAL dollars — the site renders it with /yr
windHailIncluded: boolean | null; // inside this package, or carved out
coverages: ProgressiveHomeCoverage[];
}
interface ProgressiveHomeRate {
carrier: string; // the code Bolt rates under, e.g. "Homesite"
carrierDisplayName: string | null;
lineOfBusiness: string | null; // always "PersonalHome" here
packages: ProgressiveHomePackage[];
}
// What Bolt resolved FROM THE ADDRESS — what the rate was computed against, so a
// caller can see whether the price refers to their actual house. Null means the site
// did not report it, never that we failed to read it.
interface ProgressiveHomeProperty {
yearBuilt: number | null;
squareFootage: number | null;
typeOfDwelling: string | null;
stories: string | null;
constructionType: string | null;
roofType: string | null;
}
interface ProgressiveHomeownersQuote {
quoteNumber: string | null; // Bolt's own number, e.g. "0312-5497-6842"
address: ProgressiveHomeAddress;
property: ProgressiveHomeProperty;
rates: ProgressiveHomeRate[]; // one entry per carrier that returned a price
// Carriers asked that did NOT rate this risk. Empty rates plus a non-empty this
// is a DECLINED risk, which is a real answer and not a failure.
carriersNotRated: string[];
}
interface ProgressiveRentersAddress {
street: string;
aptNumber?: string;
city: string;
state: string;
zip: string;
}
interface ProgressiveRentersQuoteQuery {
address: ProgressiveRentersAddress;
// The CALLER's own details. NO phone — the renters wizard never asks for one — and
// never a Social Security number, which it asks for and is measured to rate without.
identity: { firstName: string; lastName: string; dob: string; email: string };
// The rating factors Progressive actually prices on, typed with documented
// defaults rather than left to whatever the page offers first.
maritalStatus?: "single" | "married" | "partnered" | "widowed" | "divorced"; // default "single"
residencyType?: "house" | "apartment" | "condo" | "duplex" | "mobileHome"; // default "apartment"
gatedCommunity?: boolean; // default false
hasCurrentResidencyInsurance?: boolean; // default false
claimsHistory?: number; // prior claims in the lookback, 0-3. Default 0
hasProgressiveAutoInsurance?: boolean; // multi-policy discount. Default false
effectiveDate?: string; // ISO YYYY-MM-DD; omitted by default, the wizard rates without it
}
interface ProgressiveRentersCoverage {
code: string; // Progressive's own code, e.g. perspr
label: string; // its own label, e.g. Personal Property
description: string | null;
limit: number | null; // null where the coverage is not expressed as a dollar limit
}
interface ProgressiveRentersBillPlan {
code: string; // Progressive's PaymentScheduleCode, e.g. M01 (paid in full)
total: number; // the whole policy on THIS plan, instalment fees included
downPayment: number; // equal to total on the paid-in-full plan
monthlyRate: number | null; // null on a paid-in-full plan
futurePayments: number;
includesInstallmentFee: boolean;
}
// A question this function answered on the caller's behalf, and with what.
// "site-default" means the first option the PAGE offered, because nothing here knows
// what the question means — every one of those is also a warning.
interface ProgressiveRentersAssumption {
property: string; // the wizard's own property name, e.g. MaritalStatus
value: string; // the value sent, in Progressive's own vocabulary
source: "argument" | "site-default";
}
interface ProgressiveRentersQuote {
address: ProgressiveRentersAddress;
carrier: string; // always Progressive — renters never leaves its estate
total: number; // the cheapest total on offer, i.e. the paid-in-full plan
monthlyEquivalent: number; // total / 12, for comparison against monthly-quoting sites
deductible: number | null; // pulled out of coverages because callers always want it
coverages: ProgressiveRentersCoverage[];
billPlans: ProgressiveRentersBillPlan[];
assumptions: ProgressiveRentersAssumption[];
warnings: string[];
}
// ── the small-business quote ──────────────────────────────────────────────────
// Progressive's small-business entry is a MARKETPLACE, not a single carrier: one
// application is rated by several enrolled carriers at once, so the answer is a list
// of priced offers with the carrier named on each. The cheapest is routinely not
// Progressive's own paper.
type ProgressiveBusinessLine =
| "bop" // business owners policy — the default
| "general-liability" | "professional-liability" | "workers-comp"
| "business-interruption";
// Commercial auto and cyber are NOT here: they resolve to entirely different
// applications on different hosts, so neither is a line of this one.
interface ProgressiveBusinessQuoteQuery {
// The CALLER's own details. The contact question set refuses to advance without a
// name, an email and a phone, and no rating endpoint sits ahead of it — so this is
// a required argument, never a default and never ours.
identity: { firstName: string; lastName: string; dob: string; email: string; phone: string };
businessName: string; // as it would go on the policy
// What the business DOES, in plain words ("accounting", "landscaping", "yoga
// studio"). Matched against Progressive's own ~1,500-entry NAICS taxonomy; the
// class it resolved to comes back in businessClass, because which class it rated
// you as is the single biggest lever on the price.
businessType: string;
// No state field: Progressive derives the rating state from the ZIP itself, and a
// second source for it could only disagree.
address: { street: string; street2?: string; city: string; zip: string };
line?: ProgressiveBusinessLine; // default "bop"
// The rating facts the carriers actually knock out on. All optional, all
// price-changing — whatever is omitted is reported in assumed rather than
// quietly guessed. Measured: omitting yearBuilt makes Chubb and Liberty Mutual
// decline the same submission the other three carriers price.
details?: {
yearBuilt?: number; squareFeet?: number; annualPayroll?: number;
annualRevenue?: number; employees?: number; roofYear?: number;
};
// An escape hatch for a carrier question the shape above does not model, keyed by
// the funnel's own question code (the codes appear in assumed).
answers?: Record<string, string>;
}
// One carrier's answer. A carrier that REFUSED is not dropped: "Liberty Mutual will
// not write this risk, and here is why" is an answer, and returning three rows where
// the site showed five would misreport the market.
interface ProgressiveBusinessQuoteOffer {
carrier: string; // "Homesite"
carrierCode: string; // "homesite"
quoteNumber: string | null; // the CARRIER's own number, for checking a price later
status: "quoted" | "declined" | "pending";
annualPremium: number | null;
monthlyPremium: number | null;
downPayment: number | null; // due up front, where the carrier publishes a plan
installments: number | null;
effectiveDate: string | null;
declineReasons: string[]; // the carrier's own words; empty when it priced
limits: { description: string; value: string }[];
disclaimer: string | null; // who underwrites and services the policy
retrieveUrl: string | null; // the carrier's own portal for this quote
}
interface ProgressiveBusinessQuote {
quoteNumber: string; // Progressive's reference, e.g. PQT-VS2-DVX
line: ProgressiveBusinessLine;
businessClass: { code: string | null; description: string }; // what was actually rated
state: string; // derived from the ZIP by Progressive
offers: ProgressiveBusinessQuoteOffer[]; // priced first, cheapest first; refusals after
// Every question the walk answered on the caller's behalf, as <code>=<answer>.
// The price is conditional on these, so they are part of the answer — a caller who
// cares about one passes it in details or answers and re-runs.
assumed: string[];
}
// Who actually underwrites the property policy Progressive sells you — the page's
// own answer to "whose paper is this", which no quote row states on its face.
interface ProgressiveHomeCarrier {
name: string; // as the directory writes it
lines: string[]; // every property line it is listed under
url: string | null; // where the directory links it
progressiveOwned: boolean | null; // Progressive's own paper, not a third party's;
// null = the directory linked nothing, so it does not say
}Examples
// Who can write motorcycle cover near me, closest first?
const agents = await bowmark.providers.progressive.findAgent({ zip: "44114", product: "motorcycle" }, 5);
return agents.map((a) => `${a.name} — ${a.address} (${a.distanceMiles} mi) ${a.phone ?? "no phone listed"}`);// Spanish-speaking agencies for a renters policy, excluding Progressive's paid placements.
const agents = await bowmark.providers.progressive.findAgent({
zip: "10001", product: "renters", language: "spanish",
});
return agents.filter((a) => !a.topReferral).slice(0, 10);