Discount Tire
America's largest independent tire and wheel retailer — which tires and wheels actually fit a given vehicle, what they cost, whether they are in stock…
America's largest independent tire and wheel retailer — which tires and wheels actually fit a given vehicle, what they cost, whether they are in stock near a ZIP, when a store can install them, and the rebates running on them. Three functions are built: getProduct reads one tire or wheel by its sku (name, brand, size, product type, price, product URL), checkStock answers whether a specific tire or wheel is gettable near a ZIP, store or coordinate, and on what date, and searchTiresBySize searches the tires Discount Tire sells in a given size (or staggered pair) with prices, ratings and the site's pagination. The other twelve are declared stubs.
Domain: discounttire.com
Also known as: Discount Tire, discounttire.com, America's Tire, americastire.com
Call it directly
bowmark.providers.discounttire.getProduct(idOrUrl: string): Promise<DiscounttireProduct>
bowmark.providers.discounttire.checkStock(idOrUrl: string, location: { zip: string } | { storeCode: string } | { latitude: number; longitude: number }): Promise<DiscounttireStock>
bowmark.providers.discounttire.searchTiresBySize(args: { front: { diameter: string; width: string; aspectRatio: string }; rear?: { diameter: string; width: string; aspectRatio: string }; location: { zip: string } | { storeCode: string } | { latitude: number; longitude: number }; pageNumber: number; pageSize: number }): Promise<DiscounttireTireSizeSearch>Functions
| Function | What it does |
|---|---|
getProduct | Reads one tire or wheel product by its sku — name, brand, size, product type, product URL, and price (value and formatted string). Takes the numeric sku the site's product URLs end in… |
checkStock | Answers whether one specific tire or wheel is actually gettable near a place, and when — the site's own availability sentence for the store it resolves to ("Available as soon as Wednesday,… |
searchTiresBySize | Searches the tires Discount Tire sells in a given size (or staggered pair — front and a different rear) and returns what is in stock near a place with prices and star ratings. |
Types
interface discounttireRow {
id: string;
}
/** Where the answer is for. No default: the only location the site would infer
* is our own exit IP's, which is not the caller's. */
type DiscounttireLocation =
| { storeCode: string }
| { zip: string }
| { latitude: number; longitude: number };
/** One tire or wheel, as the site's own product read returns it. Price is
* global across stores (verified at three AZ stores on the same sku on the
* same day, 2026-08-07), so `getProduct` takes no storeCode even though
* productByCode itself requires one. */
interface DiscounttireProduct {
code: string;
name: string | null;
brand: string | null;
size: string | null;
productType: string | null;
url: string | null;
price: { value: number | null; formatted: string | null } | null;
source: string;
}
interface DiscounttireStoreRef {
code: string;
name: string | null;
streetAddress: string | null;
city: string | null;
state: string | null;
postalCode: string | null;
phone: string | null;
/** Miles from the point asked about; null when the store was named by code. */
distanceMiles: number | null;
}
interface DiscounttireAvailability {
/** The site's own sentence, verbatim — "Available as soon as Wednesday, Aug. 5
* at My Store", "Product has been discontinued". The field to show a person. */
message: string | null;
/** The site's own ordering over those messages, lower is better. Passed
* through for comparison, never interpreted. */
messageRank: number | null;
/** ISO date the site promises it AT this store; null when it promises none. */
availableDate: string | null;
daysOut: number | null;
/** "On the shelf right now" — measured 0 even on same-day-available products,
* so read `message`/`availableDate` for "can I get it". */
storeQuantity: number | null;
/** Varies by REGION rather than by store. */
regionalQuantity: number | null;
}
interface DiscounttireStock {
product: {
code: string;
name: string | null;
brand: string | null;
size: string | null;
productType: string | null;
url: string | null;
price: { value: number | null; formatted: string | null } | null;
};
/** The store the answer is ABOUT — read it back rather than assuming the
* argument was honoured: a zip resolves to whichever store is nearest. */
store: DiscounttireStoreRef;
availability: DiscounttireAvailability;
/** The site's own pick of a better nearby store, when it names one. */
alsoAt: {
storeCode: string;
streetAddress: string | null;
availability: DiscounttireAvailability;
} | null;
/** Other stores around the resolved point. Availability is regional, so these
* are where to GO, not separate stock positions. */
nearbyStores: DiscounttireStoreRef[];
source: string;
}
/** A tire size stamped on the sidewall — `225/45R17`. Strings, because the
* site's schema declares every field as `String!`. */
type TireSize = {
diameter: string;
width: string;
aspectRatio: string;
};
/** One tire product row from the size search. Same shape the site's own
* `getProduct` reads back, except price + sku + name + brand, plus the
* site's own star rating. */
interface DiscounttireTireResult {
code: string;
name: string | null;
brand: string | null;
size: string | null;
productType: string | null;
url: string | null;
price: { value: number | null; formatted: string | null } | null;
/** `0.0`-`5.0`; null when the line has no reviews. */
averageRating: number | null;
}
/** What `searchTiresBySize` returns. */
interface DiscounttireTireSizeSearch {
/** The storeCode the operation was anchored to (a zip resolves to the
* site's nearest store). */
storeCode: string;
pagination: {
currentPage: number | null;
numberOfPages: number | null;
pageSize: number | null;
totalNumberOfResults: number | null;
};
/** The site's facet names — `Brands`, `Aspect Ratio`, `Price Range`, … */
facets: string[];
results: DiscounttireTireResult[];
source: string;
}