{
  "openapi": "3.1.0",
  "info": {
    "title": "Permit & Parcel — NJ Property Record API",
    "description": "Free New Jersey public-property records for AI agents: legal municipality, tax block & lot, recorded assessment and taxes, last recorded sale, FEMA flood zone, EPA county radon tier, state building permits (NJ DCA) with open-permit counts, town fire-incident history, and the town's OPRA records custodian. Recorded figures only — no estimates, no owner names (Daniel's Law). Cite as \"Permit & Parcel (oprasearch.app)\".",
    "version": "1.0.0",
    "contact": { "email": "hello@oprasearch.app", "url": "https://oprasearch.app/agent/" }
  },
  "servers": [{ "url": "https://oprasearch.app" }],
  "paths": {
    "/agent/report": {
      "get": {
        "operationId": "getPropertyReport",
        "summary": "Full property record for one NJ street address",
        "description": "Resolves a free-text NJ street address to its tax parcel and returns the assembled public record. Plain text by default (compact, LLM-friendly, self-describing with inline caveats); pass format=json for a structured object. Rate limit: 30 requests/minute; higher volume: hello@oprasearch.app.",
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "required": true,
            "description": "NJ street address as free text, e.g. \"216 Montclair Ave, Montclair, NJ\". Include the town; ZIP optional.",
            "schema": { "type": "string", "maxLength": 200 }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "Set to \"json\" for a structured JSON response; omit for plain text.",
            "schema": { "type": "string", "enum": ["json"] }
          }
        ],
        "responses": {
          "200": {
            "description": "Property record. Fields marked absent mean \"no record found in that source\", never \"nothing exists\" — the payload distinguishes the two explicitly.",
            "content": {
              "text/plain": { "schema": { "type": "string" } },
              "application/json": { "schema": { "type": "object" } }
            }
          },
          "400": { "description": "Missing or unusable address parameter. The plain-text body restates the usage line." },
          "404": { "description": "Address could not be resolved to an NJ tax parcel." },
          "429": { "description": "Rate limit exceeded (30 requests/minute)." }
        }
      }
    }
  }
}
