---
title: "Get the business or person who owns a property"
method: GET
path: "/properties/{id}/owner"
tags: ["Properties"]
---

# Get the business or person who owns a property

`GET /properties/{id}/owner`

## Request

- Base URL: `https://api.purplegrain.com/api/v1`
- URL: `https://api.purplegrain.com/api/v1/properties/{id}/owner`
- Auth: one of:
  - none
  - HTTP bearer

The related resource URL of a property's `owner` relationship (JSON:API 1.1,
"Related Resource Links"; decision 2026-10-28, G17): the business or the
person who owns the property, each in its own shape (`data.type` is
`organization` or `user`, as `getOrganization` and `getUser` return them). It
is the relationship's `links.related` on `getProperty`, built from the
property's id alone, so it never changes. A property always has an owner, and
one whose owner is gone cannot be read at all, so `data` is never null in
practice; the document keeps the related-resource shape. Read rights are the
property's (`getProperty`): a stranger gets a 404 on a private property. Not an assistant's tool: an
assistant reads the owner with `getBusiness` or `getUser` and is refused
here (403).

## Path parameters

- `id` string, required

## Response `200`

The business or the person who owns the property

- PropertyOwnerResponseAttributes: The same document in attributes-adapter shape (Accept application/json): the flat business or person, or `data: null`.
  - `data` union
    - OrganizationModelAttributes: Organization in attributes-adapter shape (Accept application/json); fields at top level.
      - `id` string
      - `type` string
      - `name` string
      - `slug` string, nullable
      - `avatar_url` string, nullable
      - `avatar_thumb_url` string, nullable
      - `free_trial_used` boolean: Whether the organization has used its free trial.
      - `ai_format_enabled` boolean: Allow PurpleGrain AI to read this organisation's records (default true). Only present for members. When false, the formatter's request carries no property context for this organisation. Writable on update by whoever can update the organization.
      - `updated_at` string, date-time
      - `created_at` string, date-time
      - `city` object: Inlined when include=city
      - `place` object: Inlined when include=place
      - `services` unknown[], nullable: Inlined when include=services
        - unknown
      - `organization_roles` unknown[], nullable: Inlined when include=organization_roles
        - unknown
    - UserModelAttributes: User in attributes-adapter shape (Accept application/json); fields at top level.
      - `id` string
      - `type` string
      - `email` string, email
      - `name` string, nullable
      - `about` string, nullable
      - `account_mode` 'grower' | 'contractor', nullable: Grower vs Contractor mode; only present for the current user.
      - `default_record_mode` 'ai' | 'general': Which record type the composer opens on: `ai` (PurpleGrain AI, the default) or `general`. Only present for the current user. A null value is ignored on update.
      - `free_trial_used` boolean, nullable: Whether the free trial has been used. Only populated when viewing your own profile; null otherwise.
      - `mobile` string, nullable: Canonical login mobile (E.164); only present for the current user.
      - `mobile_verified` boolean, nullable: Whether the mobile has been verified by SMS one-time code; only present for the current user.
      - `sms_opted_out` boolean, nullable: Whether SMS to this account is silenced (by replying STOP, or from the account screen); only present for the current user.
      - `handle` string
      - `url` string
      - `avatar_url` string, nullable
      - `avatar_thumb_url` string, nullable
      - `updated_at` string, date-time
      - `created_at` string, date-time
      - `contact_info` object
        - `mobile` string, nullable
        - `phone` string, nullable
        - `facebook` string, nullable
        - `url` string, nullable
        - `email` boolean, nullable
      - `city` object: Inlined when include=city
      - `place` object: Inlined when include=place
      - `services` unknown[], nullable: Inlined when include=services
        - unknown
      - `location` object: Inlined when include=location

## Other responses

- `401`: Unauthorized
- `403`: Forbidden — a signed-in caller without access to the property, or an AI assistant
- `404`: Not Found — no such property, or a property a stranger may not know exists

## Changes

- **2026-10-31** `370fe2f3ed4f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/purplegrain/apis/purple-grain-api/changes/properties/:id/owner/get.md)

---

[API](https://skmtc.dev/purplegrain/apis/purple-grain-api.md) - [All operations](https://skmtc.dev/purplegrain/apis/purple-grain-api/llms.txt) - [OpenAPI document](https://skmtc.dev/purplegrain/apis/purple-grain-api/revisions/370fe2f3ed4f?raw)
