Skip to main content
POST
/
api
/
properties
Create Property
curl --request POST \
  --url https://api.example.com/api/properties \
  --header 'Authorization: <authorization>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "title": "<string>",
  "propertyTypeId": 123,
  "operationTypeId": 123,
  "price": 123,
  "description": "<string>",
  "propertySubtypeId": 123,
  "statusId": 123,
  "currencyId": 123,
  "originalPrice": 123,
  "expenses": 123,
  "surfaceCoveredM2": 123,
  "surfaceUncoveredM2": 123,
  "lotSize": 123,
  "rooms": 123,
  "bedrooms": 123,
  "bathrooms": 123,
  "yearBuilt": 123,
  "conditionId": 123,
  "condition": "<string>",
  "floor": 123,
  "hasBalcony": {},
  "hasTerrace": {},
  "hasLaundry": {},
  "hasGarden": {},
  "petsAllowed": {},
  "oportunidad": {},
  "creditoHipotecario": {},
  "aptoProfesional": {},
  "aceptaPermuta": {},
  "amoblado": {},
  "duenioDirecto": {},
  "garageSpaces": 123,
  "youtubeVideoUrl": "<string>",
  "features": [
    "<string>"
  ],
  "contactPhone": "<string>",
  "contactEmail": "<string>",
  "location": {
    "street": "<string>",
    "streetNumber": "<string>",
    "floorApartment": "<string>",
    "neighborhood": "<string>",
    "city": "<string>",
    "province": "<string>",
    "postalCode": "<string>",
    "country": "<string>",
    "latitude": 123,
    "longitude": 123,
    "showExactAddress": true
  },
  "images": [
    null
  ],
  "newImageRotations": [
    123
  ],
  "mainNewImageIndex": 123
}
'
{
  "success": true,
  "data": {
    "id": "<string>",
    "message": "<string>"
  }
}

Overview

Create a new property listing with details, images, and location. This endpoint accepts multipart/form-data for image uploads.

Authentication

Authorization
string
required
Bearer token. Admin role required.

Request Body

This endpoint accepts multipart/form-data for image uploads. All fields except title, propertyTypeId, operationTypeId, and price are optional.

Required Fields

title
string
required
Property title (max 255 characters).
propertyTypeId
number
required
Property type ID (e.g., 1 for apartment, 2 for house).
operationTypeId
number
required
Operation type ID (e.g., 1 for sale, 2 for rent).
price
number
required
Property price (must be >= 0).

Optional Property Details

description
string
Property description.
propertySubtypeId
number
Property subtype ID.
statusId
number
Status ID (defaults to 1 - active).
currencyId
number
default:"1"
Currency ID.
originalPrice
number
Original price before discount.
expenses
number
Monthly expenses.

Surface & Size

surfaceCoveredM2
number
Covered surface area in square meters.
surfaceUncoveredM2
number
Uncovered surface area in square meters.
lotSize
number
Lot size in square meters.

Room Information

rooms
number
Total number of rooms.
bedrooms
number
Number of bedrooms.
bathrooms
number
Number of bathrooms.

Building Details

yearBuilt
number
Year the property was built.
conditionId
number
Condition ID.
condition
string
Condition name (alternative to conditionId).
floor
number
Floor number.

Features (Boolean)

hasBalcony
boolean | string
Whether property has a balcony (accepts “true”/“false” strings for multipart forms).
hasTerrace
boolean | string
Whether property has a terrace.
hasLaundry
boolean | string
Whether property has a laundry room.
hasGarden
boolean | string
Whether property has a garden.
petsAllowed
boolean | string
Whether pets are allowed.
oportunidad
boolean | string
Whether this is an opportunity listing.
creditoHipotecario
boolean | string
Whether mortgage credit is available.
aptoProfesional
boolean | string
Whether suitable for professional use.
aceptaPermuta
boolean | string
Whether property exchange is accepted.
amoblado
boolean | string
Whether property is furnished.
duenioDirecto
boolean | string
Whether owner is selling directly.

Additional Features

garageSpaces
number
default:"0"
Number of garage spaces.
youtubeVideoUrl
string
YouTube video URL for property tour.
features
string[]
Array of custom feature labels (JSON array as string in multipart).

Contact Information

contactPhone
string
Contact phone number (max 50 characters).
contactEmail
string
Contact email address (must be valid email).

Location

location
object
Property location (JSON object as string in multipart).
street
string
required
Street name.
streetNumber
string
Street number.
floorApartment
string
Floor and apartment.
neighborhood
string
Neighborhood.
city
string
City (defaults to empty string).
province
string
Province/state (defaults to empty string).
postalCode
string
Postal code.
country
string
default:"Argentina"
Country.
latitude
number
Latitude (-90 to 90).
longitude
number
Longitude (-180 to 180).
showExactAddress
boolean
default:"true"
Whether to show exact address publicly.

Images

images
File[]
Array of image files (field name: “images”). Maximum 20 files. Automatically converted to WebP with variants.
newImageRotations
number[]
Rotation steps for new images (0-3, where 1=90°, 2=180°, 3=270°). JSON array as string.
mainNewImageIndex
number
Index of the main image among uploaded files (0-based). First image is main by default.

Response

success
boolean
Indicates if the property was created successfully.
data
object
Created property data.
id
string
The created property ID.
message
string
Success message.

Example Request

curl -X POST "https://api.example.com/api/properties" \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -F "title=Hermoso departamento en Palermo" \
  -F "description=Excelente departamento de 2 ambientes con balcón" \
  -F "propertyTypeId=1" \
  -F "operationTypeId=1" \
  -F "price=250000" \
  -F "currencyId=2" \
  -F "bedrooms=2" \
  -F "bathrooms=1" \
  -F "surfaceCoveredM2=65" \
  -F "hasBalcony=true" \
  -F 'location={"street":"Av. Santa Fe","streetNumber":"3500","neighborhood":"Palermo","city":"Buenos Aires","province":"CABA","country":"Argentina","showExactAddress":false}' \
  -F 'features=["Luminoso","Cerca del subte"]' \
  -F "[email protected]" \
  -F "[email protected]"

Example Response

{
  "success": true,
  "data": {
    "id": "123",
    "message": "Property created successfully"
  }
}

Error Responses

Validation Error (400)

{
  "success": false,
  "message": "Validation error",
  "errors": [
    {
      "code": "too_small",
      "minimum": 1,
      "type": "string",
      "message": "String must contain at least 1 character(s)",
      "path": ["title"]
    }
  ]
}

Unauthorized (401)

{
  "success": false,
  "message": "Unauthorized"
}

Notes

  • A unique SEO-friendly URL slug is automatically generated from title, city, and province
  • Images are automatically processed to create large and thumbnail WebP variants
  • Boolean features are converted to Spanish labels and stored in unified characteristics
  • Property is set to published immediately upon creation
  • User ID is automatically set from the authenticated admin user

Build docs developers (and LLMs) love