Create a Property

How to create a listing in Guesty.

❗️

Important

Properties are automatically created as active ("pms.active": true and "active": true).

Overview

To create listings via the API, you must make requests to multiple endpoints, such as listings, spaces, house-rules and complex. This guide provides you with the recommended parameters to include to create the property in Guesty. Booking settings and policies, marketing descriptions, financial strategies, and automation should be configured via updates through their respective endpoints. For information about key parameters from a specific endpoint, please refer to its respective documentation.

Creating a Property

Available Endpoints

MethodEndpoint
POST/listings

Key Parameters

The complete list of parameters can be found in the developer document. The parameters below represent Guesty's recommendations for creating the base listing structure you will enhance later.

Body ParameterTypeDescriptionRequired
titlestringThe name used to market the property.
nicknamestringThe internal name for the property.✔️
addressobjectThe street location of the property. See the Create a Property section below.✔️
pricesobjectThe basic fees. See the Prices table below.
termsobjectDefines the permitted stay lengths and default cancelation policy. See below for more details.
pictures[object]Property photos. Upload five, including at least one interior and exterior picture. See the Pictures section below.
typestringDefine the property as a SINGLE property or Multi-Unit (MTL) - see the Multi-Units section below.
accommodatesnumberThe total number of people the property can accommodate.
roomTypestringChoose from three options: Entire home/apartment, Shared room, or Private room.
propertyTypestringChoose from: Condominium, Apartment, House, Loft, Boat, Camper/RV, Chalet, Bed & Breakfast, Villa, Tent, Cabin, Townhouse, Bungalow, Hut, or Other.
otaRoomTypestringThis is required for Booking.com only. Select from the following: apartment, suite, studio, dormitory_room, family, bungalow, chalet, holiday_home, villa, mobile_home, or tent
defaultCheckInTimestringThe default is 15:00. Only include it if you wish to specify a different time (Hh:mm).
defaultCheckoutTimestringThe default is 11:00. Only include it if you wish to specify a different time ((Hh:mm).
amenities[string]This is a list of the amenities provided at the property. Choose from this list.
areaSquareFeetnumberSpecify the size of the property.
timezonestringSelect the relevant value from this list. E.g., "America/Cancun".
isListedbooleanEnter true to make it visible to the market, or false to hide it from the marketplace.
minimumAgenumberThe minimum age the guest needs to be to book the property. E.g., 21.

Property Address

To provide us with your address, simply enter any complete street address into the full field. The data will automatically be parsed into the remaining fields. However, if you encounter any issues with the address, you may consider entering the address data into the individual address fields shown below in addition to thefull address.

Body ParameterTypeDescriptionRequired
fullstringThe whole street address.✔️
lngnumberThe longitude of the location. It must be entered in decimal format.recommended
latnumberThe latitude of the location. It must be entered in decimal format.recommended
streetstringThe street name and number.recommended
citystringThe name of the city the property is located in. This value is used in the city filters wherever they appear in Guesty.recommended
zipcodestringThe zipcode/postcode.recommended
statestringThe state within which the property is located.recommended
countrystringThe country within which the property is located.recommended

Example

  "address": {
    "full": "<string>",
    "lng": <number>, // Thelongitude coordinate in decimal.
    "lat": <number>, // The latitude coordinate in decimal.
    "street": "<string>",
    "city": "<string>",
    "state": "<string>",
    "zipcode": "<string>",
    "country": "<string>"
  }

Prices

Body ParameterTypeDescriptionRequired
basePricenumberThe default rate per night. This will apply to the weekend if no weekend price is defined.✔️
basePriceUSDnumberThe default US dollar rate per night.
currencystringThe currency to be used for bookings at the property. Choose from this list of ISO 4217 alphabetic codes. E.g., USD.✔️
weekendBasePricenumberThe default weekend rate per night.
cleaningFeenumberThe price charged to the guest for cleaning the property between stays.
securityDepositFeenumberSet the security deposit for the property.
guestsIncludedInRegularFeenumberThe number of guests covered by the price.
extraPersonFeenumberThe fee charged for guests above the number included in the price.
monthlyPriceFactornumberThe monthly length of stay discount. It is written as a decimal and represented as 100% less the discount. E.g.,0.8 grants a 20% discount.
weeklyPriceFactornumberThe weekly length of stay discount. It is written as a decimal and represented as 100% less the discount. E.g. 0.95 grants a 5% discount.

Terms

Body ParameterTypeDescriptionRequired
minNightnumberThe default minimum stay length.
maxNightsnumberThe maximum length of stay that can be booked.

Example

    "terms": {
        "minNights": <number>,
        "maxNights": <number>,
    }

Pictures

📘

Photos

Including a minimum of five photos, with at least one showing the interior and exterior, can help avoid Trust and Safety suspensions on booking channels. Listings with few photos that don't display both views are more likely to be flagged.

Body ParameterTypeDescriptionRequired
originalstringThe URL for accessing the original image.✔️
thumbnailstringThe URL for accessing the thumbnail image. The recommended height for the image is 200 pixels. Guesty will scale the width proportionally.✔️
captionstringAdd a caption to describe the photo.recommended

Example

  "pictures": [
    {
      "original": "<URL>",
      "caption": "<string>",
    }
  ]

Optional Parameters

Body ParameterTypeDescription
originstringInclude if you need to record the platform from which the listing was migrated.
originIDstringThe property ID from the platform it was previously migrated from.

Put this all together, and your request should resemble this example:

curl 'https://open-api.guesty.com/v1/v1/listings' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'Authorization: Bearer <accessToken>' \
--data '{
    "title": "<string>",
    "nickname": "<string>",
    "isListed": <boolean>,
    "timezone": "<string>",
    "address": {
        "full": "<string>",
        "lat": <number>,
        "lng": <number>,
        "street": "<string>",
        "city": "<string>",
        "zipcode": "<string>",
        "state": "<string>",
        "country": "<string>"
    },
    "prices": {
        "guestsIncludedInRegularFee": <integer>,
        "extraPersonFee": <number>,
        "basePrice": <number>,
        "basePriceUSD": <number>,
        "monthlyPriceFactor": <number>,
        "weeklyPriceFactor": <number>,
        "weeendBasePrice": <number>,
        "securityDepositFee": <number>,
        "currency": "<string>",
        "cleaningFee": <number>
    },
    "terms": {
        "minNights": <number>,
        "maxNights": <number>
    },
    "pictures": [
        {
            "original": "<URL>",
            "caption": "<string>"
        },
        {
            "original": "<URL>",
            "caption": "<string>"
        },
        {
            "original": "<URL>",
            "caption": "<string>"
        },
        {
            "original": "<URL>",
            "caption": "<string>"
        },
        {
            "original": "<URL>",
            "caption": "<string>"
        }
    ],
    "type": "<enum>",
    "accommodates": <number>,
    "otaRoomType": "<enum>",
    "minimumAge": <number>,
    "propertyType": "<enum>",
    "roomType": "<enum>",
    "defaultCheckInTime": "<string>",
    "defaultCheckOutTime": "<string>",
    "areaSquareFeet": <number>,
    
    "amenities": [
        "<string>",
        "<string>",
        "<etc.>"
    ],
    "origin": "<string>",
    "originId": "<string>"
}'
const myHeaders = new Headers();
myHeaders.append("accept", "application/json");
myHeaders.append("content-type", "application/json");
myHeaders.append("Authorization", "Bearer {accessToken}");

