Bungalow API

Anonymous, read-mostly public REST API for syndicating Bungalow's residential rental inventory. Covers markets (23 active US metros with geo bounds, timezone and rent premiums), marketable property listings filtered by market slug, neighborhood, amenities and price, single-property detail by id or slug, showing-availability grids, showing creation, and application-source submission. JSON over HTTPS with limit/offset pagination, a structured error envelope, and URI path versioning (/api/v1/). Authenticated Hotpads and Facebook Catalog XML feeds are available to approved partners via integrations@bungalow.com.

OpenAPI Specification

bungalow-openapi-original.yml Raw ↑
openapi: 3.0.2
info:
  title: Bungalow API
  version: ''
  description: "# Getting Started\n\nIf you are looking to integrate Bungalow's property\
    \ listings, we provide a number of helpful endpoints. For accessing our listings\
    \ you have two primary options:\n\n## JSON API\n\nThis API is, for the most part,\
    \ based on [REST](https://en.wikipedia.org/wiki/Representational_state_transfer)\
    \ principles. It uses HTTP response codes to indicate errors and HTTP verbs to\
    \ describe requests. JSON is returned by all API responses, including errors.\n\
    \nIn the endpoints section below, the `markets` and `listings` topics will provide\
    \ you with a quick path to integration. Getting our listings will typically only\
    \ require three endpoints: `/markets/`, `/listings/properties/` and `/listings/properties/{id_or_slug}`.\
    \ Details on these individual calls can be found in the endpoints section below.\n\
    \n## XML Feeds\n\nAs an alternative to the JSON API, we currently offer feeds\
    \ in two formats: [Hotpads](https://filenet.hotpads.com/+guides/RentalListingsFeedGuide.pdf)\
    \ and [Facebook Catalog](https://developers.facebook.com/docs/marketing-api/real-estate-ads/#feed-xml-example).\
    \ [MITS](https://www.retall.org/wp-content/uploads/2019/04/Property-Marketing-ILS-4.1-Supplemental.html)\
    \ may be supported in the future. The main advantage to using our XML feeds is\
    \ that since they are authenticated, we can provide a broader range of fields\
    \ than the public JSON API does. If you would like access to a feed for your organization,\
    \ please send us a request to [integrations@bungalow.com](mailto:integrations@bungalow.com)\
    \ including details about how you would like to use the feed and which format\
    \ you would like to use.\n\nExample feed (Hotpads format):\n\n```xml\n<?xml version=\"\
    1.0\" encoding=\"utf-8\"?>\n<hotPadsItems version=\"2.1\">\n    <Company id=\"\
    bungalow\">\n        <name>Bungalow</name>\n        <website>https://bungalow.com</website>\n\
    \        <city>San Francisco</city>\n        <state>CA</state>\n        <CompanyLogo\
    \ source=\"https://assets.bungalow.com/logos/bungalow_symbol_dark.png\"></CompanyLogo>\n\
    \    </Company>\n    <Listing companyId=\"bungalow\" id=\"1\" propertyType=\"\
    HOUSE\" type=\"ROOM\">\n        <description>PRICE DROP ON SHORT TERM LEASES\n\
    \ \nWe lowered rent on all short term leases and added more flexibility on lease\
    \ start dates -- Lock in a lease now for a move-in date up to 60 days out.\_\_\
    \n \nNEW VIDEO CHAT TOURS\n \nConnect with a Bungalow representative from your\
    \ smartphone, tablet, or computer. Take a video tour of the home and get all your\
    \ questions answered.\n \nMOVE-IN WITH A REDUCED SECURITY DEPOSIT\n \nThe Space...\n\
    \ </description>\n        <virtualTourUrl>https://my.matterport.com/show/?m=mwiKGSegeLp&amp;utm_source=4</virtualTourUrl>\n\
    \        <name>Private Room in Contemporary Northwest District Home Near Union\
    \ Station</name>\n        <website>https://bungalow.com/listings/portland/special-seasonal-rate-steps-from-the</website>\n\
    \        <price>995</price>\n        <city>Portland</city>\n        <state>OR</state>\n\
    \        <zip>97209</zip>\n        <country>US</country>\n        <latitude>45.52...</latitude>\n\
    \        <longitude>-122.68...</longitude>\n        <street hide=\"true\">1234\
    \ Some Street</street>\n        <contactEmail>portlandrentals@bungalow.com</contactEmail>\n\
    \        <contactMethodPreference>Email</contactMethodPreference>\n        <lastUpdated>2020-06-04T19:46:37.268526+00:00</lastUpdated>\n\
    \        <ListingTag type=\"DOGS_ALLOWED\">\n            <tag>False</tag>\n  \
    \      </ListingTag>\n        <ListingTag type=\"LARGE_DOGS_ALLOWED\">\n     \
    \       <tag>False</tag>\n        </ListingTag>\n        <ListingTag type=\"CATS_ALLOWED\"\
    >\n            <tag>False</tag>\n        </ListingTag>\n        <ListingTag type=\"\
    PROPERTY_AMENITY\">\n            <tag>wifi</tag>\n        </ListingTag>\n    \
    \    <ListingTag type=\"COOLING_SYSTEM\">\n            <tag>other</tag>\n    \
    \    </ListingTag>\n        <ListingTag type=\"HEATING_SYSTEM\">\n           \
    \ <tag>other</tag>\n        </ListingTag>\n        <numBedrooms>1</numBedrooms>\n\
    \        <numFullBaths>1</numFullBaths>\n        <numHalfBaths>0</numHalfBaths>\n\
    \        <dateAvailable>2020-04-01</dateAvailable>\n        <ListingTag type=\"\
    AMENITY\">\n            <tag>Washer</tag>\n        </ListingTag>\n        <ListingTag\
    \ type=\"AMENITY\">\n            <tag>Dishwasher</tag>\n        </ListingTag>\n\
    \        <ListingTag type=\"LAUNDRY\">\n            <tag>SHARED</tag>\n      \
    \  </ListingTag>\n        <ListingTag type=\"PARKING_SPACES\">\n            <tag>0</tag>\n\
    \        </ListingTag>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/e4833c1ef4412485631c1bf3358eac6f409e55b4-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/70185d5e1cd35f15e5200899efb1536af7da347d-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/e65350af322a19b12a677f718725682214bf54ba-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/4476410f42949468b3cdf7cb070b2725a08fec5b-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/1519446e454be507177b97ca780e068517de1854-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/a819d06058220488909c67afed361e0fb8488462-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/245983ffc0f90534af1fc9a8bfc4d182ff5b1078-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/7aa88ca242d2a4ab26696628701a7f207e1e4fc9-lg.jpg\"\
    ></ListingPhoto>\n        <ListingPhoto source=\"https://dbjpekgzfghzs.cloudfront.net/541fd6af62101e212a1207640e7e5f7975cb7eb3-lg.jpg\"\
    ></ListingPhoto>\n        <terms>3-18 months</terms>\n        <Model id=\"4\"\
    \ type=\"unit\">\n            <name>Master - 1</name>\n            <lowPrice>995</lowPrice>\n\
    \            <highPrice>995</highPrice>\n            <dateAvailable>2020-04-01</dateAvailable>\n\
    \            <squareFeet>99</squareFeet>\n            <ModelTag type=\"APPLICATION_FEE\"\
    >\n                <tag>0</tag>\n            </ModelTag>\n        </Model>\n \
    \       ...\n    </Listing>\n    ...\n</hotPadsItems>\n```\n\n## Lead Capture\n\
    \nWhen a lead shows interest in one of our properties on your platform, in order\
    \ to have the best possible lead experience, we ask that you **send us a webhook**\
    \ with the lead data included. In order to have a webook configured for your platform,\
    \ please send us a request to [integrations@bungalow.com](mailto:integrations@bungalow.com).\
    \ Our webhook endpoint is flexible for data format and can support JSON or url-form-encoded\
    \ formatting.\n\nExample webhook payload:\n\n```json\n{\n  \"property_id\": \"\
    49801887334039362\",\n  \"property_name\": \"spacious-san-mateo-renovation-near\"\
    ,\n  \"first_name\": \"Sterling\",\n  \"last_name\": \"Archer\",\n  \"email\"\
    : \"sarcher@example.com\",\n  \"phone\": \"5551234567\",\n  \"bio\": \"I\u2019\
    m not saying I invented the turtleneck, but I was the first person to realise\
    \ its potential as a tactical garment. The tactical turtleneck! The\u2026 tactleneck.\"\
    ,\n  \"max_budget\": 1500,\n  \"desired_move_in_date\": \"06-01-2020\",\n  \"\
    student\": false,\n  \"work\": \"CIA\",\n  \"school\": \"Georgetown University\"\
    ,\n  \"hobbies\": [\n    \"travel\",\n    \"sports\",\n    \"foodie\"\n  ]\n}\n\
    ```\n\n ### Required fields for Lead Capture:\n\nCasing is flexible, but `snake_case`\
    \ is recommended.\n\n * `property_id`: the id of the property/listing object\n\
    \ * `name`, or `first_name` and `last_name`: name of lead, can be a full name\
    \ or separated first/last\n * `email`: email of lead\n\n# Errors\n\nError responses\
    \ will always include a body of JSON data as below.\n\n    {\n        \"error\"\
    : {\n            \"code\": <status_code>,\n            \"type\": <unicode>,\n\
    \            \"message\": <unicode>,\n        *   \"field_errors\": {\n      \
    \          \"<param_name>\": [<unicode>, ... ],\n                ...\n       \
    \     },\n        *   \"non_field_errors\": [<unicode>, ... ],\n        *   \"\
    conflict\": {\n                \"location\": <path>,\n                \"resource\"\
    : <representation>\n            }\n        }\n    }\n\n* starred attributes are\
    \ conditionally present\n\n* `code` - the HTTP response code for the response\
    \ - a little redundant, but makes the API much more browseable.\n* `type` - short\
    \ string indicating the nature of the error. Possible values are listed in the\
    \ [Types](#section/Errors/Types) section, and include things like \u201CValidationError\u201D\
    , \u201CThrottled\u201D, and \u201CServerError\u201D.\n* `message` - textual description\
    \ of the error which should go beyond the `code` and `type` in terms of informing\
    \ the client what is going on exactly.\n* `field_errors` - dictionary of fields\
    \ to error messages, to be returned when some client-provided data fails validation.\
    \ Typically will be seen alongside a `ValidationError`.\n* `non_field_errors`\
    \ - list of error messages for the client-provided data that might not pertain\
    \ to specific fields.\n* `conflict.location` and `conflict.resource` will only\
    \ be present for a `ConflictError`.\n\n## Types\n\n### ValidationError\n\n`400`\
    \ - There were one or more validation errors with the provided data.\n\nAll our\
    \ error types (as seen below) will contain at minimum the `code`, `type` and `message`\
    \ components. However, the `ValidationError` will include further information\
    \ to let you know what was wrong with your data submission.\n\n#### Field Errors\n\
    \nIf the `field_errors` key is present in the error response, it will map a list\
    \ of errors to specific fields, clearly indicating what data was problematic.\n\
    \n    {\n        \"error\": {\n            \"message\": \"There were one or more\
    \ validation errors with the provided data.\",\n            \"code\": 400,\n \
    \           \"type\": \"ValidationError\",\n            \"field_errors\": {\n\
    \                \"access_token\": [\n                    \"`access_token` cannot\
    \ be None.\"\n                ]\n            }\n        }\n    }\n\n#### Non Field\
    \ Errors\n\nYou may also receive further information in a form that is not specific\
    \ to any particular field. This will be present in a list keyed on `non_field_errors`\
    \ as part of a `ValidationError`.\n\n    {\n        \"error\": {\n           \
    \ \"message\": \"There were one or more validation errors with the provided data.\"\
    ,\n            \"code\": 400,\n            \"type\": \"ValidationError\",\n  \
    \          \"non_field_errors\": [\n                \"That account has been closed.\"\
    \n            ]\n        }\n    }\n\n\n### ParseError\n\n`400` - Malformed request.\n\
    \n### AuthenticationFailed\n`401` - Incorrect authentication credentials.\n\n\
    The token you are submitting may be malformed, invalid or expired. Use one of\
    \ the supported authentication methods to get a new token and try again.\n\n###\
    \ NotAuthenticated\n\n`401` - Authentication credentials were not provided.\n\n\
    A 'WWW-Authenticate' header will be present in the response, indicating to the\
    \ client how they can go about authenticating.\n\n### InvalidToken\n\n`401` -\
    \ The refresh or access token provided has expired or is malformed.\n\nIf you\
    \ receive this message for an access token, you should use your refresh token\
    \ to get a new access token and try the request again.\n\nIf you receive it for\
    \ a refresh token, you should prompt the user to log in to get a new refresh token.\n\
    \n### PermissionDenied\n\n`403` - You do not have permission to perform this action.\n\
    \nYour request is authenticated, but the related user does not have permission\
    \ to\nperform the action you're trying perform, or to access the data you're trying\
    \ to\naccess.\n\n### NotFound\n\n`404` - Not found.\n\n### MethodNotAllowed\n\n\
    `405` - Method \"{method}\" not allowed.\n\n### NotAcceptable\n\n`406` - Could\
    \ not satisfy the request Accept header.\n\n### Conflict\n\n`409` - The submitted\
    \ data conflicts with existing data.\n\nIn the case of a `Conflict` the additional\
    \ attributes `conflict.location` and `conflict.resource` will be in the response\
    \ body, providing detail of the conflicting resource.\n\nFor example:\n\n    {\n\
    \        \"error\": {\n            \"code\": 409,\n            \"type\": \"Conflict\"\
    ,\n            \"message\": \"You've already added that number!\",\n         \
    \   \"conflict\": {\n                \"location\": \"/api/v1/phones/numbers/1\"\
    ,\n                \"resource\": {\n                    \"id\": 1,\n         \
    \           \"number\": \"+17788486723\",\n                    \"primary\": null,\n\
    \                    \"verified\": false,\n                    \"created\": \"\
    2018-09-25T21:45:07.165829Z\"\n                }\n            }\n        }\n \
    \   }\n\n### Gone ###\n`410` - The requested resource no longer exists.\n\nWhen\
    \ a resource was available, but has been taken or no longer exists.\n\nFor example:\n\
    \n    {\n        \"error\": {\n            \"code\": 410,\n            \"type\"\
    : \"APIGoneError\",\n            \"message\": \"The requested resource no longer\
    \ exists.\",\n            \"non_field_errors\": [\n                \"This timeslot\
    \ is no longer available. Please select another time.\"\n            ]\n     \
    \   }\n    }\n\n### UnsupportedMediaType\n\n`415` - Unsupported media type \"\
    {media_type}\" in request.\n\n### Throttled\n\n`429` - Request was throttled.\n\
    \nFor example:\n\n    {\n        \"error\": {\n            \"message\": \"Request\
    \ was throttled. Expected available in 3 seconds.\",\n            \"code\": 429,\n\
    \            \"type\": \"Throttled\"\n        }\n    }\n\nIn the case of a throttled\
    \ request, a `Retry-After` header will specify how long the user should wait before\
    \ trying the API call again.\n\n\n### ServerError\n\n`500` - Server Error.\n\n\
    Something broke in the API; we'll have been notified and will fix it, in the meantime,\
    \ try again.\n\n# Pagination\n\nAcross all resource listing endpoints a standardised\
    \ approach to pagination is used. A typical paginated response appears below.\n\
    \n    {\n        \"results\": [\n            <type>, ..\n        ],\n        \"\
    count\": <int>,\n        \"next\": <url>,\n        \"previous\": <url>\n    }\n\
    \n* `results` - the result set\n* `count` - the total number results\n* `next`\
    \ - URL for the next result set\n* `previous` - URL for the previous result set\n\
    \n### Parameters ###\n\nResults can be iteratively fetched using `limit` and `offset`\
    \ parameters.\n\n* `limit` - return at most this many results. Default: 20, max:\
    \ 100\n* `offset` - return results after this point. Default: 0\n\n# Versioning\n\
    \nYou can control what version of the API you access by manipulating the path.\
    \ For example, the following would access version 1.X of the API:\n\n    /api/v1/path/to/specific/endpoint\n\
    \nWe use [semantic versioning](https://semver.org/#semantic-versioning-200) so\
    \ within major versions you do not have to worry about changes breaking backward\
    \ compatibility.\n"
  x-logo:
    url: https://assets.bungalow.com/logos/bungalow_wordmark_dark.png
    altText: Bungalow wordmark
