Saltar para o conteúdo principal

Full listing feeds

A full listing feed gives Uniplaces, Spotahome, Housing Anywhere and Inlife a landlord's whole catalogue in the marketplace's own JSON format, ready to publish.

Before you start​

ItemValue
PlatformsUniplaces, Spotahome, Housing Anywhere and Inlife
Base URLhttps://api.vivin.app/<prefix>, for example /uniplaces-integration
AuthenticationAuthorization: Bearer <partner-token>, the same token as your other routes (Authentication)
Landlord keyEach request names one landlord account in the path (The landlord key)
Use it forCreating and updating listings on your marketplace: photos, address, descriptions, amenities, prices and blocked dates. For calendar and price sync of linked units, the partial feed is enough
FreshnessThe bulk feed is rebuilt about every 10 minutes. The single-listing route is always live

Endpoints​

MethodPathReturns
GET/<prefix>/{landlordKey}/listings/fullEvery listing of one landlord account
GET/<prefix>/{landlordKey}/listings/{externalId}/fullOne listing of that account
PlatformPrefixBulk response
Uniplacesuniplaces-integrationJSON array, snake_case
Spotahomespotahome-integration{ "properties": [ … ] }, following Spotahome's JSON Feed format
Housing Anywherehousinganywhere-integrationJSON array, amounts in cents
Inlifeinlife-integrationJSON array

The Uniplaces reference lists the partial GET /listings next to the full listing feed

List a landlord's catalogue​

GET /<prefix>/{landlordKey}/listings/full

Path parameters​

NameTypeRequiredDescription
landlordKeystringYesThe landlord key or the Integration Email (The landlord key)

Example request​

curl https://api.vivin.app/uniplaces-integration/[email protected]/listings/full \
-H "Authorization: Bearer <partner-token>"

Response​

200 OK with every listing that qualifies (Which listings appear), in the platform's shape. A landlord key that matches no account is not an error: you get 200 with [] (for Spotahome, { "properties": [] }).

Errors​

StatusmessageCauseWhat to do
400landlordKey must be a non-empty valueThe key segment is blankPut the landlord key in the path
401Missing integration credentials and othersMissing or wrong partner tokenSee Authentication
503The service is busy. Please try again in a moment.VIVIN is briefly overloadedRetry after the seconds in the Retry-After header

The bulk route never returns 404: a unit that does not qualify is simply not in the array.

Retrieve one catalogue listing​

GET /<prefix>/{landlordKey}/listings/{externalId}/full returns one object in the same shape as an item of the bulk feed. For Spotahome, it is not wrapped in properties.

Path parameters​

NameTypeRequiredDescription
landlordKeystringYesAs above. The listing must belong to the matched account
externalIdstringYesYour linked ID for the unit, or the VIVIN unit ID that the feed exports for unlinked units

Example request​

curl https://api.vivin.app/housinganywhere-integration/[email protected]/listings/a1b2c3/full \
-H "Authorization: Bearer <partner-token>"

Errors​

StatusmessageCauseWhat to do
404Listing not found for <platform> with externalId <id>The landlord key matches no account, the ID is neither a linked unit of that account nor its VIVIN unit ID, the property is archived, or the unit is Excluded from feedCheck the key and take the ID from the bulk feed
404Listing not availableThe unit has no usable rentAsk the landlord to set a rent
404Listing not available: region is not supported by InlifeInlife only: the city is not one Inlife accepts (Inlife)Ask the landlord to fix the city
400, 401, 503As in List a landlord's catalogue

The landlord key​

The {landlordKey} path segment picks the VIVIN account whose listings you receive. It accepts either:

  • the account's landlord key, which VIVIN gives you during onboarding (exact match), or
  • the Integration Email the landlord entered on your platform's card under Settings → Integrations → Booking Platforms (letter case is ignored). If several accounts use the same email, the feed covers all of them.

The Housing Anywhere webhook takes the same key (Webhooks and notifications).