const raw = "{\n  \"title\": \"<string>\",\n  \"nickname\": \"<string>\",\n  \"isListed\": <boolean>,\n  \"timezone\": \"<string>\",\n  \"address\": {\n    \"full\": \"<string>\",\n    \"lat\": <number>,\n    \"lng\": <number>,\n    \"street\": \"<string>\",\n    \"city\": \"<string>\",\n    \"zipcode\": \"<string>\",\n    \"state\": \"<string>\",\n    \"country\": \"<string>\"\n  },\n  \"prices\": {\n    \"guestsIncludedInRegularFee\": <integer>,\n    \"extraPersonFee\": <number>,\n    \"basePrice\": <number>,\n    \"basePriceUSD\": <number>,\n    \"monthlyPriceFactor\": <number>,\n    \"weeklyPriceFactor\": <number>,\n    \"weeendBasePrice\": <number>,\n    \"securityDepositFee\": <number>,\n    \"currency\": \"<string>\",\n    \"cleaningFee\": <number>\n  },\n  \"terms\": {\n    \"minNights\": <number>,\n    \"maxNights\": <number>\n  },\n  \"pictures\": [\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    }\n  ],\n  \"type\": \"<enum>\",\n  \"accommodates\": <number>,\n  \"otaRoomType\": \"<enum>\",\n  \"minimumAge\": <number>,\n  \"propertyType\": \"<enum>\",\n  \"roomType\": \"<enum>\",\n  \"defaultCheckInTime\": \"<string>\",\n  \"defaultCheckOutTime\": \"<string>\",\n  \"areaSquareFeet\": <number>,\n  \"amenities\": [\n    \"<string>\",\n    \"<string>\",\n    \"<etc.>\"\n  ],\n  \"origin\": \"<string>\",\n  \"originId\": \"<string>\"\n}";

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "manual"
};

