HousingAnywhere Developers

HousingAnywhere partner feed integration

Documentation for new partners

Overview

Welcome to the HousingAnywhere partner integration guide. This guide will help you integrate your property listings with our platform using our standardized feed format.

Before going live, check your feed with the feed validator, in the browser or through its API.

Note: This documentation is based on our internal HA connector format and represents the standard structure for all partner integrations.
If you are connected via our public API then you can find the documentation for it here. Currently, we are not onboarding new partners to the public API.

Authentication

HousingAnywhere fetches your feed from your endpoint, so authentication protects your endpoint. It is optional: you can protect your feed endpoint with a bearer token. Share the token with HousingAnywhere and we send it with every request for your feed:

Security: Never expose your feed token in client-side code or public repositories.

Feed format and how it works

You must make an endpoint available to us where we can retrieve your data feed in JSON format. It must be an array of objects where each object represents a listing. Periodically we will access your endpoint and publish/update your listings on our platform, based on the current data you have available at that time.

Your feed is linked to your HousingAnywhere account. Every time our system accesses your endpoint, we will read the entire feed and process each listing (object) in the array. Each listing must have a unique identifier used as the listingReference field. This is how we identify each listing and know if it is new or if it already exists in our system. Based on the current state of each listing object in your feed, we will try to find a matching listingReference and the following will happen:

Our system is also able to send you notifications (called webhooks) about bookings when they are paid or cancelled. See the webhooks section for more information.

Note: there is an example at the end of this page that you can copy and edit to fit your needs.

Representation of the feed structure

[
  {
    "listingReference": "listing-001",
    "type": "apartment",
    "kind": "private_room",
    "description": "Bright private room in a shared apartment, ten minutes from the city centre.",
    "address": "Blaak 555, 3011 GL Rotterdam, Netherlands",
    "alias": "bright_room_rotterdam",
    "pricingType": "flat",
    "flatPrice": 85000,
    "monthlyPrices": [],
    "costs": {},
    "currencyCode": "EUR",
    "blockedPeriods": [],
    "facilities": {},
    "images": [],
    "videos": []
  }
]

Field Specifications

Field Type Required Description
listingReference string Required Unique identifier for the listing.
description string Required The full description of the listing in plain text. Should be at least 50 characters long.
address string Required Full property address including street, house number, postcode, city and country.
currencyCode string Required ISO 4217 currency code (EUR or USD or...).
pricingType string Required flat or monthly.
flatPrice integer Optional The price is in cents and is required if pricingType is flat.
All months of the year will have this price - see price structure.
monthlyPrices array Optional The price is in cents and is required if pricingType is monthly.
The rent is specified for each month as an array of objects based on the price structure.
type string Optional Property type: house, apartment, building
kind string Optional The kind of listing: private_room, shared_room or entire_place.
alias string Optional Visible only to you, used to help you identify a listing more easily.
costs object Optional Includes all the possible costs aside from the monthly rent.
It's an object containing objects following the Costs Object structure.
blockedPeriods array Optional See availability structure.
strictRentalPeriods array Optional You set the duration of the rental period, move-in and move-out dates so there are fixed rental periods with exact start/end dates and prices. When provided, the listing is only bookable for these periods (e.g. academic or seasonal periods). See the Strict rental period structure.
minimumStayMonths integer Optional The minimum duration for the rental period, in months.
maximumStayMonths integer Optional The maximum duration for the rental period, in months.
moveInWindow integer Optional If used and set to more than 0, it creates a time window in which this listing is bookable. If you set a moveInWindow of 15, a tenant can only book your listing (and must move in) within 15 days of the first available date.
facilities object Optional Follows the facilities object structure.
images array Optional Array of publicly accessible image URLs (JPEG, PNG, or WebP). Each image must respond with HTTP 200, include a Content-Length header, and be at most 15MB. At least 5 valid images are required when creating a new listing during sync.
videos array Optional Array of YouTube video URLs. Only YouTube is supported; the video ID must be exactly 11 characters. See the videos section for accepted URL formats and examples. Omitting this field or sending an empty array removes all videos. Include the field on every listing that should keep videos in sync.
listingUrl string Optional The url for your listing/property.
minAge integer Optional If there is a minimum age applicable to the tenant. Example: they have to be at least 18 years old.
maxAge integer Optional If there is a maximum age applicable to the tenant. Example: they have to be no older than 65 years old.
floor integer Optional Floor number. Not to be confused with flooring.
apartmentNumber string Optional Apartment or unit number/identifier.
registrationNumber string Optional Registration number for the unit, used for legal or regulatory purposes.

