WebSelfStorage Affiliate API

The WebSelfStorage Affiliate API is the only machine-readable contract AMERCO publishes. Operated by eMove, Inc. d/b/a U-Haul Self-Storage Affiliate Network, it gives an independent self-storage operator programmatic access to their own facility: location profile, unit types and rates, live move-in availability and cost, rent roll, waiting list, reviews, images, a hosted payment portal URL, and two write operations — reservation and move-in commit. REST over HTTPS, described by OpenAPI 3.0.1, versions v4 (current) and v3, authenticated with an affiliate access token in the Authorization header. Access is a benefit of the U-Haul Self-Storage Affiliate Network relationship; there is no self-service sign-up and no published pricing for API access.

Operations 13

GET /v4/test Simulates a success
GET /v4/error Simulates an error
GET /v4/locations Lists all entities to which you have access
GET /v4/location/{entity} Returns information about the location
GET /v4/location/{entity}/rentroll Returns the Rent Roll for an Entity.
GET /v4/location/{entity}/waitinglist Returns the Waiting List for an Entity.
GET /v4/location/{entity}/reviews Lists reviews for the location
GET /v4/location/{entity}/images Lists images for the location
POST /v4/reservation/{entity} Makes a reservation at the location
GET /v4/paymentPortalUrl/{entity} Returns the payment portal's URL
GET /v4/movein/{entity} Gets the available self move in units for a given entity
POST /v4/movein/{entity} Move in a unit at a given location
GET /v4/movein/{entity}/cost Gets the move in cost for a given entity and unit

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/webselfstorage"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

amerco-webselfstorage-affiliate-api-v4-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: WebSelfStorage.AffiliateAPI
  version: v4
