---
title: "Get a property with all paddocks and mobs"
method: GET
path: "/properties/{id}/picture"
tags: ["Properties"]
---

# Get a property with all paddocks and mobs

`GET /properties/{id}/picture`

## Request

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

One property in full — the call that lists every paddock and every mob
before a drench is recorded — whether it belongs to the signed-in user
or to a business: its name and labels, the point the map opens on, `area_ha`,
the live `paddock_count` / `mob_count`, its outline and its `blocks`, plus
every paddock and every mob on it.

`boundary` — on the property and on each paddock — is an array of closed
rings of `[longitude, latitude]` pairs, **longitude first**, never a
GeoJSON object, or null while that outline has not been drawn. A paddock
also carries `block_id` (its block, null in the home block), land use,
crop, archive state and diary counters. A mob
carries `head_count`, archive state, diary counters and
`current_paddock_id`. Archived assets are included; `paddock_count` and
`mob_count` stay live-only.

With `Accept: application/vnd.api+json` the assets are in `included`.
With `Accept: application/json` they are inlined as `paddocks` and
`mobs` on the property. What is filed on one of those assets is
`listAssetResources`. Any accepted member of the owning business can
read; a personal property is readable by its owner alone; and so is anyone
the property is shared with (`visibility` `public`, or `link` with the
`share` token). Credentials are optional; a caller with none who may not
see it is told **404**.

## Path parameters

- `id` string, required

## Query parameters

- `include` string

## Response `200`

The property with its paddocks and mobs. JSON:API puts them in
`included`; the attributes adapter inlines `paddocks` and `mobs`.

- PropertiesShowResponseAttributes
  - `data` PropertyModelAttributes: Single property in attributes-adapter shape (Accept application/json).
    - `id` string
    - `type` string
    - `slug` string: Unique within its parent (a property per owner; a paddock or mob per property); generated from the name and renamed with it. The old slug keeps resolving. See `resolveLink`.
    - `visibility` 'private' | 'link' | 'public': Who can see the property and, through it, its paddocks, mobs and scoped task lists. `private` (default) is members only; `link` is anyone with the share token (`?share=`); `public` is anyone and search engines.
    - `web_path` string: The property's address on the web, e.g. `/organizations/hillcrest/properties/yarrabee`. Present on a property read directly.
    - `url` string: The whole link to hand someone; for a property shared by link it carries `?share=<token>`. Present on a property read directly.
    - `can_edit` boolean: Whether the caller may change the property. From the session's role, never the address. Present on a property read directly.
    - `share_token` string, nullable: The token behind `visibility=link`. Returned only to callers who can change who sees the property.
    - `name` string
    - `location` string, nullable
    - `pic` string, nullable: Property Identification Code. One state-issued code of 8 letters or digits, stored uppercase. Null when unset. Not checked against `state`. A property stores one PIC. Private: present only for callers authorized to read this property's private records. Omitted for public or share-token access alone, including signed-in non-members.
    - `state` 'NSW' | 'VIC' | 'QLD' | 'SA' | 'WA' | 'TAS' | 'NT' | 'ACT', nullable: Read from place_label, or from location when place_label is blank. Null when the address does not name a state.
    - `livestock_not_required` boolean, nullable: Explicit farmer choice to skip mobs for this property during onboarding. True means no livestock needed for now; false/null undo the choice. Never inferred from zero mobs. Does not skip the first real record. Returned only with private-record permission, not public/share access.
    - `reef_catchment` boolean, nullable: Whether the farmer says the property is in a Queensland reef catchment. Not inferred from `state`, and accepted for any state. Null when unset.
    - `size` string, nullable
    - `place_label` string, nullable: The geocoded label shown under the property name on the map, e.g. "1180 Kywong Road, Currawarna NSW 2650".
    - `centroid_lat` number, nullable: Latitude of the point the map opens on. Present exactly when `centroid_lon` is.
    - `centroid_lon` number, nullable: Longitude of the point the map opens on. Present exactly when `centroid_lat` is.
    - `boundary` array[], nullable: The property outline: an array of rings, each ring an array of `[longitude, latitude]` pairs in RFC 7946 order — **longitude first** — with at least 4 positions and the first repeated last. Not a GeoJSON object (see `PropertyBoundaryModel`).
      - array[]: One closed exterior ring.
        - number[]: [longitude, latitude]
    - `boundary_captured_at` string, date-time, nullable: When the boundary was last saved. Null while the property has no ring.
    - `boundary_source` 'traced' | 'grid' | 'gps' | 'imported', nullable: How the ring was captured — traced over imagery, placed on the grid with no imagery, walked with the phone's GPS, or read from a KML/shapefile. Null for a ring saved before provenance was recorded or by a caller that named no source. Written with the ring and cleared with it.
    - `boundary_captured_by` string, nullable: Id of the user who saved the ring, stamped server-side from the request's actor and never accepted from a client. Null when a machine token saved it, and null while the property has no ring.
    - `area_ha` number, nullable: Property area in hectares. Measured from the boundary when `area_source` is `drawn`; the farmer's own number when it is `typed`.
    - `area_source` 'typed' | 'drawn', nullable: Where `area_ha` came from. A `typed` area is never overwritten by a drawn one.
    - `paddock_count` integer: How many LIVE paddocks the property has. Archived paddocks are not counted.
    - `mob_count` integer: How many LIVE mobs the property has. Archived mobs are not counted.
    - `blocks` PropertyBlock[]: The property's live blocks. Empty when every paddock is in the home block.
      - `id` string, uuid
      - `name` string
      - `kind` 'outblock' | 'irrigation_farm' | 'management'
      - `block_number` string, nullable: An optional number the business uses for the block, such as "Farm 89".
      - `paddock_ids` string[]: The ids of the live paddocks in the block, ordered by paddock name. Each of those paddocks has this block's id as its `block_id`.
      - `area_ha` number, nullable: The sum of the member paddocks' areas, in hectares. Null when no member has an area.
      - `hull` object, nullable: The convex hull of the member paddocks' boundaries as a GeoJSON geometry (usually a Polygon) in [lng, lat]. Null when no member has a boundary. For the map's dashed outline; not a boundary of its own.
        - `type` string
        - `coordinates` unknown[]
          - unknown
    - `created_at` string, date-time
    - `updated_at` string, date-time
    - `organization` object: Present when include=organization
    - `user` object, nullable: The person who owns a personal property (linkage only); null on a business's property.
  - `meta` PaginationMeta
    - `current_page` number
    - `next_page` number, nullable
    - `prev_page` number, nullable
  - `_meta` OnboardingMeta
    - `onboarding` Onboarding: Where the account in scope is in setting up a farm. A suggestion: reads are never refused because a step is missing. `next_step` is null once every step is done.
      - `status` 'not_started' | 'in_progress' | 'complete'
      - `completed_steps` string[]
      - `next_step` 'create_team' | 'create_property' | 'map_boundaries' | 'map_paddocks' | 'create_blocks' | 'add_mobs' | 'first_record', nullable
      - `skill` string
      - `skill_url` string
      - `agent_hint` string: Plain-language instruction, including a short fallback the agent can follow without the skill.

