Skip to content

Find the full portfolio of properties an owner holds

GET
/api/public/v1/properties/{property_id}/owner-portfolio/
curl --request GET \
--url https://app-api.landinsights.co/api/public/v1/properties/7234891/owner-portfolio/ \
--header 'Authorization: Bearer <token>'

Returns every parcel held by the same owner as the given property — the owner’s full portfolio — matched on the owner’s mailing address (street plus ZIP, or street plus city and state). Works whether the owner is a person, company, or trust.

Use it to gauge how much land an owner holds and where; a large or geographically scattered portfolio can flag a motivated, multi-parcel seller.

Errors: 400 when the subject parcel has no owner mailing address to match on; 404 when the property_id does not exist.

Cost: 30 tokens, or free when the owner holds nothing beyond the subject parcel.

property_id
required
integer

The property’s property_id (from property search, filter, or detail responses). Its owner’s portfolio is returned.

Examples
Example SamplePropertyID

Sample PropertyID

7234891
Media type application/json

Owner-portfolio response: portfolio totals plus every parcel the owner holds. Not paginated — the full portfolio is returned in one response.

object
source_parcel
required

The subject parcel the lookup was run for.

object
property_id
required

Land Insights numeric identifier for the parcel. Stable.

integer
url
required

Direct link to view this parcel in the Land Insights web app.

string
apn
required

Assessor’s Parcel Number — the county-assigned property identifier.

string
nullable
fips
required

5-digit county FIPS code (2-digit state FIPS + 3-digit county FIPS).

string
nullable
point
required

Geographic centroid (point-on-surface) of the parcel as [longitude, latitude] in WGS84 (EPSG:4326). May be null if geometry is unavailable.

Array<number>
nullable >= 2 characters <= 2 characters
acres
required

Parcel acreage as reported by the county assessor (source field LotSizeAcres). This is the authoritative legal/recorded acreage. For the acreage measured from the parcel polygon, see calculated_acres. Acreage filters use effective_acres.

number format: double
nullable
calculated_acres
required

Parcel acreage computed from the parcel geometry (source field CalculatedAcres): the GIS area of the polygon in acres, rounded to two decimals. May differ from the assessor-reported acres due to surveying or geometry differences, and is null when geometry is unavailable.

number format: double
nullable
effective_acres
required

Parcel acreage used for acreage filtering and sorting: the assessor-reported acres when present, otherwise the polygon-measured calculated_acres. Null only when both are unavailable.

number format: double
nullable
owner_name
required

Full name of the primary owner of record (raw string from assessor; typically uppercase, may include corporate suffixes like ‘LLC’).

string
nullable
situs_address
required

Physical street address of the parcel (situs).

string
nullable
situs_city
required

Situs city.

string
nullable
situs_state
required

Situs two-letter US state code.

string
nullable
situs_zip
required

Situs 5-digit ZIP code.

string
nullable
total_parcels
required

Total number of parcels this owner holds, including the subject parcel.

integer
total_acres
required

Combined acreage across the whole portfolio.

number format: double
total_states
required

Number of distinct states the portfolio spans.

integer
total_counties
required

Number of distinct counties (by FIPS) the portfolio spans.

integer
results
required

Every parcel held by the same owner, including the subject parcel, ordered by property_id.

Array<object>

Compact parcel record — used in search + filter results.

object
property_id
required

Land Insights numeric identifier for the parcel. Stable.

integer
url
required

Direct link to view this parcel in the Land Insights web app.

string
apn
required

Assessor’s Parcel Number — the county-assigned property identifier.

string
nullable
fips
required

5-digit county FIPS code (2-digit state FIPS + 3-digit county FIPS).

string
nullable
point
required

Geographic centroid (point-on-surface) of the parcel as [longitude, latitude] in WGS84 (EPSG:4326). May be null if geometry is unavailable.

Array<number>
nullable >= 2 characters <= 2 characters
acres
required

Parcel acreage as reported by the county assessor (source field LotSizeAcres). This is the authoritative legal/recorded acreage. For the acreage measured from the parcel polygon, see calculated_acres. Acreage filters use effective_acres.

number format: double
nullable
calculated_acres
required

Parcel acreage computed from the parcel geometry (source field CalculatedAcres): the GIS area of the polygon in acres, rounded to two decimals. May differ from the assessor-reported acres due to surveying or geometry differences, and is null when geometry is unavailable.

number format: double
nullable
effective_acres
required

Parcel acreage used for acreage filtering and sorting: the assessor-reported acres when present, otherwise the polygon-measured calculated_acres. Null only when both are unavailable.

number format: double
nullable
owner_name
required

Full name of the primary owner of record (raw string from assessor; typically uppercase, may include corporate suffixes like ‘LLC’).

string
nullable
situs_address
required

Physical street address of the parcel (situs).

string
nullable
situs_city
required

Situs city.

string
nullable
situs_state
required

Situs two-letter US state code.

string
nullable
situs_zip
required

Situs 5-digit ZIP code.