paths:
  /v4/test:
    get:
      tags:
      - WssApiV4
      summary: Simulates a success
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
  /v4/error:
    get:
      tags:
      - WssApiV4
      summary: Simulates an error
      responses:
        '200':
          description: Success
  /v4/locations:
    get:
      tags:
      - WssApiV4
      summary: Lists all entities to which you have access
      responses:
        '200':
          description: '"Successfully returns all locations!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationsResponse'
  /v4/location/{entity}:
    get:
      tags:
      - WssApiV4
      summary: Returns information about the location
      parameters:
      - name: entity
        in: path
        description: String value of the location entity for which to return information
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: '"Successfully returns location info!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationResponse'
        '400':
          description: '"No locations found or an error occurred for the requested entity"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationResponse'
  /v4/location/{entity}/rentroll:
    get:
      tags:
      - WssApiV4
      summary: Returns the Rent Roll for an Entity.
      parameters:
      - name: entity
        in: path
        description: String value of the location entity for which to return information
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: '"Successfully returns rent roll for an entity!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RentRollResponse'
        '400':
          description: '"Request for entity failed or request failed to find any rent roll"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
        '500':
          description: '"An unknown error occurred on the server"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
  /v4/location/{entity}/waitinglist:
    get:
      tags:
      - WssApiV4
      summary: Returns the Waiting List for an Entity.
      parameters:
      - name: entity
        in: path
        description: String value of the location entity for which to return information
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: '"Successfully returns waiting list for an entity!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WaitingListResponse'
        '400':
          description: '"Request for entity failed or request failed to find any waiting list items"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WaitingListResponse'
        '500':
          description: '"An unknown error occurred on the server"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
  /v4/location/{entity}/reviews:
    get:
      tags:
      - WssApiV4
      summary: Lists reviews for the location
      parameters:
      - name: entity
        in: path
        description: String value of the location entity for which to return information
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: '"Returns list of reviews for the location!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationReviewsResponse'
        '400':
          description: '"Request for entity failed"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationReviewsResponse'
  /v4/location/{entity}/images:
    get:
      tags:
      - WssApiV4
      summary: Lists images for the location
      parameters:
      - name: entity
        in: path
        description: String value of the location entity for which to return information
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: '"Returns lists of images for the location!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationImagesResponse'
        '400':
          description: '"Request for entity failed"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationImagesResponse'
  /v4/reservation/{entity}:
    post:
      tags:
      - WssApiV4
      summary: Makes a reservation at the location
      parameters:
      - name: entity
        in: path
        description: String value of the location entity for which to return information
        required: true
        schema:
          type: integer
          format: int32
      requestBody:
        description: Mandatory - as described in the example request
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReservationRequest'
      responses:
        '200':
          description: '"Returns the reservation details!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReservationResponse'
        '400':
          description: '"Invalid PaymentInfo or ReservationDay"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvalidParameterResult'
        '500':
          description: '"An unknown server error occurred"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
  /v4/paymentPortalUrl/{entity}:
    get:
      tags:
      - WssApiV4
      summary: Returns the payment portal's URL
      parameters:
      - name: entity
        in: path
        description: String value of the location entity for which to return information
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: '"Successfully returns payment portal URL!"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentPortalUrlResponse'
        '400':
          description: '"Invalid location, locationId, or undefined payment url"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
        '500':
          description: '"An unknown server error occurred"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
  /v4/movein/{entity}:
    get:
      tags:
      - WssApiV4
      summary: Gets the available self move in units for a given entity
      parameters:
      - name: entity
        in: path
        description: ''
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: '"Successfully returns available units for a move in"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AvailableUnitResponse'
        '400':
          description: '"Invalid request"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AvailableUnitResponse'
        '500':
          description: '"An unknown server error occurred"'
    post:
      tags:
      - WssApiV4
      summary: Move in a unit at a given location
      parameters:
      - name: entity
        in: path
        description: ''
        required: true
        schema:
          type: integer
          format: int32
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MoveInRequest'
      responses:
        '200':
          description: '"Successfully returns move in confirmation"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MoveInResponse'
        '400':
          description: '"Invalid payment info or inputs"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MoveInResponse'
        '500':
          description: '"An unknown server error occurred"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
  /v4/movein/{entity}/cost:
    get:
      tags:
      - WssApiV4
      summary: Gets the move in cost for a given entity and unit
      parameters:
      - name: entity
        in: path
        description: ''
        required: true
        schema:
          type: integer
          format: int32
      - name: UnitId
        in: query
        schema:
          type: string
          format: uuid
      - name: InsuranceId
        in: query
        schema:
          type: string
          format: uuid
      - name: ExpectedMoveInDate
        in: query
        schema:
          type: string
          format: date-time
      - name: IsTaxExempt
        in: query
        schema:
          type: boolean
      - name: TaxExemptNumber
        in: query
        schema:
          type: string
      - name: OneMonthFreeDiscount
        in: query
        schema:
          type: boolean
      responses:
        '500':
          description: '"An unknown server error occurred"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaseResponse'
        '200':
          description: '"Successfully returns move in cost for a unit"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MoveInCostResponse'
        '400':
          description: '"Invalid request"'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MoveInCostResponse'
