Find parcels matching all filters
curl --request POST \
--url https://api.example.com/v1/search \
--header 'Content-Type: application/json' \
--data '
{
"filters": [
{
"field": "<string>",
"value": "<unknown>"
}
],
"limit": 10,
"cursor": "<string>",
"fields": [
"<string>"
],
"enrich": false
}
'import requests
url = "https://api.example.com/v1/search"
payload = {
"filters": [
{
"field": "<string>",
"value": "<unknown>"
}
],
"limit": 10,
"cursor": "<string>",
"fields": ["<string>"],
"enrich": False
}
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({
filters: [{field: '<string>', value: '<unknown>'}],
limit: 10,
cursor: '<string>',
fields: ['<string>'],
enrich: false
})
};
fetch('https://api.example.com/v1/search', 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/search",
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([
'filters' => [
[
'field' => '<string>',
'value' => '<unknown>'
]
],
'limit' => 10,
'cursor' => '<string>',
'fields' => [
'<string>'
],
'enrich' => false
]),
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/search"
payload := strings.NewReader("{\n \"filters\": [\n {\n \"field\": \"<string>\",\n \"value\": \"<unknown>\"\n }\n ],\n \"limit\": 10,\n \"cursor\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ],\n \"enrich\": false\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/search")
.header("Content-Type", "application/json")
.body("{\n \"filters\": [\n {\n \"field\": \"<string>\",\n \"value\": \"<unknown>\"\n }\n ],\n \"limit\": 10,\n \"cursor\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ],\n \"enrich\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/search")
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 \"filters\": [\n {\n \"field\": \"<string>\",\n \"value\": \"<unknown>\"\n }\n ],\n \"limit\": 10,\n \"cursor\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ],\n \"enrich\": false\n}"
response = http.request(request)
puts response.read_body{
"status": "complete",
"matches": [
{}
],
"request_id": "<string>",
"next_cursor": "<string>",
"completion_reason": "exhausted"
}{
"detail": {
"error": "search_invalid_request",
"message": "<string>",
"retryable": false,
"issues": [
{
"path": "<string>",
"message": "<string>",
"hint": "<string>",
"expected": "<string>"
}
],
"docs_url": "<string>",
"request_id": "<string>"
}
}Discover parcels
POST /v1/search
Find parcels in selected US states with typed filters and select additional information to return.
POST
/
v1
/
search
Find parcels matching all filters
curl --request POST \
--url https://api.example.com/v1/search \
--header 'Content-Type: application/json' \
--data '
{
"filters": [
{
"field": "<string>",
"value": "<unknown>"
}
],
"limit": 10,
"cursor": "<string>",
"fields": [
"<string>"
],
"enrich": false
}
'import requests
url = "https://api.example.com/v1/search"
payload = {
"filters": [
{
"field": "<string>",
"value": "<unknown>"
}
],
"limit": 10,
"cursor": "<string>",
"fields": ["<string>"],
"enrich": False
}
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({
filters: [{field: '<string>', value: '<unknown>'}],
limit: 10,
cursor: '<string>',
fields: ['<string>'],
enrich: false
})
};
fetch('https://api.example.com/v1/search', 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/search",
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([
'filters' => [
[
'field' => '<string>',
'value' => '<unknown>'
]
],
'limit' => 10,
'cursor' => '<string>',
'fields' => [
'<string>'
],
'enrich' => false
]),
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/search"
payload := strings.NewReader("{\n \"filters\": [\n {\n \"field\": \"<string>\",\n \"value\": \"<unknown>\"\n }\n ],\n \"limit\": 10,\n \"cursor\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ],\n \"enrich\": false\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/search")
.header("Content-Type", "application/json")
.body("{\n \"filters\": [\n {\n \"field\": \"<string>\",\n \"value\": \"<unknown>\"\n }\n ],\n \"limit\": 10,\n \"cursor\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ],\n \"enrich\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/search")
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 \"filters\": [\n {\n \"field\": \"<string>\",\n \"value\": \"<unknown>\"\n }\n ],\n \"limit\": 10,\n \"cursor\": \"<string>\",\n \"fields\": [\n \"<string>\"\n ],\n \"enrich\": false\n}"
response = http.request(request)
puts response.read_body{
"status": "complete",
"matches": [
{}
],
"request_id": "<string>",
"next_cursor": "<string>",
"completion_reason": "exhausted"
}{
"detail": {
"error": "search_invalid_request",
"message": "<string>",
"retryable": false,
"issues": [
{
"path": "<string>",
"message": "<string>",
"hint": "<string>",
"expected": "<string>"
}
],
"docs_url": "<string>",
"request_id": "<string>"
}
}Search returns the first matches found, not ranked “top” matches. Every condition
is an AND requirement. Source routing is automatic. Use Search to shortlist
parcels. Set
Send this JSON directly to
Each filter is
Stored parcel scalar fields use their loaded names and types. Codes remain strings;
Rings must be closed and valid; self-intersections and overlapping MultiPolygon parts
are rejected with a correction hint. Only Additional information with
Search automatically returns scalar values used in filters. A geometry filter never
automatically returns or echoes a polygon. Full enrichment with
Send a JSON boolean; omission and
Each returned match gains an
With
Bearer authentication and account rate limits also apply. The development tariff is 0.
For transient 429/503/504 errors, respect
enrich: true to return every Enrich field
for each match in the same request.
Quick example
Find Arizona parcels between 100 and 1,000 acres and include their calculated area:{
"filters": [
{"field": "state", "op": "eq", "value": "AZ"},
{"field": "acreage", "op": "between", "value": [100, 1000]}
],
"fields": ["parcel_area_m2"],
"limit": 10
}
POST /v1/search with Authorization: Bearer <token>.
The MCP tool mireye_search accepts the same object inside req.
curl -s https://api.mireye.com/v1/search \
-H "Authorization: Bearer $MIREYE_API_TOKEN" \
-H 'content-type: application/json' \
-d '{"filters":[{"field":"state","op":"eq","value":"AZ"},{"field":"acreage","op":"between","value":[100,1000]}],"fields":["parcel_area_m2"],"limit":10}' | jq
Request
| Property | Type | Meaning |
|---|---|---|
filters | array, required | Hard conditions, including a state or state2 filter with eq or in. All must pass. There is no filter-count limit. |
fields | array of strings, optional | Extra information to return for matches. Defaults to []. These fields do not affect eligibility. |
enrich | boolean, optional | Defaults to false. When true, add an enrichment object with every Enrich field to each returned match. |
limit | integer, optional | Number of parcels per page; defaults to 10. The maximum is 100. Larger requests are rejected, never silently reduced. |
cursor | string, optional | Opaque next_cursor from a previous response. Keep the same filters, fields, and enrich; limit may change from 1 to 100. Expires after one hour. |
{field, op, value}. Operators are eq, ne, lt, lte, gt, gte,
in (nonempty array), and between (exactly two inclusive, ascending bounds).
Geometry additionally supports intersects and within.
- Text and boolean fields support
eq,ne, andin. - Numeric fields support every operator. Supply JSON numbers, not numeric strings.
- Null is never a filter operand. A genuinely absent Fetch value fails every hard filter,
including
ne. Calculation failures produce partial status instead of false non-matches. - State is required inside
filters: usestateorstate2witheqfor one two-letter US state code orinfor a nonempty list of codes. The 50 states and DC are accepted. A negativenepredicate alone does not satisfy this requirement; a county or geometry filter does not replace it. - County and acreage are optional filters. State, county and acreage are not
top-level properties. The old
parcel_filtersandfetch_filtersproperties are rejected.
Field names, types and units
Search accepts 537 filter names and 539 selectable output names in the current V1 catalog, including a spatialgeometry filter and three geometry
output formats. The complete field reference
lists names, types, units and output-only fields. Internal-only fields and internal parcel IDs
cannot be filters or selected shortlist outputs. Shortlist geometry is available only when
explicitly requested in fields. The optional enrichment object follows the Enrich catalog
and includes its geometry and identifier fields.
| Field | Input examples | Meaning |
|---|---|---|
state / state2 | eq with "AZ"; in with ["AZ", "NM"] | Required positive selection of US states or DC. Case and surrounding whitespace are normalized. |
county | "04013" or "Maricopa" | Optional five-digit combined state-and-county FIPS string or county name. Preserve leading zeros and include the required state filter. |
city | "Phoenix" | Case-insensitive situs-address city (scity), not mail_city or a Census subdivision. |
acreage | 100; between with [100, 1000] | Geometry-derived parcel area in acres. gisacre is a separate county-reported value. |
apn | "001-002" | County parcel number (parcelnumb). Preserve county/state context: APNs are not globally unique. |
parcel_area_m2 | 10000 | Area of the selected original parcel in square metres. |
coast_distance_m | 5000 | Distance from the analysis point to coastline in metres. |
struct is boolean while qoz is a string such as "No". Dates use YYYY-MM-DD;
timestamps use UTC ISO 8601 with up to millisecond precision. No geographic inference occurs.
Calculations use the existing Fetch producers, including their configured
live sources and fallbacks. Missing local datasets or credentials do not become false
no-matches: failed filter calculations make results partial. Every source retains its
existing budget, and all work shares Search’s configurable 180-second deadline.
Search runs Enrich producers only when enrich is true.
Unknown or unavailable names and incorrectly typed values are rejected before candidate reads.
Fetch whole-parcel measures, such as wetland_fraction_of_parcel, use the original
candidate boundary. Enrich-only calculations, including parcel_constraint_zones,
parcel_flood_sfha_fraction and owner_assemblage, cannot be Search filters or
selected through fields; they are included in the optional enrichment.
Search inside a polygon
Usegeometry in the same filters list. It accepts WGS84 GeoJSON Polygon or
MultiPolygon objects; positions are [longitude, latitude]. Every condition is ANDed.
intersects: any shared area or boundary point qualifies.within: the entire parcel must be covered by the area; shared boundaries are allowed.- Holes exclude their interiors, and all MultiPolygon parts are respected. Matching tests parcel boundaries, not centroids. Acreage still means the whole parcel’s area.
- Geometry filters do not add geometry to the response. Select
geometry(GeoJSON object),parcel_boundary_geojson(JSON string), orparcel_geometry_wkt(WKT string) infieldsonly when those outputs are wanted. Every format retains all parcel parts.
{
"filters": [
{"field": "state", "op": "eq", "value": "TX"},
{
"field": "geometry",
"op": "intersects",
"value": {
"type": "Polygon",
"coordinates": [[[-97.80,30.25],[-97.70,30.25],[-97.70,30.35],[-97.80,30.35],[-97.80,30.25]]]
}
},
{"field": "acreage", "op": "between", "value": [5,100]}
],
"limit": 10
}
type and coordinates are accepted (no
Feature wrapper, alternate CRS, or altitude). Split antimeridian-crossing rings at
+/-180 into a MultiPolygon. The default geometry budget is 10,000 vertices across all
area filters, and 1,000,000 square kilometres per area. These are configurable safeguards,
not extra response fields. Oversized inputs return 422; areas are never silently repaired.
Parcel attribute predicates and conservative bounding boxes narrow database candidates.
Exact polygon checks run before Fetch qualification. Bounding-box false positives do not
consume result slots, and Search continues through pages under the same 180-second budget.
fema_flood_zone refers to the Fetch calculation; parcel_fema_flood_zone selects the
stored parcel value. census_subdivision selects the raw Census subdivision column, while
city continues to mean the situs-address city.
Additional information with fields
Search automatically returns scalar values used in filters. A geometry filter never
automatically returns or echoes a polygon. fields adds information
without adding a condition. For example, requesting nearest_transmission_line_distance_m
does not require a parcel to be near a line. Add a filter when proximity is a requirement.
Extra calculations run only for matching parcels. Filter values already calculated are
reused. Repeated field names are returned once. Missing extra data does not remove a match:
the value is null, and field_status distinguishes absent (valid no-data) from
failed (unavailable or unfinished). A failed extra calculation makes the response partial.
Extra calculations share the search budget; requesting more information can increase latency.
Full enrichment with enrich
Send a JSON boolean; omission and false preserve the normal shortlist response.
null, strings such as "true", and numbers are rejected with 422. For example:
{
"filters": [
{"field": "state", "op": "eq", "value": "AZ"},
{"field": "acreage", "op": "between", "value": [100, 1000]}
],
"enrich": true,
"limit": 2
}
enrichment object with fetched_at, analysis_point,
fields, and partial_failures. Its fields map contains every field in the current
Enrich catalog, including fields outside presets,
geometry and identifiers. Each field retains Enrich’s value, status, units, provenance,
and interpretation_hints. Fields remain in one flat map, ordered by Enrich preset
groups, followed by fields outside presets. lifecycle is available only in field
discovery metadata. Only failed fields include error and retryable; those keys are
omitted for ok and absent fields. The shortlist’s fields and field_status maps keep their existing meaning;
enrichment never overwrites them.
Only returned matches are enriched. The selected original parcel and Search’s interior
analysis_point are reused, without geocoding or a second parcel lookup. Point-based
Enrich values can therefore differ from a separate /v1/enrich call, which uses its own
stored-centroid/input-fallback policy. Whole-parcel values use the original boundary.
Enrichment does not change eligibility, ordering, or the requested result limit.
Missing data remains absent; producer errors and unfinished work are failed and
listed in partial_failures. Failed enrichment keeps the matched parcel, makes Search
partial, and uses field_data_unavailable unless a timeout or other earlier failure
explains completion. Inspect enrichment.fields[name].status as well as field_status.
A zero-match response performs no enrichment.
Search and enrichment share one 180-second default deadline on every deployment.
Full enrichment can produce a large response and invoke more sources; start with a
small limit. If the deadline expires, confirmed matches remain and unfinished
Enrich fields carry explicit failures with retry information. Completed source results
and independent field calculations remain available even when another calculation in
the same producer is unfinished, along with direct parcel attributes and valid reused
Fetch fields. The response’s completion_reason is timeout. Waiting for the worker’s
enrichment slot consumes the same deadline; unavailable Fetch capacity produces failed
fields and a partial response.
Response
The response containsmatches, status, completion_reason, request_id, and
next_cursor. When next_cursor is non-null, send it as cursor in another
POST /v1/search request with the same filters, fields, and enrich value. Set limit to any
value from 1 to 100 on each page. For example, omit it on page 1 to receive up
to 10 parcels, then request limit: 100 with its cursor on page 2, and
limit: 1 with the next cursor on page 3.
Omitted enrich and false are equivalent, including for cursors created before
enrichment was available. Changing between true and false requires restarting
without the cursor; otherwise the request returns 422 search_invalid_request.
Each page has its own time and work budget. The token expires after one hour;
if it is invalid or expired, restart without cursor. A null next_cursor
means no known continuation is available. A partial page can still include a
cursor when more candidates are known; its failed fields or candidates remain
incomplete. Pages follow stored parcel order and are not a ranked result set.
Underlying parcel data may change between calls, so pagination is not a snapshot.
Search requires a configured API token signing secret to issue continuation
cursors; a deployment without it returns 503 search_unavailable before reading
candidate parcels.
Each match contains APN, address, state/county/city, acreage, source, an interior
analysis_point, a fields map, and a parallel field_status map (ok, absent, failed).
The fields map includes scalar filter values plus explicitly requested additional information.
For county, matches[].fields.county is the five-digit FIPS code when any county filter
uses a FIPS code, even if county is also requested in fields or another county-name
filter is present. Otherwise it is the county name. Request geoid to always include
the FIPS code separately; the match’s top-level county remains the county name.
Processing counts and internal limits are not returned. Shortlist fields expose their
status; optional enrichment also exposes its field-level failure metadata and notes.
The number returned is matches.length. enrichment is omitted entirely when
enrich is omitted or false; it is not an empty or null object.
An abbreviated example of a successful shortlist response (illustrative values):
{
"status": "limited",
"completion_reason": "limit_reached",
"request_id": "example-request-id",
"next_cursor": "<opaque continuation token>",
"matches": [
{
"apn": "001-002",
"address": "100 EXAMPLE ROAD, EXAMPLE CITY, AZ",
"state": "AZ",
"county": "Example County",
"city": "Example City",
"source": "parcel_vendor",
"acreage": 240.0,
"analysis_point": {
"lat": 33.4,
"lng": -111.9,
"method": "parcel_representative_point"
},
"fields": {"state": "AZ", "acreage": 240.0, "parcel_area_m2": 971246.0},
"field_status": {"state": "ok", "acreage": "ok", "parcel_area_m2": "ok"}
}
]
}
| Status | Meaning |
|---|---|
complete | The loaded candidate set was exhausted and evaluation completed. This does not imply complete real-world coverage. |
limited | The requested count was reached, or an internal work ceiling stopped evaluation. More matches may exist. |
partial | A timeout, unavailable source, failed qualification, extra calculation or enrichment prevented completion. Confirmed matches are retained. |
| Completion reason | Agent action |
|---|---|
exhausted | Use the results; the loaded candidate set was exhausted. |
limit_reached | The requested shortlist is ready. It is not a ranking. |
timeout | Use confirmed matches with an incompleteness caveat; narrow filters, lower the page limit, disable full enrichment or retry. |
work_limit | Narrow filters or request fewer parcels. |
source_unavailable | A later candidate page failed. Retain confirmed matches and retry later. |
evaluation_failed | Some candidate qualifications failed. Do not conclude that no qualifying parcels exist. |
field_data_unavailable | Parcels qualified, but some requested information failed. Inspect field_status and any enrichment.fields statuses. |
enrich: true, the enriched fields already belong to the selected match. With
enrich: false, call Enrich separately when you want to investigate a chosen parcel.
Point samples describe that point, not the entire parcel, unless the field explicitly
measures a parcel calculation.
Agent workflow
Treatmatches as a shortlist. Check status and completion_reason before saying
the search is exhaustive: limited and partial can leave qualifying parcels
unseen. Check field_status for each requested value; a failed value is not
evidence that the parcel fails a condition. When enrich: true, read the per-field
provenance and failures in enrichment. Otherwise, when a result needs deeper review,
send its address or analysis_point to Enrich, then
confirm the parcel identity in Enrich’s parcel_match. Do not assume the two
calls selected the same parcel merely because their coordinates are close.
Correcting an invalid request
Validation is deterministic. HTTP 422 responses containdetail.error, message,
issues, retryable: false, docs_url and request_id. Each issue identifies the input
path, describes the problem, and supplies a correction hint; typed semantic errors
can also include expected. Raw input values are not echoed.
Missing state selection, invalid state codes, an empty state in list, or state
predicates using only ne return 422 search_invalid_request. Add a state or
state2 filter using eq with a valid two-letter code, or in with a nonempty
list of valid codes. County names and FIPS codes do not replace this filter.
For example, an acreage string is rejected with “acreage requires nonnegative numbers in
acres.” at the offending filter. Replace the string with a JSON number. A limit above
the supported maximum returns search_limit_exceeded and states the valid range.
For an unknown field, consult this page and the field catalog; do not repeatedly retry
an unchanged request. The default docs_url points to the server’s interactive OpenAPI
documentation; operators can set MIREYE_SEARCH_DOCS_URL to this published Search page.
| HTTP | Code | Retryable | Meaning |
|---|---|---|---|
| 422 | search_invalid_request | no | Malformed JSON, request shape, missing positive state selection, invalid state, operator, or basic input type. |
| 422 | search_invalid_filter | no | Unsupported filter/selected field, source, comparison or value. |
| 422 | search_limit_exceeded | no | Requested result count exceeds the supported maximum. |
| 429 | search_busy | yes | Search capacity is full; Retry-After: 3. |
| 503 | search_unavailable | yes | No candidate page could be read; no no-match conclusion was made. |
| 504 | search_deadline_exceeded | yes | The budget expired before the first candidate page. |
Retry-After (3 seconds for Search’s own errors;
account rate limits can specify another delay). Authentication errors require valid credentials.
Execution and coverage
The defaults are 1,000 parcel candidates per batch and 10 returned matches per page, with a 100-result maximum per page. The budget is 180 seconds for each page request, including enrichment, in both application and production configuration. Application defaults have no total candidate/evaluation caps; production retains 1,000 total candidates and 500 evaluated parcels. Awork_limit or timeout
response can stop before all loaded parcels are examined. Use a client timeout above
the server budget, for example 210 seconds. Search stops early as soon as enough
matches are found.
If the HTTP client disconnects, Search cancels and drains its coroutine tasks promptly.
An already-running blocking computation may finish later; its enrichment and Fetch
capacity stays reserved until that work stops. A timeout response can return while
that cleanup finishes, and subsequent enrichment waits within its own request budget.
Retrying starts a new search; disconnected searches are not saved as background jobs.
A worker restart may also interrupt an in-flight request; process shutdown remains
bounded separately from the request deadline.
Stored parcel predicates run first, followed by catalog-field qualification in bounded batches.
Search keeps reading candidate pages as needed. A one-row sentinel establishes whether
another page exists. Stable source keys prevent duplicate source records; distinct parcels
sharing an APN remain distinct. Search reuses the selected parcel for calculations; it does
not perform a new paid parcel point lookup or geocoding.
Operational counts, source aggregates, request structure and timing are logged internally.
Raw filter values and parcel responses are excluded. Rejected requests are included in demand
analysis. Logging uses bounded summaries and the existing background telemetry queue.
For local operators: MIREYE_SEARCH_DEADLINE_SECONDS configures the budget;
MIREYE_SEARCH_CANDIDATE_BATCH_SIZE controls the internal candidate batch size;
MIREYE_SEARCH_MAX_CANDIDATES=0 and MIREYE_SEARCH_MAX_EVALUATED=0 disable optional count caps;
MIREYE_SEARCH_PARCEL_CONCURRENCY=8 bounds qualification calculations;
MIREYE_SEARCH_ENRICH_CONCURRENCY=1 bounds full enrichment across requests in each worker;
MIREYE_SEARCH_DOCS_URL can override the correction link.
MIREYE_SEARCH_MAX_GEOMETRY_VERTICES=10000 bounds vertices across all area filters;
MIREYE_SEARCH_MAX_GEOMETRY_AREA_KM2=1000000 bounds each area.
The checked-in Fly configuration uses the same 180-second budget and retains
MIREYE_SEARCH_MAX_CANDIDATES=1000 and MIREYE_SEARCH_MAX_EVALUATED=500.
Enrichment and Fetch slots remain held until already-running blocking work completes,
including after deadline expiry or cancellation. This prevents a subsequent parcel
from overlapping cancelled native work without extending the request or shutdown
deadline. Invalid or unset enrichment concurrency falls back to one.Body
application/json
All conditions are required; source routing is automatic.
Minimum array length:
1Show child attributes
Show child attributes
Parcels on this page, from 1 to 100; may change between cursor requests.
Required range:
x >= 1Required string length:
1 - 2048Additional information to return for matches; never used to filter parcels.
Minimum string length:
1Pattern:
^[a-z][a-z0-9_]*$Return every Enrich field with provenance for each matched parcel.
Response
Successful Response
Available options:
complete, limited, partial Available options:
exhausted, limit_reached, timeout, source_unavailable, work_limit, evaluation_failed, field_data_unavailable