Bowmark AIdocs

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

FunctionWhat it does
findAgentFinds the independent agencies appointed to sell Progressive near a ZIP, nearest first — name, street address, phone, coordinates, distance and the agency's own page.
getBusinessQuoteReturns real small-business premiums from Progressive's commercial marketplace — a business owners policy, general liability, professional liability, workers' comp or business interruption…
getHomeownersQuoteReturns real homeowners premiums for a property address — the panel of carriers Progressive brokers home through (Homesite, ASI, StillWater, Plymouth Rock…), each with its…
getRentersQuoteReturns 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…
getMotorcycleQuoteReturns 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…
getPwcQuoteReturns 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…
listHomeownersCompaniesLists 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);
insuranceInsurance — the capability this provider backs.
insurifyAlso backs the same capability.
naicAlso backs the same capability.
statefarmAlso backs the same capability.