Add a region to the user's saved markets
const url = 'https://example.com/api/public/v1/markets/';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"region_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","status":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/public/v1/markets/ \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "region_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "status": "example" }'Saves a market (county or ZIP region) to the authenticated user’s market list. Look up the region_id from the Market Stats response (its id field).
Cost: free.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”object
UUID of the region to save. Obtain from the /markets-stats/{fips}/stats/ response (its id field) or another regions response.
Pipeline label, mirroring the in-app market board columns (e.g., ‘Backlog’, ‘Watching’, ‘Active’). Free-form string.
Example generated
{ "region_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "status": "example"}Responses
Section titled “ Responses ”object
Identifier for the saved market row.
Snapshot of the saved region’s stats at response time.
object
Internal region identifier.
Region type — ‘county’ for full-county stats, ‘zip’ for a single ZIP.
county- Whole county.zip- Single ZIP code.
County name (when type=‘county’) or ZIP code (when type=‘zip’).
Two-letter US state code (e.g., ‘CA’).
Primary county name. For ZIP regions, the county the ZIP falls into.
5-digit county FIPS code.
List of statistic buckets, one per acreage range. May be empty for regions where no stats have been computed yet.
object
Acreage bucket label. The list contains overlapping ranges (e.g. both 5 acre-10 acre and 5 acre-100 acre) because the pipeline emits multiple useful slices; pick the bucket closest to the acreage you’re analysing.
Aggregated metrics for parcels in this acreage bucket. Field names mirror the internal pipeline labels — abbreviations: STR = sell-through rate, DOM = days on market, PPA = price per acre, Gini = Gini coefficient of PPA dispersion (0–100, lower = tighter).
object
Number of currently-active listings in this bucket.
Number of pending (under-contract) listings.
Closed sales in the trailing 1 month.
Closed sales in the trailing 3 months.
Closed sales in the trailing 6 months.
Closed sales in the trailing 12 months.
Pending sell-through rate (%): pending listings as a fraction of active inventory.
1-month sell-through rate (%): trailing-month sales as a fraction of active inventory.
3-month sell-through rate (%).
6-month sell-through rate (%).
12-month sell-through rate (%).
Average days-on-market for sales closed in the trailing month.
Average days-on-market over the trailing 3 months.
Average days-on-market over the trailing 6 months.
Average days-on-market over the trailing 12 months.
Median closed sale price (USD) in the trailing month.
Median closed sale price (USD) over the trailing 3 months.
Median closed sale price (USD) over the trailing 6 months.
Median closed sale price (USD) over the trailing 12 months.
Median asking price (USD) across pending listings.
Median asking price (USD) across active listings.
Median acreage across active listings.
Median acreage across pending listings.
Median acreage across closed sales (trailing 12 months).
Median price per acre (USD) across pending listings.
Median price per acre (USD) across active listings.
Median price per acre (USD) across closed sales in the trailing 12 months.
Minimum price per acre observed across active listings.
Maximum price per acre observed across active listings.
Minimum price per acre observed across pending listings.
Maximum price per acre observed across pending listings.
Minimum price per acre in sales closed during the trailing month.
Maximum price per acre in sales closed during the trailing month.
Minimum price per acre in sales closed during the trailing 3 months.
Maximum price per acre in sales closed during the trailing 3 months.
Minimum price per acre in sales closed during the trailing 6 months.
Maximum price per acre in sales closed during the trailing 6 months.
Minimum price per acre in sales closed during the trailing 12 months.
Maximum price per acre in sales closed during the trailing 12 months.
Gini coefficient (0–100) of price-per-acre in trailing-month sales. Lower = tighter clustering.
Gini coefficient (0–100) over the trailing 3 months.
Gini coefficient (0–100) over the trailing 6 months.
Gini coefficient (0–100) over the trailing 12 months.
Pipeline label, mirroring the in-app market board columns (e.g., ‘Backlog’, ‘Watching’, ‘Active’). Free-form string.
ISO-8601 timestamp.
ISO-8601 timestamp.
Example
{ "region": { "type": "county", "stats": [ { "type": "0-9.5k sqft" } ] }}Validation error.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Missing or invalid credentials.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}A Pro subscription or higher API tier is required.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Authenticated but not permitted.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Resource not found.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Rate limit exceeded.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Internal error.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}