Videos

The videos field accepts an array of YouTube URLs. Each entry must resolve to a valid 11-character YouTube video ID. Other video hosts (for example Vimeo) are rejected.

Supported URL formats:

{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://youtu.be/c-aQvP7CUAI",
    "https://youtube.com/embed/IehwV2K60r8",
    "https://www.youtube.com/shorts/pxYxA1XCgDg",
    "Ks-_Mh1QhMc"
  ]
}

Omitting videos or sending an empty array removes all videos from the listing. Include the field on every listing that should keep videos in sync.

Availability structure

You can declare availability with the blockedPeriods field. This field's structure has a startDate and an endDate. The date format must be YYYY-MM-DD. The startDate must be today or in the future, and the endDate must be after the startDate. Alternatively, see strictRentalPeriods.

{
  "blockedPeriods": [
    {
      "startDate": "2027-12-01",
      "endDate": "2027-12-31"
    },
    {
      "startDate": "2028-07-01",
      "endDate": "2028-09-30"
    }
  ]
}

Strict rental period structure

Use strictRentalPeriods when your listing is only available for fixed date ranges (e.g. academic semesters or seasonal periods). Each period has a fixed price and defines when the tenant can move in. If you provide this field, the listing is bookable only for these periods.

All dates must be in ISO 8601 format (YYYY-MM-DD). startDate and endDate define the rental period. moveInEndDate is the latest date by which the tenant can move in for that period (e.g. to allow a short move-in window at the start of the term).

Strict rental period object fields
Field Type Required Description
price integer Required Total price for the period, in cents.
startDate string Required First day of the rental period (YYYY-MM-DD).
endDate string Required Last day of the rental period (YYYY-MM-DD). Must be after startDate.
moveInEndDate string Required Latest date the tenant can move in for this period (YYYY-MM-DD). It will be on or after startDate, and on or before endDate.
{
  "strictRentalPeriods": [
    {
      "price": 900000,
      "startDate": "2027-09-01",
      "endDate": "2028-05-31",
      "moveInEndDate": "2027-09-15"
    },
    {
      "price": 450000,
      "startDate": "2028-06-01",
      "endDate": "2028-08-31",
      "moveInEndDate": "2028-06-15"
    }
  ]
}

Price structure

You can have the same price for every month by defining a flat price.

{
  "pricingType": "flat",
  "flatPrice": 100000
}

Or you can have a different price for each month by defining monthly prices for all 12 months.

{
  "pricingType": "monthly",
  "monthlyPrices": [
    {
      "month": "1",
      "price": 188100
    },
    {
      "month": "2",
      "price": 288100
    },
    {
      "month": "3",
      "price": 388100
    },
    {
      "month": "4",
      "price": 488100
    },
    {
      "month": "5",
      "price": 588100
    },
    {
      "month": "6",
      "price": 688100
    },
    {
      "month": "7",
      "price": 788100
    },
    {
      "month": "8",
      "price": 888100
    },
    {
      "month": "9",
      "price": 988100
    },
    {
      "month": "10",
      "price": 1088100
    },
    {
      "month": "11",
      "price": 1188100
    },
    {
      "month": "12",
      "price": 1288100
    }
  ]
}

Costs Object structure

You can use the costs object to define additional costs, where each one is an object that follows the same structure but might accept different values.

