Skip to content

Loading…

Create a property

Creates a private CRM property. Publication is a separate operation.

POST/v1/properties

Requires the properties:write scope

On this page

Operation, pricing, location, area and characteristics are separate validated objects. Each operation needs its price: sale, rent or transfer. Use owner_id only for a holder contact in the same workspace.

The response is 201 with the new id. Creating a property does not make it public. Next: upload images, then publish.

Send an optional Idempotency-Key header (1–200 characters). For 24 hours the same key, API key and operation with the same body returns the original result, without creating another record. Reusing it with a different body returns 409.

Example request

curl -X POST "https://api.vestta.app/v1/properties" \
  -H "X-Api-Key: $VESTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "operations": [
    "venta"
  ],
  "type": "apartamento",
  "title": "Apartment in Madrid",
  "pricing": {
    "sale": 350000
  },
  "location": {
    "city": "Madrid",
    "address": "Calle de Serrano",
    "full_address": "Calle de Serrano 41, 3B",
    "coordinates": {
      "latitude": 40.425318,
      "longitude": -3.687934
    },
    "visibility": "approximate"
  },
  "area": {
    "total": 95
  },
  "bedrooms": 2,
  "bathrooms": 1
}'

Authorization

  • X-Api-Keystringheaderrequired

    Your API key, AC_LIVE_<key_id>.<secret>. Authorization: ApiKey <key> is also accepted.

Request headers

  • idempotency-keystring1–200 chars

Request body

application/json · required

  • operationsarray of stringsrequired
  • typePropertyTyperequired
  • subtypestring≤ 100 chars
  • titlestringrequired1–300 chars
  • descriptionstring≤ 50000 chars default:
  • pricingPropertyPricingrequired
  • locationPropertyLocationrequired
  • areaPropertyArearequired
  • bedroomsinteger≥ 0≤ 1000 default: 0
  • bathroomsinteger≥ 0≤ 1000 default: 0
  • characteristicsPropertyCharacteristics
  • featuresarray of objects
  • owner_idinteger≥ 1

    Existing holder contact in the same business.

  • is_featuredboolean default: false
  • statusstring default: disponible

    One ofdisponiblereservada

Response

201 Successful response.

Example response
{
  "status": "ok",
  "id": 1355
}

Response fields

  • statusstring default: ok always ok
  • idintegerrequired

Errors

StatusWhen
401 UnauthorizedThe API key is missing, malformed, unknown, revoked or expired.
403 ForbiddenThe API key lacks the required scope.
404 Not FoundThe resource does not exist in this business.
409 ConflictDuplicate contact or idempotency key reused with a different payload.
422 Unprocessable ContentA path parameter, query parameter or body field is invalid.
500 Internal Server ErrorUnexpected server error while processing the request.

Error bodies and how to handle each case: Errors.