## Other responses

- `400`: The `include` query parameter names a relationship path this endpoint does not take (JSON:API 1.1, "Inclusion of Related Resources"). One error with `code: "unknown_include"` and `source.parameter: "include"`; its `detail` names the refused path(s) and the paths the endpoint allows (the parameter's `x-include-paths`). An endpoint whose serializer whitelists no relationship refuses any path. Rolling out as monitor then enforce: until the API's `JSONAPI_UNKNOWN_INCLUDE` is `reject`, an unknown path is dropped and logged instead.
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found

## Changes

- **2026-10-30** `e32f34ba218b`: 1 info
  - added the optional property `data/relationships/owner` to the response with the `200` status
- **2026-10-30** `143d65e52617`: 1 info
  - added the non-success response with the status `400`
- **2026-10-30** `92c4663a1266`: 6 warning, 6 info
  - removed the optional property `_meta` from the response with the `404` status (media type: application/json)
  - removed the optional property `_meta` from the response with the `404` status (media type: application/vnd.api+json)
  - removed the optional property `errors/items/onboarding` from the response with the `404` status (media type: application/json)
  - removed the optional property `errors/items/onboarding` from the response with the `404` status (media type: application/vnd.api+json)
  - …8 more
- **2026-10-24** `80a8118f0ada`: 2 info
  - added the optional property `data/attributes/livestock_not_required` to the response with the `200` status (media type: application/vnd.api+json)
  - added the optional property `data/livestock_not_required` to the response with the `200` status (media type: application/json)
- …earlier changes not shown

[Operation history](https://skmtc.dev/purplegrain/apis/purple-grain-api/changes/properties/:id/picture/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/e32f34ba218b?raw)