Which listings appear​

FeedUnits included
Partial: GET /<prefix>/listingsOnly units linked to your platform in the unit's Channels section
Full: GET /<prefix>/{landlordKey}/listings/fullEvery unit of the account, linked or not

That is why the full feed can hold more listings than the partial one. It still leaves a unit out when:

  • the unit is archived, or its property is archived,
  • the landlord set your platform to Excluded from feed on the unit's Full integration tab, under Integration listings,
  • it has no usable rent: a fixed rent of 0, or a variable rent with no monthly rents or with a month at 0,
  • (Inlife only) its city is not one Inlife accepts.

A unit that appears only in the full feed cannot be booked with POST /<prefix>/bookings until it is linked in Channels. The Uniplaces and Housing Anywhere webhooks accept it by its VIVIN unit ID (Property and unit mapping).

Listing IDs​

Each feed has one field that identifies the unit. Store it and use it on the single-listing route and in webhooks.

PlatformID fieldLinked unitUnlinked unit
Uniplacesreference_idYour Uniplaces external IDThe VIVIN unit ID (a UUID)
SpotahomeidYour Spotahome external IDThe VIVIN unit ID
Housing AnywherelistingReferenceYour Housing Anywhere external IDThe VIVIN unit ID
Inlifeid and room.idYour ID split in two (see below)Both hold the VIVIN unit ID
  • Send the same value back in webhooks: offer_api_reference for Uniplaces, listing_external_reference for Housing Anywhere (Webhooks and notifications).
  • Inlife: the stored key is Inlife's propertyId_roomId. The feed splits it: id is the property ID and room.id the room ID, and neither contains _. If the stored key has no _ (a studio saved with its property ID only), id is that key and room.id is the VIVIN unit ID. Do not put the joined value in id. The partial feed and POST /bookings still use the joined propertyId_roomId.

Inlife full-feed schema: id is the underscore-free property ID

What the feed contains​

The feed is built from what the landlord fills in on the Full integration tab of the property and unit editors (copy, location, amenities, rules and partner-specific fields) and from the photos on their Photos tab.

PlatformMain fields
Uniplacesreference_id, property_reference_id, property_type, rent_by, location, available_from, listing_pricing, property_elements, property_images (whole properties) or listing_images (rooms and beds), property_description, listing_description, property_features, listing_features, property_rules, property_size, floor, blocked_periods, landlord_email, original_listing_url, updated_at
Spotahomeid, type, copy (title and description), suitability, location, pricing, area, availabilities, instant_booking, stay, status, property (images, bathrooms, amenities), bedrooms[] for rooms
Housing AnywherelistingReference, description, address, pricingType, flatPrice or monthlyPrices, currencyCode, type, kind, costs, blockedPeriods, minimumStayMonths, maximumStayMonths, facilities, images, minAge / maxAge, floor, registrationNumber
Inlifeid, title and description per language, address, coordinates, region, neighborhood, photos, amenity counts and flags, house rules, securityDeposit, extraAdministrativeFee, landlord_email, room (rent, stay limits, photos, unavailability), creationDate, modificationDate, updated
  • landlord_email (Uniplaces, Inlife) is the Integration Email from your platform's card, not the landlord's login or a per-unit contact. Uniplaces leaves the field out when the card has none.
  • Placeholder images are removed: stock-image hosts such as picsum.photos, placehold.co or dummyimage.com never appear.
  • The Wi-Fi password is never included, only the fact that the unit has Wi-Fi.
  • New fields can be added at any time. Ignore fields you do not use.

Uniplaces full-feed schema: location, image lists, descriptions and feature tags

Prices​

  • Rent includes the Markup on the landlord's card for your platform. Deposit and fees do not.
  • Currency: Uniplaces and Housing Anywhere state it (currency_code, currencyCode). It is the Currency (ISO 4217) set under the property's Full integration → Partner platforms, otherwise the account currency.
  • Housing Anywhere amounts are in cents in the full feed: divide by 100. The partial feed uses normal amounts.
