Extra Space Storage
Extra Space Storage — self-storage facility search and detail.
Extra Space Storage — self-storage facility search and detail. search takes a US city or ZIP and returns the nearby facilities its own locator would, nearest first, each with its address, distance, amenities and the real monthly price of the cheapest unit in every size it carries. getFacility reads one of them in full: street address, both phone lines, office and gate-access hours, what its units offer, starting prices, rating, driving directions and the nearby facilities. checkAvailability checks one specific unit size at one facility and returns every unit class that matches it, each with its own live availability and price. Published deals are declared but not built yet.
Domain: extraspace.com
Also known as: Extra Space Storage, Extra Space, ExtraSpace
Call it directly
bowmark.providers.extraspace.search(query: string, options?: ExtraspaceSearchOptions): Promise<ExtraspaceSearchResult>
bowmark.providers.extraspace.getFacility(storeId: number | string): Promise<ExtraspaceFacilityDetail>
bowmark.providers.extraspace.checkAvailability(storeId: number | string, unitSize: string): Promise<ExtraspaceAvailabilityResult>Functions
| Function | What it does |
|---|---|
search | Searches Extra Space Storage's live facility inventory the way its own homepage locator does. |
getFacility | Reads ONE Extra Space Storage facility in full — everything its own facility page is built from, in one call. |
checkAvailability | Checks current availability and price for one unit SIZE (e.g. "10x10", "5x15" — width x depth, in feet) at one Extra Space Storage facility. |
Types
interface ExtraspaceSearchResult {
query: string;
totalFound: number;
facilities: ExtraspaceFacility[];
}
interface ExtraspaceFacility {
storeId: number;
number: number | null;
name: string;
street: string;
city: string;
state: string;
stateAbbreviation: string;
postalCode: string;
country: string;
latitude: number | null;
longitude: number | null;
distanceMiles: number | null;
phone: string | null;
startingAt: ExtraspaceStartingPrices;
units: ExtraspaceUnit[];
features: ExtraspaceFeatures;
rating: { average: number; count: number } | null;
isComingSoon: boolean;
mapUrl: string | null;
}
/** Whole US dollars per month; null where the facility does not carry that size. */
interface ExtraspaceStartingPrices {
starting: number | null;
small: number | null;
medium: number | null;
large: number | null;
parking: number | null;
}
interface ExtraspaceUnit {
sizeDisplay: string;
sizeClass: string;
widthFeet: number | null;
depthFeet: number | null;
squareFeet: number | null;
streetRate: number | null;
webRate: number | null;
promotions: string[];
available: boolean;
features: string[];
}
interface ExtraspaceFeatures {
climateControlled: boolean;
driveUpAccess: boolean;
indoor: boolean;
enclosedStorage: boolean;
vehicleStorage: boolean;
rvParkingCovered: boolean;
rvParkingUncovered: boolean;
wineStorage: boolean;
managerLivesOnSite: boolean;
}
interface ExtraspaceSearchOptions {
climateControlled?: boolean;
driveUp?: boolean;
vehicleStorage?: boolean;
unitSize?: string;
limit?: number;
}
interface ExtraspaceFacilityDetail {
storeId: number;
number: number | null;
name: string;
street: string;
street2: string | null;
city: string;
state: string;
stateAbbreviation: string;
postalCode: string;
latitude: number | null;
longitude: number | null;
phone: string | null;
existingCustomerPhone: string | null;
timeZone: string | null;
manager: string | null;
/** The site's own prose — and the only place it states its security features. */
description: string | null;
officeHours: ExtraspaceHours | null;
gateHours: ExtraspaceHours | null;
hours: ExtraspaceHours[];
access: ExtraspaceAccess;
/** Match on `code`; `display` is presentation copy the site can reword. */
unitFeatures: ExtraspaceUnitFeature[];
startingAt: ExtraspaceStartingPrices;
rating: { average: number; count: number } | null;
reviewCount: number;
unitClassCount: number;
directions: ExtraspaceDirections;
mapUrl: string | null;
imageUrls: string[];
isComingSoon: boolean;
isGrandOpening: boolean;
isNewlyBuilt: boolean;
isNewManagement: boolean;
hasAvailableInventory: boolean;
nearby: ExtraspaceNearbyFacility[];
}
/** Wall-clock in the facility's own `timeZone`; a day is "09:30 AM - 06:00 PM",
* "Closed", or null where the facility publishes nothing. */
interface ExtraspaceHours {
type: string;
monday: string | null;
tuesday: string | null;
wednesday: string | null;
thursday: string | null;
friday: string | null;
saturday: string | null;
sunday: string | null;
}
interface ExtraspaceAccess {
twentyFourHour: boolean;
extendedHours: boolean;
kiosk: boolean;
vehicleParking: boolean;
}
interface ExtraspaceDirections {
north: string | null;
south: string | null;
east: string | null;
west: string | null;
landmarks: string | null;
}
interface ExtraspaceUnitFeature {
/** The site's stable identifier, e.g. "DriveUpAccess", "OutdoorRVUncovered". */
code: string;
/** What the site prints, e.g. "Drive-Up Access". */
display: string;
}
interface ExtraspaceNearbyFacility {
/** Feed straight back into getFacility; null only if the site omitted it. */
storeId: number | null;
number: number | null;
name: string;
distanceMiles: number | null;
}
interface ExtraspaceAvailabilityResult {
storeId: number;
/** Normalized the way search's unitSize option is, e.g. "10x10". */
unitSize: string;
/** Every unit CLASS matching the requested size; empty if the facility carries none. */
matches: ExtraspaceUnitAvailability[];
}
interface ExtraspaceUnitAvailability {
sizeDisplay: string;
sizeClass: string;
widthFeet: number | null;
depthFeet: number | null;
squareFeet: number | null;
/** Whether the site is currently offering THIS class for rent. */
available: boolean;
unitsAvailable: number | null;
streetRate: number | null;
webRate: number | null;
promotions: string[];
features: string[];
}Examples
// What is the cheapest 10x10 near Austin, and what does it actually cost online?
const { facilities } = await bowmark.providers.extraspace.search("Austin, TX", { unitSize: "10x10", limit: 5 });
return facilities.map((f) => ({
name: f.name,
address: `${f.street}, ${f.city} ${f.stateAbbreviation}`,
miles: f.distanceMiles,
tenByTen: f.units.find((u) => u.sizeDisplay.replace(/[^0-9x]/g, "") === "10x10") ?? null,
startingAt: f.startingAt.starting,
}));// Climate-controlled storage near 90210, cheapest first rather than nearest first.
const { facilities, totalFound } = await bowmark.providers.extraspace.search("90210", { climateControlled: true });
const priced = facilities.filter((f) => f.startingAt.starting !== null);
priced.sort((a, b) => a.startingAt.starting - b.startingAt.starting);
return { totalFound, cheapest: priced.slice(0, 5).map((f) => ({ name: f.name, price: f.startingAt.starting, miles: f.distanceMiles })) };