{
  "info": {
    "title": "Shace Partner API",
    "version": "1.0.0",
    "description": "Publish your vacant premises to Shace straight from your property system.\n\nAuthenticate every request with `Authorization: Bearer shace_sk_…` (an org-scoped key handed out by Shace).\nPush objects and listings by your own reference with `PUT /objects/{id}` and `PUT /listings/{id}` whenever they are saved on your side: the same reference updates instead of duplicating, unchanged bodies are no-ops, and listings you do not push are never touched. `POST /listings/{id}/unpublish` takes a unit off the market.\nAnywhere a Shace id is accepted, `ext:<your reference>` is accepted too.\n\nErrors use the shape `{ code, status, message, data? }`. Validation errors carry issues under `data.issues`."
  },
  "externalDocs": {
    "description": "Guides: quickstart and publishing from your system",
    "url": "https://docs.shace.se"
  },
  "security": [
    {
      "apiKey": []
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "Every request carries an organization-scoped API key as a bearer token: `Authorization: Bearer shace_sk_…`. A key is `shace_sk_` followed by 48 hex characters, and it has full inventory access for its organization and nothing else. There are no scopes yet; if a narrower key is ever needed, say so.\n\n**Getting a key.** Shace mints keys during onboarding and shows them once, so store the plaintext in your secret manager right away. Shace keeps only a hash and can never show a key again; if one is lost, a new one is issued and the old one revoked. Keys issued for a pilot may carry an expiry: `GET /me` shows `expiresAt`, or `null` for none.\n\n**Rotation.** Several keys can be live at once, so rotation is: get a new key, switch your job over, ask Shace to revoke the old one. A revoked or expired key answers `401` from the next request.\n\n**Server to server only.** Keyed routes send CORS headers to this docs site alone, for the Test Request button; every other origin gets none, so a key cannot be used from your own browser pages even by accident. Call the API from your backend or a scheduled job.\n\n**Environments.** Production keys work against `api.shace.se`. The preview environment serves the same API with keys minted there and is the sandbox: real code, disposable data. Use a preview key and the preview host for the Test Request button."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every error, on every route, has this one shape. `code` and `status` are stable and safe to branch on. `message` is for humans and may change. `data` is present when there is something structured to say; validation errors carry `issues` there, each with a `path` into the request body.\n\n- `400 BAD_REQUEST`: field validation failed, an id is neither a UUID nor `ext:<reference>`, a cursor is invalid, a media URL is not from your uploads, an amenity id is unknown, `assignedTo` is not a member, an address could not be geocoded, or a listing was pushed onto an archived object.\n- `401 UNAUTHORIZED`: missing, malformed, revoked or expired key.\n- `403 FORBIDDEN`: the key's organization is not a landlord organization.\n- `404 NOT_FOUND`: no listing or object with that id or reference in your organization. Also returned for another organization's ids, so ids leak nothing.\n- `409 CONFLICT`: two requests raced to create the same reference (safe to retry), or the organization has no owner yet to attribute listings to (retrying does not help: the owner invite has to be accepted first).\n- `413 PAYLOAD_TOO_LARGE`: the request body is larger than the endpoint allows: 8 files of 15 MB for image uploads, one 15 MB file for floor plans, 2 MB for any JSON body. Split the batch.\n- `429 TOO_MANY_REQUESTS`: reserved for the rate limit reported by `GET /me`. Not enforced yet, but build in a backoff that honours `Retry-After` so it keeps working when it is.\n- `500 INTERNAL_SERVER_ERROR`: something on our side, including a geocoding outage. Retry with backoff; if it persists, tell us the `X-Request-Id` response header.\n\n**Publish rules are not errors.** Missing images, a zero price or a missing notice period never produce an error. The listing is stored and the response lists them under `publishBlockers`.\n\n**Retrying.** `PUT` requests are idempotent by design: repeating one is safe and, when nothing changed, a no-op. Retry `429` and `500` with a short backoff, and a `409` from a create race once. Do not retry `400`; fix the body.",
        "properties": {
          "code": {
            "type": "string",
            "description": "Stable machine-readable code, for example BAD_REQUEST."
          },
          "status": {
            "type": "integer",
            "description": "The HTTP status, repeated."
          },
          "message": {
            "type": "string",
            "description": "Human-readable; may change."
          },
          "data": {
            "description": "Present when there is something structured to say. Validation errors carry `issues`."
          }
        },
        "required": [
          "code",
          "status",
          "message"
        ]
      }
    }
  },
  "openapi": "3.1.1",
  "paths": {
    "/me": {
      "get": {
        "operationId": "me",
        "summary": "The organization and key behind this request",
        "description": "The first call in every quickstart: confirms the key works and shows which organization it acts for.",
        "tags": [
          "Account"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "org": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "Shace id of the organization."
                        },
                        "name": {
                          "type": "string",
                          "description": "Organization name."
                        },
                        "orgNumber": {
                          "type": "string",
                          "description": "Organization number, digits only."
                        },
                        "orgType": {
                          "type": "string",
                          "enum": [
                            "lister",
                            "realtor"
                          ],
                          "description": "lister is a landlord, realtor a broker acting for one."
                        }
                      },
                      "required": [
                        "id",
                        "name",
                        "orgNumber",
                        "orgType"
                      ],
                      "additionalProperties": false,
                      "description": "The organization the key acts for."
                    },
                    "key": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "Shace id of the key."
                        },
                        "name": {
                          "type": "string",
                          "description": "The label the key was issued with."
                        },
                        "keyPrefix": {
                          "type": "string",
                          "description": "The first characters of the key, to tell keys apart."
                        },
                        "expiresAt": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "When the key stops working, or null for no expiry."
                        },
                        "createdAt": {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                          "description": "ISO 8601 UTC."
                        }
                      },
                      "required": [
                        "id",
                        "name",
                        "keyPrefix",
                        "expiresAt",
                        "createdAt"
                      ],
                      "additionalProperties": false,
                      "description": "The key that made this request."
                    },
                    "rateLimit": {
                      "type": "object",
                      "properties": {
                        "requestsPerMinute": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991,
                          "description": "Requests per minute across all endpoints."
                        },
                        "uploadsPerMinute": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991,
                          "description": "Upload requests per minute, counted separately."
                        }
                      },
                      "required": [
                        "requestsPerMinute",
                        "uploadsPerMinute"
                      ],
                      "additionalProperties": false,
                      "description": "Limits for this key. Not enforced yet; once they are, requests over the limit get 429 with Retry-After."
                    }
                  },
                  "required": [
                    "org",
                    "key",
                    "rateLimit"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "org": {
                    "id": "8ac643b3-dab8-4254-ae00-96e0c88b95fb",
                    "name": "Nordic Fastigheter AB",
                    "orgNumber": "5568123456",
                    "orgType": "lister"
                  },
                  "key": {
                    "id": "ca2d7f01-45e6-4845-a18e-6c99be527414",
                    "name": "Nordic Fastigheter AB",
                    "keyPrefix": "shace_sk_0123",
                    "expiresAt": null,
                    "createdAt": "2026-09-02T13:17:51.949Z"
                  },
                  "rateLimit": {
                    "requestsPerMinute": 600,
                    "uploadsPerMinute": 60
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/amenities": {
      "get": {
        "operationId": "listAmenities",
        "summary": "The amenity catalogue",
        "description": "Ids to reference from a listing's `amenityIds`, with labels per locale.",
        "tags": [
          "Account"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991,
                            "description": "Use in a listing's amenityIds."
                          },
                          "slug": {
                            "type": "string",
                            "description": "Stable machine name."
                          },
                          "labels": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {
                              "type": "string"
                            },
                            "description": "Label per locale, keyed by locale code (sv, en)."
                          }
                        },
                        "required": [
                          "id",
                          "slug",
                          "labels"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "slug": "wifi",
                      "labels": {
                        "sv": "WiFi",
                        "en": "WiFi"
                      }
                    },
                    {
                      "id": 2,
                      "slug": "parking",
                      "labels": {
                        "sv": "Parkering",
                        "en": "Parking"
                      }
                    },
                    {
                      "id": 3,
                      "slug": "elevator",
                      "labels": {
                        "sv": "Hiss",
                        "en": "Elevator"
                      }
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/objects/{id}": {
      "put": {
        "operationId": "upsertObject",
        "summary": "Create or update an object (a building or address) by your own reference",
        "description": "Idempotent. Geocoded on create and whenever the address changes; an unchanged address is a no-op. Pushing the ref of an archived object puts it back in service, but does not republish the listings that archiving unpublished: push each of them again to bring them back.\n\n### Outcomes\n\nThe same request in other situations, as `outcome` and `status`:\n\n- First push of a new reference: `created`, `active`\n- The same address again: not geocoded again, nothing is written: `unchanged`, `active`\n- The address changed: geocoded again, every listing on the object follows: `updated`, `active`\n- The reference of an archived object, pushed again: `updated`, `active`",
        "tags": [
          "Objects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "description": "Your external reference for the object, URL-encoded. Send it directly, without adding ext:."
            },
            "example": "bldg-12"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "streetAddress": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Street and number, as the landlord writes it."
                  },
                  "streetAddress2": {
                    "description": "Floor, entrance or suite. Optional.",
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 200
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "postalCode": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20,
                    "description": "Postal code."
                  },
                  "city": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "description": "City."
                  },
                  "region": {
                    "description": "County or region. Optional.",
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 100
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "countryCode": {
                    "description": "ISO 3166-1 alpha-2. Only SE is enabled today.",
                    "default": "SE",
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2
                  }
                },
                "required": [
                  "streetAddress",
                  "postalCode",
                  "city"
                ]
              },
              "example": {
                "streetAddress": "Sveavägen 44",
                "postalCode": "111 34",
                "city": "Stockholm",
                "countryCode": "SE"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Shace id."
                    },
                    "externalRef": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Your reference, or null when the object was created in the app."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "active",
                        "archived"
                      ],
                      "description": "archived objects cannot carry published listings."
                    },
                    "streetAddress": {
                      "type": "string",
                      "description": "Street and number."
                    },
                    "streetAddress2": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Floor, entrance or suite, or null."
                    },
                    "postalCode": {
                      "type": "string",
                      "description": "Postal code."
                    },
                    "city": {
                      "type": "string",
                      "description": "City."
                    },
                    "region": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "County or region, or null."
                    },
                    "countryCode": {
                      "type": "string",
                      "description": "ISO 3166-1 alpha-2."
                    },
                    "location": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "lng": {
                              "type": "number"
                            },
                            "lat": {
                              "type": "number"
                            }
                          },
                          "required": [
                            "lng",
                            "lat"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Geocoded point, WGS84."
                    },
                    "listingCount": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991,
                      "description": "Listings on this object, in any status."
                    },
                    "createdVia": {
                      "type": "string",
                      "enum": [
                        "app",
                        "api"
                      ],
                      "description": "Whether the object was created in the app or through this API."
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "created",
                        "updated",
                        "unchanged"
                      ],
                      "description": "What the request did. unchanged means the address matched what Shace already holds."
                    }
                  },
                  "required": [
                    "id",
                    "externalRef",
                    "status",
                    "streetAddress",
                    "streetAddress2",
                    "postalCode",
                    "city",
                    "region",
                    "countryCode",
                    "location",
                    "listingCount",
                    "createdVia",
                    "createdAt",
                    "updatedAt",
                    "outcome"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                  "externalRef": "bldg-12",
                  "status": "active",
                  "streetAddress": "Sveavägen 44",
                  "streetAddress2": null,
                  "postalCode": "111 34",
                  "city": "Stockholm",
                  "region": null,
                  "countryCode": "SE",
                  "location": {
                    "lng": 18.062649,
                    "lat": 59.3368083
                  },
                  "listingCount": 0,
                  "createdVia": "api",
                  "createdAt": "2026-09-02T13:18:23.360Z",
                  "updatedAt": "2026-09-02T13:18:23.360Z",
                  "outcome": "created"
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Fix the body; do not retry as is.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "validation": {
                    "summary": "Field validation failed",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "Input validation failed",
                      "data": {
                        "issues": [
                          {
                            "path": [
                              "postalCode"
                            ],
                            "message": "Invalid input: expected string, received undefined"
                          }
                        ]
                      }
                    }
                  },
                  "geocoding": {
                    "summary": "The address could not be resolved to coordinates",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "Geocoding failed: could not resolve address to coordinates"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict. A create race is safe to retry once.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "createRace": {
                    "summary": "Two requests raced to create the same reference; retry once",
                    "value": {
                      "code": "CONFLICT",
                      "status": 409,
                      "message": "An object with externalRef \"bldg-12\" was just created. Retry the request."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "getObject",
        "summary": "Read an object",
        "description": "`id` is a Shace UUID or `ext:<externalRef>`. A UUID that is not one of your objects is looked up as an externalRef, so the URL you pushed to with PUT always reads back.",
        "tags": [
          "Objects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "Object id, or `ext:<your reference>`."
            },
            "example": "ext:bldg-12"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Shace id."
                    },
                    "externalRef": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Your reference, or null when the object was created in the app."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "active",
                        "archived"
                      ],
                      "description": "archived objects cannot carry published listings."
                    },
                    "streetAddress": {
                      "type": "string",
                      "description": "Street and number."
                    },
                    "streetAddress2": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Floor, entrance or suite, or null."
                    },
                    "postalCode": {
                      "type": "string",
                      "description": "Postal code."
                    },
                    "city": {
                      "type": "string",
                      "description": "City."
                    },
                    "region": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "County or region, or null."
                    },
                    "countryCode": {
                      "type": "string",
                      "description": "ISO 3166-1 alpha-2."
                    },
                    "location": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "lng": {
                              "type": "number"
                            },
                            "lat": {
                              "type": "number"
                            }
                          },
                          "required": [
                            "lng",
                            "lat"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Geocoded point, WGS84."
                    },
                    "listingCount": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991,
                      "description": "Listings on this object, in any status."
                    },
                    "createdVia": {
                      "type": "string",
                      "enum": [
                        "app",
                        "api"
                      ],
                      "description": "Whether the object was created in the app or through this API."
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    }
                  },
                  "required": [
                    "id",
                    "externalRef",
                    "status",
                    "streetAddress",
                    "streetAddress2",
                    "postalCode",
                    "city",
                    "region",
                    "countryCode",
                    "location",
                    "listingCount",
                    "createdVia",
                    "createdAt",
                    "updatedAt"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                  "externalRef": "bldg-12",
                  "status": "active",
                  "streetAddress": "Sveavägen 44",
                  "streetAddress2": null,
                  "postalCode": "111 34",
                  "city": "Stockholm",
                  "region": null,
                  "countryCode": "SE",
                  "location": {
                    "lng": 18.062649,
                    "lat": 59.3368083
                  },
                  "listingCount": 4,
                  "createdVia": "api",
                  "createdAt": "2026-09-02T13:18:23.360Z",
                  "updatedAt": "2026-09-02T13:18:23.360Z"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found in your organization. Other organizations' ids answer the same, so ids leak nothing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "notFound": {
                    "summary": "No object with that id or reference in your organization",
                    "value": {
                      "code": "NOT_FOUND",
                      "status": 404,
                      "message": "No object with externalRef \"bldg-12\""
                    }
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "archiveObject",
        "summary": "Archive an object",
        "description": "`id` is a Shace UUID or `ext:<externalRef>` (a UUID that is not one of your objects is looked up as an externalRef). Nothing is hard-deleted. The object is archived and any published listings on it are unpublished; their ids are returned. Idempotent.",
        "tags": [
          "Objects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "Object id, or `ext:<your reference>`."
            },
            "example": "ext:bldg-12"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Shace id of the object."
                    },
                    "status": {
                      "type": "string",
                      "const": "archived",
                      "description": "Always archived."
                    },
                    "unpublishedListingIds": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                      },
                      "description": "Listings that were live on the object and are now unpublished."
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "unpublishedListingIds"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                  "status": "archived",
                  "unpublishedListingIds": [
                    "5c1c8f0e-6a3b-4a4c-9a3e-2b7f0d9a1e11"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found in your organization. Other organizations' ids answer the same, so ids leak nothing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "notFound": {
                    "summary": "No object with that id or reference in your organization",
                    "value": {
                      "code": "NOT_FOUND",
                      "status": 404,
                      "message": "No object with externalRef \"bldg-12\""
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/objects": {
      "get": {
        "operationId": "listObjects",
        "summary": "List your objects",
        "description": "Newest first, cursor paginated. Archived objects are excluded unless `includeArchived=true`.",
        "tags": [
          "Objects"
        ],
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "description": "nextCursor from the previous page.",
              "type": "string"
            },
            "allowEmptyValue": true,
            "allowReserved": true
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "default": 50,
              "description": "Page size, 1 to 200.",
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            },
            "allowEmptyValue": true,
            "allowReserved": true,
            "example": 50
          },
          {
            "name": "includeArchived",
            "in": "query",
            "schema": {
              "description": "Include archived objects.",
              "default": "false",
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "allowEmptyValue": true,
            "allowReserved": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                            "description": "Shace id."
                          },
                          "externalRef": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Your reference, or null when the object was created in the app."
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "active",
                              "archived"
                            ],
                            "description": "archived objects cannot carry published listings."
                          },
                          "streetAddress": {
                            "type": "string",
                            "description": "Street and number."
                          },
                          "streetAddress2": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Floor, entrance or suite, or null."
                          },
                          "postalCode": {
                            "type": "string",
                            "description": "Postal code."
                          },
                          "city": {
                            "type": "string",
                            "description": "City."
                          },
                          "region": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "County or region, or null."
                          },
                          "countryCode": {
                            "type": "string",
                            "description": "ISO 3166-1 alpha-2."
                          },
                          "location": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "lng": {
                                    "type": "number"
                                  },
                                  "lat": {
                                    "type": "number"
                                  }
                                },
                                "required": [
                                  "lng",
                                  "lat"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Geocoded point, WGS84."
                          },
                          "listingCount": {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991,
                            "description": "Listings on this object, in any status."
                          },
                          "createdVia": {
                            "type": "string",
                            "enum": [
                              "app",
                              "api"
                            ],
                            "description": "Whether the object was created in the app or through this API."
                          },
                          "createdAt": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                            "description": "ISO 8601 UTC."
                          },
                          "updatedAt": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                            "description": "ISO 8601 UTC."
                          }
                        },
                        "required": [
                          "id",
                          "externalRef",
                          "status",
                          "streetAddress",
                          "streetAddress2",
                          "postalCode",
                          "city",
                          "region",
                          "countryCode",
                          "location",
                          "listingCount",
                          "createdVia",
                          "createdAt",
                          "updatedAt"
                        ],
                        "additionalProperties": false
                      },
                      "description": "The page, newest first."
                    },
                    "nextCursor": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Pass as ?cursor= to fetch the next page; null on the last page."
                    }
                  },
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "data": [
                    {
                      "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                      "externalRef": "bldg-12",
                      "status": "active",
                      "streetAddress": "Sveavägen 44",
                      "streetAddress2": null,
                      "postalCode": "111 34",
                      "city": "Stockholm",
                      "region": null,
                      "countryCode": "SE",
                      "location": {
                        "lng": 18.062649,
                        "lat": 59.3368083
                      },
                      "listingCount": 4,
                      "createdVia": "api",
                      "createdAt": "2026-09-02T13:18:23.360Z",
                      "updatedAt": "2026-09-02T13:18:23.360Z"
                    }
                  ],
                  "nextCursor": null
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Fix the body; do not retry as is.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalidCursor": {
                    "summary": "The cursor is not one this endpoint issued",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "Invalid cursor"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/listings/{id}": {
      "put": {
        "operationId": "upsertListing",
        "summary": "Create or update a listing by your own reference",
        "description": "Idempotent. Pushing the same `ref` again updates the listing instead of duplicating it; an unchanged body is a no-op. The body points at the object the listing sits on with exactly one of `objectRef`, `objectId` or `address`. Publishes on success unless the body says `status: \"draft\"`. A listing that is valid but not publishable is stored as a draft and the response lists the `publishBlockers`. A `ref` whose listing was unpublished is republished.\n\n### Outcomes\n\nThe same request in other situations, as `outcome`, `status` and any `publishBlockers`:\n\n- First push of a new reference: `created`, `published`\n- The same body again: nothing is written, no translation is queued, updatedAt does not move: `unchanged`, `published`\n- A field changed, for example the price: `updated`, `published`\n- Two images instead of three on a listing that was live: stored, taken off the market until a third is pushed: `updated`, `unpublished`, blockers `images`\n- The body says status: \"draft\" for a listing that was live: `updated`, `unpublished`\n- The body says status: \"draft\" for a listing that was never live, with the same content: `unchanged`, `draft`\n- The reference of a listing that was unpublished, pushed again: `updated`, `published`",
        "tags": [
          "Listings"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "description": "Your external reference for the listing, URL-encoded. Send it directly, without adding ext:."
            },
            "example": "unit-4711"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "objectRef": {
                    "description": "Your reference for an object pushed with PUT /objects/{id}. Send exactly one of objectRef, objectId or address.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "objectId": {
                    "description": "A Shace object id, or `ext:<your reference>`. Send exactly one of objectRef, objectId or address.",
                    "type": "string",
                    "minLength": 1
                  },
                  "address": {
                    "description": "Inline address. Reuses your organization's active object at that address or creates and geocodes one. Send exactly one of objectRef, objectId or address.",
                    "type": "object",
                    "properties": {
                      "streetAddress": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200,
                        "description": "Street and number, as the landlord writes it."
                      },
                      "streetAddress2": {
                        "description": "Floor, entrance or suite. Optional.",
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "postalCode": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 20,
                        "description": "Postal code."
                      },
                      "city": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 100,
                        "description": "City."
                      },
                      "region": {
                        "description": "County or region. Optional.",
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 100
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "countryCode": {
                        "description": "ISO 3166-1 alpha-2. Only SE is enabled today.",
                        "default": "SE",
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 2
                      }
                    },
                    "required": [
                      "streetAddress",
                      "postalCode",
                      "city"
                    ]
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "office",
                      "coworking",
                      "part_of_office"
                    ],
                    "description": "office for a whole office, coworking for desks or rooms in a shared workspace, part_of_office for part of a larger office."
                  },
                  "locale": {
                    "default": "sv",
                    "description": "Language of description and customAmenities. Shace translates to the other locales.",
                    "type": "string",
                    "enum": [
                      "sv",
                      "en"
                    ]
                  },
                  "description": {
                    "description": "Free text about the premises, in locale.",
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 10000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "areaM2": {
                    "description": "Floor area in square metres, with at most two decimal places.",
                    "anyOf": [
                      {
                        "type": "number",
                        "exclusiveMinimum": 0,
                        "maximum": 1000000,
                        "multipleOf": 0.01
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "capacity": {
                    "description": "Number of workplaces.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 100000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "furnished": {
                    "description": "Furnished or not.",
                    "anyOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "price": {
                    "type": "object",
                    "properties": {
                      "amount": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 9999999999.99,
                        "multipleOf": 0.01,
                        "description": "Rent excluding VAT, per period, with at most two decimal places. 0 is accepted but blocks publishing (publishBlockers: price)."
                      },
                      "currency": {
                        "default": "sek",
                        "description": "Only SEK today.",
                        "type": "string",
                        "const": "sek"
                      },
                      "period": {
                        "default": "month",
                        "description": "month for open-ended leases (tillsvidare), day for day rates.",
                        "type": "string",
                        "enum": [
                          "month",
                          "day"
                        ]
                      }
                    },
                    "required": [
                      "amount"
                    ],
                    "description": "Base rent. Transparent pricing is part of Shace, so there is no price on request."
                  },
                  "noticePeriod": {
                    "description": "Notice period in months. Required to publish month-priced listings; must be omitted for day pricing.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 120
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "minimumDuration": {
                    "description": "Binding period in months, month-priced listings only. Omit for no minimum.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 600
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "amenityIds": {
                    "default": [],
                    "description": "Ids from the catalogue in GET /amenities.",
                    "maxItems": 100,
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991
                    }
                  },
                  "customAmenities": {
                    "description": "Amenities not in the catalogue: { id (uuid), icon, translations: { sv?, en? } }. Include a label in locale. Supplied labels are preserved; omitted languages are translated automatically.",
                    "maxItems": 20,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        "icon": {
                          "type": "string",
                          "minLength": 1
                        },
                        "translations": {
                          "type": "object",
                          "properties": {
                            "sv": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "en": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            }
                          }
                        }
                      },
                      "required": [
                        "id",
                        "icon",
                        "translations"
                      ]
                    }
                  },
                  "images": {
                    "default": [],
                    "description": "URLs returned by POST /uploads/images for your organization, in display order; the first is the cover. At least 3 to publish. Reordering counts as a change.",
                    "maxItems": 30,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uri"
                    }
                  },
                  "blurPlaceholders": {
                    "description": "Blur placeholders keyed by image URL, as returned by the upload endpoint. Optional.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string",
                      "format": "uri"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "maxLength": 2000
                    }
                  },
                  "floorPlanUrl": {
                    "description": "URL returned by POST /uploads/floor-plan. Optional; does not count towards the three-image minimum.",
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "openHours": {
                    "description": "Opening hours per weekday for coworking listings. Each day is { open, close } as HH:MM, or null for closed.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "monday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tuesday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "wednesday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "thursday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "friday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "saturday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "sunday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "monday",
                          "tuesday",
                          "wednesday",
                          "thursday",
                          "friday",
                          "saturday",
                          "sunday"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "status": {
                    "default": "published",
                    "description": "published (default) goes live when there are no publish blockers; draft holds the listing back.",
                    "type": "string",
                    "enum": [
                      "published",
                      "draft"
                    ]
                  },
                  "assignedTo": {
                    "description": "Email of the organization member who owns the listing. Defaults to the organization owner when the listing is created; omitted on an update, the current assignee is kept.",
                    "type": "string",
                    "format": "email",
                    "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                  }
                },
                "required": [
                  "type",
                  "price"
                ]
              },
              "example": {
                "objectRef": "bldg-12",
                "type": "office",
                "locale": "sv",
                "description": "Ljust hörnkontor på plan 4 med sex arbetsplatser, eget mötesrum och pentry.",
                "areaM2": 120,
                "capacity": 6,
                "furnished": true,
                "price": {
                  "amount": 38000,
                  "currency": "sek",
                  "period": "month"
                },
                "noticePeriod": 3,
                "minimumDuration": 12,
                "amenityIds": [
                  1,
                  3
                ],
                "images": [
                  "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                  "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                  "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                ],
                "status": "published"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Shace id."
                    },
                    "externalRef": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Your reference, or null when none was sent."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "draft",
                        "published",
                        "unpublished"
                      ],
                      "description": "draft (never live), published, or unpublished (was live, taken off)."
                    },
                    "publishBlockers": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "images",
                          "price",
                          "noticePeriod",
                          "object"
                        ]
                      },
                      "description": "Empty when the listing can go live; otherwise what is missing: images, price, noticePeriod, object."
                    },
                    "object": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "Shace id of the object."
                        },
                        "externalRef": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Your reference for the object, or null."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "archived"
                          ],
                          "description": "An archived object blocks publishing (publishBlockers: object)."
                        },
                        "streetAddress": {
                          "type": "string",
                          "description": "Street and number."
                        },
                        "streetAddress2": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Floor, entrance or suite, or null."
                        },
                        "postalCode": {
                          "type": "string",
                          "description": "Postal code."
                        },
                        "city": {
                          "type": "string",
                          "description": "City."
                        },
                        "region": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "County or region, or null."
                        },
                        "countryCode": {
                          "type": "string",
                          "description": "ISO 3166-1 alpha-2."
                        }
                      },
                      "required": [
                        "id",
                        "externalRef",
                        "status",
                        "streetAddress",
                        "streetAddress2",
                        "postalCode",
                        "city",
                        "region",
                        "countryCode"
                      ],
                      "additionalProperties": false,
                      "description": "The object (building or address) the listing sits on."
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "office",
                        "coworking",
                        "part_of_office"
                      ],
                      "description": "office for a whole office, coworking for desks or rooms in a shared workspace, part_of_office for part of a larger office."
                    },
                    "locale": {
                      "type": "string",
                      "enum": [
                        "sv",
                        "en"
                      ],
                      "description": "Locale the description was submitted in; Shace translates the rest."
                    },
                    "description": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Free text about the premises, in locale."
                    },
                    "areaM2": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Floor area in square metres."
                    },
                    "capacity": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Number of workplaces."
                    },
                    "furnished": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Furnished or not."
                    },
                    "price": {
                      "type": "object",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "Rent excluding VAT, per period."
                        },
                        "currency": {
                          "type": "string",
                          "const": "sek",
                          "description": "Only SEK today."
                        },
                        "period": {
                          "type": "string",
                          "enum": [
                            "month",
                            "day"
                          ],
                          "description": "month for open-ended leases, day for day rates."
                        }
                      },
                      "required": [
                        "amount",
                        "currency",
                        "period"
                      ],
                      "additionalProperties": false,
                      "description": "Base rent, as sent."
                    },
                    "noticePeriod": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Notice period in months, month-priced listings only."
                    },
                    "minimumDuration": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Binding period in months, or null for no minimum."
                    },
                    "amenityIds": {
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": -9007199254740991,
                        "maximum": 9007199254740991
                      },
                      "description": "Ids from the catalogue in GET /amenities."
                    },
                    "customAmenities": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "Your uuid for the amenity."
                          },
                          "icon": {
                            "type": "string",
                            "description": "Icon name."
                          },
                          "translations": {
                            "description": "Label per locale, keyed by locale code (sv, en).",
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "id",
                          "icon"
                        ],
                        "additionalProperties": false
                      },
                      "description": "Amenities outside the catalogue, as sent."
                    },
                    "images": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Public image URLs in display order."
                    },
                    "floorPlanUrl": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Public floor plan URL, or null."
                    },
                    "openHours": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "monday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "tuesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "wednesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "thursday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "friday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "saturday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "sunday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Opening hours per weekday for coworking listings, or null."
                    },
                    "assignedTo": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Email of the assigned organization member."
                    },
                    "createdVia": {
                      "type": "string",
                      "enum": [
                        "app",
                        "api"
                      ],
                      "description": "Whether the listing was created in the app or through this API."
                    },
                    "lastSyncedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Last time a PUT through this API wrote content fields."
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "Latest update to the listing, its primary-language description, or its object. ISO 8601 UTC, millisecond precision."
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "created",
                        "updated",
                        "unchanged"
                      ],
                      "description": "What the request did. unchanged means the body matched what Shace already holds."
                    }
                  },
                  "required": [
                    "id",
                    "externalRef",
                    "status",
                    "publishBlockers",
                    "object",
                    "type",
                    "locale",
                    "description",
                    "areaM2",
                    "capacity",
                    "furnished",
                    "price",
                    "noticePeriod",
                    "minimumDuration",
                    "amenityIds",
                    "customAmenities",
                    "images",
                    "floorPlanUrl",
                    "openHours",
                    "assignedTo",
                    "createdVia",
                    "lastSyncedAt",
                    "createdAt",
                    "updatedAt",
                    "outcome"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "id": "5c1c8f0e-6a3b-4a4c-9a3e-2b7f0d9a1e11",
                  "externalRef": "unit-4711",
                  "status": "published",
                  "publishBlockers": [],
                  "object": {
                    "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                    "externalRef": "bldg-12",
                    "status": "active",
                    "streetAddress": "Sveavägen 44",
                    "streetAddress2": null,
                    "postalCode": "111 34",
                    "city": "Stockholm",
                    "region": null,
                    "countryCode": "SE"
                  },
                  "type": "office",
                  "locale": "sv",
                  "description": "Ljust hörnkontor på plan 4 med sex arbetsplatser, eget mötesrum och pentry.",
                  "areaM2": 120,
                  "capacity": 6,
                  "furnished": true,
                  "price": {
                    "amount": 38000,
                    "currency": "sek",
                    "period": "month"
                  },
                  "noticePeriod": 3,
                  "minimumDuration": 12,
                  "amenityIds": [
                    1,
                    3
                  ],
                  "customAmenities": [],
                  "images": [
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                  ],
                  "floorPlanUrl": null,
                  "openHours": null,
                  "assignedTo": "agent@landlord.se",
                  "createdVia": "api",
                  "lastSyncedAt": "2026-09-02T13:19:00.445Z",
                  "createdAt": "2026-09-02T13:19:00.445Z",
                  "updatedAt": "2026-09-02T13:19:00.445Z",
                  "outcome": "created"
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Fix the body; do not retry as is.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "validation": {
                    "summary": "Field validation failed",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "Input validation failed",
                      "data": {
                        "issues": [
                          {
                            "path": [
                              "noticePeriod"
                            ],
                            "message": "Notice period only applies to month-priced listings"
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found in your organization. Other organizations' ids answer the same, so ids leak nothing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "objectMissing": {
                    "summary": "objectRef points at an object you have not pushed",
                    "value": {
                      "code": "NOT_FOUND",
                      "status": 404,
                      "message": "No object with externalRef \"bldg-12\". Push it with PUT /objects/{id} first."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict. A create race is safe to retry once.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "createRace": {
                    "summary": "Two requests raced to create the same reference; retry once",
                    "value": {
                      "code": "CONFLICT",
                      "status": 409,
                      "message": "A listing with externalRef \"unit-4711\" was just created. Retry the request."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "getListing",
        "summary": "Read a listing",
        "description": "`id` is a Shace UUID or `ext:<externalRef>`. A UUID that is not one of your listings is looked up as an externalRef, so the URL you pushed to with PUT always reads back.",
        "tags": [
          "Listings"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "Listing id, or `ext:<your reference>`."
            },
            "example": "ext:unit-4711"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Shace id."
                    },
                    "externalRef": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Your reference, or null when none was sent."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "draft",
                        "published",
                        "unpublished"
                      ],
                      "description": "draft (never live), published, or unpublished (was live, taken off)."
                    },
                    "publishBlockers": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "images",
                          "price",
                          "noticePeriod",
                          "object"
                        ]
                      },
                      "description": "Empty when the listing can go live; otherwise what is missing: images, price, noticePeriod, object."
                    },
                    "object": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "Shace id of the object."
                        },
                        "externalRef": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Your reference for the object, or null."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "archived"
                          ],
                          "description": "An archived object blocks publishing (publishBlockers: object)."
                        },
                        "streetAddress": {
                          "type": "string",
                          "description": "Street and number."
                        },
                        "streetAddress2": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Floor, entrance or suite, or null."
                        },
                        "postalCode": {
                          "type": "string",
                          "description": "Postal code."
                        },
                        "city": {
                          "type": "string",
                          "description": "City."
                        },
                        "region": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "County or region, or null."
                        },
                        "countryCode": {
                          "type": "string",
                          "description": "ISO 3166-1 alpha-2."
                        }
                      },
                      "required": [
                        "id",
                        "externalRef",
                        "status",
                        "streetAddress",
                        "streetAddress2",
                        "postalCode",
                        "city",
                        "region",
                        "countryCode"
                      ],
                      "additionalProperties": false,
                      "description": "The object (building or address) the listing sits on."
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "office",
                        "coworking",
                        "part_of_office"
                      ],
                      "description": "office for a whole office, coworking for desks or rooms in a shared workspace, part_of_office for part of a larger office."
                    },
                    "locale": {
                      "type": "string",
                      "enum": [
                        "sv",
                        "en"
                      ],
                      "description": "Locale the description was submitted in; Shace translates the rest."
                    },
                    "description": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Free text about the premises, in locale."
                    },
                    "areaM2": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Floor area in square metres."
                    },
                    "capacity": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Number of workplaces."
                    },
                    "furnished": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Furnished or not."
                    },
                    "price": {
                      "type": "object",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "Rent excluding VAT, per period."
                        },
                        "currency": {
                          "type": "string",
                          "const": "sek",
                          "description": "Only SEK today."
                        },
                        "period": {
                          "type": "string",
                          "enum": [
                            "month",
                            "day"
                          ],
                          "description": "month for open-ended leases, day for day rates."
                        }
                      },
                      "required": [
                        "amount",
                        "currency",
                        "period"
                      ],
                      "additionalProperties": false,
                      "description": "Base rent, as sent."
                    },
                    "noticePeriod": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Notice period in months, month-priced listings only."
                    },
                    "minimumDuration": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Binding period in months, or null for no minimum."
                    },
                    "amenityIds": {
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": -9007199254740991,
                        "maximum": 9007199254740991
                      },
                      "description": "Ids from the catalogue in GET /amenities."
                    },
                    "customAmenities": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "Your uuid for the amenity."
                          },
                          "icon": {
                            "type": "string",
                            "description": "Icon name."
                          },
                          "translations": {
                            "description": "Label per locale, keyed by locale code (sv, en).",
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "id",
                          "icon"
                        ],
                        "additionalProperties": false
                      },
                      "description": "Amenities outside the catalogue, as sent."
                    },
                    "images": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Public image URLs in display order."
                    },
                    "floorPlanUrl": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Public floor plan URL, or null."
                    },
                    "openHours": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "monday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "tuesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "wednesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "thursday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "friday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "saturday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "sunday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Opening hours per weekday for coworking listings, or null."
                    },
                    "assignedTo": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Email of the assigned organization member."
                    },
                    "createdVia": {
                      "type": "string",
                      "enum": [
                        "app",
                        "api"
                      ],
                      "description": "Whether the listing was created in the app or through this API."
                    },
                    "lastSyncedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Last time a PUT through this API wrote content fields."
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "Latest update to the listing, its primary-language description, or its object. ISO 8601 UTC, millisecond precision."
                    }
                  },
                  "required": [
                    "id",
                    "externalRef",
                    "status",
                    "publishBlockers",
                    "object",
                    "type",
                    "locale",
                    "description",
                    "areaM2",
                    "capacity",
                    "furnished",
                    "price",
                    "noticePeriod",
                    "minimumDuration",
                    "amenityIds",
                    "customAmenities",
                    "images",
                    "floorPlanUrl",
                    "openHours",
                    "assignedTo",
                    "createdVia",
                    "lastSyncedAt",
                    "createdAt",
                    "updatedAt"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "id": "5c1c8f0e-6a3b-4a4c-9a3e-2b7f0d9a1e11",
                  "externalRef": "unit-4711",
                  "status": "published",
                  "publishBlockers": [],
                  "object": {
                    "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                    "externalRef": "bldg-12",
                    "status": "active",
                    "streetAddress": "Sveavägen 44",
                    "streetAddress2": null,
                    "postalCode": "111 34",
                    "city": "Stockholm",
                    "region": null,
                    "countryCode": "SE"
                  },
                  "type": "office",
                  "locale": "sv",
                  "description": "Ljust hörnkontor på plan 4 med sex arbetsplatser, eget mötesrum och pentry.",
                  "areaM2": 120,
                  "capacity": 6,
                  "furnished": true,
                  "price": {
                    "amount": 38000,
                    "currency": "sek",
                    "period": "month"
                  },
                  "noticePeriod": 3,
                  "minimumDuration": 12,
                  "amenityIds": [
                    1,
                    3
                  ],
                  "customAmenities": [],
                  "images": [
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                  ],
                  "floorPlanUrl": null,
                  "openHours": null,
                  "assignedTo": "agent@landlord.se",
                  "createdVia": "api",
                  "lastSyncedAt": "2026-09-02T13:19:00.445Z",
                  "createdAt": "2026-09-02T13:19:00.445Z",
                  "updatedAt": "2026-09-02T13:19:00.445Z"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found in your organization. Other organizations' ids answer the same, so ids leak nothing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "notFound": {
                    "summary": "No listing with that id or reference in your organization",
                    "value": {
                      "code": "NOT_FOUND",
                      "status": 404,
                      "message": "No listing with externalRef \"unit-4711\""
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/listings": {
      "post": {
        "operationId": "createListing",
        "summary": "Create a listing without an external reference",
        "description": "For landlords with nothing to key on. Every call creates a new listing; prefer `PUT /listings/{id}` when your system has a stable id for the unit. Same body as the upsert, including exactly one of `objectRef`, `objectId` or `address`.",
        "tags": [
          "Listings"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "type": "object",
                "properties": {
                  "objectRef": {
                    "description": "Your reference for an object pushed with PUT /objects/{id}. Send exactly one of objectRef, objectId or address.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "objectId": {
                    "description": "A Shace object id, or `ext:<your reference>`. Send exactly one of objectRef, objectId or address.",
                    "type": "string",
                    "minLength": 1
                  },
                  "address": {
                    "description": "Inline address. Reuses your organization's active object at that address or creates and geocodes one. Send exactly one of objectRef, objectId or address.",
                    "type": "object",
                    "properties": {
                      "streetAddress": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200,
                        "description": "Street and number, as the landlord writes it."
                      },
                      "streetAddress2": {
                        "description": "Floor, entrance or suite. Optional.",
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "postalCode": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 20,
                        "description": "Postal code."
                      },
                      "city": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 100,
                        "description": "City."
                      },
                      "region": {
                        "description": "County or region. Optional.",
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 100
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "countryCode": {
                        "description": "ISO 3166-1 alpha-2. Only SE is enabled today.",
                        "default": "SE",
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 2
                      }
                    },
                    "required": [
                      "streetAddress",
                      "postalCode",
                      "city"
                    ]
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "office",
                      "coworking",
                      "part_of_office"
                    ],
                    "description": "office for a whole office, coworking for desks or rooms in a shared workspace, part_of_office for part of a larger office."
                  },
                  "locale": {
                    "default": "sv",
                    "description": "Language of description and customAmenities. Shace translates to the other locales.",
                    "type": "string",
                    "enum": [
                      "sv",
                      "en"
                    ]
                  },
                  "description": {
                    "description": "Free text about the premises, in locale.",
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 10000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "areaM2": {
                    "description": "Floor area in square metres, with at most two decimal places.",
                    "anyOf": [
                      {
                        "type": "number",
                        "exclusiveMinimum": 0,
                        "maximum": 1000000,
                        "multipleOf": 0.01
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "capacity": {
                    "description": "Number of workplaces.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 100000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "furnished": {
                    "description": "Furnished or not.",
                    "anyOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "price": {
                    "type": "object",
                    "properties": {
                      "amount": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 9999999999.99,
                        "multipleOf": 0.01,
                        "description": "Rent excluding VAT, per period, with at most two decimal places. 0 is accepted but blocks publishing (publishBlockers: price)."
                      },
                      "currency": {
                        "default": "sek",
                        "description": "Only SEK today.",
                        "type": "string",
                        "const": "sek"
                      },
                      "period": {
                        "default": "month",
                        "description": "month for open-ended leases (tillsvidare), day for day rates.",
                        "type": "string",
                        "enum": [
                          "month",
                          "day"
                        ]
                      }
                    },
                    "required": [
                      "amount"
                    ],
                    "description": "Base rent. Transparent pricing is part of Shace, so there is no price on request."
                  },
                  "noticePeriod": {
                    "description": "Notice period in months. Required to publish month-priced listings; must be omitted for day pricing.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 120
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "minimumDuration": {
                    "description": "Binding period in months, month-priced listings only. Omit for no minimum.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "exclusiveMinimum": 0,
                        "maximum": 600
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "amenityIds": {
                    "default": [],
                    "description": "Ids from the catalogue in GET /amenities.",
                    "maxItems": 100,
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991
                    }
                  },
                  "customAmenities": {
                    "description": "Amenities not in the catalogue: { id (uuid), icon, translations: { sv?, en? } }. Include a label in locale. Supplied labels are preserved; omitted languages are translated automatically.",
                    "maxItems": 20,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        "icon": {
                          "type": "string",
                          "minLength": 1
                        },
                        "translations": {
                          "type": "object",
                          "properties": {
                            "sv": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "en": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            }
                          }
                        }
                      },
                      "required": [
                        "id",
                        "icon",
                        "translations"
                      ]
                    }
                  },
                  "images": {
                    "default": [],
                    "description": "URLs returned by POST /uploads/images for your organization, in display order; the first is the cover. At least 3 to publish. Reordering counts as a change.",
                    "maxItems": 30,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uri"
                    }
                  },
                  "blurPlaceholders": {
                    "description": "Blur placeholders keyed by image URL, as returned by the upload endpoint. Optional.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string",
                      "format": "uri"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "maxLength": 2000
                    }
                  },
                  "floorPlanUrl": {
                    "description": "URL returned by POST /uploads/floor-plan. Optional; does not count towards the three-image minimum.",
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "openHours": {
                    "description": "Opening hours per weekday for coworking listings. Each day is { open, close } as HH:MM, or null for closed.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "monday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tuesday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "wednesday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "thursday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "friday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "saturday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "sunday": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "open": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Opening time, HH:MM (00:00 to 23:59)."
                                  },
                                  "close": {
                                    "type": "string",
                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                    "description": "Closing time, HH:MM (00:00 to 23:59)."
                                  },
                                  "allDay": {
                                    "description": "Open around the clock.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "open",
                                  "close"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "monday",
                          "tuesday",
                          "wednesday",
                          "thursday",
                          "friday",
                          "saturday",
                          "sunday"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "status": {
                    "default": "published",
                    "description": "published (default) goes live when there are no publish blockers; draft holds the listing back.",
                    "type": "string",
                    "enum": [
                      "published",
                      "draft"
                    ]
                  },
                  "assignedTo": {
                    "description": "Email of the organization member who owns the listing. Defaults to the organization owner when the listing is created; omitted on an update, the current assignee is kept.",
                    "type": "string",
                    "format": "email",
                    "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                  }
                },
                "required": [
                  "type",
                  "price"
                ]
              },
              "example": {
                "objectId": "88cfe4aa-9014-4523-945c-29a849f9a528",
                "type": "office",
                "locale": "sv",
                "description": "Ljust hörnkontor på plan 4 med sex arbetsplatser, eget mötesrum och pentry.",
                "areaM2": 120,
                "capacity": 6,
                "furnished": true,
                "price": {
                  "amount": 38000,
                  "currency": "sek",
                  "period": "month"
                },
                "noticePeriod": 3,
                "minimumDuration": 12,
                "amenityIds": [
                  1,
                  3
                ],
                "images": [
                  "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                  "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                  "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                ],
                "status": "published"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Shace id."
                    },
                    "externalRef": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Your reference, or null when none was sent."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "draft",
                        "published",
                        "unpublished"
                      ],
                      "description": "draft (never live), published, or unpublished (was live, taken off)."
                    },
                    "publishBlockers": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "images",
                          "price",
                          "noticePeriod",
                          "object"
                        ]
                      },
                      "description": "Empty when the listing can go live; otherwise what is missing: images, price, noticePeriod, object."
                    },
                    "object": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "Shace id of the object."
                        },
                        "externalRef": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Your reference for the object, or null."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "archived"
                          ],
                          "description": "An archived object blocks publishing (publishBlockers: object)."
                        },
                        "streetAddress": {
                          "type": "string",
                          "description": "Street and number."
                        },
                        "streetAddress2": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Floor, entrance or suite, or null."
                        },
                        "postalCode": {
                          "type": "string",
                          "description": "Postal code."
                        },
                        "city": {
                          "type": "string",
                          "description": "City."
                        },
                        "region": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "County or region, or null."
                        },
                        "countryCode": {
                          "type": "string",
                          "description": "ISO 3166-1 alpha-2."
                        }
                      },
                      "required": [
                        "id",
                        "externalRef",
                        "status",
                        "streetAddress",
                        "streetAddress2",
                        "postalCode",
                        "city",
                        "region",
                        "countryCode"
                      ],
                      "additionalProperties": false,
                      "description": "The object (building or address) the listing sits on."
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "office",
                        "coworking",
                        "part_of_office"
                      ],
                      "description": "office for a whole office, coworking for desks or rooms in a shared workspace, part_of_office for part of a larger office."
                    },
                    "locale": {
                      "type": "string",
                      "enum": [
                        "sv",
                        "en"
                      ],
                      "description": "Locale the description was submitted in; Shace translates the rest."
                    },
                    "description": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Free text about the premises, in locale."
                    },
                    "areaM2": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Floor area in square metres."
                    },
                    "capacity": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Number of workplaces."
                    },
                    "furnished": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Furnished or not."
                    },
                    "price": {
                      "type": "object",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "Rent excluding VAT, per period."
                        },
                        "currency": {
                          "type": "string",
                          "const": "sek",
                          "description": "Only SEK today."
                        },
                        "period": {
                          "type": "string",
                          "enum": [
                            "month",
                            "day"
                          ],
                          "description": "month for open-ended leases, day for day rates."
                        }
                      },
                      "required": [
                        "amount",
                        "currency",
                        "period"
                      ],
                      "additionalProperties": false,
                      "description": "Base rent, as sent."
                    },
                    "noticePeriod": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Notice period in months, month-priced listings only."
                    },
                    "minimumDuration": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Binding period in months, or null for no minimum."
                    },
                    "amenityIds": {
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": -9007199254740991,
                        "maximum": 9007199254740991
                      },
                      "description": "Ids from the catalogue in GET /amenities."
                    },
                    "customAmenities": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "Your uuid for the amenity."
                          },
                          "icon": {
                            "type": "string",
                            "description": "Icon name."
                          },
                          "translations": {
                            "description": "Label per locale, keyed by locale code (sv, en).",
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "id",
                          "icon"
                        ],
                        "additionalProperties": false
                      },
                      "description": "Amenities outside the catalogue, as sent."
                    },
                    "images": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Public image URLs in display order."
                    },
                    "floorPlanUrl": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Public floor plan URL, or null."
                    },
                    "openHours": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "monday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "tuesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "wednesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "thursday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "friday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "saturday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "sunday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Opening hours per weekday for coworking listings, or null."
                    },
                    "assignedTo": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Email of the assigned organization member."
                    },
                    "createdVia": {
                      "type": "string",
                      "enum": [
                        "app",
                        "api"
                      ],
                      "description": "Whether the listing was created in the app or through this API."
                    },
                    "lastSyncedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Last time a PUT through this API wrote content fields."
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "Latest update to the listing, its primary-language description, or its object. ISO 8601 UTC, millisecond precision."
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "created",
                        "updated",
                        "unchanged"
                      ],
                      "description": "What the request did. unchanged means the body matched what Shace already holds."
                    }
                  },
                  "required": [
                    "id",
                    "externalRef",
                    "status",
                    "publishBlockers",
                    "object",
                    "type",
                    "locale",
                    "description",
                    "areaM2",
                    "capacity",
                    "furnished",
                    "price",
                    "noticePeriod",
                    "minimumDuration",
                    "amenityIds",
                    "customAmenities",
                    "images",
                    "floorPlanUrl",
                    "openHours",
                    "assignedTo",
                    "createdVia",
                    "lastSyncedAt",
                    "createdAt",
                    "updatedAt",
                    "outcome"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "id": "5c1c8f0e-6a3b-4a4c-9a3e-2b7f0d9a1e11",
                  "externalRef": null,
                  "status": "published",
                  "publishBlockers": [],
                  "object": {
                    "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                    "externalRef": "bldg-12",
                    "status": "active",
                    "streetAddress": "Sveavägen 44",
                    "streetAddress2": null,
                    "postalCode": "111 34",
                    "city": "Stockholm",
                    "region": null,
                    "countryCode": "SE"
                  },
                  "type": "office",
                  "locale": "sv",
                  "description": "Ljust hörnkontor på plan 4 med sex arbetsplatser, eget mötesrum och pentry.",
                  "areaM2": 120,
                  "capacity": 6,
                  "furnished": true,
                  "price": {
                    "amount": 38000,
                    "currency": "sek",
                    "period": "month"
                  },
                  "noticePeriod": 3,
                  "minimumDuration": 12,
                  "amenityIds": [
                    1,
                    3
                  ],
                  "customAmenities": [],
                  "images": [
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                  ],
                  "floorPlanUrl": null,
                  "openHours": null,
                  "assignedTo": "agent@landlord.se",
                  "createdVia": "api",
                  "lastSyncedAt": "2026-09-02T13:19:00.445Z",
                  "createdAt": "2026-09-02T13:19:00.445Z",
                  "updatedAt": "2026-09-02T13:19:00.445Z",
                  "outcome": "created"
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Fix the body; do not retry as is.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "validation": {
                    "summary": "Field validation failed",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "Input validation failed",
                      "data": {
                        "issues": [
                          {
                            "path": [
                              "noticePeriod"
                            ],
                            "message": "Notice period only applies to month-priced listings"
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found in your organization. Other organizations' ids answer the same, so ids leak nothing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "objectNotFound": {
                    "summary": "objectId is not one of your objects",
                    "value": {
                      "code": "NOT_FOUND",
                      "status": 404,
                      "message": "Object not found"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "listListings",
        "summary": "List your listings",
        "description": "Newest first, cursor paginated. Use `updatedSince` to verify what Shace holds without re-pushing.",
        "tags": [
          "Listings"
        ],
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "description": "nextCursor from the previous page.",
              "type": "string"
            },
            "allowEmptyValue": true,
            "allowReserved": true
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "default": 50,
              "description": "Page size, 1 to 200.",
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            },
            "allowEmptyValue": true,
            "allowReserved": true,
            "example": 50
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "description": "Only listings in this status.",
              "type": "string",
              "enum": [
                "draft",
                "published",
                "unpublished"
              ]
            },
            "allowEmptyValue": true,
            "allowReserved": true,
            "example": "published"
          },
          {
            "name": "updatedSince",
            "in": "query",
            "schema": {
              "description": "ISO 8601 instant. Only listings whose returned updatedAt is after it, compared at millisecond precision. Includes changes to their objects and primary-language descriptions.",
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "allowEmptyValue": true,
            "allowReserved": true,
            "example": "2026-09-01T00:00:00Z"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                            "description": "Shace id."
                          },
                          "externalRef": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Your reference, or null when none was sent."
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "draft",
                              "published",
                              "unpublished"
                            ],
                            "description": "draft (never live), published, or unpublished (was live, taken off)."
                          },
                          "publishBlockers": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "enum": [
                                "images",
                                "price",
                                "noticePeriod",
                                "object"
                              ]
                            },
                            "description": "Empty when the listing can go live; otherwise what is missing: images, price, noticePeriod, object."
                          },
                          "object": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                                "description": "Shace id of the object."
                              },
                              "externalRef": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "Your reference for the object, or null."
                              },
                              "status": {
                                "type": "string",
                                "enum": [
                                  "active",
                                  "archived"
                                ],
                                "description": "An archived object blocks publishing (publishBlockers: object)."
                              },
                              "streetAddress": {
                                "type": "string",
                                "description": "Street and number."
                              },
                              "streetAddress2": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "Floor, entrance or suite, or null."
                              },
                              "postalCode": {
                                "type": "string",
                                "description": "Postal code."
                              },
                              "city": {
                                "type": "string",
                                "description": "City."
                              },
                              "region": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "County or region, or null."
                              },
                              "countryCode": {
                                "type": "string",
                                "description": "ISO 3166-1 alpha-2."
                              }
                            },
                            "required": [
                              "id",
                              "externalRef",
                              "status",
                              "streetAddress",
                              "streetAddress2",
                              "postalCode",
                              "city",
                              "region",
                              "countryCode"
                            ],
                            "additionalProperties": false,
                            "description": "The object (building or address) the listing sits on."
                          },
                          "type": {
                            "type": "string",
                            "enum": [
                              "office",
                              "coworking",
                              "part_of_office"
                            ],
                            "description": "office for a whole office, coworking for desks or rooms in a shared workspace, part_of_office for part of a larger office."
                          },
                          "locale": {
                            "type": "string",
                            "enum": [
                              "sv",
                              "en"
                            ],
                            "description": "Locale the description was submitted in; Shace translates the rest."
                          },
                          "description": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Free text about the premises, in locale."
                          },
                          "areaM2": {
                            "anyOf": [
                              {
                                "type": "number"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Floor area in square metres."
                          },
                          "capacity": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": -9007199254740991,
                                "maximum": 9007199254740991
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Number of workplaces."
                          },
                          "furnished": {
                            "anyOf": [
                              {
                                "type": "boolean"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Furnished or not."
                          },
                          "price": {
                            "type": "object",
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "Rent excluding VAT, per period."
                              },
                              "currency": {
                                "type": "string",
                                "const": "sek",
                                "description": "Only SEK today."
                              },
                              "period": {
                                "type": "string",
                                "enum": [
                                  "month",
                                  "day"
                                ],
                                "description": "month for open-ended leases, day for day rates."
                              }
                            },
                            "required": [
                              "amount",
                              "currency",
                              "period"
                            ],
                            "additionalProperties": false,
                            "description": "Base rent, as sent."
                          },
                          "noticePeriod": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": -9007199254740991,
                                "maximum": 9007199254740991
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Notice period in months, month-priced listings only."
                          },
                          "minimumDuration": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": -9007199254740991,
                                "maximum": 9007199254740991
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Binding period in months, or null for no minimum."
                          },
                          "amenityIds": {
                            "type": "array",
                            "items": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            },
                            "description": "Ids from the catalogue in GET /amenities."
                          },
                          "customAmenities": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "description": "Your uuid for the amenity."
                                },
                                "icon": {
                                  "type": "string",
                                  "description": "Icon name."
                                },
                                "translations": {
                                  "description": "Label per locale, keyed by locale code (sv, en).",
                                  "type": "object",
                                  "propertyNames": {
                                    "type": "string"
                                  },
                                  "additionalProperties": {
                                    "type": "string"
                                  }
                                }
                              },
                              "required": [
                                "id",
                                "icon"
                              ],
                              "additionalProperties": false
                            },
                            "description": "Amenities outside the catalogue, as sent."
                          },
                          "images": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "Public image URLs in display order."
                          },
                          "floorPlanUrl": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Public floor plan URL, or null."
                          },
                          "openHours": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "monday": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "properties": {
                                          "open": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Opening time, HH:MM (00:00 to 23:59)."
                                          },
                                          "close": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Closing time, HH:MM (00:00 to 23:59)."
                                          },
                                          "allDay": {
                                            "description": "Open around the clock.",
                                            "type": "boolean"
                                          }
                                        },
                                        "required": [
                                          "open",
                                          "close"
                                        ],
                                        "additionalProperties": false
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "tuesday": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "properties": {
                                          "open": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Opening time, HH:MM (00:00 to 23:59)."
                                          },
                                          "close": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Closing time, HH:MM (00:00 to 23:59)."
                                          },
                                          "allDay": {
                                            "description": "Open around the clock.",
                                            "type": "boolean"
                                          }
                                        },
                                        "required": [
                                          "open",
                                          "close"
                                        ],
                                        "additionalProperties": false
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "wednesday": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "properties": {
                                          "open": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Opening time, HH:MM (00:00 to 23:59)."
                                          },
                                          "close": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Closing time, HH:MM (00:00 to 23:59)."
                                          },
                                          "allDay": {
                                            "description": "Open around the clock.",
                                            "type": "boolean"
                                          }
                                        },
                                        "required": [
                                          "open",
                                          "close"
                                        ],
                                        "additionalProperties": false
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "thursday": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "properties": {
                                          "open": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Opening time, HH:MM (00:00 to 23:59)."
                                          },
                                          "close": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Closing time, HH:MM (00:00 to 23:59)."
                                          },
                                          "allDay": {
                                            "description": "Open around the clock.",
                                            "type": "boolean"
                                          }
                                        },
                                        "required": [
                                          "open",
                                          "close"
                                        ],
                                        "additionalProperties": false
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "friday": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "properties": {
                                          "open": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Opening time, HH:MM (00:00 to 23:59)."
                                          },
                                          "close": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Closing time, HH:MM (00:00 to 23:59)."
                                          },
                                          "allDay": {
                                            "description": "Open around the clock.",
                                            "type": "boolean"
                                          }
                                        },
                                        "required": [
                                          "open",
                                          "close"
                                        ],
                                        "additionalProperties": false
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "saturday": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "properties": {
                                          "open": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Opening time, HH:MM (00:00 to 23:59)."
                                          },
                                          "close": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Closing time, HH:MM (00:00 to 23:59)."
                                          },
                                          "allDay": {
                                            "description": "Open around the clock.",
                                            "type": "boolean"
                                          }
                                        },
                                        "required": [
                                          "open",
                                          "close"
                                        ],
                                        "additionalProperties": false
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "sunday": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "properties": {
                                          "open": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Opening time, HH:MM (00:00 to 23:59)."
                                          },
                                          "close": {
                                            "type": "string",
                                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                            "description": "Closing time, HH:MM (00:00 to 23:59)."
                                          },
                                          "allDay": {
                                            "description": "Open around the clock.",
                                            "type": "boolean"
                                          }
                                        },
                                        "required": [
                                          "open",
                                          "close"
                                        ],
                                        "additionalProperties": false
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "monday",
                                  "tuesday",
                                  "wednesday",
                                  "thursday",
                                  "friday",
                                  "saturday",
                                  "sunday"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Opening hours per weekday for coworking listings, or null."
                          },
                          "assignedTo": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Email of the assigned organization member."
                          },
                          "createdVia": {
                            "type": "string",
                            "enum": [
                              "app",
                              "api"
                            ],
                            "description": "Whether the listing was created in the app or through this API."
                          },
                          "lastSyncedAt": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time",
                                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                              },
                              {
                                "type": "null"
                              }
                            ],
                            "description": "Last time a PUT through this API wrote content fields."
                          },
                          "createdAt": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                            "description": "ISO 8601 UTC."
                          },
                          "updatedAt": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                            "description": "Latest update to the listing, its primary-language description, or its object. ISO 8601 UTC, millisecond precision."
                          }
                        },
                        "required": [
                          "id",
                          "externalRef",
                          "status",
                          "publishBlockers",
                          "object",
                          "type",
                          "locale",
                          "description",
                          "areaM2",
                          "capacity",
                          "furnished",
                          "price",
                          "noticePeriod",
                          "minimumDuration",
                          "amenityIds",
                          "customAmenities",
                          "images",
                          "floorPlanUrl",
                          "openHours",
                          "assignedTo",
                          "createdVia",
                          "lastSyncedAt",
                          "createdAt",
                          "updatedAt"
                        ],
                        "additionalProperties": false
                      },
                      "description": "The page, newest first."
                    },
                    "nextCursor": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Pass as ?cursor= to fetch the next page; null on the last page."
                    }
                  },
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "data": [
                    {
                      "id": "5c1c8f0e-6a3b-4a4c-9a3e-2b7f0d9a1e11",
                      "externalRef": "unit-4711",
                      "status": "published",
                      "publishBlockers": [],
                      "object": {
                        "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                        "externalRef": "bldg-12",
                        "status": "active",
                        "streetAddress": "Sveavägen 44",
                        "streetAddress2": null,
                        "postalCode": "111 34",
                        "city": "Stockholm",
                        "region": null,
                        "countryCode": "SE"
                      },
                      "type": "office",
                      "locale": "sv",
                      "description": "Ljust hörnkontor på plan 4 med sex arbetsplatser, eget mötesrum och pentry.",
                      "areaM2": 120,
                      "capacity": 6,
                      "furnished": true,
                      "price": {
                        "amount": 38000,
                        "currency": "sek",
                        "period": "month"
                      },
                      "noticePeriod": 3,
                      "minimumDuration": 12,
                      "amenityIds": [
                        1,
                        3
                      ],
                      "customAmenities": [],
                      "images": [
                        "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                        "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                        "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                      ],
                      "floorPlanUrl": null,
                      "openHours": null,
                      "assignedTo": "agent@landlord.se",
                      "createdVia": "api",
                      "lastSyncedAt": "2026-09-02T13:19:00.445Z",
                      "createdAt": "2026-09-02T13:19:00.445Z",
                      "updatedAt": "2026-09-02T13:19:00.445Z"
                    }
                  ],
                  "nextCursor": "eyJjIjoiMjAyNi0wOS0wMlQxMzoxOTowMS4wODFaIiwiaSI6Ijk4NzJhYjE1LWRhM2EtNDc1Ni04ODU2LTllM2UyYmQ1OTZlZCJ9"
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Fix the body; do not retry as is.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "invalidCursor": {
                    "summary": "The cursor is not one this endpoint issued",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "Invalid cursor"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/listings/{id}/unpublish": {
      "post": {
        "operationId": "unpublishListing",
        "summary": "Take a listing off the market",
        "description": "For the unpublish action in your system. `id` is a Shace UUID or `ext:<externalRef>`. The listing is hidden from matchmaking and keeps its content and reference; nothing is deleted, and the next `PUT` of the same reference puts it back on the market. Idempotent: a listing that is already off the market answers `outcome: \"unchanged\"`.",
        "tags": [
          "Listings"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "Listing id, or `ext:<your reference>`."
            },
            "example": "ext:unit-4711"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$schema": "https://json-schema.org/draft/2020-12/schema",
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Shace id."
                    },
                    "externalRef": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Your reference, or null when none was sent."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "draft",
                        "published",
                        "unpublished"
                      ],
                      "description": "draft (never live), published, or unpublished (was live, taken off)."
                    },
                    "publishBlockers": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "images",
                          "price",
                          "noticePeriod",
                          "object"
                        ]
                      },
                      "description": "Empty when the listing can go live; otherwise what is missing: images, price, noticePeriod, object."
                    },
                    "object": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "Shace id of the object."
                        },
                        "externalRef": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Your reference for the object, or null."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "archived"
                          ],
                          "description": "An archived object blocks publishing (publishBlockers: object)."
                        },
                        "streetAddress": {
                          "type": "string",
                          "description": "Street and number."
                        },
                        "streetAddress2": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Floor, entrance or suite, or null."
                        },
                        "postalCode": {
                          "type": "string",
                          "description": "Postal code."
                        },
                        "city": {
                          "type": "string",
                          "description": "City."
                        },
                        "region": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "County or region, or null."
                        },
                        "countryCode": {
                          "type": "string",
                          "description": "ISO 3166-1 alpha-2."
                        }
                      },
                      "required": [
                        "id",
                        "externalRef",
                        "status",
                        "streetAddress",
                        "streetAddress2",
                        "postalCode",
                        "city",
                        "region",
                        "countryCode"
                      ],
                      "additionalProperties": false,
                      "description": "The object (building or address) the listing sits on."
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "office",
                        "coworking",
                        "part_of_office"
                      ],
                      "description": "office for a whole office, coworking for desks or rooms in a shared workspace, part_of_office for part of a larger office."
                    },
                    "locale": {
                      "type": "string",
                      "enum": [
                        "sv",
                        "en"
                      ],
                      "description": "Locale the description was submitted in; Shace translates the rest."
                    },
                    "description": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Free text about the premises, in locale."
                    },
                    "areaM2": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Floor area in square metres."
                    },
                    "capacity": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Number of workplaces."
                    },
                    "furnished": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Furnished or not."
                    },
                    "price": {
                      "type": "object",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "Rent excluding VAT, per period."
                        },
                        "currency": {
                          "type": "string",
                          "const": "sek",
                          "description": "Only SEK today."
                        },
                        "period": {
                          "type": "string",
                          "enum": [
                            "month",
                            "day"
                          ],
                          "description": "month for open-ended leases, day for day rates."
                        }
                      },
                      "required": [
                        "amount",
                        "currency",
                        "period"
                      ],
                      "additionalProperties": false,
                      "description": "Base rent, as sent."
                    },
                    "noticePeriod": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Notice period in months, month-priced listings only."
                    },
                    "minimumDuration": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Binding period in months, or null for no minimum."
                    },
                    "amenityIds": {
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": -9007199254740991,
                        "maximum": 9007199254740991
                      },
                      "description": "Ids from the catalogue in GET /amenities."
                    },
                    "customAmenities": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "Your uuid for the amenity."
                          },
                          "icon": {
                            "type": "string",
                            "description": "Icon name."
                          },
                          "translations": {
                            "description": "Label per locale, keyed by locale code (sv, en).",
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "id",
                          "icon"
                        ],
                        "additionalProperties": false
                      },
                      "description": "Amenities outside the catalogue, as sent."
                    },
                    "images": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Public image URLs in display order."
                    },
                    "floorPlanUrl": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Public floor plan URL, or null."
                    },
                    "openHours": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "monday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "tuesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "wednesday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "thursday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "friday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "saturday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "sunday": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "open": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Opening time, HH:MM (00:00 to 23:59)."
                                    },
                                    "close": {
                                      "type": "string",
                                      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
                                      "description": "Closing time, HH:MM (00:00 to 23:59)."
                                    },
                                    "allDay": {
                                      "description": "Open around the clock.",
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "open",
                                    "close"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Opening hours per weekday for coworking listings, or null."
                    },
                    "assignedTo": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Email of the assigned organization member."
                    },
                    "createdVia": {
                      "type": "string",
                      "enum": [
                        "app",
                        "api"
                      ],
                      "description": "Whether the listing was created in the app or through this API."
                    },
                    "lastSyncedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Last time a PUT through this API wrote content fields."
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "ISO 8601 UTC."
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "Latest update to the listing, its primary-language description, or its object. ISO 8601 UTC, millisecond precision."
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "created",
                        "updated",
                        "unchanged"
                      ],
                      "description": "What the request did. unchanged means the body matched what Shace already holds."
                    }
                  },
                  "required": [
                    "id",
                    "externalRef",
                    "status",
                    "publishBlockers",
                    "object",
                    "type",
                    "locale",
                    "description",
                    "areaM2",
                    "capacity",
                    "furnished",
                    "price",
                    "noticePeriod",
                    "minimumDuration",
                    "amenityIds",
                    "customAmenities",
                    "images",
                    "floorPlanUrl",
                    "openHours",
                    "assignedTo",
                    "createdVia",
                    "lastSyncedAt",
                    "createdAt",
                    "updatedAt",
                    "outcome"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "id": "5c1c8f0e-6a3b-4a4c-9a3e-2b7f0d9a1e11",
                  "externalRef": "unit-4711",
                  "status": "unpublished",
                  "publishBlockers": [],
                  "object": {
                    "id": "88cfe4aa-9014-4523-945c-29a849f9a528",
                    "externalRef": "bldg-12",
                    "status": "active",
                    "streetAddress": "Sveavägen 44",
                    "streetAddress2": null,
                    "postalCode": "111 34",
                    "city": "Stockholm",
                    "region": null,
                    "countryCode": "SE"
                  },
                  "type": "office",
                  "locale": "sv",
                  "description": "Ljust hörnkontor på plan 4 med sex arbetsplatser, eget mötesrum och pentry.",
                  "areaM2": 120,
                  "capacity": 6,
                  "furnished": true,
                  "price": {
                    "amount": 38000,
                    "currency": "sek",
                    "period": "month"
                  },
                  "noticePeriod": 3,
                  "minimumDuration": 12,
                  "amenityIds": [
                    1,
                    3
                  ],
                  "customAmenities": [],
                  "images": [
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                  ],
                  "floorPlanUrl": null,
                  "openHours": null,
                  "assignedTo": "agent@landlord.se",
                  "createdVia": "api",
                  "lastSyncedAt": "2026-09-02T13:19:00.445Z",
                  "createdAt": "2026-09-02T13:19:00.445Z",
                  "updatedAt": "2026-09-18T08:02:11.310Z",
                  "outcome": "updated"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found in your organization. Other organizations' ids answer the same, so ids leak nothing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "notFound": {
                    "summary": "No listing with that id or reference in your organization",
                    "value": {
                      "code": "NOT_FOUND",
                      "status": 404,
                      "message": "No listing with externalRef \"unit-4711\""
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/uploads/images": {
      "post": {
        "operationId": "uploadImages",
        "tags": [
          "Uploads"
        ],
        "summary": "Upload listing images",
        "description": "Multipart form with one or more `files` fields. Each image is converted to webp, resized to at most 2048 px and given a blur placeholder, exactly like uploads from the app. Reference the returned URLs from `images` on a listing. At most 8 files per request, each at most 15 MB. JPEG, PNG, WebP and HEIC are supported; a file that cannot be decoded as an image is rejected with `400 BAD_REQUEST`.",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 8,
                    "description": "One multipart field per image, all named files. Order is preserved in the response. At most 15 MB each.",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "contentType": "image/jpeg, image/png, image/webp, image/heic"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "urls",
                    "blurPlaceholders"
                  ],
                  "properties": {
                    "urls": {
                      "type": "array",
                      "description": "Public URLs, in upload order. Use these in `images`.",
                      "items": {
                        "type": "string",
                        "format": "uri"
                      }
                    },
                    "blurPlaceholders": {
                      "type": "object",
                      "description": "Tiny base64 webp per URL. Pass along as `blurPlaceholders` on the listing if you want instant previews in the app; optional.",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                },
                "example": {
                  "urls": [
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp"
                  ],
                  "blurPlaceholders": {
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/df8f8bd6-34ae-4b0b-b7b1-f3b01f53c433.webp": "data:image/webp;base64,UklGRkAAAABXRUJQVlA4IDQAAAAwAgCdASoKAAoAAUAmJaQAA3AA/vuUaAA=",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/86937c08-cc69-4118-8816-9dddc4ab166d.webp": "data:image/webp;base64,UklGRkAAAABXRUJQVlA4IDQAAAAwAgCdASoKAAoAAUAmJaQAA3AA/vuUaAA=",
                    "https://storage.shace.se/listing-images/8ac643b3-dab8-4254-ae00-96e0c88b95fb/4c695935-0bff-4865-8121-b46dbb44b4e2.webp": "data:image/webp;base64,UklGRkAAAABXRUJQVlA4IDQAAAAwAgCdASoKAAoAAUAmJaQAA3AA/vuUaAA="
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Fix the body; do not retry as is.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "undecodable": {
                    "summary": "A file is not a supported image",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "One or more files are not a supported image (JPEG, PNG, WebP or HEIC)"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Payload too large. Split the batch.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "tooLarge": {
                    "summary": "The batch is over the size limit; split it",
                    "value": {
                      "code": "PAYLOAD_TOO_LARGE",
                      "status": 413,
                      "message": "At most 8 images of 15MB each per request"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/uploads/floor-plan": {
      "post": {
        "operationId": "uploadFloorPlan",
        "tags": [
          "Uploads"
        ],
        "summary": "Upload a floor plan",
        "description": "Multipart form with a single `file` field: PNG, JPEG, WebP or PDF, at most 15 MB. Reference the returned URL from `floorPlanUrl` on a listing.",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "file"
                ],
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "PNG, JPEG, WebP or PDF, at most 15 MB."
                  }
                }
              },
              "encoding": {
                "file": {
                  "contentType": "image/png, image/jpeg, image/webp, application/pdf"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "url"
                  ],
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Public URL. Use it as `floorPlanUrl`."
                    }
                  }
                },
                "example": {
                  "url": "https://storage.shace.se/listing-floor-plans/8ac643b3-dab8-4254-ae00-96e0c88b95fb/1f6e2c1a-8d1e-4a4e-9f27-0d3d9c8f1b2a.pdf"
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Fix the body; do not retry as is.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unsupportedFormat": {
                    "summary": "The file is not PNG, JPEG, WebP or PDF",
                    "value": {
                      "code": "BAD_REQUEST",
                      "status": 400,
                      "message": "Only PNG, JPEG, WebP, or PDF files are allowed"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. The key is missing, malformed, revoked or expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Missing, malformed, revoked or expired key",
                    "value": {
                      "code": "UNAUTHORIZED",
                      "status": 401,
                      "message": "Missing or invalid API key"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Payload too large. Split the batch.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "tooLarge": {
                    "summary": "The file is over 15 MB",
                    "value": {
                      "code": "PAYLOAD_TOO_LARGE",
                      "status": 413,
                      "message": "File too large (max 15MB)"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Listings",
      "description": "Units for rent. `PUT /listings/{id}` by your own reference is the call to make whenever a unit is saved in your system; `POST /listings/{id}/unpublish` takes it off the market."
    },
    {
      "name": "Objects",
      "description": "Buildings and addresses. Push them on their own when several units share an address."
    },
    {
      "name": "Uploads",
      "description": "Listings reference images by URL, and the URLs must come from your organization's uploads through this API. A URL from anywhere else is rejected with `400`.\n\n**Upload once, cache the URLs.** Store the returned URLs next to the unit in your system. Later pushes send the same URLs and the listing comes back `unchanged`; upload again only when a photo actually changed. Shace checks that each URL points into your organization's folder but does not fetch it, so a URL for an upload that no longer exists is accepted and shows as a broken image.\n\n**Deletion.** An upload is deleted as soon as no listing in your organization references it any more. If a photo moves between units (unit A drops a URL and unit B gains it), push B before A, or upload the photo again for B. A URL shared by several listings stays as long as one of them keeps it.\n\n**Order matters.** `images` is the display order in Shace and the first image is the cover. Reordering the array counts as a change and re-indexes the listing.\n\n**Floor plans** are optional and do not count towards the three-image minimum. **Blur placeholders** from the upload response are optional to pass along on the listing; leave them out if your system has nowhere to keep them.\n\n**Remote URLs.** Accepting your own CDN URLs and fetching them on our side is planned. Until then, the upload endpoints are the way in."
    },
    {
      "name": "Account",
      "description": "The organization and key behind a request, and the amenity catalogue."
    }
  ],
  "servers": [
    {
      "url": "https://api-preview.shace.se/partner/v1"
    }
  ]
}