paths:
  /markets/:
    get:
      operationId: /markets/
      description: Lists all active markets
      parameters:
      - name: limit
        required: false
        in: query
        description: Number of results to return per page.
        schema:
          type: integer
      - name: offset
        required: false
        in: query
        description: The initial index from which to return the results.
        schema:
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    example: 123
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      properties:
                        id:
                          type: integer
                          readOnly: true
                        internal_name:
                          type: string
                          maxLength: 256
                        display_name:
                          type: string
                          maxLength: 256
                        slug:
                          type: string
                          nullable: true
                          maxLength: 50
                          pattern: ^[-a-zA-Z0-9_]+$
                        email:
                          type: string
                          description: Market specific email i.e la@bungalow.com which
                            accepts messages from robots
                          maxLength: 128
                        region:
                          type: string
                          maxLength: 64
                        region_code:
                          type: string
                          maxLength: 3
                        country:
                          type: string
                          maxLength: 128
                        country_code:
                          type: string
                          description: Alpha-2 ISO 3166 code
                          maxLength: 2
                        img:
                          type: string
                          format: uri
                          maxLength: 200
                          pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\\
                            s:@/]*)?@)?(?:(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\\
                            d?)(?:\\.(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\d?)){3}|\\\
                            [[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF\
                            0-9-]{0,61}[a-z\xA1-\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF\
                            0-9-]{1,63}(?<!-))*\\.(?!-)(?:[a-z\xA1-\uFFFF-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\\\
                            .?|localhost))(?::\\d{2,5})?(?:[/?#][^\\s]*)?\\Z"
                        img_md:
                          type: string
                          format: uri
                          maxLength: 200
                          pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\\
                            s:@/]*)?@)?(?:(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\\
                            d?)(?:\\.(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\d?)){3}|\\\
                            [[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF\
                            0-9-]{0,61}[a-z\xA1-\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF\
                            0-9-]{1,63}(?<!-))*\\.(?!-)(?:[a-z\xA1-\uFFFF-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\\\
                            .?|localhost))(?::\\d{2,5})?(?:[/?#][^\\s]*)?\\Z"
                        hide_room_details:
                          type: boolean
                        rent_premiums:
                          type: array
                          items:
                            properties:
                              lease_length_in_months:
                                type: integer
                                maximum: 2147483647
                                minimum: 0
                              premium_per_month:
                                type: number
                                multipleOf: 0.01
                                maximum: 10000000000000
                                minimum: -10000000000000
                            required:
                            - lease_length_in_months
                            - premium_per_month
                        icons:
                          properties:
                            small:
                              type: string
                              format: binary
                            medium:
                              type: string
                              format: binary
                            large:
                              type: string
                              format: binary
                            svg:
                              type: string
                              format: binary
                          required:
                          - small
                          - medium
                          - large
                          - svg
                          type: object
                        timezone:
                          type: string
                        latitude:
                          type: string
                        longitude:
                          type: string
                        market_info:
                          type: string
                          readOnly: true
                        market_area:
                          properties:
                            id:
                              type: integer
                              readOnly: true
                            slug:
                              type: string
                              nullable: true
                              description: Hyphenated lower case form, can be used
                                as part of URL
                              maxLength: 250
                              pattern: ^[-a-zA-Z0-9_]+$
                            name:
                              type: string
                              maxLength: 128
                            area_type:
                              type: string
                              nullable: true
                              description: Type of area, e.g Neighborhood, Market,
                                et. al
                            geohash:
                              type: string
                              description: The geohash prefix that falls in and round
                                this area (ideal for filtering in a client interface).
                              maxLength: 9
                            bounds_north:
                              type: number
                              multipleOf: 1.0e-06
                              maximum: 1000
                              minimum: -1000
                              description: The max latitude
                            bounds_south:
                              type: number
                              multipleOf: 1.0e-06
                              maximum: 1000
                              minimum: -1000
                              description: The min latitude
                            bounds_west:
                              type: number
                              multipleOf: 1.0e-06
                              maximum: 1000
                              minimum: -1000
                              description: The min longitude
                            bounds_east:
                              type: number
                              multipleOf: 1.0e-06
                              maximum: 1000
                              minimum: -1000
                              description: The max longitude
                            latitude:
                              type: number
                              multipleOf: 1.0e-06
                              maximum: 1000
                              minimum: -1000
                              description: The centerpoint latitude
                            longitude:
                              type: number
                              multipleOf: 1.0e-06
                              maximum: 1000
                              minimum: -1000
                              description: The centerpoint longitude
                          required:
                          - name
                          - bounds_north
                          - bounds_south
                          - bounds_west
                          - bounds_east
                          - latitude
                          - longitude
                          type: object
                        support_operating_hours:
                          type: string
                          readOnly: true
                        waive_application_fees:
                          type: boolean
                      required:
                      - internal_name
                      - display_name
                      - rent_premiums
                      - icons
                      - timezone
                      - market_area
                      - waive_application_fees
          description: ''
      tags:
      - Markets
  /markets/{id}:
    get:
      operationId: /markets/{id}
      description: Gets all details of a market, and includes demand metrics
      parameters:
      - name: id
        in: path
        required: true
        description: A unique value identifying this market.
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  id:
                    type: integer
                    readOnly: true
                  internal_name:
                    type: string
                    maxLength: 256
                  display_name:
                    type: string
                    maxLength: 256
                  slug:
                    type: string
                    nullable: true
                    maxLength: 50
                    pattern: ^[-a-zA-Z0-9_]+$
                  email:
                    type: string
                    description: Market specific email i.e la@bungalow.com which accepts
                      messages from robots
                    maxLength: 128
                  region:
                    type: string
                    maxLength: 64
                  region_code:
                    type: string
                    maxLength: 3
                  country:
                    type: string
                    maxLength: 128
                  country_code:
                    type: string
                    description: Alpha-2 ISO 3166 code
                    maxLength: 2
                  img:
                    type: string
                    format: uri
                    maxLength: 200
                    pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:0|25[0-5]|2[0-4]\\\
                      d|1\\d?\\d?|[1-9]\\d?)(?:\\.(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\\
                      d?)){3}|\\[[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1\
                      -\uFFFF0-9-]{0,61}[a-z\xA1-\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF\
                      0-9-]{1,63}(?<!-))*\\.(?!-)(?:[a-z\xA1-\uFFFF-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\\\
                      .?|localhost))(?::\\d{2,5})?(?:[/?#][^\\s]*)?\\Z"
                  img_md:
                    type: string
                    format: uri
                    maxLength: 200
                    pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:0|25[0-5]|2[0-4]\\\
                      d|1\\d?\\d?|[1-9]\\d?)(?:\\.(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\\
                      d?)){3}|\\[[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1\
                      -\uFFFF0-9-]{0,61}[a-z\xA1-\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF\
                      0-9-]{1,63}(?<!-))*\\.(?!-)(?:[a-z\xA1-\uFFFF-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\\\
                      .?|localhost))(?::\\d{2,5})?(?:[/?#][^\\s]*)?\\Z"
                  hide_room_details:
                    type: boolean
                  rent_premiums:
                    type: array
                    items:
                      properties:
                        lease_length_in_months:
                          type: integer
                          maximum: 2147483647
                          minimum: 0
                        premium_per_month:
                          type: number
                          multipleOf: 0.01
                          maximum: 10000000000000
                          minimum: -10000000000000
                      required:
                      - lease_length_in_months
                      - premium_per_month
                  icons:
                    properties:
                      small:
                        type: string
                        format: binary
                      medium:
                        type: string
                        format: binary
                      large:
                        type: string
                        format: binary
                      svg:
                        type: string
                        format: binary
                    required:
                    - small
                    - medium
                    - large
                    - svg
                    type: object
                  timezone:
                    type: string
                  latitude:
                    type: string
                  longitude:
                    type: string
                  market_info:
                    type: string
                    readOnly: true
                  market_area:
                    properties:
                      id:
                        type: integer
                        readOnly: true
                      slug:
                        type: string
                        nullable: true
                        description: Hyphenated lower case form, can be used as part
                          of URL
                        maxLength: 250
                        pattern: ^[-a-zA-Z0-9_]+$
                      name:
                        type: string
                        maxLength: 128
                      area_type:
                        type: string
                        nullable: true
                        description: Type of area, e.g Neighborhood, Market, et. al
                      geohash:
                        type: string
                        description: The geohash prefix that falls in and round this
                          area (ideal for filtering in a client interface).
                        maxLength: 9
                      bounds_north:
                        type: number
                        multipleOf: 1.0e-06
                        maximum: 1000
                        minimum: -1000
                        description: The max latitude
                      bounds_south:
                        type: number
                        multipleOf: 1.0e-06
                        maximum: 1000
                        minimum: -1000
                        description: The min latitude
                      bounds_west:
                        type: number
                        multipleOf: 1.0e-06
                        maximum: 1000
                        minimum: -1000
                        description: The min longitude
                      bounds_east:
                        type: number
                        multipleOf: 1.0e-06
                        maximum: 1000
                        minimum: -1000
                        description: The max longitude
                      latitude:
                        type: number
                        multipleOf: 1.0e-06
                        maximum: 1000
                        minimum: -1000
                        description: The centerpoint latitude
                  

# --- truncated at 32 KB (102 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/bungalow/refs/heads/main/openapi/bungalow-openapi-original.yml