components:
  schemas:
    Address:
      type: object
      properties:
        addressLine1:
          type: string
          nullable: true
        addressLine2:
          type: string
          nullable: true
        city:
          type: string
          nullable: true
        country:
          type: string
          nullable: true
        county:
          type: string
          nullable: true
        destinationLatitude:
          type: number
          format: double
        destinationLongitude:
          type: number
          format: double
        destinationState:
          type: string
          nullable: true
        formattedAddress:
          type: string
          nullable: true
        location:
          $ref: '#/components/schemas/LocationLatLong'
        originLatitude:
          type: number
          format: double
        originLongitude:
          type: number
          format: double
        postalCode:
          type: string
          nullable: true
        state:
          type: string
          nullable: true
      additionalProperties: false
    AvailableUnitResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        availableUnits:
          type: array
          items:
            $ref: '#/components/schemas/SelfMoveInUnit'
          nullable: true
      additionalProperties: false
    BaseResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
      additionalProperties: false
    Coupon:
      type: object
      properties:
        description:
          type: string
          nullable: true
        instructions:
          type: string
          nullable: true
      additionalProperties: false
    Customer:
      type: object
      properties:
        firstName:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        lastName:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        address1:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        address2:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        city:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        state:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        zip:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        phone:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
      additionalProperties: false
    DayOfTheWeek:
      type: object
      properties:
        close:
          type: string
          nullable: true
        isOpen:
          type: boolean
        open:
          type: string
          nullable: true
      additionalProperties: false
    FacilityFeature:
      type: object
      properties:
        description:
          type: string
          nullable: true
        imageUrl:
          type: string
          nullable: true
      additionalProperties: false
    HoursOfOperation:
      type: object
      properties:
        gate:
          $ref: '#/components/schemas/WeeklyHours'
        office:
          $ref: '#/components/schemas/WeeklyHours'
      additionalProperties: false
    InsuranceCoverageTypesEnum:
      enum:
      - SafeStor
      - HomeownersNoInformation
      - Homeowners
      - DeclineAllInsuranceOptions
      type: string
    InsuranceOption:
      type: object
      properties:
        description:
          type: string
          nullable: true
        due:
          type: number
          format: double
        insuranceId:
          type: string
          format: uuid
        monthlyRate:
          type: number
          format: double
        percentage:
          type: number
          format: double
        quantity:
          type: integer
          format: int32
        selected:
          type: boolean
        tax:
          type: number
          format: double
        total:
          type: number
          format: double
        insuranceCoverageType:
          $ref: '#/components/schemas/InsuranceCoverageTypesEnum'
      additionalProperties: false
    InvalidParameterResult:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        parameter:
          type: string
          nullable: true
        reason:
          type: string
          nullable: true
      additionalProperties: false
    LocationFeature:
      type: object
      properties:
        description:
          type: string
          nullable: true
      additionalProperties: false
    LocationImagesResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        imageLinks:
          type: array
          items:
            type: string
          description: Optional, present only when at least one image is found without any errors!
          nullable: true
      additionalProperties: false
    LocationInformation:
      type: object
      properties:
        address:
          $ref: '#/components/schemas/Address'
        allowsReservations:
          type: boolean
        coupons:
          type: array
          items:
            $ref: '#/components/schemas/Coupon'
          nullable: true
        facilityFeatures:
          type: array
          items:
            $ref: '#/components/schemas/FacilityFeature'
          nullable: true
        hoursOfOperation:
          $ref: '#/components/schemas/HoursOfOperation'
        locationFeatures:
          type: array
          items:
            $ref: '#/components/schemas/LocationFeature'
          nullable: true
        locationServices:
          type: array
          items:
            $ref: '#/components/schemas/LocationService'
          nullable: true
        name:
          type: string
          nullable: true
        phone:
          type: string
          nullable: true
        reservationDates:
          type: array
          items:
            type: string
          nullable: true
        reservationNotBelowPercentage:
          type: string
          nullable: true
        reservationNotBelowTotalUnits:
          type: string
          nullable: true
        reviewFee:
          type: number
          format: double
        units:
          type: array
          items:
            $ref: '#/components/schemas/UnitType'
          nullable: true
      additionalProperties: false
    LocationLatLong:
      type: object
      properties:
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
      additionalProperties: false
    LocationResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        location:
          $ref: '#/components/schemas/LocationInformation'
      additionalProperties: false
    LocationReviewsResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        reviews:
          type: array
          items:
            $ref: '#/components/schemas/WssRating'
          description: Optional, present only when at least one entity is found without any errors!
          nullable: true
      additionalProperties: false
    LocationService:
      type: object
      properties:
        amount:
          type: number
          format: double
        description:
          type: string
          nullable: true
        locationServiceNumber:
          type: string
          nullable: true
        taxable:
          type: string
          nullable: true
      additionalProperties: false
    LocationsResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        entities:
          type: array
          items:
            type: integer
            format: int32
          description: Optional, present only when at least one entity is found without any errors!
          nullable: true
      additionalProperties: false
    MoveInCostBreakDown:
      type: object
      properties:
        discountedRent:
          type: number
          format: double
        discountedTaxAmount:
          type: number
          format: double
        fees:
          type: number
          format: double
        feesTax:
          type: number
          format: double
        insurance:
          type: number
          format: double
        insuranceTax:
          type: number
          format: double
        moveInDeposit:
          type: number
          format: double
        moveInDepositTax:
          type: number
          format: double
        rent:
          type: number
          format: double
        rentTax:
          type: number
          format: double
        reservationDepositCredit:
          type: number
          format: double
        retail:
          type: number
          format: double
        retailTax:
          type: number
          format: double
      additionalProperties: false
    MoveInCostResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        costBreakDown:
          $ref: '#/components/schemas/MoveInCostBreakDown'
        totalCost:
          type: number
          format: double
      additionalProperties: false
    MoveInRequest:
      type: object
      properties:
        unitID:
          type: string
          format: uuid
        insuranceId:
          type: string
          format: uuid
        gatePassword:
          type: string
          nullable: true
        payAmount:
          type: number
          format: double
        oneMonthFreeDiscount:
          type: boolean
        moveInDate:
          type: string
          format: date-time
        isTaxExempt:
          type: boolean
        taxNumber:
          type: string
          nullable: true
        saveCardForFutureUse:
          type: boolean
        enrollIntoAutopay:
          type: boolean
        paymentInfo:
          $ref: '#/components/schemas/PaymentInfo'
        alternatePhoneNumber:
          type: string
          nullable: true
        alternateContact:
          $ref: '#/components/schemas/Customer'
      additionalProperties: false
    MoveInResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        contractNumber:
          type: string
          nullable: true
        unitNumbers:
          type: array
          items:
            type: string
          nullable: true
        gatePassword:
          type: string
          nullable: true
        moveInDirections:
          type: string
          nullable: true
        rentalAgreementHtml:
          type: string
          nullable: true
      additionalProperties: false
    PaymentInfo:
      type: object
      properties:
        firstName:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        lastName:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        address1:
          type: string
          description: Required - Will throw validation failures if absent! Must contain at least 1 letter
            and 1 digit (e.g. 123 Main St)
          nullable: true
        address2:
          type: string
          nullable: true
        city:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        state:
          type: string
          description: Required - Will throw validation failures if absent! Must be a valid 2-character
            US state/territory or Canadian province abbreviation (e.g. TX, CA, ON)
          nullable: true
        zip:
          type: string
          description: Required - Will throw validation failures if absent! US ZIP code (e.g. 12345 or
            12345-6789) or Canadian postal code (e.g. A1A 1A1 or A1A1A1) depending on the provided State
          nullable: true
        phone:
          type: string
          description: Required - Will throw validation failures if absent! Must be a 10-digit US or Canadian
            number. Area code cannot start with 0 or 1. The 7 digits after the area code cannot all be
            identical, and all 10 digits cannot be the same. Non-digit characters are stripped automatically.
          nullable: true
        email:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        creditCard:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        expirationMMYY:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
        csc:
          type: string
          description: Required - Will throw validation failures if absent!
          nullable: true
      additionalProperties: false
    PaymentPortalUrlResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        url:
          type: string
          nullable: true
      additionalProperties: false
    Portable:
      type: object
      properties:
        isPortable:
          type: boolean
        onSiteOnly:
          type: boolean
        waiveDeliveryFee:
          type: boolean
      additionalProperties: false
    RentRoll:
      type: object
      properties:
        address1:
          type: string
          nullable: true
        address2:
          type: string
          nullable: true
        apartment:
          type: string
          nullable: true
        balance:
          type: number
          format: double
        city:
          type: string
          nullable: true
        contractType:
          type: string
          nullable: true
        contractUnitId:
          type: string
          format: uuid
        customerName:
          type: string
          nullable: true
        customerPhoneNumber:
          type: string
          nullable: true
        dateMovedIn:
          type: string
          format: date-time
        daysOccupied:
          type: integer
          format: int32
        insurance:
          type: number
          format: double
        paidThru:
          type: string
          format: date-time
        roomNumber:
          type: string
          nullable: true
        stateName:
          type: string
          nullable: true
        streetRate:
          type: number
          format: double
        zip:
          type: string
          nullable: true
      additionalProperties: false
    RentRollResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        rentRoll:
          type: array
          items:
            $ref: '#/components/schemas/RentRoll'
          nullable: true
      additionalProperties: false
    ReservationRequest:
      type: object
      properties:
        reservationDay:
          type: string
          description: Required - Will throw validation failure if absent!
          format: date-time
        units:
          type: array
          items:
            $ref: '#/components/schemas/UnitReservation'
          description: Required - Must specify at least one unit!
          nullable: true
        paymentInfo:
          $ref: '#/components/schemas/PaymentInfo'
      additionalProperties: false
    ReservationResponse:
      type: object
      properties:
        success:
          type: boolean
        errorMessage:
          type: string
          nullable: true
        entity:
          type: integer
          format: int32
        moveInDate:
          type: string
          format: date-time
        totalCost:
          type: number
          format: double
        reservationNumber:
          type: string
          nullable: true
      additionalProperties: false
    RoomSizeReservationRules:
      type: object
      properties:
        reservationNotBelowPercentage:
          type: integer
          format: int32
          nullable: true
        reservationNotBelowTotalUnits:
          type: integer
          format: int32
          nullable: true
        allowReservationsWhenOfficeClosed:
          type: boolean
          nullable: true
        allowableReservationDates:
          type: array
          items:
            type: string
            format: date-time
          nullable: true
      additionalProperties: false
    SelfMoveInUnit:
      type: object
      properties:
        locationName:
          type: string
          nullable: true
        bonusComments:
          type: string
          nullable: true
        orderGrouping:
          type: string
          nullable: true
        totalUnits:
          type: integer
          format: int32
        vacantUnits:
          type: integer
          format: int32
        insuranceOptions:
          type: array
          items:
            $ref: '#/components/schemas/InsuranceOption'
          nullable: true
        isCampusStorage:
          type: boolean
        monthly:
          type: number
          format: double
        sizeDescriptionsField:
          type: array
          items:
            type: string
          nullable: true
        rentableObjectId:
          type: string
          format: uuid
        unitSize:
          type: string
          nullable: true
        length:
          type: number
          format: double
        width:
          type: number
          format: double
        height:
          type: number
          format: double
        cubicFootage:
          type: number
          format: double
        squareFootage:
          type: number
          format: double
        units:
          type: array
          items:
            $ref: '#/components/schemas/Unit'
          nullable: true
      additionalProperties: false
    ServiceCharge:
      type: object
      properties:
        amount:
          type: number
          format: double
        description:
          type: string
          nullable: true
        number:
          type: integer
          format: int32
        quantity:
          type: integer
          format: int32
        taxable:
          type: string
          nullable: true
      additionalProperties: false
    Unit:
      type: object
      properties:
        unitId:
          type: string
          format: uuid
        unitNumber:
          type: string
          nullable: true
      additionalProperties: false
    UnitFeature:
      type: object
      properties:
        access:
          type: string
          nullable: true
        climate:
          type: string
          nullable: true
        doors:
          type: string
          nullable: true
        elevation:
          type: string
          nullable: true
        floor:
          type: string
          nullable: true
        product:
          type: string
          nullable: true
      additionalProperties: false
    UnitReservation:
      type: object
      properties:
        unitID:
          type: string
          format: uuid
        insuranceID:
          type: string
          format: uuid
          nullable: true
      additionalProperties: false
    UnitStorageGuide:
      type: object
      properties:
        longDescription:
          type: string
          nullable: true
        shortDescription:
          type: string
          nullable: true
      additionalProperties: false
    UnitType:
      type: object
      properties:
        bonusComments:
          type: string
          nullable: true
        cubicFootage:
          type: number
          format: double
        orderGrouping:
          type: string
          nullable: true
        squareFootage:
          type: number
          format: double
        totalUnits:
          type: integer
          format: int32
        unitFeature:
          $ref: '#/components/schemas/UnitFeature'
        unitStorageGuide:
          $ref: '#/components/schemas/UnitStorageGuide'
        unitTypeImage:
          $ref: '#/components/schemas/UnitTypeImage'
        height:
          type: number
          format: double
        insuranceOptions:
          type: array
          items:
            $ref: '#/components/schemas/InsuranceOption'
          nullable: true
        isCampusStorage:
          type: boolean
        length:
          type: number
          format: double
        monthly:
          type: number
          format: double
        portable:
          $ref: '#/components/schemas/Portable'
        serviceCharges:
    

# --- truncated at 32 KB (36 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/amerco/refs/heads/main/openapi/amerco-webselfstorage-affiliate-api-v4-openapi.yml