UniplacesSpotahomeHousing AnywhereInlife
Fixed rentlisting_pricing.rentspricing.monthlypricingType: "flat", flatPriceroom.rent, room.fixedRent: true
Variable rentrents = the highest monthmonthly = the highest monthpricingType: "monthly", 12 monthlyPricesroom.fixedRent: true; room.rent, room.minRent and room.maxRent = the highest month; no per-month prices
Depositlisting_pricing.deposit.valuepricing.depositcosts["security-deposit"]securityDeposit
Admin feelisting_pricing.admin_fee.valuepricing.admin_feecosts["administration-fee"]extraAdministrativeFee
Bills includedlisting_pricing.bills: truebills: [{ "name": "all", "option": "included", "value": "0" }]No bills cost linebillsIncluded: true
Cleaningcleaning / cleaning_included booleans onlyservicesAndExpenses → periodicCleaningcosts["cleaning-fee"], monthlycleaningLadyPrice
Extra tenantNot publishedNot publishedNot publishedroom.extraTenantsPrice (0 when the unit sleeps one)
  • For a variable-rent unit, charge each month from its own rent: Housing Anywhere monthlyPrices, or rentsPerMonth on the partial feed. Do not apply the Uniplaces or Spotahome headline to every month.
  • Spotahome rooms carry monthly, deposit and admin_fee in bedrooms[].pricing. The top-level pricing then holds only bills and services.
  • The exit fee, the local rent cap and the extra deposit per tenant are not in any feed.

The Housing Anywhere costs object lists only positive amounts the tenant pays, each with value (cents), payableBy, payableAt, required, refundable and isEstimated. Bills included in the rent are left out. When bills are not included and the property has a monthly bills amount, it appears as an estimated other-additional-costs line. membership-fee (at move-in) and parking (monthly) come from the property's Membership fee amount and Parking fee amount under Full integration → Partner platforms. For example, 850 rent with an 850 deposit:

{
"listingReference": "a1b2c3",
"currencyCode": "EUR",
"pricingType": "flat",
"flatPrice": 85000,
"costs": {
"security-deposit": {
"value": 85000,
"payableBy": "tenant",
"payableAt": "move-in",
"required": true,
"refundable": true,
"isEstimated": false
}
}
}

Housing Anywhere full-feed schema: flatPrice and the costs object are in cents

Blocked dates​

Each feed lists the nights the unit cannot be booked: bookings and the landlord's blocks.

PlatformFieldEnd date meansBlock with no end date
Uniplacesblocked_periods[] → from, toto = last blocked night (inclusive)Left out
Spotahomebedrooms[].availabilities.occupancies[] → from, to (shared rooms only)to = last blocked night (inclusive)to: null
Housing AnywhereblockedPeriods[] → startDate, endDateendDate = first free day (exclusive)Left out
Inliferoom.unavailability[] → start, endend = last blocked night (inclusive)end: null

A stay from the night of 1 May 2027 to the night of 31 August 2027 appears as:

  • Uniplaces and Spotahome: "from": "2027-05-01", "to": "2027-08-31"
  • Housing Anywhere: "startDate": "2027-05-01", "endDate": "2027-09-01"
  • Inlife: "start": "2027-05-01", "end": "2027-08-31"

