Bowmark AIdocs

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

FunctionWhat it does
searchSearches Extra Space Storage's live facility inventory the way its own homepage locator does.
getFacilityReads ONE Extra Space Storage facility in full — everything its own facility page is built from, in one call.
checkAvailabilityChecks 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 })) };