Currently supported costs are security-deposit, administration-fee, membership-fee, electricity-bill, cleaning-fee, gas-bill, water-bill, internet-bill, parking and other-additional-costs.
Supported costs and their accepted values
value payableBy payableAt required refundable isEstimated
security-deposit integer (in cents) tenant not-applicable move-in true false true false
administration-fee integer (in cents) tenant included-in-rent not-applicable move-in true false false
membership-fee integer (in cents) tenant not-applicable move-in true false false
electricity-bill integer (in cents) tenant included-in-rent not-applicable weekly monthly bi-weekly bi-monthly true false true false
cleaning-fee integer (in cents) tenant included-in-rent not-applicable weekly monthly bi-weekly bi-monthly move-in move-out true false false true false
gas-bill integer (in cents) tenant included-in-rent not-applicable weekly monthly bi-weekly bi-monthly true false true false
water-bill integer (in cents) tenant included-in-rent not-applicable weekly monthly bi-weekly bi-monthly true false true false
internet-bill integer (in cents) tenant included-in-rent not-applicable weekly monthly bi-weekly bi-monthly true false true false
parking integer (in cents) tenant included-in-rent not-applicable move-in move-out weekly monthly bi-weekly one-off false false true false
other-additional-costs integer (in cents) tenant included-in-rent not-applicable move-in move-out weekly monthly bi-weekly bi-monthly true false false true false

Rules:

Example of a security deposit of 800 EUR, administration fee of 250 EUR, monthly electricity fee of 10 EUR (estimated) and an optional "other" fee of 100 EUR.

{
  "costs": {
    "security-deposit": {
      "value": 80000,
      "payableBy": "tenant",
      "payableAt": "move-in",
      "required": true,
      "refundable": true,
      "isEstimated": false
    },
    "administration-fee": {
      "value": 25000,
      "payableBy": "tenant",
      "payableAt": "move-in",
      "required": true,
      "refundable": false,
      "isEstimated": false
    },
    "electricity-bill": {
      "value": 1000,
      "payableBy": "tenant",
      "payableAt": "monthly",
      "required": true,
      "refundable": false,
      "isEstimated": true
    },
    "other-additional-costs": {
      "value": 10000,
      "payableBy": "tenant",
      "payableAt": "move-out",
      "required": false,
      "refundable": false,
      "isEstimated": false
    }
  }
}

Facilities Object structure

Supported fields and their accepted values
Type Accepted fields Description
bedroomSize integer 0 1 2 3 4 5 ... Bedroom size
totalSize integer 0 1 2 3 4 5 ... Total property size
currentOccupancy integer 0 1 2 3 4 5 ... The number of people currently living in the house. This is only applicable to properties that are shared apartments or shared rooms.
freePlaces integer 0 1 2 3 4 5 ... Amount of free places
allergyFriendly boolean true false null If the place is allergens free or not.
housematesGender string shared_w_boys shared_w_girls shared_w_both Gender of current tenants
registrationPossible boolean true false null If the tenant can register at this address
tenantStatus string working working_student student looking_for_a_job Tenant type accepted under House rules and preferences
bedroomCount integer 0 1 2 3 4 5 ... Number of bedrooms
bedroomFurnished boolean true false null Is it furnished?
bedroomLock boolean true false null Is there a lock in the bedroom?
balconyTerrace string private shared null Part of the available facilities and amenities.
basement string private shared null Part of the available facilities and amenities.
bathroom string private shared_w_boys shared_w_girls shared_w_both no Part of the available facilities and amenities.
garden string private shared null Part of the available facilities and amenities.
kitchen string private shared null Part of the available facilities and amenities.
livingRoom string private shared null Part of the available facilities and amenities.
parking string private shared null Part of the available facilities and amenities.
toilet string private shared null Part of the available facilities and amenities.
kitchenware string private shared null Part of the available facilities and amenities.
wheelchairAccessible boolean true false null Part of the available facilities and amenities.
ac boolean true false null Part of the available facilities and amenities.
bed boolean true false null Part of the available facilities and amenities.
closet boolean true false null Part of the available facilities and amenities.
desk boolean true false null Part of the available facilities and amenities.
dishwasher boolean true false null Part of the available facilities and amenities.
dryer boolean true false null Part of the available facilities and amenities.
flooring string stone wood plastic carpet laminate other Part of the available facilities and amenities.
internet boolean true false null Part of the available facilities and amenities.
livingRoomFurnished boolean true false null Part of the available facilities and amenities.
tv boolean true false null Part of the available facilities and amenities.
washingMachine boolean true false null Part of the available facilities and amenities.
wifi boolean true false null Part of the available facilities and amenities.
animalAllowed string yes no discussable Part of the house rules and preferences
cleaningCommon boolean true false null Whether the common areas’ cleaning fee is included in the rent or not
cleaningPrivate boolean true false null Whether the common areas’ cleaning fee is included in the rent or not
playMusic string yes no discussable Part of the house rules and preferences
smokingAllowed string yes no outside_only discussable Part of the house rules and preferences
preferredGender string male female Part of the house rules and preferences
couplesAllowed boolean true false Part of the house rules and preferences
heating string central gas wood_stove electrical no Part of the available facilities and amenities.

