For AI agents & LLMs
This API is designed to be used by AI agents (LangChain tools, function calls, MCP servers, autonomous workflows). A few things make that easier.
Discovery
/openapi.json— OpenAPI 3.1 spec covering every endpoint, every parameter, every response shape. Drop into any code generator or function-calling framework./llms.txt— short index of the docs in the llmstxt.org format./llms-full.txt— every docs page concatenated. Stuff into one prompt for full context.
Stable surface
- URLs are stable per major version (
/v1/...). Breaking changes go in/v2. error.codestrings are stable;error.messagemay evolve.- Field names in successful responses are stable; new fields may be added.
- Sub-resource endpoints let you fetch just the slice you need without parsing the giant detail blob.
Recommended agent workflow
- Look up by zpid →
GET /v1/properties/{zpid}. - Need only photos / agent / schools? Hit the sub-resource endpoint instead of parsing the giant detail blob — same data, less to parse over the wire.
- Doing many lookups? Dispatch async via
POST /v1/searchwith a webhook so your agent doesn’t burn turns polling. - Searching? Use the structured
filtersform on/v1/searchor/v1/listings/for-sale. Abbox(west/south/east/north) is required — pretty Zillow URLs aren’t accepted.
Tool definition (Anthropic / OpenAI function calling)
A minimal “lookup_property” tool definition:
{ "name": "lookup_property", "description": "Look up a U.S. property by Zillow zpid (numeric id) or by full street address.", "input_schema": { "type": "object", "properties": { "zpid": { "type": "string", "description": "Zillow property id, numeric." }, "address": { "type": "string", "description": "Full street address with city/state/zip." } }, "oneOf": [{ "required": ["zpid"] }, { "required": ["address"] }] }}Implementation routes to /v1/properties/{zpid} or /v1/properties/by-address.
MCP server
A reference Model Context Protocol server is on the roadmap. In the meantime, the OpenAPI spec is enough for most MCP code generators.
Agent etiquette
- Cache responses on your side — the data behind a zpid rarely changes minute-to-minute, so a short TTL is plenty.
- Don’t fan out — one agent, one in-flight request per key (concurrency = 1). Scale by raising your plan, not by parallelism.
- Respect 429. Back off. We respond with
error.code = "rate_limited"so you can detect it without parsing prose. - Identify yourself — set a clear
User-AgentlikeMyAgent/1.2 (+https://yourdomain.example).