Enrich a parcel
curl --request POST \
--url https://api.example.com/v1/enrich \
--header 'Content-Type: application/json' \
--data '
{
"lat": 123,
"lng": 123,
"address": "<string>",
"fields": [
"<string>"
]
}
'import requests
url = "https://api.example.com/v1/enrich"
payload = {
"lat": 123,
"lng": 123,
"address": "<string>",
"fields": ["<string>"]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({lat: 123, lng: 123, address: '<string>', fields: ['<string>']})
};
fetch('https://api.example.com/v1/enrich', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/enrich",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'lat' => 123,
'lng' => 123,
'address' => '<string>',
'fields' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/enrich"
payload := strings.NewReader("{\n \"lat\": 123,\n \"lng\": 123,\n \"address\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/enrich")
.header("Content-Type", "application/json")
.body("{\n \"lat\": 123,\n \"lng\": 123,\n \"address\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/enrich")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"lat\": 123,\n \"lng\": 123,\n \"address\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Discover parcels
POST /v1/enrich
Resolve one US parcel and return cited attributes and calculations.
POST
/
v1
/
enrich
Enrich a parcel
curl --request POST \
--url https://api.example.com/v1/enrich \
--header 'Content-Type: application/json' \
--data '
{
"lat": 123,
"lng": 123,
"address": "<string>",
"fields": [
"<string>"
]
}
'import requests
url = "https://api.example.com/v1/enrich"
payload = {
"lat": 123,
"lng": 123,
"address": "<string>",
"fields": ["<string>"]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({lat: 123, lng: 123, address: '<string>', fields: ['<string>']})
};
fetch('https://api.example.com/v1/enrich', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/enrich",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'lat' => 123,
'lng' => 123,
'address' => '<string>',
'fields' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/enrich"
payload := strings.NewReader("{\n \"lat\": 123,\n \"lng\": 123,\n \"address\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/enrich")
.header("Content-Type", "application/json")
.body("{\n \"lat\": 123,\n \"lng\": 123,\n \"address\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/enrich")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"lat\": 123,\n \"lng\": 123,\n \"address\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Enrich requires a Mireye bearer token and follows standard account rate limits.
Requests currently cost zero customer credits.
enrich: true returns the same field catalog and provenance for every matched parcel,
using Search’s original parcel and interior point without a second lookup. Point-based
values can differ from a separate Enrich call, which uses the stored parcel centroid
or input fallback; whole-parcel calculations use the same original boundary.
The MCP tool mireye_enrich accepts the same Enrich
request body inside req.
Quick request
curl -s https://api.mireye.com/v1/enrich \
-H "Authorization: Bearer $MIREYE_API_TOKEN" \
-H 'content-type: application/json' \
-d '{"lat": 40.75, "lng": -73.99, "fields": ["slope_degrees"]}' | jq
| Property | Type | Meaning |
|---|---|---|
lat, lng | numbers | A US coordinate pair. Supply both together. |
address | string | A US street address resolved server-side. Supply this instead of coordinates. |
fields | array of field IDs | Individual Enrich names, such as slope_degrees, owner, or zoning. |
preset | string | One named Enrich bundle, such as terrain or parcel. |
fields selects individual Enrich field IDs; preset selects one bundle.
You may supply both to request their union, with duplicates returned once.
For example:
{"lat": 40.75, "lng": -73.99, "preset": "terrain", "fields": ["owner", "slope_degrees"]}
parcel, zoning, buildings, valuation, legal, power, access,
water, terrain, environment, climate, hazards, market, and
constraints. Returned fields stays one flat map, with related fields together
in this preset order, preserving each preset’s field order. This order applies
to all fields, a preset, and an explicit selection; request order does not change
it. A field belonging to multiple presets appears once at its first preset.
Fields outside every preset follow in catalog order.
Omitting both selectors, or setting both to null, requests all
538 Enrich fields. An empty fields list and an unknown preset return 422;
unknown field IDs return 400 fields_unknown. "fields": ["zoning"] requests
one field, while "preset": "zoning" requests the whole bundle. Enrich has no
50-field cap. Choose a small set for an initial screen; requesting all fields
can make a much larger response and invoke more producers. The
Enrich field reference lists all individual IDs,
their types, units and bundle memberships. Enrich presets are independent of
Fetch presets.
Fields excluded from Enrich
The following eight fields are excluded from Enrich’s default selection and all Enrich presets. Explicitly requesting any of them also returns400 fields_unknown; they are not optional Enrich add-ons.
| Group | Field IDs |
|---|---|
| Hydrography | huc_12_name, intersects_nhd_area, nearest_flowline_name, nearest_waterbody_name |
| Water cooling | huc12_thermoelectric_consumptive_use_m3_per_day, nearest_groundwater_well_depth_to_water_m, public_water_system_population_served, surface_water_supply_use_index_huc12 |
owner_assemblage
and all wetland fields, including parcel wetland-overlap calculations.
Response examples
This matched response shows the identity, analysis point, and one field. The values below illustrate the shape; they are not a live result for the request above.{
"lat": 40.75,
"lng": -73.99,
"fetched_at": "2026-10-14T12:00:00Z",
"resolved_location": {"lat": 40.75, "lng": -73.99, "source": "coordinate"},
"analysis_point": {
"lat": 40.7501,
"lng": -73.9898,
"method": "stored_parcel_centroid",
"source": "parcel.centroid_lat/centroid_lon"
},
"parcel_match": {
"status": "matched",
"parcel": {
"parcel_id": "example-parcel",
"apn": "000001",
"address": "100 EXAMPLE ROAD, EXAMPLE CITY, NY",
"source": "parcel_vendor",
"match_type": "exact_intersect",
"match_distance_m": 0.0
},
"candidates": [],
"reason": null
},
"fields": {
"slope_degrees": {
"value": 12.5,
"unit": "degrees",
"source": "USGS_3DEP",
"source_url": "https://www.usgs.gov/3d-elevation-program",
"confidence": "high",
"fetched_at": "2026-10-14T12:00:00Z",
"dataset_vintage": null,
"ttl_seconds": 31536000,
"notes": null,
"status": "ok",
"interpretation_hints": "Slope >15° materially raises wildfire spread risk on forested land. Slope >25° complicates conventional construction. Combine with lcms_class and dist_to_wui_m for wildfire underwriting."
}
},
"partial_failures": []
}
parcel_match: {"status": "no_match", "parcel": null, "candidates": [], "reason": "No parcel matched the resolved point."} is paired
with analysis_point: null, fields: {}, and partial_failures: [].
Read the response in order
- Check
resolved_location. For an address, also inspectgeocodeand itsparcel_grade,normalized_address, andprecision_notebefore trusting a parcel-specific conclusion. - Check
parcel_match.status. Onlymatchedruns enrichment.ambiguousreturns parcel candidates for clarification;no_matchmeans the completed lookup found none;unavailablemeans matching could not be established. All three returnfields: {}and noanalysis_point. - For a match, inspect
analysis_pointand each requestedfields[name].status.okhas a value,absenthas a null value and an explanatorynotesstring, andfailedhas a null value pluserrorandretryable. Do not turn an absent or failed field into a zero or a negative finding.
lat, lng, fetched_at, parcel_match, and
partial_failures. A matched parcel’s parcel_match.parcel supplies its identity,
APN, address, source, and matching evidence. analysis_point.method is
stored_parcel_centroid when the stored pair exists or input_fallback otherwise.
It records the point used for point-based calculations; it is not a claim that
every point on the parcel has the same value.
Each field contains value, unit, source, source_url, confidence,
fetched_at, dataset_vintage, ttl_seconds, notes, status,
and interpretation_hints. Failed fields also have error and retryable, and
appear in partial_failures. The error and retryable keys are omitted when
inapplicable; other legitimate nulls, including value, unit, and unknown
timestamps or source metadata, remain present. Field confidence preserves the
producer’s value, including medium for an absent NSRDB field. lifecycle stays
in the catalog and field discovery; it is omitted from returned field objects.
Read the field’s hints before using a value as a site-wide or legal conclusion.
Field provenance can vary within one response because the selected facts come
from different sources. Search with enrich: true uses this same field shape
and ordering.
Agent workflow
If you start with a broad criterion, Search for a shortlist. Withenrich: true, each result already contains the complete field map and provenance
in enrichment; inspect its statuses and partial_failures. Search’s default is false.
For a separate investigation, pick a result using APN, address, state and county as
identity evidence. Enrich its address or analysis_point coordinate and confirm
parcel_match.parcel is the parcel you intended. The Search point is
an interior analysis point, but a fresh Enrich lookup may still be ambiguous or
unavailable. Never silently substitute another candidate.
Keep source URLs and per-field status with any answer you write. Retry a failed
field only when its retryable flag is true; ask for clarification when the
parcel match is ambiguous. An empty fields map after no_match or
unavailable does not mean the requested facts were absent.
Access and errors
Authentication and coordinate/address validation follow the existing API conventions. Invalid request shapes return 422; unknown individual field IDs return400 fields_unknown. A resolved coordinate outside
the supported US envelope returns 400 coord_out_of_bounds. Address-resolution
errors follow Geocode. Account rate limits and the
shared Fetch worker-capacity limit can return 429 with Retry-After. See
Errors for shared authentication responses.Body
application/json
Address XOR lat/lng; select individual Enrich fields and/or one preset.
Omitted/null selectors retain the all-fields default. Preset expansion and field-ID validation happen before geocoding, parcel lookup or producers.
Required string length:
1 - 256Individual Enrich field IDs, for example elevation or owner. Combined with preset by union; duplicates are returned once. Omit or use null for both selectors to request all Enrich fields.
Minimum array length:
1One named Enrich bundle, expanded before any additional fields.
Available options:
parcel, zoning, buildings, valuation, legal, power, access, water, terrain, environment, climate, hazards, market, constraints Response
Successful Response
The response is of type object.