Example of a facilities object that says this property has 120 m², has 5 furnished bedrooms with a lock, the tenant can register at this address and they must be a working professional. Additionally, pets are allowed.

{
  "facilities": {
    "totalSize": 120,
    "bedroomCount": 5,
    "bedroomLock": true,
    "bedroomFurnished": true,
    "registrationPossible": true,
    "tenantStatus": "working",
    "animalAllowed": "yes"
  }
}

Webhooks

Optional. We POST a JSON body to a URL you provide when a booking on your account is paid or cancelled.

The body is webhookType plus a data object. Money amounts are integer cents. Paid notifications include pricingOverview, the payment breakdown for the stay (currency, tenant fee, contract value, commission, costs, and the instalment schedule). Cancellation notifications use the same data shape and omit pricingOverview.

The first instalment is collected by HousingAnywhere and has no dueDate. Later instalments are collected by the landlord and include dueDate (YYYY-MM-DD). Cost payableBy and payableAt use the same values as the feed costs object.

Field Type Accepted values
webhookType string after_booking_paid after_booking_cancellation
instalmentType string rent deposit
collector string housinganywhere landlord
tenantGenderCode integer 1 male 2 female 3 other
data object fields
Field Type Description
bookingId integer HousingAnywhere booking (conversation) ID.
bookingUUID string HousingAnywhere booking UUID. Store this or bookingId to match later notifications.
bookingAdvertiserId integer HousingAnywhere advertiser (landlord account) ID.
bookingAdvertiserUUID string HousingAnywhere advertiser (landlord account) UUID.
bookingStartDate string Booking start date in ISO 8601 format.
bookingEndDate string Booking end date in ISO 8601 format.
bookingPrice integer Rent for the first month (the first instalment), in cents. Can differ from later months, for example for a partial first month.
bookingDeposit integer Security deposit, in cents.
bookingFee integer Tenant service fee, in cents.
bookingTotal integer Amount the tenant pays HousingAnywhere at booking: bookingPrice plus bookingFee, in cents.
bookingTcv integer Total rent for the stay (sum of all instalments), in cents.
bookingCurrency string ISO 4217 currency code (for example EUR).
bookingTenantsCount integer Number of tenants on the booking.
listingId integer HousingAnywhere listing ID.
listingUUID string HousingAnywhere listing UUID.
listingAddress string Full listing address.
listingCity string Listing city.
listingCountryCode string Listing country code.
listingLat number Listing latitude.
listingLng number Listing longitude.
listingAlias string Listing alias shown to partners.
listingExternalReference string Partner listing reference from the feed.
tenantEmail string Tenant email address.
tenantPhone string Tenant phone number.
tenantFirstName string Tenant first name.
tenantLastName string Tenant last name.
tenantBirthDate string Tenant birth date in ISO 8601 format.
tenantGenderCode integer 1 male, 2 female, 3 other.
tenantNationality string Tenant nationality.
tenantIsoCountryCode string Tenant ISO country code.
tenantFirstLanguage string Tenant primary spoken language.
pricingOverview object Payment breakdown for the stay. Omitted on cancellation.

Paid

Store bookingUUID or bookingId. The cancellation notification repeats the same values, so you can cancel that booking in your system.

