curl --request POST \
--url https://api.skortorent.com/api/v1/property-management/properties \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"workspace_id": "Ab12Cd",
"properties": [
{
"rent_amount": 1250,
"street": "Calle Mayor",
"street_number": 12,
"postal_code": "28013",
"floor": 3,
"letter": "B",
"province": "Madrid",
"municipality": "Madrid",
"entrance_stairwell": "2",
"bedrooms": 2,
"bathrooms": 1,
"property_reference": "MAD-12-3B"
}
]
}
'import requests
url = "https://api.skortorent.com/api/v1/property-management/properties"
payload = {
"workspace_id": "Ab12Cd",
"properties": [
{
"rent_amount": 1250,
"street": "Calle Mayor",
"street_number": 12,
"postal_code": "28013",
"floor": 3,
"letter": "B",
"province": "Madrid",
"municipality": "Madrid",
"entrance_stairwell": "2",
"bedrooms": 2,
"bathrooms": 1,
"property_reference": "MAD-12-3B"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
workspace_id: 'Ab12Cd',
properties: [
{
rent_amount: 1250,
street: 'Calle Mayor',
street_number: 12,
postal_code: '28013',
floor: 3,
letter: 'B',
province: 'Madrid',
municipality: 'Madrid',
entrance_stairwell: '2',
bedrooms: 2,
bathrooms: 1,
property_reference: 'MAD-12-3B'
}
]
})
};
fetch('https://api.skortorent.com/api/v1/property-management/properties', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.skortorent.com/api/v1/property-management/properties",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'workspace_id' => 'Ab12Cd',
'properties' => [
[
'rent_amount' => 1250,
'street' => 'Calle Mayor',
'street_number' => 12,
'postal_code' => '28013',
'floor' => 3,
'letter' => 'B',
'province' => 'Madrid',
'municipality' => 'Madrid',
'entrance_stairwell' => '2',
'bedrooms' => 2,
'bathrooms' => 1,
'property_reference' => 'MAD-12-3B'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.skortorent.com/api/v1/property-management/properties"
payload := strings.NewReader("{\n \"workspace_id\": \"Ab12Cd\",\n \"properties\": [\n {\n \"rent_amount\": 1250,\n \"street\": \"Calle Mayor\",\n \"street_number\": 12,\n \"postal_code\": \"28013\",\n \"floor\": 3,\n \"letter\": \"B\",\n \"province\": \"Madrid\",\n \"municipality\": \"Madrid\",\n \"entrance_stairwell\": \"2\",\n \"bedrooms\": 2,\n \"bathrooms\": 1,\n \"property_reference\": \"MAD-12-3B\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.skortorent.com/api/v1/property-management/properties")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"workspace_id\": \"Ab12Cd\",\n \"properties\": [\n {\n \"rent_amount\": 1250,\n \"street\": \"Calle Mayor\",\n \"street_number\": 12,\n \"postal_code\": \"28013\",\n \"floor\": 3,\n \"letter\": \"B\",\n \"province\": \"Madrid\",\n \"municipality\": \"Madrid\",\n \"entrance_stairwell\": \"2\",\n \"bedrooms\": 2,\n \"bathrooms\": 1,\n \"property_reference\": \"MAD-12-3B\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skortorent.com/api/v1/property-management/properties")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"workspace_id\": \"Ab12Cd\",\n \"properties\": [\n {\n \"rent_amount\": 1250,\n \"street\": \"Calle Mayor\",\n \"street_number\": 12,\n \"postal_code\": \"28013\",\n \"floor\": 3,\n \"letter\": \"B\",\n \"province\": \"Madrid\",\n \"municipality\": \"Madrid\",\n \"entrance_stairwell\": \"2\",\n \"bedrooms\": 2,\n \"bathrooms\": 1,\n \"property_reference\": \"MAD-12-3B\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Properties created successfully",
"data": {
"properties": [
{
"rent_amount": 1250,
"street": "Calle Mayor",
"street_number": 12,
"postal_code": "28013",
"floor": 3,
"letter": "B",
"province": "Madrid",
"municipality": "Madrid",
"property_id": "6655c944c2e40f249b664e74",
"workspace_id": "Ab12Cd",
"entrance_stairwell": "2",
"bedrooms": 2,
"bathrooms": 1,
"property_reference": "MAD-12-3B"
}
]
}
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}Create Properties
Creates one or multiple properties in a workspace. The landlord must
have the OWNER, GOLD, or SILVER role.
province and municipality must be an exact pair from the supported
Spanish location catalog, including accents and bilingual names. The
municipality must belong to the selected province.
Download the complete catalog.
Duplicate detection compares all required address fields case-insensitively. It covers active workspace properties and duplicate addresses within the same request.
If any duplicate is found, the API returns 409 before inserting any
property from the request.
curl --request POST \
--url https://api.skortorent.com/api/v1/property-management/properties \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"workspace_id": "Ab12Cd",
"properties": [
{
"rent_amount": 1250,
"street": "Calle Mayor",
"street_number": 12,
"postal_code": "28013",
"floor": 3,
"letter": "B",
"province": "Madrid",
"municipality": "Madrid",
"entrance_stairwell": "2",
"bedrooms": 2,
"bathrooms": 1,
"property_reference": "MAD-12-3B"
}
]
}
'import requests
url = "https://api.skortorent.com/api/v1/property-management/properties"
payload = {
"workspace_id": "Ab12Cd",
"properties": [
{
"rent_amount": 1250,
"street": "Calle Mayor",
"street_number": 12,
"postal_code": "28013",
"floor": 3,
"letter": "B",
"province": "Madrid",
"municipality": "Madrid",
"entrance_stairwell": "2",
"bedrooms": 2,
"bathrooms": 1,
"property_reference": "MAD-12-3B"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
workspace_id: 'Ab12Cd',
properties: [
{
rent_amount: 1250,
street: 'Calle Mayor',
street_number: 12,
postal_code: '28013',
floor: 3,
letter: 'B',
province: 'Madrid',
municipality: 'Madrid',
entrance_stairwell: '2',
bedrooms: 2,
bathrooms: 1,
property_reference: 'MAD-12-3B'
}
]
})
};
fetch('https://api.skortorent.com/api/v1/property-management/properties', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.skortorent.com/api/v1/property-management/properties",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'workspace_id' => 'Ab12Cd',
'properties' => [
[
'rent_amount' => 1250,
'street' => 'Calle Mayor',
'street_number' => 12,
'postal_code' => '28013',
'floor' => 3,
'letter' => 'B',
'province' => 'Madrid',
'municipality' => 'Madrid',
'entrance_stairwell' => '2',
'bedrooms' => 2,
'bathrooms' => 1,
'property_reference' => 'MAD-12-3B'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.skortorent.com/api/v1/property-management/properties"
payload := strings.NewReader("{\n \"workspace_id\": \"Ab12Cd\",\n \"properties\": [\n {\n \"rent_amount\": 1250,\n \"street\": \"Calle Mayor\",\n \"street_number\": 12,\n \"postal_code\": \"28013\",\n \"floor\": 3,\n \"letter\": \"B\",\n \"province\": \"Madrid\",\n \"municipality\": \"Madrid\",\n \"entrance_stairwell\": \"2\",\n \"bedrooms\": 2,\n \"bathrooms\": 1,\n \"property_reference\": \"MAD-12-3B\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.skortorent.com/api/v1/property-management/properties")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"workspace_id\": \"Ab12Cd\",\n \"properties\": [\n {\n \"rent_amount\": 1250,\n \"street\": \"Calle Mayor\",\n \"street_number\": 12,\n \"postal_code\": \"28013\",\n \"floor\": 3,\n \"letter\": \"B\",\n \"province\": \"Madrid\",\n \"municipality\": \"Madrid\",\n \"entrance_stairwell\": \"2\",\n \"bedrooms\": 2,\n \"bathrooms\": 1,\n \"property_reference\": \"MAD-12-3B\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skortorent.com/api/v1/property-management/properties")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"workspace_id\": \"Ab12Cd\",\n \"properties\": [\n {\n \"rent_amount\": 1250,\n \"street\": \"Calle Mayor\",\n \"street_number\": 12,\n \"postal_code\": \"28013\",\n \"floor\": 3,\n \"letter\": \"B\",\n \"province\": \"Madrid\",\n \"municipality\": \"Madrid\",\n \"entrance_stairwell\": \"2\",\n \"bedrooms\": 2,\n \"bathrooms\": 1,\n \"property_reference\": \"MAD-12-3B\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Properties created successfully",
"data": {
"properties": [
{
"rent_amount": 1250,
"street": "Calle Mayor",
"street_number": 12,
"postal_code": "28013",
"floor": 3,
"letter": "B",
"province": "Madrid",
"municipality": "Madrid",
"property_id": "6655c944c2e40f249b664e74",
"workspace_id": "Ab12Cd",
"entrance_stairwell": "2",
"bedrooms": 2,
"bathrooms": 1,
"property_reference": "MAD-12-3B"
}
]
}
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}{
"status": "error",
"message": "Request validation failed",
"errors": [
{
"field": "properties.0.street",
"message": "properties.0.street is required"
}
]
}Authorizations
Generate a shared token via /authenticate/token, then pass it as
Authorization: Bearer <token>.
Body
Public workspace UUID.
"Ab12Cd"
Properties to create. Province and municipality values must be an exact pair from the supported location catalog. The operation is atomic when a duplicate is found.
1 - 100 elementsShow child attributes
Show child attributes