fetch("https://open-api.guesty.com/v1/v1/listings", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://open-api.guesty.com/v1/v1/listings',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => false,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
  "title": "<string>",
  "nickname": "<string>",
  "isListed": <boolean>,
  "timezone": "<string>",
  "address": {
    "full": "<string>",
    "lat": <number>,
    "lng": <number>,
    "street": "<string>",
    "city": "<string>",
    "zipcode": "<string>",
    "state": "<string>",
    "country": "<string>"
  },
  "prices": {
    "guestsIncludedInRegularFee": <integer>,
    "extraPersonFee": <number>,
    "basePrice": <number>,
    "basePriceUSD": <number>,
    "monthlyPriceFactor": <number>,
    "weeklyPriceFactor": <number>,
    "weeendBasePrice": <number>,
    "securityDepositFee": <number>,
    "currency": "<string>",
    "cleaningFee": <number>
  },
  "terms": {
    "minNights": <number>,
    "maxNights": <number>
  },
  "pictures": [
    {
      "original": "<URL>",
      "caption": "<string>"
    },
    {
      "original": "<URL>",
      "caption": "<string>"
    },
    {
      "original": "<URL>",
      "caption": "<string>"
    },
    {
      "original": "<URL>",
      "caption": "<string>"
    },
    {
      "original": "<URL>",
      "caption": "<string>"
    }
  ],
  "type": "<enum>",
  "accommodates": <number>,
  "otaRoomType": "<enum>",
  "minimumAge": <number>,
  "propertyType": "<enum>",
  "roomType": "<enum>",
  "defaultCheckInTime": "<string>",
  "defaultCheckOutTime": "<string>",
  "areaSquareFeet": <number>,
  "amenities": [
    "<string>",
    "<string>",
    "<etc.>"
  ],
  "origin": "<string>",
  "originId": "<string>"
}',
  CURLOPT_HTTPHEADER => array(
    'accept: application/json',
    'content-type: application/json',
    'Authorization: Bearer {accessToken}'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

import http.client
import json

conn = http.client.HTTPSConnection("open-api.guesty.com")
payload = "{\n  \"title\": \"<string>\",\n  \"nickname\": \"<string>\",\n  \"isListed\": <boolean>,\n  \"timezone\": \"<string>\",\n  \"address\": {\n    \"full\": \"<string>\",\n    \"lat\": <number>,\n    \"lng\": <number>,\n    \"street\": \"<string>\",\n    \"city\": \"<string>\",\n    \"zipcode\": \"<string>\",\n    \"state\": \"<string>\",\n    \"country\": \"<string>\"\n  },\n  \"prices\": {\n    \"guestsIncludedInRegularFee\": <integer>,\n    \"extraPersonFee\": <number>,\n    \"basePrice\": <number>,\n    \"basePriceUSD\": <number>,\n    \"monthlyPriceFactor\": <number>,\n    \"weeklyPriceFactor\": <number>,\n    \"weeendBasePrice\": <number>,\n    \"securityDepositFee\": <number>,\n    \"currency\": \"<string>\",\n    \"cleaningFee\": <number>\n  },\n  \"terms\": {\n    \"minNights\": <number>,\n    \"maxNights\": <number>\n  },\n  \"pictures\": [\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    },\n    {\n      \"original\": \"<URL>\",\n      \"caption\": \"<string>\"\n    }\n  ],\n  \"type\": \"<enum>\",\n  \"accommodates\": <number>,\n  \"otaRoomType\": \"<enum>\",\n  \"minimumAge\": <number>,\n  \"propertyType\": \"<enum>\",\n  \"roomType\": \"<enum>\",\n  \"defaultCheckInTime\": \"<string>\",\n  \"defaultCheckOutTime\": \"<string>\",\n  \"areaSquareFeet\": <number>,\n  \"amenities\": [\n    \"<string>\",\n    \"<string>\",\n    \"<etc.>\"\n  ],\n  \"origin\": \"<string>\",\n  \"originId\": \"<string>\"\n}"
headers = {
  'accept': 'application/json',
  'content-type': 'application/json',
  'Authorization': 'Bearer {accessToken}'
}
conn.request("POST", "/v1/v1/listings", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

The response will return a status 200 OK with the listing object as its payload.

Multi-Units

When creating a new multi-unit, include the following additional parameters in your request.

 

Body Parameter Type Description Required
numberOfChildrenToCreate number The amount of sub-units to create.  
manageSubunitPictures boolean Set as true for the sub-units to inherit the multi-unit's pictures, or false to manage the pictures on the unit level.  
mtl object The multi-unit management settings.  
  aas string When to assign a reservation to a unit. It can be one of the following: oc (on create), m (manual), or bc (before check-in).  
  aao string Defines the automatic assignment rules for the selected multi-unit - it is not relevant for listings that have manual assignment logic ("aas": "m"). It must be one of the following: f (first free by unit's nickname), or r (randomly).  
  bc number When "aas": "bc", set the number of days before check-in to assign the reservation to a unit.  
  hdb4 number Defines the number of days before check-in to highlight unassigned upcoming reservations on the multi-calendar.  
  lmcn boolean When true it limits availability to match consecutive available nights for a specific sub-unit, else it will be calculated according to the number of vacant sub-units (false).  

Example

{ ...
  "mtl":{
    "aas":"bc",
    "aao":"f",
    "bc":14,
    "hdb4":14,
    "lmcn":true
  },
  "numberOfChildrenToCreate":5,
  "manageSubunitPictures":true
 ...
}

Complexes

A complex is a hotel-like property with different types of listings at the same address. It is a holding structure within minimal parameters. A complex can be comprised of single-units, multi-units, or both.

While some channels require listings to be set up as complexes, you may decide to utilize this listing type to organize your listings in Guesty. Learn more here.

Create a Complex

First, create the complex's properties according to the recommendations in the Create a Property section. Afterward, Create the complex and assign the properties to the complex.