{
    "webhookType": "after_booking_paid",
    "data": {
        "bookingId": 1234567,
        "bookingUUID": "123fc52-8f44-46c5-a260-a1c9d6506121",
        "bookingAdvertiserId": 12345,
        "bookingAdvertiserUUID": "abcde769-858d-4207-b8c4-d462ecf03aab",
        "bookingStartDate": "2025-06-01T00:00:00Z",
        "bookingEndDate": "2026-06-01T00:00:00Z",
        "bookingPrice": 71000,
        "bookingDeposit": 71000,
        "bookingFee": 21300,
        "bookingTotal": 92300,
        "bookingTcv": 852000,
        "bookingCurrency": "EUR",
        "bookingTenantsCount": 1,
        "listingId": 987654,
        "listingUUID": "abcde73f-e42b-4b48-b053-214411abeafb",
        "listingAddress": "Example Street 1, 1234 AB Example City, Netherlands",
        "listingCity": "Example City",
        "listingCountryCode": "nl",
        "listingLat": 52.0,
        "listingLng": 5.0,
        "listingAlias": "REF24",
        "listingExternalReference": "REF24",
        "tenantEmail": "tenant@example.com",
        "tenantPhone": "+31600000000",
        "tenantFirstName": "tenantFirstName",
        "tenantLastName": "tenantLastName",
        "tenantBirthDate": "1974-06-21T00:00:00Z",
        "tenantGenderCode": 2,
        "tenantNationality": "NL",
        "tenantIsoCountryCode": "NL",
        "tenantFirstLanguage": "en",
        "pricingOverview": {
            "currency": "EUR",
            "tenantFee": 21300,
            "contractValue": 852000,
            "commission": {
                "amount": 120000,
                "vatAmount": 0,
                "vatPercentage": 0,
                "vatCountryCode": ""
            },
            "costs": {
                "security-deposit": {
                    "value": 71000,
                    "payableBy": "tenant",
                    "payableAt": "move-in",
                    "required": true,
                    "refundable": true,
                    "isEstimated": false
                }
            },
            "instalments": [
                {
                    "number": 1,
                    "amount": 71000,
                    "instalmentType": "rent",
                    "collector": "housinganywhere"
                },
                {
                    "number": 2,
                    "amount": 71000,
                    "instalmentType": "rent",
                    "collector": "landlord",
                    "dueDate": "2025-07-01"
                }
            ]
        }
    }
}

Cancellation

Cancellation uses the same body. webhookType is after_booking_cancellation, and pricingOverview is omitted. The other data fields match the paid notification.

{
    "webhookType": "after_booking_cancellation",
    "data": {
        "bookingId": 1234567,
        "bookingUUID": "123fc52-8f44-46c5-a260-a1c9d6506121",
        "bookingAdvertiserId": 12345,
        "bookingAdvertiserUUID": "abcde769-858d-4207-b8c4-d462ecf03aab",
        "bookingStartDate": "2025-06-01T00:00:00Z",
        "bookingEndDate": "2026-06-01T00:00:00Z",
        "bookingPrice": 71000,
        "bookingDeposit": 71000,
        "bookingFee": 21300,
        "bookingTotal": 92300,
        "bookingTcv": 852000,
        "bookingCurrency": "EUR",
        "bookingTenantsCount": 1,
        "listingId": 987654,
        "listingUUID": "abcde73f-e42b-4b48-b053-214411abeafb",
        "listingAddress": "Example Street 1, 1234 AB Example City, Netherlands",
        "listingCity": "Example City",
        "listingCountryCode": "nl",
        "listingLat": 52.0,
        "listingLng": 5.0,
        "listingAlias": "REF24",
        "listingExternalReference": "REF24",
        "tenantEmail": "tenant@example.com",
        "tenantPhone": "+31600000000",
        "tenantFirstName": "tenantFirstName",
        "tenantLastName": "tenantLastName",
        "tenantBirthDate": "1974-06-21T00:00:00Z",
        "tenantGenderCode": 2,
        "tenantNationality": "NL",
        "tenantIsoCountryCode": "NL",
        "tenantFirstLanguage": "en"
    }
}

Responding to webhooks

Respond with a 2xx status code when you have processed the notification, and with a non-2xx status code when you have not. The response body is optional and otherwise ignored.

If you can only respond with 2xx, mark a failure with a JSON body that contains "success": false or an "error" message.

{
    "success": false,
    "error": "listing not found"
}

Endpoints

GET Feed Endpoint

URL: https://your-domain.com/api/listings

Description: HousingAnywhere will call this endpoint to retrieve your feed

Response Format: JSON array of listing objects

Example

