Documentation for new partners
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.
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:
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.
[
{
"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 | 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. |
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.
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"
}
]
}
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).
| 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"
}
]
}
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
}
]
}
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.| 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
}
}
}
| 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"
}
}
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 |
| 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. |
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 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"
}
}
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"
}
URL:
https://your-domain.com/api/listings
Description: HousingAnywhere will call this endpoint to retrieve your feed
Response Format: JSON array of listing objects
[
{
"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"
}
}
]
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.
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.
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
| 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
}
]
}