Beta. Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named legal_owners, most recently permitted first. At least one of geo_id and legal_owner is required; a legal_owner search needs no geo scope. Pass cursor from a page’s next_cursor to page through results. Filter by permit_tags (presence and --prefixed exclusion), permit_status, permit_from, and property_type. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a --prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction’s ingestion lag, is not counted against the claim. Every absence-class row carries a trust object stating three honesty terms — the jurisdiction’s permit coverage_tier, its unresolved_rate (the share of its permits that never linked to an address), and the row’s data_horizon — plus horizon_basis (whether that horizon is measured, pooled, or a state prior) and footprint_basis (whether suppression could resolve the row’s geo); the response trust_summary row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim’s staleness bound is the rebuild cadence plus each jurisdiction’s permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent ‘no permit since D’ stays under-observed until that lag elapses. Each row’s data_horizon is the per-row handle on that bound — the most recent start_date past which ‘no X since D’ is under-observed for that row. Not supported, each for one reason: permit_to or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); ‘before D’ absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only ‘ever’ and ‘since D’ are expressible on max-date maps; ‘has X since D and no Y since D’ in one query — a mixed query binds an exclusion to ‘ever’, so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.
GET
/
properties
/
search
Search Properties
curl --request GET \
--url https://api.shovels.ai/v2/properties/search \
--header 'X-API-Key: <api-key>'
Scope: a 2-letter state, 5-digit ZIP, ZIP+4, or a Shovels state/county/city/address geolocation id. Jurisdiction ids are not accepted. Optional when legal_owner is given, required otherwise.
Filter by the property's legal owner, matched on the owner's canonical form — case and spacing variants of one name return the same properties. Pass up to 10 legal_owner params to span several owners. Without a geo_id this searches an owner's properties nationwide; with one it narrows that scope to the owner. A name the data uses for an unidentified owner (for example 'RECORD OWNER') is rejected.
Filter by canonical permit tags. Repeat the key for several tags (e.g. ?permit_tags=roofing&permit_tags=-solar). A positive tag keeps properties with that tag on some permit; a - prefix excludes the tag (properties without it). Multiple positive tags require each tag (address grain — a documented divergence from /permits/search, where they must share one permit). With permit_status, each positive tag must be matched by a permit that also has one of the statuses. With permit_from: a positive tag matches since the date; an exclusion means 'no such tag since the date' in a pure-absence query, or 'never' when combined with any positive filter.
Filter by permit status; repeat the key for several (final, in_review, inactive, active). With positive permit_tags this is a same-permit conjunction; on its own it keeps properties with a permit of one of the statuses. 'unknown' is not a filterable status.
Bind the tag/status/absence filters to this ISO date (YYYY-MM-DD): a positive filter matches since the date, a pure-absence exclusion means 'none since the date'. With no tag/status filter it keeps properties whose most recent permit is on or after the date.
Filter by property type: residential, commercial, industrial, agricultural, vacant land, exempt, miscellaneous, office, recreational. Repeat the key to match any of several types (e.g. ?property_type=residential&property_type=commercial). Properties with no attributed type are excluded; property attributes are available for 70.1% of properties.
Keep properties with an UNFINALED permit of each named canonical tag. Repeat the key for several (e.g. ?permit_tags_unfinaled=solar&permit_tags_unfinaled=roofing). Permit status — not a permit's final_date — is the finaled flag: a final permit carries a NULL final_date 14.7% of the time, and ~41% of permits with a NULL final_date are in fact finaled by status, so a final_date IS NULL test over-counts unfinaled permits and is wrong ~41% of the time. A tag is unfinaled for an address only when its latest non-final permit of that tag is more recent than its latest final permit of that tag (equal dates count as finaled); this clear rule removes the false positives a plain 'any non-final permit of this tag' test would keep — for solar, 31.5% of them, though the share varies by tag (nearer 13-18% for tags such as roofing and hvac). A permit whose status is unknown (NULL) counts as neither final nor unfinaled. With permit_from, the tag's latest unfinaled permit must be on or after the date.
Minimum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).
Maximum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).
Top-level count object, not an integer: {"value": 970, "relation": "eq"}. "eq" means an exact count up to 10,000. "gte" means at least 10,000 matches, with value set to 10,000. Counted only when requested on the first page without a cursor. null when not requested, on later pages, or when the count query times out.
Row-weighted trust summary; present only on absence-class responses.
Show child attributes
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Shovels Documentation","colors":{"primary":"#01654D","light":"#E8BD51","dark":"#01654D"},"logo":{"light":"https://mintcdn.com/shovelsai/RpZdSdGGx61eI0yq/assets/shovels-logo.png?fit=max\u0026auto=format\u0026n=RpZdSdGGx61eI0yq\u0026q=85\u0026s=4580f7cd0725b33ba31367d40fda3bbf","dark":"https://mintcdn.com/shovelsai/1PwAyN7q-VPDJL6r/assets/shovels-logo-dark.png?fit=max\u0026auto=format\u0026n=1PwAyN7q-VPDJL6r\u0026q=85\u0026s=48cea9b3276127273eefe9d0d6d9b0b8","href":"https://www.shovels.ai"},"favicon":"https://mintcdn.com/shovelsai/RpZdSdGGx61eI0yq/assets/favicon.png?fit=max\u0026auto=format\u0026n=RpZdSdGGx61eI0yq\u0026q=85\u0026s=fd9ec8e38b5dd0ef58cf2d43fdc71ec3","api":{"playground":{"display":"interactive"},"examples":{"languages":["curl","python","java","go","ruby","php"]},"mdx":{"server":"https://api.shovels.ai/v2"}},"background":{"color":{"light":"#fcfbf8","dark":"#101727"}},"navbar":{"links":[{"href":"mailto:support@shovels.ai","label":"Contact Support"}],"primary":{"type":"button","label":"Free Trial","href":"https://app.shovels.ai/login?mode=register"}},"footer":{"socials":{"discord":"https://discord.gg/Nypja3cKDx","github":"https://github.com/shovelsai","linkedin":"https://linkedin.com/company/shovels"}},"seo":{"metatags":{"og:site_name":"Shovels Documentation","og:type":"website","og:image":"https://docs.shovels.ai/assets/shovels-logo.png","twitter:card":"summary_large_image","twitter:site":"@shovelsai"},"indexing":"navigable"},"fonts":{"heading":{"family":"Poppins"},"body":{"family":"IBM Plex Sans"}},"styling":{"codeblocks":{"theme":{"light":"css-variables","dark":"css-variables"}},"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Data Dictionary","icon":"book-open-cover","href":"https://www.shovels.ai/data-dictionary"},{"anchor":"Coverage Dashboard","icon":"map-pin","href":"https://www.shovels.ai/coverage"},{"anchor":"Community","icon":"discord","href":"https://discord.gg/Nypja3cKDx"},{"anchor":"Blog","icon":"newspaper","href":"https://www.shovels.ai/blog/"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"shovelsai","hasAudioNarration":false,"actualSubdomain":"shovelsai","customDomains":["docs.shovels.ai"],"gitSource":{"type":"github","owner":"shovelsai","repo":"shovels-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aea230fc4fda768c27b6da4","collectionId":"f6c67a76-3d7c-4c01-a39c-2733ea4aa712","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aea230fc4fda768c27b6da4"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aea29d548425b5f57ad54d8","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"Knowledge Base","count":202},{"language":"default","tag":"API Reference","count":35},{"language":"default","tag":"Endpoints","count":34},{"language":"default","tag":"API Questions","count":30},{"language":"default","tag":"Data \u0026 Coverage","count":28},{"language":"default","tag":"Documentation","count":18},{"language":"default","tag":"Contractors","count":15},{"language":"default","tag":"Permits","count":12},{"language":"default","tag":"API Basics","count":10},{"language":"default","tag":"Shovels CLI","count":10}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1iIq129k.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1isq129k.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1iAq129k.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1iEq129k.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1i8q1w.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwl1FgtIU.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwlRFgtIU.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwl9FgtIU.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwl5FgtIU.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwlBFgg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwl1FgtIU.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwlRFgtIU.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwl9FgtIU.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwl5FgtIU.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwlBFgg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n:root{--shovels-ink: #101727;--shovels-ink-body: #1e293e;--shovels-ink-secondary: #6b695c;--shovels-label: #837e6c;--shovels-primary: #01654d;--shovels-emerald-dark-rgb: 16 185 129;--shovels-emerald-dark: rgb(var(--shovels-emerald-dark-rgb));--shovels-on-emerald: #0e1420;--shovels-surface: #ffffff;--shovels-panel: #f9f7f1;--shovels-subtle: #f0ecdf;--shovels-rule: #e2dcc9;--shovels-rule-strong: #dad3bd;--shovels-dark-panel: #161d2c;--shovels-dark-subtle: #1a2338;--shovels-dark-rule: #2a3550;--shovels-dark-rule-strong: #33415e;--shovels-dark-ink: #d6d0c1;--shovels-dark-ink-secondary: #948d73;--shovels-dark-success-rgb: 110 231 183;--shovels-dark-warning-rgb: 233 190 81;--shovels-dark-error-rgb: 217 135 98;--shovels-success-fill: #e6f2ee;--shovels-success-line: #c6d7ce;--shovels-success-ink: #014d3a;--shovels-warning-fill: #fdfaf0;--shovels-warning-line: #ecd9a4;--shovels-warning-ink: #7a5b18;--shovels-error-fill: #fdf2ee;--shovels-error-line: #a63d27;--shovels-error-ink: #8a3b28;--shovels-structure: Poppins, ui-sans-serif, system-ui, sans-serif;--shovels-identifier: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;--shovels-lift: 0 1px 1px rgba(84, 72, 40, 0.04)}:root:not(.dark){--gray-50: 250 249 244;--gray-100: 244 241 231;--gray-200: 233 228 212;--gray-300: 216 209 188;--gray-400: 148 142 122;--gray-500: 121 116 95;--gray-600: 107 105 92;--gray-700: 30 41 62;--gray-800: 23 32 50;--gray-900: 16 23 39;--gray-950: 10 15 26}.eyebrow,#sidebar .sidebar-title,#content-area table th{font-family:var(--shovels-structure);font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:0.08em;line-height:1.4}:root:not(.dark) .eyebrow{color:var(--shovels-primary)}:root:not(.dark) #sidebar .sidebar-title,:root:not(.dark) #content-area table th{color:var(--shovels-ink-secondary)}:root.dark #content-area table th{color:var(--shovels-dark-ink-secondary)}#content-area .prose:not(.text-sm){font-size:15px;line-height:1.65}#content-area h1,#content-area h2,#content-area h3,#content-area h4{font-weight:600;letter-spacing:-0.02em}:root{--font-paper-mono: var(--shovels-identifier)}code,pre,kbd,samp{font-family:var(--shovels-identifier)}:root:not(.dark) #content-area :not(pre)>code{color:var(--shovels-ink);background:var(--shovels-subtle);border:1px solid var(--shovels-rule)}:root.dark #content-area :not(pre)>code{color:var(--shovels-dark-ink);background:var(--shovels-dark-subtle);border:1px solid var(--shovels-dark-rule)}:root:not(.dark){--mint-foreground: var(--shovels-ink);--mint-background: transparent;--mint-token-keyword: var(--shovels-primary);--mint-token-function: var(--shovels-primary);--mint-token-string: #874d33;--mint-token-string-expression: #874d33;--mint-token-constant: #765817;--mint-token-parameter: #55622f;--mint-token-punctuation: #6b6652;--mint-token-comment: #6c6753;--mint-token-link: var(--shovels-primary)}:root.dark{--mint-foreground: var(--shovels-dark-ink);--mint-background: transparent;--mint-token-keyword: var(--shovels-emerald-dark);--mint-token-function: var(--shovels-emerald-dark);--mint-token-string: #d98762;--mint-token-string-expression: #d98762;--mint-token-constant: #ba974a;--mint-token-parameter: #90a653;--mint-token-punctuation: var(--shovels-dark-ink-secondary);--mint-token-comment: #8c8670;--mint-token-link: var(--shovels-emerald-dark)}span[style*=\"--mint-token-keyword\"],span[style*=\"--mint-token-function\"]{font-weight:500;--shiki-dark-font-weight: 500}#sidebar .sidebar-group a{font-family:var(--shovels-structure)}:root:not(.dark) #search-bar-entry,:root:not(.dark) #assistant-entry{background:var(--shovels-subtle);border:1px solid var(--shovels-rule)}:root:not(.dark) #search-bar-entry *,:root:not(.dark) #assistant-entry *{color:var(--shovels-ink-secondary)}:root.dark #search-bar-entry,:root.dark #assistant-entry{background:var(--shovels-dark-subtle);border:1px solid var(--shovels-dark-rule)}:root.dark #search-bar-entry *,:root.dark #assistant-entry *{color:var(--shovels-dark-ink-secondary)}#content-area .card{border-radius:10px}:root:not(.dark) #content-area .card{background:var(--shovels-surface);border-color:var(--shovels-rule);box-shadow:var(--shovels-lift)}#content-area table td{font-size:13px}#content-area table th{padding-top:8px;padding-bottom:8px;vertical-align:middle}#content-area details table td{overflow-wrap:anywhere}#content-area details table td:first-child{font-family:var(--shovels-identifier);font-weight:500}:root:not(.dark) #content-area table th{background:var(--shovels-subtle);border-bottom:1px solid var(--shovels-rule-strong)}:root:not(.dark) #content-area table td{border-bottom:1px solid var(--shovels-rule)}:root.dark #content-area table th{background:var(--shovels-dark-subtle);border-bottom:1px solid var(--shovels-dark-rule-strong)}:root.dark #content-area table td{border-bottom:1px solid var(--shovels-dark-rule)}#content-area .callout{border-radius:10px}:root:not(.dark) #content-area .callout[class*=\"bg-neutral-\"]{background:var(--shovels-panel);border-color:var(--shovels-rule)}:root:not(.dark) #content-area .callout[class*=\"bg-neutral-\"] svg{color:var(--shovels-label)}:root:not(.dark) #content-area .callout[class*=\"bg-blue-\"]{background:var(--shovels-subtle);border-color:var(--shovels-rule-strong)}:root:not(.dark) #content-area .callout[class*=\"bg-blue-\"] svg{color:var(--shovels-ink-secondary)}:root:not(.dark) #content-area .callout[class*=\"bg-green-\"]{background:var(--shovels-success-fill);border-color:var(--shovels-success-line)}:root:not(.dark) #content-area .callout[class*=\"bg-green-\"] svg{color:var(--shovels-primary)}:root:not(.dark) #content-area .callout[class*=\"bg-yellow-\"]{background:var(--shovels-warning-fill);border-color:var(--shovels-warning-line)}:root:not(.dark) #content-area .callout[class*=\"bg-yellow-\"] svg{color:var(--shovels-warning-ink)}:root:not(.dark) #content-area .callout[class*=\"bg-red-\"]{background:var(--shovels-error-fill);border-color:var(--shovels-error-line)}:root:not(.dark) #content-area .callout[class*=\"bg-red-\"] svg{color:var(--shovels-error-line)}:root:not(.dark) #content-area .callout[class*=\"bg-neutral-\"] .prose,:root:not(.dark) #content-area .callout[class*=\"bg-blue-\"] .prose{color:var(--shovels-ink-body)}:root:not(.dark) #content-area .callout[class*=\"bg-green-\"] .prose{color:var(--shovels-success-ink)}:root:not(.dark) #content-area .callout[class*=\"bg-yellow-\"] .prose{color:var(--shovels-warning-ink)}:root:not(.dark) #content-area .callout[class*=\"bg-red-\"] .prose{color:var(--shovels-error-ink)}:root.dark #content-area .callout[class*=\"bg-neutral-\"]{background:var(--shovels-dark-panel);border-color:var(--shovels-dark-rule)}:root.dark #content-area .callout[class*=\"bg-neutral-\"] svg{color:var(--shovels-dark-ink-secondary)}:root.dark #content-area .callout[class*=\"bg-blue-\"]{background:var(--shovels-dark-subtle);border-color:var(--shovels-dark-rule-strong)}:root.dark #content-area .callout[class*=\"bg-blue-\"] svg{color:var(--shovels-dark-ink-secondary)}:root.dark #content-area .callout[class*=\"bg-green-\"]{background:rgb(var(--shovels-dark-success-rgb) / 0.12);border-color:rgb(var(--shovels-dark-success-rgb) / 0.30)}:root.dark #content-area .callout[class*=\"bg-green-\"] svg{color:rgb(var(--shovels-dark-success-rgb))}:root.dark #content-area .callout[class*=\"bg-yellow-\"]{background:rgb(var(--shovels-dark-warning-rgb) / 0.12);border-color:rgb(var(--shovels-dark-warning-rgb) / 0.30)}:root.dark #content-area .callout[class*=\"bg-yellow-\"] svg{color:rgb(var(--shovels-dark-warning-rgb))}:root.dark #content-area .callout[class*=\"bg-red-\"]{background:rgb(var(--shovels-dark-error-rgb) / 0.12);border-color:rgb(var(--shovels-dark-error-rgb) / 0.30)}:root.dark #content-area .callout[class*=\"bg-red-\"] svg{color:rgb(var(--shovels-dark-error-rgb))}:root.dark #content-area .callout[class*=\"bg-neutral-\"] .prose,:root.dark #content-area .callout[class*=\"bg-blue-\"] .prose{color:var(--shovels-dark-ink)}:root.dark #content-area .callout[class*=\"bg-green-\"] .prose{color:rgb(var(--shovels-dark-success-rgb))}:root.dark #content-area .callout[class*=\"bg-yellow-\"] .prose{color:rgb(var(--shovels-dark-warning-rgb))}:root.dark #content-area .callout[class*=\"bg-red-\"] .prose{color:rgb(var(--shovels-dark-error-rgb))}:root:not(.dark){--accordion-background-color: var(--shovels-panel);--accordion-background-hover: var(--shovels-subtle);--accordion-icon-color: var(--shovels-label)}:root:not(.dark) .method-nav-pill [class*=\"2AB673\"],:root:not(.dark) .tryit-button[class*=\"2AB673\"]{background-color:var(--shovels-primary)}:root:not(.dark) .method-nav-pill [class*=\"bg-green-\"],:root:not(.dark) .method-pill[class*=\"bg-green-\"]{background-color:var(--shovels-success-fill);color:var(--shovels-primary)}:root.dark .method-nav-pill [class*=\"2AB673\"],:root.dark .tryit-button[class*=\"2AB673\"]{background-color:var(--shovels-emerald-dark);color:var(--shovels-on-emerald)}:root.dark .method-nav-pill [class*=\"bg-green-\"],:root.dark .method-pill[class*=\"bg-green-\"]{background-color:rgb(var(--shovels-emerald-dark-rgb) / 0.18);color:var(--shovels-emerald-dark)}:root.dark [class*=\"bg-primary-dark\"]{background-color:var(--shovels-emerald-dark)}:root.dark #topbar-cta-button,:root.dark #topbar-cta-button *{color:var(--shovels-on-emerald)}:root:not(.dark) #content-area [class*=\"bg-red-100\"]{background-color:var(--shovels-warning-fill);color:var(--shovels-warning-ink);box-shadow:inset 0 0 0 1px var(--shovels-warning-line)}:root.dark #content-area [class*=\"bg-red-100\"]{background-color:rgb(var(--shovels-dark-warning-rgb) / 0.12);color:rgb(var(--shovels-dark-warning-rgb));box-shadow:inset 0 0 0 1px rgb(var(--shovels-dark-warning-rgb) / 0.30)}"}],"page":{"pagePath":"api-reference/properties/search-properties","slug":"/api-reference/properties/search-properties","pageMetadata":{"title":"Search Properties","description":"**Beta.** Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named `legal_owner`s, most recently permitted first. At least one of `geo_id` and `legal_owner` is required; a `legal_owner` search needs no geo scope. Pass `cursor` from a page's `next_cursor` to page through results. Filter by `permit_tags` (presence and `-`-prefixed exclusion), `permit_status`, `permit_from`, and `property_type`. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a `-`-prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction's ingestion lag, is not counted against the claim. Every absence-class row carries a `trust` object stating three honesty terms — the jurisdiction's permit `coverage_tier`, its `unresolved_rate` (the share of its permits that never linked to an address), and the row's `data_horizon` — plus `horizon_basis` (whether that horizon is measured, pooled, or a state prior) and `footprint_basis` (whether suppression could resolve the row's geo); the response `trust_summary` row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim's staleness bound is the rebuild cadence plus each jurisdiction's permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent 'no permit since D' stays under-observed until that lag elapses. Each row's `data_horizon` is the per-row handle on that bound — the most recent start_date past which 'no X since D' is under-observed for that row. Not supported, each for one reason: `permit_to` or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); 'before D' absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only 'ever' and 'since D' are expressible on max-date maps; 'has X since D and no Y since D' in one query — a mixed query binds an exclusion to 'ever', so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /properties/search","href":"/api-reference/properties/search-properties","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Beta.\"\n }), \" Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named \", _jsx(_components.code, {\n children: \"legal_owner\"\n }), \"s, most recently permitted first. At least one of \", _jsx(_components.code, {\n children: \"geo_id\"\n }), \" and \", _jsx(_components.code, {\n children: \"legal_owner\"\n }), \" is required; a \", _jsx(_components.code, {\n children: \"legal_owner\"\n }), \" search needs no geo scope. Pass \", _jsx(_components.code, {\n children: \"cursor\"\n }), \" from a page’s \", _jsx(_components.code, {\n children: \"next_cursor\"\n }), \" to page through results. Filter by \", _jsx(_components.code, {\n children: \"permit_tags\"\n }), \" (presence and \", _jsx(_components.code, {\n children: \"-\"\n }), \"-prefixed exclusion), \", _jsx(_components.code, {\n children: \"permit_status\"\n }), \", \", _jsx(_components.code, {\n children: \"permit_from\"\n }), \", and \", _jsx(_components.code, {\n children: \"property_type\"\n }), \". Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a \", _jsx(_components.code, {\n children: \"-\"\n }), \"-prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction’s ingestion lag, is not counted against the claim. Every absence-class row carries a \", _jsx(_components.code, {\n children: \"trust\"\n }), \" object stating three honesty terms — the jurisdiction’s permit \", _jsx(_components.code, {\n children: \"coverage_tier\"\n }), \", its \", _jsx(_components.code, {\n children: \"unresolved_rate\"\n }), \" (the share of its permits that never linked to an address), and the row’s \", _jsx(_components.code, {\n children: \"data_horizon\"\n }), \" — plus \", _jsx(_components.code, {\n children: \"horizon_basis\"\n }), \" (whether that horizon is measured, pooled, or a state prior) and \", _jsx(_components.code, {\n children: \"footprint_basis\"\n }), \" (whether suppression could resolve the row’s geo); the response \", _jsx(_components.code, {\n children: \"trust_summary\"\n }), \" row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim’s staleness bound is the rebuild cadence plus each jurisdiction’s permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent ‘no permit since D’ stays under-observed until that lag elapses. Each row’s \", _jsx(_components.code, {\n children: \"data_horizon\"\n }), \" is the per-row handle on that bound — the most recent start_date past which ‘no X since D’ is under-observed for that row. Not supported, each for one reason: \", _jsx(_components.code, {\n children: \"permit_to\"\n }), \" or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); ‘before D’ absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only ‘ever’ and ‘since D’ are expressible on max-date maps; ‘has X since D and no Y since D’ in one query — a mixed query binds an exclusion to ‘ever’, so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"css-variables","dark":"css-variables"}},"config":{},"pageMetadata":{"title":"Search Properties","description":"**Beta.** Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named `legal_owner`s, most recently permitted first. At least one of `geo_id` and `legal_owner` is required; a `legal_owner` search needs no geo scope. Pass `cursor` from a page's `next_cursor` to page through results. Filter by `permit_tags` (presence and `-`-prefixed exclusion), `permit_status`, `permit_from`, and `property_type`. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a `-`-prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction's ingestion lag, is not counted against the claim. Every absence-class row carries a `trust` object stating three honesty terms — the jurisdiction's permit `coverage_tier`, its `unresolved_rate` (the share of its permits that never linked to an address), and the row's `data_horizon` — plus `horizon_basis` (whether that horizon is measured, pooled, or a state prior) and `footprint_basis` (whether suppression could resolve the row's geo); the response `trust_summary` row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim's staleness bound is the rebuild cadence plus each jurisdiction's permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent 'no permit since D' stays under-observed until that lag elapses. Each row's `data_horizon` is the per-row handle on that bound — the most recent start_date past which 'no X since D' is under-observed for that row. Not supported, each for one reason: `permit_to` or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); 'before D' absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only 'ever' and 'since D' are expressible on max-date maps; 'has X since D and no Y since D' in one query — a mixed query binds an exclusion to 'ever', so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /properties/search","href":"/api-reference/properties/search-properties","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Properties","Properties"],"summary":"Search Properties","description":"**Beta.** Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named `legal_owner`s, most recently permitted first. At least one of `geo_id` and `legal_owner` is required; a `legal_owner` search needs no geo scope. Pass `cursor` from a page's `next_cursor` to page through results. Filter by `permit_tags` (presence and `-`-prefixed exclusion), `permit_status`, `permit_from`, and `property_type`. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a `-`-prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction's ingestion lag, is not counted against the claim. Every absence-class row carries a `trust` object stating three honesty terms — the jurisdiction's permit `coverage_tier`, its `unresolved_rate` (the share of its permits that never linked to an address), and the row's `data_horizon` — plus `horizon_basis` (whether that horizon is measured, pooled, or a state prior) and `footprint_basis` (whether suppression could resolve the row's geo); the response `trust_summary` row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim's staleness bound is the rebuild cadence plus each jurisdiction's permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent 'no permit since D' stays under-observed until that lag elapses. Each row's `data_horizon` is the per-row handle on that bound — the most recent start_date past which 'no X since D' is under-observed for that row. Not supported, each for one reason: `permit_to` or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); 'before D' absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only 'ever' and 'since D' are expressible on max-date maps; 'has X since D and no Y since D' in one query — a mixed query binds an exclusion to 'ever', so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.","operationId":"search_properties_properties_search_get","security":["f598c7f3-f87c-44b6-9ac6-7b04d2531657"],"parameters":["ccbd279c-978a-49f6-a3f9-d773101cc0b4","42b5d46f-2296-4df7-8b7d-5b148ab69b3a","55220ef2-92e7-4005-97f0-c7d95139aa88","c5c22c9a-983c-4456-b8d0-d32389190335","4b8be825-0c3d-4de6-b552-c3c4e3d6b308","34412e89-59a5-4ac1-86ec-648c3c00ac6a","a1ea3bce-f3d5-4acc-81f9-654fd449fe11","44c78d4e-29e1-43e1-a3c2-98cbf7fa82df","5ac6d14e-d336-469b-96ee-cfe2e5396c09","58c59ff5-fc93-4d61-92a7-0c2ec4422da9","533bde35-f615-4cf0-ac14-c52586d42937","56999f34-c785-48e3-93d0-7a2b7c292257","a815106c-5c2c-4141-8bdc-3674fc969d08","9edc7370-3597-4d19-921a-dc9d061480d3","1d9b7c71-62a4-42d9-b81f-284770fc28d8","8ba22d98-5cd6-4c1c-84af-32e503bdf235","d10d5e10-71a0-4067-a9b3-594085e47a8b","059cbdd9-8e2d-4f99-be27-fc1799e526c4","ff510225-4331-4ca1-b61d-449abf3f9e72","aef3d3d9-b13e-4d1b-ae94-775d2a3fb7dd","be98934a-6968-4b6c-8407-831228e46ec6"],"responses":{"200":"d9558828-bb59-470b-9d90-6f6772db272a","422":"a0596b08-8532-4fd7-a02a-d4064fd9f554"},"method":"get","type":"path","servers":["370fdb2b-7744-45ce-9b90-cd3a263353be"],"path":"/properties/search","baseUrlOptions":["https://api.shovels.ai/v2"],"title":"Search Properties","codeSamples":[],"requestExampleLanguages":["bash","python","java","go","ruby","php"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"ccbd279c-978a-49f6-a3f9-d773101cc0b4":{"name":"geo_id","in":"query","required":false,"schema":{"oneOf":[{"type":"string","title":"Geolocation ID","description":"Scope: a 2-letter state, 5-digit ZIP, ZIP+4, or a Shovels state/county/city/address geolocation id. Jurisdiction ids are not accepted. Optional when `legal_owner` is given, required otherwise.","uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"null","title":"Geolocation ID","description":"Scope: a 2-letter state, 5-digit ZIP, ZIP+4, or a Shovels state/county/city/address geolocation id. Jurisdiction ids are not accepted. Optional when `legal_owner` is given, required otherwise.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string | null"},"description":"Scope: a 2-letter state, 5-digit ZIP, ZIP+4, or a Shovels state/county/city/address geolocation id. Jurisdiction ids are not accepted. Optional when `legal_owner` is given, required otherwise."},"42b5d46f-2296-4df7-8b7d-5b148ab69b3a":{"name":"legal_owner","in":"query","required":false,"schema":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Legal Owner","description":"Filter by the property's legal owner, matched on the owner's canonical form — case and spacing variants of one name return the same properties. Pass up to 10 `legal_owner` params to span several owners. Without a `geo_id` this searches an owner's properties nationwide; with one it narrows that scope to the owner. A name the data uses for an unidentified owner (for example 'RECORD OWNER') is rejected.","maxItems":10,"uniqueKey":"oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Legal Owner","description":"Filter by the property's legal owner, matched on the owner's canonical form — case and spacing variants of one name return the same properties. Pass up to 10 `legal_owner` params to span several owners. Without a `geo_id` this searches an owner's properties nationwide; with one it narrows that scope to the owner. A name the data uses for an unidentified owner (for example 'RECORD OWNER') is rejected.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string[] | null"},"description":"Filter by the property's legal owner, matched on the owner's canonical form — case and spacing variants of one name return the same properties. Pass up to 10 `legal_owner` params to span several owners. Without a `geo_id` this searches an owner's properties nationwide; with one it narrows that scope to the owner. A name the data uses for an unidentified owner (for example 'RECORD OWNER') is rejected."},"55220ef2-92e7-4005-97f0-c7d95139aa88":{"name":"permit_tags","in":"query","required":false,"schema":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Permit Tags","description":"Filter by canonical permit tags. Repeat the key for several tags (e.g. `?permit_tags=roofing\u0026permit_tags=-solar`). A positive tag keeps properties with that tag on some permit; a `-` prefix excludes the tag (properties without it). Multiple positive tags require each tag (address grain — a documented divergence from /permits/search, where they must share one permit). With `permit_status`, each positive tag must be matched by a permit that also has one of the statuses. With `permit_from`: a positive tag matches since the date; an exclusion means 'no such tag since the date' in a pure-absence query, or 'never' when combined with any positive filter.","uniqueKey":"oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Permit Tags","description":"Filter by canonical permit tags. Repeat the key for several tags (e.g. `?permit_tags=roofing\u0026permit_tags=-solar`). A positive tag keeps properties with that tag on some permit; a `-` prefix excludes the tag (properties without it). Multiple positive tags require each tag (address grain — a documented divergence from /permits/search, where they must share one permit). With `permit_status`, each positive tag must be matched by a permit that also has one of the statuses. With `permit_from`: a positive tag matches since the date; an exclusion means 'no such tag since the date' in a pure-absence query, or 'never' when combined with any positive filter.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string[] | null"},"description":"Filter by canonical permit tags. Repeat the key for several tags (e.g. `?permit_tags=roofing\u0026permit_tags=-solar`). A positive tag keeps properties with that tag on some permit; a `-` prefix excludes the tag (properties without it). Multiple positive tags require each tag (address grain — a documented divergence from /permits/search, where they must share one permit). With `permit_status`, each positive tag must be matched by a permit that also has one of the statuses. With `permit_from`: a positive tag matches since the date; an exclusion means 'no such tag since the date' in a pure-absence query, or 'never' when combined with any positive filter."},"c5c22c9a-983c-4456-b8d0-d32389190335":{"name":"permit_status","in":"query","required":false,"schema":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Permit Status","description":"Filter by permit status; repeat the key for several (final, in_review, inactive, active). With positive `permit_tags` this is a same-permit conjunction; on its own it keeps properties with a permit of one of the statuses. 'unknown' is not a filterable status.","uniqueKey":"oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Permit Status","description":"Filter by permit status; repeat the key for several (final, in_review, inactive, active). With positive `permit_tags` this is a same-permit conjunction; on its own it keeps properties with a permit of one of the statuses. 'unknown' is not a filterable status.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string[] | null"},"description":"Filter by permit status; repeat the key for several (final, in_review, inactive, active). With positive `permit_tags` this is a same-permit conjunction; on its own it keeps properties with a permit of one of the statuses. 'unknown' is not a filterable status."},"4b8be825-0c3d-4de6-b552-c3c4e3d6b308":{"name":"permit_from","in":"query","required":false,"schema":{"oneOf":[{"type":"string","title":"Permit From","description":"Bind the tag/status/absence filters to this ISO date (YYYY-MM-DD): a positive filter matches since the date, a pure-absence exclusion means 'none since the date'. With no tag/status filter it keeps properties whose most recent permit is on or after the date.","format":"date","uniqueKey":"oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","title":"Permit From","description":"Bind the tag/status/absence filters to this ISO date (YYYY-MM-DD): a positive filter matches since the date, a pure-absence exclusion means 'none since the date'. With no tag/status filter it keeps properties whose most recent permit is on or after the date.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string\u003cdate> | null"},"description":"Bind the tag/status/absence filters to this ISO date (YYYY-MM-DD): a positive filter matches since the date, a pure-absence exclusion means 'none since the date'. With no tag/status filter it keeps properties whose most recent permit is on or after the date."},"34412e89-59a5-4ac1-86ec-648c3c00ac6a":{"name":"permit_to","in":"query","required":false,"schema":{"oneOf":[{"type":"string","title":"Permit To","description":"Not supported on /properties/search — use /permits/search for a date-window search.","uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"null","title":"Permit To","description":"Not supported on /properties/search — use /permits/search for a date-window search.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string | null"},"description":"Not supported on /properties/search — use /permits/search for a date-window search."},"a1ea3bce-f3d5-4acc-81f9-654fd449fe11":{"name":"property_type","in":"query","required":false,"schema":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Property Type","description":"Filter by property type: residential, commercial, industrial, agricultural, vacant land, exempt, miscellaneous, office, recreational. Repeat the key to match any of several types (e.g. `?property_type=residential\u0026property_type=commercial`). Properties with no attributed type are excluded; property attributes are available for 70.1% of properties.","uniqueKey":"oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Property Type","description":"Filter by property type: residential, commercial, industrial, agricultural, vacant land, exempt, miscellaneous, office, recreational. Repeat the key to match any of several types (e.g. `?property_type=residential\u0026property_type=commercial`). Properties with no attributed type are excluded; property attributes are available for 70.1% of properties.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string[] | null"},"description":"Filter by property type: residential, commercial, industrial, agricultural, vacant land, exempt, miscellaneous, office, recreational. Repeat the key to match any of several types (e.g. `?property_type=residential\u0026property_type=commercial`). Properties with no attributed type are excluded; property attributes are available for 70.1% of properties."},"44c78d4e-29e1-43e1-a3c2-98cbf7fa82df":{"name":"permit_tags_unfinaled","in":"query","required":false,"schema":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Permit Tags Unfinaled","description":"Keep properties with an UNFINALED permit of each named canonical tag. Repeat the key for several (e.g. `?permit_tags_unfinaled=solar\u0026permit_tags_unfinaled=roofing`). Permit status — not a permit's final_date — is the finaled flag: a final permit carries a NULL final_date 14.7% of the time, and ~41% of permits with a NULL final_date are in fact finaled by status, so a `final_date IS NULL` test over-counts unfinaled permits and is wrong ~41% of the time. A tag is unfinaled for an address only when its latest non-final permit of that tag is more recent than its latest final permit of that tag (equal dates count as finaled); this clear rule removes the false positives a plain 'any non-final permit of this tag' test would keep — for solar, 31.5% of them, though the share varies by tag (nearer 13-18% for tags such as roofing and hvac). A permit whose status is unknown (NULL) counts as neither final nor unfinaled. With `permit_from`, the tag's latest unfinaled permit must be on or after the date.","uniqueKey":"oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Permit Tags Unfinaled","description":"Keep properties with an UNFINALED permit of each named canonical tag. Repeat the key for several (e.g. `?permit_tags_unfinaled=solar\u0026permit_tags_unfinaled=roofing`). Permit status — not a permit's final_date — is the finaled flag: a final permit carries a NULL final_date 14.7% of the time, and ~41% of permits with a NULL final_date are in fact finaled by status, so a `final_date IS NULL` test over-counts unfinaled permits and is wrong ~41% of the time. A tag is unfinaled for an address only when its latest non-final permit of that tag is more recent than its latest final permit of that tag (equal dates count as finaled); this clear rule removes the false positives a plain 'any non-final permit of this tag' test would keep — for solar, 31.5% of them, though the share varies by tag (nearer 13-18% for tags such as roofing and hvac). A permit whose status is unknown (NULL) counts as neither final nor unfinaled. With `permit_from`, the tag's latest unfinaled permit must be on or after the date.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string[] | null"},"description":"Keep properties with an UNFINALED permit of each named canonical tag. Repeat the key for several (e.g. `?permit_tags_unfinaled=solar\u0026permit_tags_unfinaled=roofing`). Permit status — not a permit's final_date — is the finaled flag: a final permit carries a NULL final_date 14.7% of the time, and ~41% of permits with a NULL final_date are in fact finaled by status, so a `final_date IS NULL` test over-counts unfinaled permits and is wrong ~41% of the time. A tag is unfinaled for an address only when its latest non-final permit of that tag is more recent than its latest final permit of that tag (equal dates count as finaled); this clear rule removes the false positives a plain 'any non-final permit of this tag' test would keep — for solar, 31.5% of them, though the share varies by tag (nearer 13-18% for tags such as roofing and hvac). A permit whose status is unknown (NULL) counts as neither final nor unfinaled. With `permit_from`, the tag's latest unfinaled permit must be on or after the date."},"5ac6d14e-d336-469b-96ee-cfe2e5396c09":{"name":"property_min_market_value","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Minimum Property Market Value","description":"Minimum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Minimum Property Market Value","description":"Minimum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Minimum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties)."},"58c59ff5-fc93-4d61-92a7-0c2ec4422da9":{"name":"property_max_market_value","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Maximum Property Market Value","description":"Maximum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Maximum Property Market Value","description":"Maximum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Maximum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties)."},"533bde35-f615-4cf0-ac14-c52586d42937":{"name":"property_min_lot_size","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Minimum Property Lot Size","description":"Minimum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Minimum Property Lot Size","description":"Minimum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Minimum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties)."},"56999f34-c785-48e3-93d0-7a2b7c292257":{"name":"property_max_lot_size","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Maximum Property Lot Size","description":"Maximum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Maximum Property Lot Size","description":"Maximum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Maximum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties)."},"a815106c-5c2c-4141-8bdc-3674fc969d08":{"name":"property_min_building_area","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Minimum Property Building Area","description":"Minimum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Minimum Property Building Area","description":"Minimum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Minimum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties)."},"9edc7370-3597-4d19-921a-dc9d061480d3":{"name":"property_max_building_area","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Maximum Property Building Area","description":"Maximum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Maximum Property Building Area","description":"Maximum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Maximum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties)."},"1d9b7c71-62a4-42d9-b81f-284770fc28d8":{"name":"property_min_unit_count","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Minimum Property Unit Count","description":"Minimum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Minimum Property Unit Count","description":"Minimum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Minimum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties)."},"8ba22d98-5cd6-4c1c-84af-32e503bdf235":{"name":"property_max_unit_count","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Maximum Property Unit Count","description":"Maximum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Maximum Property Unit Count","description":"Maximum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Maximum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties)."},"d10d5e10-71a0-4067-a9b3-594085e47a8b":{"name":"property_min_year_built","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Minimum Property Year Built","description":"Minimum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Minimum Property Year Built","description":"Minimum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Minimum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties)."},"059cbdd9-8e2d-4f99-be27-fc1799e526c4":{"name":"property_max_year_built","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","title":"Maximum Property Year Built","description":"Maximum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties).","uniqueKey":"oneOf.0","typeLabel":"integer"},{"type":"null","title":"Maximum Property Year Built","description":"Maximum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties).","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"integer | null"},"description":"Maximum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties)."},"ff510225-4331-4ca1-b61d-449abf3f9e72":{"name":"cursor","in":"query","required":false,"schema":{"oneOf":[{"type":"string","title":"Cursor","description":"Opaque keyset cursor from a previous page's next_cursor.","uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"null","title":"Cursor","description":"Opaque keyset cursor from a previous page's next_cursor.","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string | null"},"description":"Opaque keyset cursor from a previous page's next_cursor."},"aef3d3d9-b13e-4d1b-ae94-775d2a3fb7dd":{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size (1-100).","default":10,"title":"Size","isRequired":false,"uniqueKey":"","typeLabel":"integer"},"description":"Page size (1-100)."},"be98934a-6968-4b6c-8407-831228e46ec6":{"name":"include_total_count","in":"query","required":false,"schema":{"type":"boolean","description":"When true and on the first page (no cursor), include a total_count capped at 10,000.","default":false,"title":"Include Total Count","isRequired":false,"uniqueKey":"","typeLabel":"boolean"},"description":"When true and on the first page (no cursor), include a total_count capped at 10,000."}},"responses":{"d9558828-bb59-470b-9d90-6f6772db272a":{"description":"A page of properties in the scope.","content":{"application/json":{"schema":{"properties":{"items":{"items":{"properties":{"id":{"type":"string","title":"Id","description":"The base64 address handle; the property's public id.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].id","typeLabel":"string"},"street_no":{"oneOf":[{"type":"string","title":"Street No","description":"Street number of the address.","uniqueKey":"\\items.items.[INDEX].street_no.oneOf.0","typeLabel":"string"},{"type":"null","title":"Street No","description":"Street number of the address.","uniqueKey":"\\items.items.[INDEX].street_no.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].street_no","typeLabel":"string | null"},"street":{"oneOf":[{"type":"string","title":"Street","description":"Street name of the address.","uniqueKey":"\\items.items.[INDEX].street.oneOf.0","typeLabel":"string"},{"type":"null","title":"Street","description":"Street name of the address.","uniqueKey":"\\items.items.[INDEX].street.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].street","typeLabel":"string | null"},"city":{"oneOf":[{"type":"string","title":"City","description":"City of the address.","uniqueKey":"\\items.items.[INDEX].city.oneOf.0","typeLabel":"string"},{"type":"null","title":"City","description":"City of the address.","uniqueKey":"\\items.items.[INDEX].city.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].city","typeLabel":"string | null"},"city_id":{"oneOf":[{"type":"string","title":"City Id","description":"Base64 city handle.","uniqueKey":"\\items.items.[INDEX].city_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"City Id","description":"Base64 city handle.","uniqueKey":"\\items.items.[INDEX].city_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].city_id","typeLabel":"string | null"},"zip_code":{"oneOf":[{"type":"string","title":"Zip Code","description":"ZIP code of the address.","uniqueKey":"\\items.items.[INDEX].zip_code.oneOf.0","typeLabel":"string"},{"type":"null","title":"Zip Code","description":"ZIP code of the address.","uniqueKey":"\\items.items.[INDEX].zip_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].zip_code","typeLabel":"string | null"},"zip_code_ext":{"oneOf":[{"type":"string","title":"Zip Code Ext","description":"ZIP+4 extension of the address.","uniqueKey":"\\items.items.[INDEX].zip_code_ext.oneOf.0","typeLabel":"string"},{"type":"null","title":"Zip Code Ext","description":"ZIP+4 extension of the address.","uniqueKey":"\\items.items.[INDEX].zip_code_ext.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].zip_code_ext","typeLabel":"string | null"},"county":{"oneOf":[{"type":"string","title":"County","description":"County of the address.","uniqueKey":"\\items.items.[INDEX].county.oneOf.0","typeLabel":"string"},{"type":"null","title":"County","description":"County of the address.","uniqueKey":"\\items.items.[INDEX].county.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].county","typeLabel":"string | null"},"county_id":{"oneOf":[{"type":"string","title":"County Id","description":"Base64 county handle.","uniqueKey":"\\items.items.[INDEX].county_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"County Id","description":"Base64 county handle.","uniqueKey":"\\items.items.[INDEX].county_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].county_id","typeLabel":"string | null"},"state":{"oneOf":[{"type":"string","title":"State","description":"State of the address.","uniqueKey":"\\items.items.[INDEX].state.oneOf.0","typeLabel":"string"},{"type":"null","title":"State","description":"State of the address.","uniqueKey":"\\items.items.[INDEX].state.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].state","typeLabel":"string | null"},"lat":{"oneOf":[{"type":"number","title":"Lat","description":"Latitude of the address.","uniqueKey":"\\items.items.[INDEX].lat.oneOf.0","typeLabel":"number"},{"type":"null","title":"Lat","description":"Latitude of the address.","uniqueKey":"\\items.items.[INDEX].lat.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].lat","typeLabel":"number | null"},"long":{"oneOf":[{"type":"number","title":"Long","description":"Longitude of the address.","uniqueKey":"\\items.items.[INDEX].long.oneOf.0","typeLabel":"number"},{"type":"null","title":"Long","description":"Longitude of the address.","uniqueKey":"\\items.items.[INDEX].long.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].long","typeLabel":"number | null"},"permit_count":{"type":"integer","title":"Permit Count","description":"Count of permits linked to the address.","default":0,"uniqueKey":"\\items.items.[INDEX].permit_count","typeLabel":"integer"},"untagged_permit_count":{"type":"integer","title":"Untagged Permit Count","description":"Count of the address's permits carrying no canonical tag.","default":0,"uniqueKey":"\\items.items.[INDEX].untagged_permit_count","typeLabel":"integer"},"total_job_value":{"type":"integer","title":"Total Job Value","description":"Sum of permit job values in integer cents (dollars x 100).","default":0,"uniqueKey":"\\items.items.[INDEX].total_job_value","typeLabel":"integer"},"contractor_count":{"type":"integer","title":"Contractor Count","description":"Distinct contractors across the address's permits.","default":0,"uniqueKey":"\\items.items.[INDEX].contractor_count","typeLabel":"integer"},"tags":{"items":{"type":"string","uniqueKey":"\\items.items.[INDEX].tags.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Tags","description":"Distinct canonical tags present on the address's permits.","default":[],"uniqueKey":"\\items.items.[INDEX].tags","typeLabel":"string[]"},"tag_status_pairs":{"items":{"type":"string","uniqueKey":"\\items.items.[INDEX].tag_status_pairs.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Tag Status Pairs","description":"Distinct tag:status pairs (status folded to 'unknown' when NULL).","default":[],"uniqueKey":"\\items.items.[INDEX].tag_status_pairs","typeLabel":"string[]"},"statuses":{"items":{"type":"string","uniqueKey":"\\items.items.[INDEX].statuses.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Statuses","description":"Distinct permit statuses incl the 'unknown' NULL fold.","default":[],"uniqueKey":"\\items.items.[INDEX].statuses","typeLabel":"string[]"},"tag_tally":{"additionalProperties":{"type":"integer","uniqueKey":"\\items.items.[INDEX].tag_tally.additionalProperties","typeLabel":"integer"},"type":"object","title":"Tag Tally","description":"Map tag -> permit count.","default":{},"uniqueKey":"\\items.items.[INDEX].tag_tally","typeLabel":"Tag Tally · object"},"last_date_by_tag":{"additionalProperties":{"type":"string","uniqueKey":"\\items.items.[INDEX].last_date_by_tag.additionalProperties","typeLabel":"string"},"type":"object","title":"Last Date By Tag","description":"Map tag -> latest permit start_date.","default":{},"uniqueKey":"\\items.items.[INDEX].last_date_by_tag","typeLabel":"Last Date By Tag · object"},"last_unfinaled_date_by_tag":{"additionalProperties":{"type":"string","uniqueKey":"\\items.items.[INDEX].last_unfinaled_date_by_tag.additionalProperties","typeLabel":"string"},"type":"object","title":"Last Unfinaled Date By Tag","description":"Map tag -> latest non-final start_date under the clear rule.","default":{},"uniqueKey":"\\items.items.[INDEX].last_unfinaled_date_by_tag","typeLabel":"Last Unfinaled Date By Tag · object"},"last_date_by_pair":{"additionalProperties":{"type":"string","uniqueKey":"\\items.items.[INDEX].last_date_by_pair.additionalProperties","typeLabel":"string"},"type":"object","title":"Last Date By Pair","description":"Map tag:status -> latest permit start_date.","default":{},"uniqueKey":"\\items.items.[INDEX].last_date_by_pair","typeLabel":"Last Date By Pair · object"},"last_date_by_status":{"additionalProperties":{"type":"string","uniqueKey":"\\items.items.[INDEX].last_date_by_status.additionalProperties","typeLabel":"string"},"type":"object","title":"Last Date By Status","description":"Map status -> latest permit start_date.","default":{},"uniqueKey":"\\items.items.[INDEX].last_date_by_status","typeLabel":"Last Date By Status · object"},"last_permit_date":{"oneOf":[{"type":"string","title":"Last Permit Date","description":"Latest permit start_date across all of the address's permits; null when never permitted.","format":"date","uniqueKey":"\\items.items.[INDEX].last_permit_date.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","title":"Last Permit Date","description":"Latest permit start_date across all of the address's permits; null when never permitted.","uniqueKey":"\\items.items.[INDEX].last_permit_date.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].last_permit_date","typeLabel":"string\u003cdate> | null"},"apn":{"oneOf":[{"type":"string","title":"Apn","description":"Assessor parcel number.","uniqueKey":"\\items.items.[INDEX].apn.oneOf.0","typeLabel":"string"},{"type":"null","title":"Apn","description":"Assessor parcel number.","uniqueKey":"\\items.items.[INDEX].apn.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].apn","typeLabel":"string | null"},"property_type":{"oneOf":[{"type":"string","title":"Property Type","description":"Property type.","uniqueKey":"\\items.items.[INDEX].property_type.oneOf.0","typeLabel":"string"},{"type":"null","title":"Property Type","description":"Property type.","uniqueKey":"\\items.items.[INDEX].property_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].property_type","typeLabel":"string | null"},"property_type_detail":{"oneOf":[{"type":"string","title":"Property Type Detail","description":"Property type detail.","uniqueKey":"\\items.items.[INDEX].property_type_detail.oneOf.0","typeLabel":"string"},{"type":"null","title":"Property Type Detail","description":"Property type detail.","uniqueKey":"\\items.items.[INDEX].property_type_detail.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].property_type_detail","typeLabel":"string | null"},"year_built":{"oneOf":[{"type":"integer","title":"Year Built","description":"Year the property was built.","uniqueKey":"\\items.items.[INDEX].year_built.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Year Built","description":"Year the property was built.","uniqueKey":"\\items.items.[INDEX].year_built.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].year_built","typeLabel":"integer | null"},"lot_size":{"oneOf":[{"type":"integer","title":"Lot Size","description":"Lot size of the property.","uniqueKey":"\\items.items.[INDEX].lot_size.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Lot Size","description":"Lot size of the property.","uniqueKey":"\\items.items.[INDEX].lot_size.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].lot_size","typeLabel":"integer | null"},"story_count":{"oneOf":[{"type":"integer","title":"Story Count","description":"Number of stories in the property.","uniqueKey":"\\items.items.[INDEX].story_count.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Story Count","description":"Number of stories in the property.","uniqueKey":"\\items.items.[INDEX].story_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].story_count","typeLabel":"integer | null"},"unit_count":{"oneOf":[{"type":"integer","title":"Unit Count","description":"Number of units in the property.","uniqueKey":"\\items.items.[INDEX].unit_count.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Unit Count","description":"Number of units in the property.","uniqueKey":"\\items.items.[INDEX].unit_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].unit_count","typeLabel":"integer | null"},"building_area":{"oneOf":[{"type":"integer","title":"Building Area","description":"Building area of the property.","uniqueKey":"\\items.items.[INDEX].building_area.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Building Area","description":"Building area of the property.","uniqueKey":"\\items.items.[INDEX].building_area.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].building_area","typeLabel":"integer | null"},"assess_market_value":{"oneOf":[{"type":"integer","title":"Assess Market Value","description":"Assessed market value in integer cents (dollars x 100).","uniqueKey":"\\items.items.[INDEX].assess_market_value.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Assess Market Value","description":"Assessed market value in integer cents (dollars x 100).","uniqueKey":"\\items.items.[INDEX].assess_market_value.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].assess_market_value","typeLabel":"integer | null"},"owner_type":{"oneOf":[{"type":"string","title":"Owner Type","description":"Type of property owner.","uniqueKey":"\\items.items.[INDEX].owner_type.oneOf.0","typeLabel":"string"},{"type":"null","title":"Owner Type","description":"Type of property owner.","uniqueKey":"\\items.items.[INDEX].owner_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].owner_type","typeLabel":"string | null"},"legal_owner":{"oneOf":[{"type":"string","title":"Legal Owner","description":"Legal owner of the property.","uniqueKey":"\\items.items.[INDEX].legal_owner.oneOf.0","typeLabel":"string"},{"type":"null","title":"Legal Owner","description":"Legal owner of the property.","uniqueKey":"\\items.items.[INDEX].legal_owner.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].legal_owner","typeLabel":"string | null"},"trust":{"oneOf":[{"type":"object","title":"PropertyTrust","description":"Per-row absence-honesty surface; present only on absence-class responses.","required":["unresolved_rate","coverage_tier","data_horizon","horizon_basis","trust_jurisdiction_basis","footprint_basis"],"properties":{"unresolved_rate":{"type":"number","maximum":1,"minimum":0,"title":"Unresolved Rate","description":"Share of the row jurisdiction's permits of the tag that never linked to an address.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.unresolved_rate","typeLabel":"number"},"coverage_tier":{"type":"string","enum":["high","medium","low"],"title":"Coverage Tier","description":"Coverage bucket for the row's jurisdiction (90/50 cutoffs).","isRequired":true,"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.coverage_tier","typeLabel":"enum\u003cstring>"},"data_horizon":{"type":"string","format":"date","title":"Data Horizon","description":"Most recent start_date past which 'no X since D' is under-observed; never null.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.data_horizon","typeLabel":"string\u003cdate>"},"horizon_basis":{"type":"string","enum":["measured","pooled","prior"],"title":"Horizon Basis","description":"How data_horizon was estimated: a measured cohort, a pooled fallback, or the state prior.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.horizon_basis","typeLabel":"enum\u003cstring>"},"trust_jurisdiction_basis":{"type":"string","enum":["own","dominant","unknown"],"title":"Trust Jurisdiction Basis","description":"Whether the trust join used the row's own jurisdiction, its ZIP's dominant one, or none.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.trust_jurisdiction_basis","typeLabel":"enum\u003cstring>"},"footprint_basis":{"type":"string","enum":["matched","unknown"],"title":"Footprint Basis","description":"Whether footprint suppression could resolve the row's geo scope.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.footprint_basis","typeLabel":"enum\u003cstring>"},"trust_jurisdiction_error_bar":{"type":"number","maximum":1,"minimum":0,"title":"Trust Jurisdiction Error Bar","description":"Measured error rate of the trust jurisdiction: the 6.13% ZIP-dominant estimate error on a 'dominant' basis, 0 on an 'own' or 'unknown' basis.","default":0,"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.trust_jurisdiction_error_bar","typeLabel":"number"},"flags":{"items":{"type":"string","uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.flags.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Flags","description":"Row-grain honesty flags, e.g. since_d_beyond_horizon or trust_row_missing.","default":[],"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0.flags","typeLabel":"string[]"}},"uniqueKey":"\\items.items.[INDEX].trust.oneOf.0","typeLabel":"PropertyTrust · object"},{"type":"null","description":"Per-row absence-honesty surface; present only on absence-class responses.","uniqueKey":"\\items.items.[INDEX].trust.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].trust","typeLabel":"PropertyTrust · object | null"}},"type":"object","required":["id"],"title":"PropertiesRead","description":"Response schema for one property, served by both /properties endpoints.\n\nThe public id is the base64 address handle. Presence arrays and the maps default to\npresent-and-empty so a never-permitted row serializes zero counts and empty\ncollections; attributes, dates, and trust are nullable. trust is None on non-absence\nresponses and a PropertyTrust on absence responses (optional-by-polarity).","uniqueKey":"\\items.items.[INDEX]","typeLabel":"PropertiesRead · object"},"type":"array","title":"Items","description":"The list of items returned in the response following given criteria.","isRequired":true,"uniqueKey":"\\items","typeLabel":"PropertiesRead · object[]"},"size":{"type":"integer","title":"Size","description":"The number of items returned in the response.","isRequired":true,"uniqueKey":"size","typeLabel":"integer"},"next_cursor":{"oneOf":[{"type":"string","title":"Next Cursor","description":"The cursor for retrieving the next page of results.","isRequired":true,"uniqueKey":"next_cursor.oneOf.0","typeLabel":"string"},{"type":"null","title":"Next Cursor","description":"The cursor for retrieving the next page of results.","isRequired":true,"uniqueKey":"next_cursor.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"next_cursor","typeLabel":"string | null"},"total_count":{"oneOf":[{"type":"object","title":"TotalCount","description":"Top-level count object, not an integer: {\"value\": 970, \"relation\": \"eq\"}. \"eq\" means an exact count up to 10,000. \"gte\" means at least 10,000 matches, with value set to 10,000. Counted only when requested on the first page without a cursor. null when not requested, on later pages, or when the count query times out.","required":["value","relation"],"example":{"relation":"eq","value":970},"properties":{"value":{"type":"integer","minimum":0,"title":"Value","description":"The count value; capped at the probe's cap (10,000 on the wire).","isRequired":true,"uniqueKey":"total_count.oneOf.0.value","typeLabel":"integer"},"relation":{"type":"string","enum":["eq","gte"],"title":"Relation","description":"\"eq\" means value is the exact count. \"gte\" means the actual count is at least value (the cap).","isRequired":true,"uniqueKey":"total_count.oneOf.0.relation","typeLabel":"enum\u003cstring>"}},"uniqueKey":"total_count.oneOf.0","typeLabel":"TotalCount · object"},{"type":"null","description":"Top-level count object, not an integer: {\"value\": 970, \"relation\": \"eq\"}. \"eq\" means an exact count up to 10,000. \"gte\" means at least 10,000 matches, with value set to 10,000. Counted only when requested on the first page without a cursor. null when not requested, on later pages, or when the count query times out.","example":{"relation":"eq","value":970},"uniqueKey":"total_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"total_count","typeLabel":"TotalCount · object | null"},"trust_summary":{"oneOf":[{"type":"object","title":"TrustSummary","description":"Row-weighted trust summary; present only on absence-class responses.","required":["rows_flagged","row_weighted_unresolved_rate","expected_miss_rate","suppressed_scopes"],"properties":{"rows_flagged":{"type":"integer","minimum":0,"title":"Rows Flagged","description":"Number of rows on the page carrying a trust flag.","isRequired":true,"uniqueKey":"trust_summary.oneOf.0.rows_flagged","typeLabel":"integer"},"row_weighted_unresolved_rate":{"type":"number","maximum":1,"minimum":0,"title":"Row Weighted Unresolved Rate","description":"Row-weighted mean unresolved_rate across the page.","isRequired":true,"uniqueKey":"trust_summary.oneOf.0.row_weighted_unresolved_rate","typeLabel":"number"},"expected_miss_rate":{"type":"number","maximum":1,"minimum":0,"title":"Expected Miss Rate","description":"Estimated share of true matches absent from arrived data due to ingestion lag.","isRequired":true,"uniqueKey":"trust_summary.oneOf.0.expected_miss_rate","typeLabel":"number"},"suppressed_scopes":{"type":"integer","minimum":0,"title":"Suppressed Scopes","description":"Number of footprint scopes excluded from the result by suppression.","isRequired":true,"uniqueKey":"trust_summary.oneOf.0.suppressed_scopes","typeLabel":"integer"}},"uniqueKey":"trust_summary.oneOf.0","typeLabel":"TrustSummary · object"},{"type":"null","description":"Row-weighted trust summary; present only on absence-class responses.","uniqueKey":"trust_summary.oneOf.1","typeLabel":"null"}],"uniqueKey":"trust_summary","typeLabel":"TrustSummary · object | null"}},"type":"object","required":["items","size","next_cursor"],"title":"PaginatedPropertiesResponse","description":"Paginated /properties response; carries the honesty summary on absence pages.","uniqueKey":"","typeLabel":"PaginatedPropertiesResponse · object"},"examples":{"Example":{"title":"Example","value":{"items":[{"id":"\u003cstring>","street_no":"\u003cstring>","street":"\u003cstring>","city":"\u003cstring>","city_id":"\u003cstring>","zip_code":"\u003cstring>","zip_code_ext":"\u003cstring>","county":"\u003cstring>","county_id":"\u003cstring>","state":"\u003cstring>","lat":123,"long":123,"permit_count":0,"untagged_permit_count":0,"total_job_value":0,"contractor_count":0,"tags":[],"tag_status_pairs":[],"statuses":[],"tag_tally":{},"last_date_by_tag":{},"last_unfinaled_date_by_tag":{},"last_date_by_pair":{},"last_date_by_status":{},"last_permit_date":"2023-12-25","apn":"\u003cstring>","property_type":"\u003cstring>","property_type_detail":"\u003cstring>","year_built":123,"lot_size":123,"story_count":123,"unit_count":123,"building_area":123,"assess_market_value":123,"owner_type":"\u003cstring>","legal_owner":"\u003cstring>","trust":{"unresolved_rate":0.5,"coverage_tier":"high","data_horizon":"2023-12-25","horizon_basis":"measured","trust_jurisdiction_basis":"own","footprint_basis":"matched","trust_jurisdiction_error_bar":0,"flags":[]}}],"size":123,"next_cursor":"\u003cstring>","total_count":{"relation":"eq","value":970},"trust_summary":{"rows_flagged":1,"row_weighted_unresolved_rate":0.5,"expected_miss_rate":0.5,"suppressed_scopes":1}}}},"exampleType":"generated"}},"exampleType":"generated"},"a0596b08-8532-4fd7-a02a-d4064fd9f554":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"oneOf":[{"type":"string","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"integer","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.1","typeLabel":"integer"}],"uniqueKey":"detail.items.[INDEX].loc.items.[INDEX]","typeLabel":"string | integer"},"type":"array","title":"Location","isRequired":true,"uniqueKey":"detail.items.[INDEX].loc","typeLabel":"(string | integer)[]"},"msg":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"detail.items.[INDEX].msg","typeLabel":"string"},"type":{"type":"string","title":"Error Type","isRequired":true,"uniqueKey":"detail.items.[INDEX].type","typeLabel":"string"},"input":{"oneOf":[{"title":"Input"}],"uniqueKey":"detail.items.[INDEX].input","typeLabel":"any"},"ctx":{"type":"object","title":"Context","uniqueKey":"detail.items.[INDEX].ctx","typeLabel":"Context · object"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError","uniqueKey":"detail.items.[INDEX]","typeLabel":"ValidationError · object"},"type":"array","title":"Detail","uniqueKey":"detail","typeLabel":"ValidationError · object[]"}},"type":"object","title":"HTTPValidationError","uniqueKey":"","typeLabel":"HTTPValidationError · object"},"examples":{"Example":{"title":"Example","value":{"detail":[{"loc":["\u003cstring>"],"msg":"\u003cstring>","type":"\u003cstring>","input":"\u003cunknown>","ctx":{}}]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"f598c7f3-f87c-44b6-9ac6-7b04d2531657":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"APIKeyHeader"}}},"servers":{"370fdb2b-7744-45ce-9b90-cd3a263353be":{"url":"https://api.shovels.ai/v2","description":"Shovels API"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"APIKeyHeader"},"schema":{"title":"X-API-Key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"APIKeyHeader","name":"X-API-Key"}],"title":"APIKeyHeader"}]},"originalFileLocation":"https://api.shovels.ai/spec/v2/openapi.production.yaml"},"subdomain":"shovelsai","siteName":"Shovels Documentation","title":"Search Properties - Shovels Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-03T18:08:20.913Z","originalFileLocation":"api-reference/properties/search-properties.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Beta. Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named legal_owners, most recently permitted first. At least one of geo_id and legal_owner is required; a legal_owner search needs no geo scope. Pass cursor from a page\u0026#x27;s next_cursor to page through results. Filter by permit_tags (presence and --prefixed exclusion), permit_status, permit_from, and property_type. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a --prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction\u0026#x27;s ingestion lag, is not counted against the claim. Every absence-class row carries a trust object stating three honesty terms — the jurisdiction\u0026#x27;s permit coverage_tier, its unresolved_rate (the share of its permits that never linked to an address), and the row\u0026#x27;s data_horizon — plus horizon_basis (whether that horizon is measured, pooled, or a state prior) and footprint_basis (whether suppression could resolve the row\u0026#x27;s geo); the response trust_summary row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim\u0026#x27;s staleness bound is the rebuild cadence plus each jurisdiction\u0026#x27;s permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent \u0026#x27;no permit since D\u0026#x27; stays under-observed until that lag elapses. Each row\u0026#x27;s data_horizon is the per-row handle on that bound — the most recent start_date past which \u0026#x27;no X since D\u0026#x27; is under-observed for that row. Not supported, each for one reason: permit_to or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); \u0026#x27;before D\u0026#x27; absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only \u0026#x27;ever\u0026#x27; and \u0026#x27;since D\u0026#x27; are expressible on max-date maps; \u0026#x27;has X since D and no Y since D\u0026#x27; in one query — a mixed query binds an exclusion to \u0026#x27;ever\u0026#x27;, so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Shovels Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Search Properties - Shovels Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Beta. Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named legal_owners, most recently permitted first. At least one of geo_id and legal_owner is required; a legal_owner search needs no geo scope. Pass cursor from a page\u0026#x27;s next_cursor to page through results. Filter by permit_tags (presence and --prefixed exclusion), permit_status, permit_from, and property_type. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a --prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction\u0026#x27;s ingestion lag, is not counted against the claim. Every absence-class row carries a trust object stating three honesty terms — the jurisdiction\u0026#x27;s permit coverage_tier, its unresolved_rate (the share of its permits that never linked to an address), and the row\u0026#x27;s data_horizon — plus horizon_basis (whether that horizon is measured, pooled, or a state prior) and footprint_basis (whether suppression could resolve the row\u0026#x27;s geo); the response trust_summary row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim\u0026#x27;s staleness bound is the rebuild cadence plus each jurisdiction\u0026#x27;s permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent \u0026#x27;no permit since D\u0026#x27; stays under-observed until that lag elapses. Each row\u0026#x27;s data_horizon is the per-row handle on that bound — the most recent start_date past which \u0026#x27;no X since D\u0026#x27; is under-observed for that row. Not supported, each for one reason: permit_to or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); \u0026#x27;before D\u0026#x27; absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only \u0026#x27;ever\u0026#x27; and \u0026#x27;since D\u0026#x27; are expressible on max-date maps; \u0026#x27;has X since D and no Y since D\u0026#x27; in one query — a mixed query binds an exclusion to \u0026#x27;ever\u0026#x27;, so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Shovels Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.shovels.ai/api-reference/properties/search-properties\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.shovels.ai/assets/shovels-logo.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Search Properties - Shovels Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Beta. Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named legal_owners, most recently permitted first. At least one of geo_id and legal_owner is required; a legal_owner search needs no geo scope. Pass cursor from a page\u0026#x27;s next_cursor to page through results. Filter by permit_tags (presence and --prefixed exclusion), permit_status, permit_from, and property_type. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a --prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction\u0026#x27;s ingestion lag, is not counted against the claim. Every absence-class row carries a trust object stating three honesty terms — the jurisdiction\u0026#x27;s permit coverage_tier, its unresolved_rate (the share of its permits that never linked to an address), and the row\u0026#x27;s data_horizon — plus horizon_basis (whether that horizon is measured, pooled, or a state prior) and footprint_basis (whether suppression could resolve the row\u0026#x27;s geo); the response trust_summary row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim\u0026#x27;s staleness bound is the rebuild cadence plus each jurisdiction\u0026#x27;s permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent \u0026#x27;no permit since D\u0026#x27; stays under-observed until that lag elapses. Each row\u0026#x27;s data_horizon is the per-row handle on that bound — the most recent start_date past which \u0026#x27;no X since D\u0026#x27; is under-observed for that row. Not supported, each for one reason: permit_to or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); \u0026#x27;before D\u0026#x27; absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only \u0026#x27;ever\u0026#x27; and \u0026#x27;since D\u0026#x27; are expressible on max-date maps; \u0026#x27;has X since D and no Y since D\u0026#x27; in one query — a mixed query binds an exclusion to \u0026#x27;ever\u0026#x27;, so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.shovels.ai/assets/shovels-logo.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/shovelsai/0tzx6OgdpifPiQBm/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Shovels Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#01654D\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.shovels.ai/api-reference/properties/search-properties\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/properties/search-properties.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.shovels.ai/#organization\",\"name\":\"Shovels Documentation\",\"url\":\"https://docs.shovels.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/shovelsai/RpZdSdGGx61eI0yq/assets/shovels-logo.png?fit=max\u0026auto=format\u0026n=RpZdSdGGx61eI0yq\u0026q=85\u0026s=4580f7cd0725b33ba31367d40fda3bbf\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.shovels.ai#website\",\"name\":\"Shovels Documentation\",\"url\":\"https://docs.shovels.ai\",\"publisher\":{\"@id\":\"https://docs.shovels.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.shovels.ai/api-reference/properties/search-properties#webpage\",\"url\":\"https://docs.shovels.ai/api-reference/properties/search-properties\",\"name\":\"Search Properties\",\"description\":\"Beta. Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named legal_owners, most recently permitted first. At least one of geo_id and legal_owner is required; a legal_owner search needs no geo scope. Pass cursor from a page's next_cursor to page through results. Filter by permit_tags (presence and --prefixed exclusion), permit_status, permit_from, and property_type. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a --prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction's ingestion lag, is not counted against the claim. Every absence-class row carries a trust object stating three honesty terms — the jurisdiction's permit coverage_tier, its unresolved_rate (the share of its permits that never linked to an address), and the row's data_horizon — plus horizon_basis (whether that horizon is measured, pooled, or a state prior) and footprint_basis (whether suppression could resolve the row's geo); the response trust_summary row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim's staleness bound is the rebuild cadence plus each jurisdiction's permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent 'no permit since D' stays under-observed until that lag elapses. Each row's data_horizon is the per-row handle on that bound — the most recent start_date past which 'no X since D' is under-observed for that row. Not supported, each for one reason: permit_to or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); 'before D' absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only 'ever' and 'since D' are expressible on max-date maps; 'has X since D and no Y since D' in one query — a mixed query binds an exclusion to 'ever', so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.\",\"dateModified\":\"2026-11-03T18:08:20.913Z\",\"isPartOf\":{\"@id\":\"https://docs.shovels.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.shovels.ai/api-reference/properties/search-properties#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.shovels.ai/api-reference/properties/search-properties#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.shovels.ai/api-reference/permits/search-permits\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Properties\",\"item\":\"https://docs.shovels.ai/api-reference/properties/get-properties-by-id\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Search Properties\",\"item\":\"https://docs.shovels.ai/api-reference/properties/search-properties\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.shovels.ai/api-reference/properties/search-properties#apireference\",\"headline\":\"Search Properties\",\"name\":\"Search Properties\",\"description\":\"Beta. Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties within a geo scope (state, county, city, ZIP, ZIP+4, or address) and/or owned by named legal_owners, most recently permitted first. At least one of geo_id and legal_owner is required; a legal_owner search needs no geo scope. Pass cursor from a page's next_cursor to page through results. Filter by permit_tags (presence and --prefixed exclusion), permit_status, permit_from, and property_type. Properties with no attributed type are excluded; property attributes are available for 70.1% of properties. An absence filter (a --prefixed tag) returns properties with no resolved permit of the excluded type in covered, arrived data: a permit that never linked to an address, or one that has not yet arrived within a jurisdiction's ingestion lag, is not counted against the claim. Every absence-class row carries a trust object stating three honesty terms — the jurisdiction's permit coverage_tier, its unresolved_rate (the share of its permits that never linked to an address), and the row's data_horizon — plus horizon_basis (whether that horizon is measured, pooled, or a state prior) and footprint_basis (whether suppression could resolve the row's geo); the response trust_summary row-weights them across the page. A presence-only search omits both. Freshness: /properties is served from a whole-table rebuild swapped in by a blue/green cutover — the rebuild is the unit of refresh, and the absence-trust metadata is rebuilt from the same data it describes. An absence claim's staleness bound is the rebuild cadence plus each jurisdiction's permit-ingestion lag: permits reach the data a median 84 days (p90 188 days) after their start_date, so a recent 'no permit since D' stays under-observed until that lag elapses. Each row's data_horizon is the per-row handle on that bound — the most recent start_date past which 'no X since D' is under-observed for that row. Not supported, each for one reason: permit_to or any upper date bound — a max-date rollup cannot bound a closed date window without dropping addresses whose latest permit postdates it (use /permits/search); 'before D' absence — a max-date cannot tell a history that also holds later permits from one that does not; closed-window absence within [D1, D2] — only 'ever' and 'since D' are expressible on max-date maps; 'has X since D and no Y since D' in one query — a mixed query binds an exclusion to 'ever', so per-predicate dates cannot be composed; and jurisdiction geo_ids as a scope.\",\"url\":\"https://docs.shovels.ai/api-reference/properties/search-properties\",\"mainEntityOfPage\":{\"@id\":\"https://docs.shovels.ai/api-reference/properties/search-properties#webpage\"},\"image\":\"https://docs.shovels.ai/assets/shovels-logo.png\",\"dateModified\":\"2026-11-03T18:08:20.913Z\",\"publisher\":{\"@id\":\"https://docs.shovels.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.shovels.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Shovels Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Shovels Documentation","nav":{"global":{"anchors":[{"anchor":"Data Dictionary","icon":"book-open-cover","href":"https://www.shovels.ai/data-dictionary"},{"anchor":"Coverage Dashboard","icon":"map-pin","href":"https://www.shovels.ai/coverage"},{"anchor":"Community","icon":"discord","href":"https://discord.gg/Nypja3cKDx"},{"anchor":"Blog","icon":"newspaper","href":"https://www.shovels.ai/blog/"}]},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/docs/introduction"}]},{"tab":"API Reference","groups":[{"group":"Getting Started","pages":[{"title":"About the API Reference","href":"/docs/api-reference-about"}]},{"group":"Endpoints","pages":[{"group":"Permits","pages":[{"title":"Search Permits","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /permits/search","href":"/api-reference/permits/search-permits"},{"title":"Get Permits By Id","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /permits","href":"/api-reference/permits/get-permits-by-id"}]},{"group":"Decisions","pages":[{"title":"Search Decisions","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /decisions/search","href":"/api-reference/decisions/search-decisions"},{"title":"Get Decisions By Id","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /decisions","href":"/api-reference/decisions/get-decisions-by-id"}]},{"group":"Contractors","pages":[{"title":"Get Contractors By Id","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /contractors","href":"/api-reference/contractors/get-contractors-by-id"},{"title":"Search Contractors","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /contractors/search","href":"/api-reference/contractors/search-contractors"},{"title":"Get Permits By Contractor Id","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /contractors/{id}/permits","href":"/api-reference/contractors/get-permits-by-contractor-id"},{"title":"Get Contractor Employees","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /contractors/{id}/employees","href":"/api-reference/contractors/get-contractor-employees"},{"title":"Get Filtered Metrics By Contractor Id","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /contractors/{id}/metrics","href":"/api-reference/contractors/get-filtered-metrics-by-contractor-id"}]},{"group":"Addresses","pages":[{"title":"Search Addresses","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /addresses/search","href":"/api-reference/addresses/search-addresses"},{"title":"Get Address Metrics Monthly","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /addresses/{geo_id}/metrics/monthly","href":"/api-reference/addresses/get-address-metrics-monthly"},{"title":"Get Address Metrics Current","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /addresses/{geo_id}/metrics/current","href":"/api-reference/addresses/get-address-metrics-current"},{"title":"Get Residents","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /addresses/{geo_id}/residents","href":"/api-reference/addresses/get-residents"}]},{"group":"Cities","pages":[{"title":"Search Cities","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /cities/search","href":"/api-reference/cities/search-cities"},{"title":"Get City Metrics Monthly","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /cities/{geo_id}/metrics/monthly","href":"/api-reference/cities/get-city-metrics-monthly"},{"title":"Get City Metrics Current","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /cities/{geo_id}/metrics/current","href":"/api-reference/cities/get-city-metrics-current"},{"title":"Get City Details","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /cities","href":"/api-reference/cities/get-city-details"}]},{"group":"Counties","pages":[{"title":"Search Counties","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /counties/search","href":"/api-reference/counties/search-counties"},{"title":"Get County Metrics Monthly","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /counties/{geo_id}/metrics/monthly","href":"/api-reference/counties/get-county-metrics-monthly"},{"title":"Get County Metrics Current","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /counties/{geo_id}/metrics/current","href":"/api-reference/counties/get-county-metrics-current"},{"title":"Get County Details","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /counties","href":"/api-reference/counties/get-county-details"}]},{"group":"Jurisdictions","pages":[{"title":"Search Jurisdictions","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /jurisdictions/search","href":"/api-reference/jurisdictions/search-jurisdictions"},{"title":"Get Jurisdiction Metrics Monthly","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /jurisdictions/{geo_id}/metrics/monthly","href":"/api-reference/jurisdictions/get-jurisdiction-metrics-monthly"},{"title":"Get Jurisdiction Metrics Current","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /jurisdictions/{geo_id}/metrics/current","href":"/api-reference/jurisdictions/get-jurisdiction-metrics-current"},{"title":"Get Jurisdiction Details","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /jurisdictions","href":"/api-reference/jurisdictions/get-jurisdiction-details"}]},{"group":"Zipcodes","pages":[{"title":"Search Zipcodes","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /zipcodes/search","href":"/api-reference/zipcodes/search-zipcodes"}]},{"group":"States","pages":[{"title":"Search States","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /states/search","href":"/api-reference/states/search-states"}]},{"group":"Meta","pages":[{"title":"Get Data Release Date","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /meta/release","href":"/api-reference/meta/get-data-release-date"},{"title":"Get Coverage","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /meta/coverage","href":"/api-reference/meta/get-coverage"}]},{"group":"Lists","pages":[{"title":"Get All Available Zip Codes","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /list/zip","href":"/api-reference/lists/get-all-available-zip-codes"},{"title":"Get All Available Tags","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /list/tags","href":"/api-reference/lists/get-all-available-tags"}]},{"group":"Properties","pages":[{"title":"Get Properties By Id","description":"**Beta.** Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice. Treat the shape as unstable while it is in beta. Returns properties by their address id. Provide up to 50 `id` query parameters in one call; rows come back in request order and unknown ids are omitted (no per-id 404). A non-address geolocation id (city, county, or jurisdiction) is rejected.","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /properties","href":"/api-reference/properties/get-properties-by-id"},{"title":"Search Properties","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /properties/search","href":"/api-reference/properties/search-properties"}]},{"group":"Usage","pages":[{"title":"Get Usage","description":"Get your current credit usage for the rolling 30-day period.","deprecated":null,"version":null,"openapi":"https://api.shovels.ai/spec/v2/openapi.production.yaml get /usage","href":"/api-reference/usage/get-usage"}]}]}]},{"tab":"Release Notes","pages":[{"title":"Release Notes","href":"/release-notes/release-notes"}]},{"tab":"Knowledge Base","pages":[{"title":"Knowledge Base","href":"/docs/knowledge-base"}]}]},"basePath":"","title":"Search Properties - Shovels Documentation","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DX1Meug0.js","utils-B_OMIQVC.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-ChxhRPMa.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CuKvD8Iv.js","snippetPresets-C5d7p2hp.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CfHcE8m4.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C1zZV314.js","shallow-CmQhqCJn.js","getApiPlaygroundDisplay-YRo9s1O7.js","CodeSnippet-RN1MTdfk.js","CodeSnippets-DKLPHxJA.js","Page-BAvA99GL.js","getPastedJson-bz0M41mU.js","icon-CsmhpPrv.js","MethodPill-CNGsVE77.js","DuplicateIcon-DilfU_Z2.js","createIcon-BdsYzQck.js","DynamicMarkdown-CbqEDjbV.js","SectionHeading-O6hXpFCN.js","axios-vUo_bRtp.js","Markdown-nKm-uidQ.js","clsx-ClVdStUn.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CIQkMg3R.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-ImrFS4Fy.js"]}