[
  {
    "listingReference": "example_listing_00003",
    "alias": "house_by_the_beach",
    "type": "house",
    "kind": "shared_room",
    "description": "Historical beach house.\n Welcome to a beautiful mansion by the beach where you will have a private and cozy room",
    "address": "Blaak 555, 3011 GL Rotterdam, Netherlands",
    "currencyCode": "EUR",
    "pricingType": "monthly",
    "monthlyPrices": [
      {
        "month": "1",
        "price": 80000
      },
      {
        "month": "2",
        "price": 80000
      },
      {
        "month": "3",
        "price": 80000
      },
      {
        "month": "4",
        "price": 85000
      },
      {
        "month": "5",
        "price": 85000
      },
      {
        "month": "6",
        "price": 95000
      },
      {
        "month": "7",
        "price": 100000
      },
      {
        "month": "8",
        "price": 120000
      },
      {
        "month": "9",
        "price": 120000
      },
      {
        "month": "10",
        "price": 115000
      },
      {
        "month": "11",
        "price": 95000
      },
      {
        "month": "12",
        "price": 90000
      }
    ],
    "blockedPeriods": [
      {
        "startDate": "2027-12-01",
        "endDate": "2027-12-31"
      },
      {
        "startDate": "2028-07-01",
        "endDate": "2028-09-30"
      }
    ],
    "strictRentalPeriods": [
      {
        "price": 100000,
        "startDate": "2028-01-01",
        "endDate": "2028-12-01",
        "moveInEndDate": "2028-02-01"
      }
    ],
    "costs": {
      "security-deposit": {
        "value": 80000,
        "payableBy": "tenant",
        "payableAt": "move-in",
        "required": true,
        "refundable": true,
        "isEstimated": false
      },
      "administration-fee": {
        "value": 25000,
        "payableBy": "tenant",
        "payableAt": "move-in",
        "required": true,
        "refundable": false,
        "isEstimated": false
      },
      "electricity-bill": {
        "value": 1000,
        "payableBy": "tenant",
        "payableAt": "weekly",
        "required": true,
        "refundable": false,
        "isEstimated": true
      },
      "other-additional-costs": {
        "value": 10000,
        "payableBy": "tenant",
        "payableAt": "move-out",
        "required": false,
        "refundable": false,
        "isEstimated": false
      }
    },
    "minimumStayMonths": 1,
    "maximumStayMonths": 12,
    "moveInWindow": 15,
    "images": [
      "https://your-domain.com/images/prop-123456-1.jpg",
      "https://your-domain.com/images/prop-123456-2.jpg",
      "https://your-domain.com/images/prop-123456-3.jpg"
    ],
    "videos": [
      "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "https://youtu.be/c-aQvP7CUAI",
      "https://www.youtube.com/shorts/pxYxA1XCgDg"
    ],
    "listingUrl": "https://your-domain.com/listings/PROP-123456",
    "minAge": 18,
    "maxAge": 35,
    "registrationNumber": "ESREG2026ALQ000000123456789BLA00000000098765432102222",
    "floor": 2,
    "apartmentNumber": "5A",
    "facilities": {
      "totalSize": 120,
      "bedroomSize": 14,
      "currentOccupancy": 1,
      "freePlaces": 3,
      "allergyFriendly": true,
      "housematesGender": "shared_w_girls",
      "registrationPossible": true,
      "tenantStatus": "working",
      "bedroomCount": 4,
      "bedroomFurnished": true,
      "bedroomLock": true,
      "balconyTerrace": "private",
      "basement": "shared",
      "bathroom": "shared_w_boys",
      "garden": "private",
      "kitchen": "shared",
      "livingRoom": "shared",
      "parking": "shared",
      "toilet": "shared",
      "kitchenware": "shared",
      "wheelchairAccessible": true,
      "ac": true,
      "bed": true,
      "closet": true,
      "desk": true,
      "dishwasher": false,
      "dryer": true,
      "flooring": "carpet",
      "internet": true,
      "livingRoomFurnished": true,
      "tv": true,
      "washingMachine": true,
      "wifi": true,
      "animalAllowed": "yes",
      "cleaningCommon": true,
      "cleaningPrivate": false,
      "playMusic": "discussable",
      "smokingAllowed": "outside_only",
      "preferredGender": "female",
      "couplesAllowed": true,
      "heating": "central"
    }
  }
]

Feed validator

Validate your feed against HousingAnywhere business rules before going live. You can test a hosted feed URL (with optional bearer token) or paste JSON directly.

Security: Credentials are sent only to test your endpoint during validation; never commit tokens to source control.
Limitations: Image URLs are not HTTP-checked and minimum image count is not enforced here. Geocoding and account/country rules are checked only during real sync.