In each case the next check-in can be on 1 September.

  • Overlapping blocks (sharing at least one night) are merged into one range.
  • Blocks that ended before today are left out. Housing Anywhere also moves a past startDate forward to today.
  • Spotahome whole apartments and studios carry no occupancy list. They publish availabilities.available_from and available_to (the latest move-out date of the unit's booking window, or null).
  • Booking windows: when a unit has an open booking window, the nights before its earliest move-in and after its latest move-out are published as blocked on Uniplaces, Spotahome rooms and Inlife. Housing Anywhere (minimumStayMonths, maximumStayMonths), Inlife (room.periodStayMin, room.periodStayMax) and Spotahome (stay, in days) also recalculate the stay limits from the window length. Housing Anywhere blockedPeriods does not get these extra blocks.
  • Calendar Block (days): if the landlord set it on your platform's card, you may see a block of about two years, starting where the unit's furthest-out block ends once that date is further away than the number of days set.

Platform specifics​

Spotahome​

  • Photos: Spotahome gets the unit's own photos only, not the property's. Spotahome asks for at least 5 images, so when a unit has 1 to 4 photos the feed repeats them to reach 5.
  • Location: city is a lowercase slug of the property's City, or the Feed city slug from Full integration → Partner platforms when set. A property with no country is sent as ES.
  • Stay: stay.min_days and stay.max_days (also on bedrooms[] for rooms) are the unit's minimum and maximum stay converted to days at 30 days a month, as strings. A unit with no minimum set is sent as "30"; no maximum is null. When instant booking is on, instant_booking.min_months_stay is the minimum stay in months, at least 1.

Inlife​

Inlife accepts only certain cities. VIVIN reads the property's City, then its Region, from Full integration → Location & geography, ignoring case and accents.

Inlife regionNames that match
LisboaLisbon, Lisboa, Lisbonne
PortoPorto, Oporto
MadridMadrid
BarcelonaBarcelona
RomaRome, Roma
MilanMilan, Milano
SevillaSeville, Sevilla
ValenciaValencia
AveiroAveiro
BragaBraga

A unit with any other city is left out of the bulk feed, and its single-listing route returns 404 Listing not available: region is not supported by Inlife. The Inlife partial feed does not apply this check.

room.availableFrom, room.firstAvailability, creationDate, modificationDate and updated are Unix epoch milliseconds. room.firstAvailability is the earliest date, from today on, that is either availableFrom or the day after a blocked range ends. The blocked-date rows are the exception: start and end are YYYY-MM-DD text.

{
"room": {
"availableFrom": 1819756800000,
"firstAvailability": 1819756800000,
"unavailability": [
{ "start": "2027-05-01", "end": "2027-08-31", "added": "2026-09-20" }
]
}
}

Spotahome legacy feed​

Spotahome also has an older feed in an earlier { "properties": [ … ] } format. Use the full feed for new work, and keep this one only if your integration already depends on it.

MethodPathReturns
GET/spotahome-integration/listings/feedThe units linked to Spotahome in Channels, every account
GET/spotahome-integration/listings/feed/{key}The same, for one landlord
  • {key} is the company name in the domain of the landlord's Integration Email: for [email protected], the key is sample-homes. It is not the landlord key of the full feed.
  • The key only identifies a landlord on a company domain. A gmail.com Integration Email gives no key, so that landlord is left out of the keyed feed. Another shared domain, such as outlook.com, gives one key (outlook) for every landlord on it.
  • Both routes use the partner token and the standard errors.

Polling​

  • The bulk feeds are rebuilt about every 10 minutes per landlord key, so polling more often returns the same data. The single-listing routes are always live: use them to check one unit right before you publish it.
  • Partner routes have no rate limit.
  • updated_at (Uniplaces) and updated (Inlife) change when the listing record is edited, not when a booking or block is added. Re-read the blocked dates on every pull.
  • Import bookings with POST /<prefix>/bookings or your webhook, whichever feed you poll (Creating bookings).

Troubleshooting​

SymptomLikely cause and fix
The bulk feed is an empty arrayThe landlord key matched no account. Check the key or the Integration Email with the landlord
The full feed has more listings than the partial feedExpected: the full feed includes units not linked to your platform yet
A listing is in the full feed but a booking for it failsIt is not linked in Channels. Book it through your webhook by its VIVIN unit ID, or ask the landlord to link it
Housing Anywhere prices look 100 times too highThe full feed is in cents
An Inlife unit is missingIts city is not in the Inlife list. The single-listing route says so