string
nullable
Examples
Example OwnerHoldsThreeParcels

Owner holds three parcels

{
"source_parcel": {
"property_id": 7234891,
"url": "https://app.landinsights.co/data?parcel=7234891",
"apn": "07111-04-006",
"fips": 8023,
"point": [
-105.42,
37.2
],
"acres": 5,
"calculated_acres": 5.13,
"effective_acres": 5.13,
"owner_name": "SMITH JOHN",
"situs_address": null,
"situs_city": "SAN LUIS",
"situs_state": "CO",
"situs_zip": "81152"
},
"total_parcels": 3,
"total_acres": 20.07,
"total_states": 1,
"total_counties": 1,
"results": [
{
"property_id": 7234891,
"url": "https://app.landinsights.co/data?parcel=7234891",
"apn": "07111-04-006",
"fips": 8023,
"point": [
-105.42,
37.2
],
"acres": 5,
"calculated_acres": 5.13,
"effective_acres": 5.13,
"owner_name": "SMITH JOHN",
"situs_address": null,
"situs_city": "SAN LUIS",
"situs_state": "CO",
"situs_zip": "81152"
},
{
"property_id": 7234917,
"url": "https://app.landinsights.co/data?parcel=7234917",
"apn": "07111-04-007",
"fips": 8023,
"point": [
-105.421,
37.198
],
"acres": 5,
"calculated_acres": 5.07,
"effective_acres": 5.07,
"owner_name": "SMITH JOHN",
"situs_address": null,
"situs_city": "SAN LUIS",
"situs_state": "CO",
"situs_zip": "81152"
}
]
}

Validation error.

Media type application/json
object
error
required
object
code
required

Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, usage_backstop_reached, payment_required, validation_error, unprocessable, not_found, method_not_allowed, rate_limited, internal_error.

string
message
required

Human-readable description of the error.

string
request_id
required

Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.

string
details

Present on validation errors only: maps each rejected field to its list of messages.

object
key
additional properties
any
Example generated
{
"error": {
"code": "example",
"message": "example",
"request_id": "example",
"details": {}
}
}

Missing or invalid credentials.

Media type application/json
object
error
required
object
code
required

Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, usage_backstop_reached, payment_required, validation_error, unprocessable, not_found, method_not_allowed, rate_limited, internal_error.

string
message
required

Human-readable description of the error.

string
request_id
required

Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.

string
details

Present on validation errors only: maps each rejected field to its list of messages.

object
key
additional properties
any
Example generated
{
"error": {
"code": "example",
"message": "example",
"request_id": "example",
"details": {}
}
}

A Pro subscription or higher API tier is required.

Media type application/json
object
error
required
object
code
required

Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, usage_backstop_reached, payment_required, validation_error, unprocessable, not_found, method_not_allowed, rate_limited, internal_error.

string
message
required

Human-readable description of the error.

string
request_id
required

Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.

string
details

Present on validation errors only: maps each rejected field to its list of messages.

object
key
additional properties
any
Example generated
{
"error": {
"code": "example",
"message": "example",
"request_id": "example",
"details": {}
}
}

Authenticated but not permitted.

Media type application/json
object
error
required
object
code
required

Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, usage_backstop_reached, payment_required, validation_error, unprocessable, not_found, method_not_allowed, rate_limited, internal_error.

string
message
required

Human-readable description of the error.

string
request_id
required

Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.

string
details

Present on validation errors only: maps each rejected field to its list of messages.

object
key
additional properties
any
Example generated
{
"error": {
"code": "example",
"message": "example",
"request_id": "example",
"details": {}
}
}

Resource not found.

Media type application/json
object
error
required
object
code
required

Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, usage_backstop_reached, payment_required, validation_error, unprocessable, not_found, method_not_allowed, rate_limited, internal_error.

string
message
required

Human-readable description of the error.

string
request_id
required

Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.

string
details

Present on validation errors only: maps each rejected field to its list of messages.

object
key
additional properties
any
Example generated
{
"error": {
"code": "example",
"message": "example",
"request_id": "example",
"details": {}
}
}

Rate limit exceeded.

Media type application/json
object
error
required
object
code
required

Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, usage_backstop_reached, payment_required, validation_error, unprocessable, not_found, method_not_allowed, rate_limited, internal_error.

string
message
required

Human-readable description of the error.

string
request_id
required

Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.

string
details

Present on validation errors only: maps each rejected field to its list of messages.

object
key
additional properties
any
Example generated
{
"error": {
"code": "example",
"message": "example",
"request_id": "example",
"details": {}
}
}

Internal error.

Media type application/json
object
error
required
object
code
required

Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, usage_backstop_reached, payment_required, validation_error, unprocessable, not_found, method_not_allowed, rate_limited, internal_error.

string
message
required

Human-readable description of the error.

string
request_id
required

Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.

string
details

Present on validation errors only: maps each rejected field to its list of messages.

object
key
additional properties
any
Example generated
{
"error": {
"code": "example",
"message": "example",
"request_id": "example",
"details": {}
}
}