Validator API

The validator is also available as an API, for example to check your feed from a script or CI before you publish changes. It needs no authentication and is rate limited per IP address. The request body can be at most 4 MiB. Validate larger feeds in url mode.

POST Validate feed

URL: https://api.housinganywhere.com/v1/ha/validate-feed

Request format: JSON object, see the fields below

Response format: JSON object with the validation result

Request fields
Field Type Required Description
input_mode string Required url to validate a hosted feed, json to validate a feed sent in the request.
address string Required for url Your feed URL. HousingAnywhere fetches it from its own servers, so it must be publicly reachable.
jwt_token string Optional Bearer token for your feed endpoint, without the Bearer prefix. Sent as Authorization: Bearer <token> when fetching your feed.
feed array or string Required for json Your feed: the listings array itself, or a string containing it.

Validate a hosted feed:

curl -X POST https://api.housinganywhere.com/v1/ha/validate-feed \
  -H "Content-Type: application/json" \
  -d '{"input_mode": "url", "address": "https://your-domain.com/feed.json", "jwt_token": "your-token"}'

Validate a feed sent in the request body:

{
  "input_mode": "json",
  "feed": [
    {
      "listingReference": "listing-001",
      "type": "apartment",
      "kind": "private_room",
      "description": "Bright private room in a shared apartment, ten minutes from the city centre.",
      "address": "Blaak 555, 3011 GL Rotterdam, Netherlands",
      "pricingType": "flat",
      "flatPrice": 85000,
      "currencyCode": "EUR",
      "facilities": {
        "bedroomCount": 1
      }
    },
    {
      "listingReference": "listing-002",
      "type": "apartment",
      "kind": "entire_place",
      "description": "Furnished one-bedroom apartment with a balcony, close to the university and public transport.",
      "address": "Witte de Withstraat 20, 3012 BP Rotterdam, Netherlands",
      "pricingType": "flat",
      "currencyCode": "EUR",
      "facilities": {
        "bedroomCount": 1
      }
    },
    {
      "listingReference": "listing-003",
      "type": "apartment",
      "kind": "entire_place",
      "description": "Spacious studio with its own kitchen and bathroom, a short bike ride from the station.",
      "address": "Nieuwe Binnenweg 101, 3014 GH Rotterdam, Netherlands",
      "pricingType": "flat",
      "flatPrice": 110000,
      "currencyCode": "EUR",
      "facilities": {
        "bedroomCount": 1
      },
      "costs": {
        "security-deposit": {
          "value": 120000,
          "payableBy": "tenant",
          "payableAt": "monthly",
          "required": true,
          "refundable": true,
          "isEstimated": false
        }
      }
    },
    {
      "listingReference": "listing-004",
      "type": "apartment",
      "kind": "private_room",
      "description": "Quiet room in a family home with a garden, bills included and fast wifi.",
      "address": "Kralingse Plaslaan 8, 3061 BA Rotterdam, Netherlands",
      "pricingType": "flat",
      "flatPrice": 70000,
      "currencyCode": "EUR",
      "facilities": {
        "bedroomCount": 1
      },
      "videos": [
        "https://vimeo.com/76979871"
      ]
    }
  ]
}

Example response. ok is true only when the feed parses and every listing is valid. Each entry in results lists the errors and warnings for one listing, or null when there are none. When the feed is not valid JSON, the response has parse_error instead of summary and results. In url mode the response also has a fetch object with ok, status_code and error for the request to your feed.

{
  "ok": false,
  "summary": {
    "total": 4,
    "valid": 1,
    "invalid": 3
  },
  "results": [
    {
      "index": 0,
      "listing_reference": "listing-001",
      "errors": null,
      "warnings": null
    },
    {
      "index": 1,
      "listing_reference": "listing-002",
      "errors": [
        "flatPrice is required and must be greater than 0 when pricingType is flat"
      ],
      "warnings": null
    },
    {
      "index": 2,
      "listing_reference": "listing-003",
      "errors": [
        "[security-deposit].[payable_at] monthly is not a valid, acceptable values [move-in]"
      ],
      "warnings": null
    },
    {
      "index": 3,
      "listing_reference": "listing-004",
      "errors": [
        "videos[0]: youtube url expected"
      ],
      "warnings": null
    }
  ]
}