curl --request PATCH \
--url https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"floor": "<string>",
"suiteNumber": "<string>",
"squareFootage": 123,
"rentable": true,
"occupied": true,
"archived": true
}
'import requests
url = "https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}"
payload = {
"floor": "<string>",
"suiteNumber": "<string>",
"squareFootage": 123,
"rentable": True,
"occupied": True,
"archived": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
floor: '<string>',
suiteNumber: '<string>',
squareFootage: 123,
rentable: true,
occupied: true,
archived: true
})
};
fetch('https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}', 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.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'floor' => '<string>',
'suiteNumber' => '<string>',
'squareFootage' => 123,
'rentable' => true,
'occupied' => true,
'archived' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}"
payload := strings.NewReader("{\n \"floor\": \"<string>\",\n \"suiteNumber\": \"<string>\",\n \"squareFootage\": 123,\n \"rentable\": true,\n \"occupied\": true,\n \"archived\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"floor\": \"<string>\",\n \"suiteNumber\": \"<string>\",\n \"squareFootage\": 123,\n \"rentable\": true,\n \"occupied\": true,\n \"archived\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"floor\": \"<string>\",\n \"suiteNumber\": \"<string>\",\n \"squareFootage\": 123,\n \"rentable\": true,\n \"occupied\": true,\n \"archived\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"buildingId": "<string>",
"floor": "<string>",
"suiteNumber": "<string>",
"squareFootage": 123,
"type": "Office",
"rentable": true,
"archived": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"occupied": true
}{
"error": "Invalid Input",
"errorCode": "InvalidInput",
"message": "dba cannot be blank",
"status": "400 BAD_REQUEST",
"timestamp": "2026-09-02T20:41:03.118Z",
"localizedMessage": "dba cannot be blank"
}{
"error": "JWT authentication is not supported. Use an API key."
}{
"error": "Access Denied",
"errorCode": "AccessDenied",
"message": "Not authorized. Missing capabilities: WRITE:DOCUMENT",
"status": "403 FORBIDDEN",
"timestamp": "2026-09-02T20:41:03.118Z",
"localizedMessage": "Not authorized. Missing capabilities: WRITE:DOCUMENT"
}{
"error": "Entity Not Found",
"errorCode": "EntityNotFound",
"message": "This entity is not found in the system.",
"status": "404 NOT_FOUND",
"timestamp": "2026-09-02T20:41:03.118Z",
"localizedMessage": "This entity is not found in the system."
}UPDATE Building Space
Updates a Building Space’s fields. Omitted fields are left unchanged.
Required capabilities: WRITE:BUILDING_SPACE
curl --request PATCH \
--url https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"floor": "<string>",
"suiteNumber": "<string>",
"squareFootage": 123,
"rentable": true,
"occupied": true,
"archived": true
}
'import requests
url = "https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}"
payload = {
"floor": "<string>",
"suiteNumber": "<string>",
"squareFootage": 123,
"rentable": True,
"occupied": True,
"archived": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
floor: '<string>',
suiteNumber: '<string>',
squareFootage: 123,
rentable: true,
occupied: true,
archived: true
})
};
fetch('https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}', 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.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'floor' => '<string>',
'suiteNumber' => '<string>',
'squareFootage' => 123,
'rentable' => true,
'occupied' => true,
'archived' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}"
payload := strings.NewReader("{\n \"floor\": \"<string>\",\n \"suiteNumber\": \"<string>\",\n \"squareFootage\": 123,\n \"rentable\": true,\n \"occupied\": true,\n \"archived\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"floor\": \"<string>\",\n \"suiteNumber\": \"<string>\",\n \"squareFootage\": 123,\n \"rentable\": true,\n \"occupied\": true,\n \"archived\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.prophia.com/rest/v2/accounts/{accountId}/buildings/{buildingId}/spaces/{spaceId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"floor\": \"<string>\",\n \"suiteNumber\": \"<string>\",\n \"squareFootage\": 123,\n \"rentable\": true,\n \"occupied\": true,\n \"archived\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"buildingId": "<string>",
"floor": "<string>",
"suiteNumber": "<string>",
"squareFootage": 123,
"type": "Office",
"rentable": true,
"archived": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"occupied": true
}{
"error": "Invalid Input",
"errorCode": "InvalidInput",
"message": "dba cannot be blank",
"status": "400 BAD_REQUEST",
"timestamp": "2026-09-02T20:41:03.118Z",
"localizedMessage": "dba cannot be blank"
}{
"error": "JWT authentication is not supported. Use an API key."
}{
"error": "Access Denied",
"errorCode": "AccessDenied",
"message": "Not authorized. Missing capabilities: WRITE:DOCUMENT",
"status": "403 FORBIDDEN",
"timestamp": "2026-09-02T20:41:03.118Z",
"localizedMessage": "Not authorized. Missing capabilities: WRITE:DOCUMENT"
}{
"error": "Entity Not Found",
"errorCode": "EntityNotFound",
"message": "This entity is not found in the system.",
"status": "404 NOT_FOUND",
"timestamp": "2026-09-02T20:41:03.118Z",
"localizedMessage": "This entity is not found in the system."
}Authorizations
Body
Fields to change on a Building Space. Every field is optional; omit one to leave it as it is. Caution: Renaming suiteNumber breaks the string match Tags use to find this space.
What kind of unit this is. There are in-app configurations that may be set per space type that can affect how a space applies its square footage to particular metrics or occasionally its presence in certain reports. Be default all types are included in which case the value here is purely for reference.
Office, Retail, Industrial, Storage, Telecom, Parking, Conference Room, Lobby, Elevator, Fitness Center, License Agreement, Management Office, Amenity, Cafe, Bike Storage, Lounge, Other, zSuite Defaulted to true. Represents whether the space counts as rentable inventory. A non-rentable space can still have a lease applied to it, but the non-rentable nature may prevent the space and/or lease from displaying properly in certain reports. A false value is typically used for spaces such as lobbies or elevators that are not expected to be leased, but may still be of interest on a stacking plan without applying its square footage to occupancy metrics.
Defaulted to false. Purely an override value. Setting false does not mean the space is vacant — it only clears the override; derive real occupancy from leases. Typically used to denote spaces that aren't traditionally leased as occupied, such as conference rooms or fitness centers, etc. Even if this value is false, an active lease applied to the space will cause the space to appear as occupied on reports like the stacking plan.
Response
OK
Representation of a space or unit in a Building. Some example uses: a rentable suite, a conference room, storage space, or a full floor.
Floor the space sits on. This value primarily affects the grouping of Building Spaces in the Stacking Plan, but also governs which spaces have floor level encumbrances applied to them. For example if a ROFO Tag's offeredSpace component references 'FLOOR1' as its encumbranceSpaces value, all spaces having space.floor=1 will show as encumbered in the Stacking Plan.
What kind of unit this is. This is a referential value and does not affect how a space operates in the system.
Office, Retail, Industrial, Storage, Telecom, Parking, Conference Room, Lobby, Elevator, Fitness Center, License Agreement, Management Office, Amenity, Cafe, Bike Storage, Lounge, Other, zSuite Whether the space counts as rentable inventory. If marked as non-rentable, the space and leases associated with it, if you've chosen to continue associating leases with the space, may cease being present in reports like the Rent Roll. Marking a space as non-rentable is normally used in cases like Lobbies, Elevators, and like shared public spaces of the Building that are not eligible to be leased.
An override value: Allows the space to be marked as occupied, even when lacking an active lease associated with the space. A value of false does not mean that there are no associated active leases, only that the override is not currently marking the space as occupied. Best used for spaces that are not traditionally leased but you still want to show as occupied in the Stacking Plan and count towards occupied square footage statistics.

