{
  "openapi": "3.1.0",
  "info": {
    "title": "Investorlift Data Services API",
    "version": "1.0.0",
    "summary": "Rehab-aware valuation, maximum allowable offer and recorded transaction history — for a single property address or a batch of them.",
    "description": "The Investorlift Data Services API scores a property address and returns a rehab-aware valuation and the maximum allowable offer — the most a flip buyer on standard financing can pay and still clear the target margin.\n\n`https://api.investorliftdata.com` · JSON in, JSON out · Bearer API key\n\n<a href=\"/openapi.json\" download=\"openapi.json\" target=\"_blank\" rel=\"noopener\">Download the API description (OpenAPI)</a>\n\n<h2 id=\"authentication\">Authentication</h2>\n\nSend your API Key on every call as `Authorization: Bearer <API Key>`. Issue and revoke API Keys from the Portal; [API keys](/api-keys) shows how.\n\nA missing or wrong key is refused as [`401 invalid-key`](/errors/invalid-key), and nothing is charged.\n\n**Metering.** `POST /v1/predict` is a Metered Call: it is charged to the Account's Balance. The price of a call is resolved by the Ledger at the moment of the Spend and each call's page states its cost. `POST /v1/validate` is free: it charges nothing and keeps working at a zero Balance. With an API Key it answers even while the Ledger is down. A connected app — one that signed you in instead of holding an API Key — makes one Ledger read there to confirm the connection is still approved, so while that read is failing it answers 503 `call-not-started`. Nothing is charged either way.\n\n<h2 id=\"errors\">Errors</h2>\n\nEvery error response is an RFC 9457 Problem Detail sent as `application/problem+json`. Branch on its `type` member, a stable URI that never changes without a documented deprecation. Two errors can share a status, so the status alone is not enough.\n\nEvery error type, its status and whether anything was charged is listed in the [error reference](/errors).\n\nThe four 503 types mean different things, so never treat them alike:\n\n| `type` | What it tells you |\n|---|---|\n| [`ledger-unreachable`](/errors/ledger-unreachable) | The call was never started, and nothing was charged. |\n| [`call-not-started`](/errors/call-not-started) | The failure happened before the Ledger was called, so no Spend was recorded and nothing was charged. |\n| [`spend-indeterminate`](/errors/spend-indeterminate) | The outcome is not known, so it makes no claim about what was consumed. Any charge recorded for the call is returned as a Refund. |\n| [`route-unavailable`](/errors/route-unavailable) | The operator has switched the endpoint off for now, and nothing was charged. Wait for the `Retry-After` interval, then send the call again. |\n\n<h2 id=\"idempotent-requests\">Idempotent requests</h2>\n\nSend an `Idempotency-Key` header to make a retry safe. A call's page lists the header when the call accepts it; `POST /v1/predict`, `POST /v1/predict/batch` and `POST /v1/history` all do.\n\n- The header is optional. A request without one is never an error, and is charged per call.\n- Keys are scoped to your Account. One Account can never replay another Account's result.\n- Sending the same request with the same key within 24 hours returns the stored result, with one Spend however many times you send it. After 24 hours, the same key starts a new, charged request.\n- Only successful responses are stored. If the earlier call was refunded or stored nothing, the key is taken over: the new request runs and is charged.\n- The same key with a different request is refused as [`422 idempotency-key-conflict`](/errors/idempotency-key-conflict), and nothing is charged.\n- While an identical request is still in flight, a second send receives [`409 duplicate-request-in-flight`](/errors/duplicate-request-in-flight) with a `Retry-After` header, and nothing is charged.\n- If the Terms of Service changed since your Account last accepted them, a send within the window is refused as [`403 terms-not-accepted`](/errors/terms-not-accepted), and nothing is charged.\n\n\"The same request\" means the same body for a `POST` call, and the same path and query string for a `GET` call. `POST /v1/validate` charges nothing, so it ignores the header.\n\nThis API never retries a request on your behalf. A Metered Call can be charged before it fails, so retrying is yours to control, and the key is what makes it safe.\n\n<h2 id=\"rate-limits\">Rate limits</h2>\n\nRequests are counted per Account, in one count across every endpoint. Minting or rotating a key does not give you a fresh count.\n\nOver the limit, a request is refused as [`429 rate-limited`](/errors/rate-limited) before anything is charged. Its `Retry-After` header is authoritative: wait that many seconds, then send the request again. The body repeats the value as `retry_after`.\n\nThe other 429, [`spend-cap-exceeded`](/errors/spend-cap-exceeded), is a different limit and carries no `Retry-After`. Branch on `type`, never on the status alone.\n\nThe current defaults, by Tier:\n\n| Tier | Requests | Window |\n|---|---|---|\n| No valid API Key | 30 | 1 minute |\n| Public | 60 | 1 minute |\n| Reseller | 300 | 1 minute |\n\nAn Account's limit can be configured differently from these defaults, so obey the `Retry-After` header rather than this table.\n\nRequests without a valid API Key share one count between them. A burst with a bad key can therefore be answered `429` rather than [`401 invalid-key`](/errors/invalid-key): slow down rather than retry.\n\n<h2 id=\"request-ids\">Request IDs</h2>\n\nEvery response, success or failure, carries a `trace-id` header, and every Problem Detail repeats it as `trace_id`. That Trace ID is the only handle support needs to find your call, so log it with each request.\n\n**Support.** Questions about a call, an Account or a Refund go to `support@investorliftdata.com`. Quote the Trace ID from the response.\n\n<h2 id=\"pagination\">Pagination</h2>\n\nA call that returns a list takes two query parameters, `limit` and `cursor`. `limit` is how many rows to return, from 1 to 500, and 100 when you send none. `cursor` asks for the next page.\n\nIts answer carries a `page` member with `next_cursor`, `limit` and `returned`. Send `next_cursor` back as `cursor` to read the next page; when it is `null`, you have the last one.\n\nA cursor stops working when the data is refreshed. Start again from the first page.\n\n<h2 id=\"versioning\">Versioning</h2>\n\nThe version is in the path: every call lives under `/v1`, and `/v1` is the only version today.\n\nAdditive changes, such as new fields, new calls and new optional inputs, ship without a new version and are announced in the [Changelog](/changelog).\n\nA breaking change ships as a new version, and the previous version keeps working for 90 days after the announcement.\n\nAn error's `type` and its HTTP status are part of the version: renaming or re-statusing one is a breaking change.\n\n<h2 id=\"try-it-from-these-pages\">Try it from these pages</h2>\n\nA request sent from this page is a real call and is charged at the price shown for it; checking a request with `/v1/validate` is free.\n\nTo try a call, open its **Test** panel, choose **api_key** (API key), and paste your key into **Authorize**. Need a key? See [API keys](/api-keys). A `401` means the key needs attention: see [API keys](/api-keys). A `402` means the balance is not enough: see [How your balance works](/balance) or [add funds](https://investorliftdata.com/app/billing).",
    "contact": {
      "name": "Investorlift Data Services support"
    }
  },
  "servers": [
    {
      "url": "https://api.investorliftdata.com"
    }
  ],
  "security": [
    {
      "api_key": []
    },
    {
      "connected_app": []
    }
  ],
  "tags": [
    {
      "name": "Scoring",
      "description": "Score one property address or a batch of them, and check what you send before anything is charged.",
      "x-zudoku-seo": {
        "title": "Scoring",
        "description": "Score a property address or a batch of them: a rehab-aware valuation and the maximum allowable offer, with comparable sales."
      }
    },
    {
      "name": "History",
      "description": "Property history: a property’s recorded transaction history.",
      "x-zudoku-seo": {
        "title": "Property history",
        "description": "A property’s recorded transaction history, from the county record."
      }
    },
    {
      "name": "Properties",
      "description": "Find a property by address, then read its record, its ownership history and its listing history.",
      "x-zudoku-seo": {
        "title": "Properties",
        "description": "Find a property by address and read its record, ownership history and listing history."
      }
    },
    {
      "name": "Listings and sales",
      "description": "Homes for sale and for rent near a place, one listing in full, and recent sales.",
      "x-zudoku-seo": {
        "title": "Listings and sales",
        "description": "Homes for sale and for rent near a place, one listing in full, and recent sales near a place."
      }
    },
    {
      "name": "Investors",
      "description": "Investor purchases near a place, the investors buying in a set of ZIP codes, the investors who buy homes like a given one, and an investor company found by name.",
      "x-zudoku-seo": {
        "title": "Investors",
        "description": "Investor purchases near a place, the investors active in a set of ZIP codes, and the investors who buy homes like a given one."
      }
    },
    {
      "name": "Investor companies",
      "description": "One investor company’s profile, purchases and sales.",
      "x-zudoku-seo": {
        "title": "Investor companies",
        "description": "Read one investor company’s profile, and the homes it bought and sold."
      }
    },
    {
      "name": "Lenders",
      "description": "The lenders active in a place, and one lender’s profile, loans and borrowers.",
      "x-zudoku-seo": {
        "title": "Lenders",
        "description": "The lenders active in a place, and one lender’s profile, loans and borrowers."
      }
    },
    {
      "name": "ZIP codes and coverage",
      "description": "Snapshots of one or several ZIP codes, the sellers in a ZIP code, and where the data service has data.",
      "x-zudoku-seo": {
        "title": "ZIP codes and coverage",
        "description": "Snapshots of one or several ZIP codes, the sellers in a ZIP code, and where the data service has data."
      }
    },
    {
      "name": "MCP",
      "description": "Connect an AI assistant to the API over the Model Context Protocol.",
      "x-zudoku-seo": {
        "title": "MCP",
        "description": "Connect an AI assistant to Investorlift Data Services over the Model Context Protocol."
      }
    }
  ],
  "x-tagGroups": [
    {
      "name": "Scoring",
      "tags": [
        "Scoring"
      ]
    },
    {
      "name": "Property history",
      "tags": [
        "History"
      ]
    },
    {
      "name": "Property data",
      "tags": [
        "Properties",
        "Listings and sales",
        "Investors",
        "Investor companies",
        "Lenders",
        "ZIP codes and coverage"
      ]
    },
    {
      "name": "MCP",
      "tags": [
        "MCP"
      ]
    }
  ],
  "paths": {
    "/v1/predict": {
      "post": {
        "operationId": "predict",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Score a property address",
        "description": "**Cost:** $1.00 per address answered\n\nScores a single property address and returns a rehab-aware valuation and the maximum allowable offer — the most a flip buyer on standard financing can pay and still clear the target margin.\n\nThis is a Metered Call. The price is resolved by the Ledger inside the same transaction that records the Spend; it is never sent by the client. The Spend is committed **before** the scoring service is called, so a call that reaches the scoring service has already been paid for, and a call that fails before the Spend consumes nothing.\n\nSend an `Idempotency-Key` to make a retry safe. A key is replayed only when the earlier call succeeded and its response was stored. If the earlier call was refunded, ended without a stored response, or is older than the replay window, the key is taken over: the new request runs and is charged, whatever body it carries. Otherwise the same key sent with a different body is refused as a conflict, and nothing is charged for it.\n\n`POST /v1/validate` is the validation endpoint for this call, and it is free.\n\nSend the optional boolean `partial_answer` to ask for a partial answer. It is accepted on this endpoint and the free `POST /v1/validate` check, and refused on the batch endpoint. When it is `true` and we found the property but the pricing model does not price it, the answer is a `200` with `max_allowable_offer: null`, the `subject_property` facts and `outside_model_range.reasons`, and it is charged as an answer. When it is absent or `false`, that case is a `422 unscorable-address` and the charge is returned to your balance, as before. An address we cannot find is not charged either way.\n\nA request sent from this page is a real call and is charged at the price shown for it; checking a request with `/v1/validate` is free.",
        "tags": [
          "Scoring"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Exactly one property. Sending more properties than this endpoint accepts is rejected before any Spend.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SingleScoredCallRequest"
              },
              "examples": {
                "score-a-property": {
                  "summary": "Score a property",
                  "value": {
                    "address": "1026 N Beckley Ave, Dallas, TX 75203"
                  }
                },
                "score-with-your-own-numbers": {
                  "summary": "Score a property with your own repair budget and target margin",
                  "description": "Both options are additive: this body and the one above are the same call, priced on different figures. The repair budget is in whole dollars and replaces the `condition` bracket entirely; the target margin is a fraction of the repaired value. The answer echoes both back as the numbers the arithmetic used, and breaks them out in `cost_stack`.",
                  "value": {
                    "address": "1026 N Beckley Ave, Dallas, TX 75203",
                    "rehab_budget": 48000,
                    "target_margin": 0.25
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The Scored Call succeeded. This was a Metered Call, so the call was charged to the Account's Balance, as resolved by the Ledger.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScoredCallResponse"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "comps": [
                        {
                          "sqft": 2080,
                          "lotsize": 6500,
                          "bedrooms": 6,
                          "bathrooms": 2,
                          "sale_date": "2024-12-03",
                          "sale_price": 246641,
                          "year_built": 1945,
                          "address_zip": "75203",
                          "property_id": "00000000000000000000000000000001",
                          "address_city": "Dallas",
                          "address_state": "TX",
                          "property_type": "Single Family",
                          "address_street": "523 N Marsalis Ave",
                          "distance_miles": 0.4,
                          "similarity_rank": 1,
                          "price_per_square_foot": 119
                        },
                        {
                          "sqft": 1400,
                          "lotsize": 7025,
                          "bedrooms": 3,
                          "bathrooms": 1,
                          "sale_date": "2026-05-08",
                          "sale_price": 234999,
                          "year_built": 1930,
                          "address_zip": "75203",
                          "property_id": "00000000000000000000000000000001",
                          "address_city": "Dallas",
                          "address_state": "TX",
                          "property_type": "Single Family",
                          "address_street": "102 E 5th St",
                          "distance_miles": 0.09,
                          "similarity_rank": 2,
                          "price_per_square_foot": 168
                        },
                        {
                          "sqft": 1787,
                          "lotsize": 6678,
                          "bedrooms": 4,
                          "bathrooms": 2,
                          "sale_date": "2025-03-05",
                          "sale_price": 503139,
                          "year_built": 1945,
                          "address_zip": "75208",
                          "property_id": "00000000000000000000000000000001",
                          "address_city": "Dallas",
                          "address_state": "TX",
                          "property_type": "Single Family",
                          "address_street": "818 Elsbeth St",
                          "distance_miles": 0.24,
                          "similarity_rank": 3,
                          "price_per_square_foot": 282
                        }
                      ],
                      "comp_band": {
                        "low": 388634,
                        "high": 942020,
                        "median": 571412
                      },
                      "cost_stack": {
                        "loan": 331200,
                        "points": 6624,
                        "interest": 6533,
                        "hold_days": 60,
                        "down_payment": 82800,
                        "closing_costs": 29562,
                        "target_profit": 114282
                      },
                      "rehab_budget": 0,
                      "target_margin": 0.2,
                      "valuation_mean": 1016099,
                      "subject_property": {
                        "facts": {
                          "bathrooms": {
                            "value": 2,
                            "source": "county-record"
                          },
                          "year_built": {
                            "value": 1935,
                            "source": "county-record"
                          },
                          "square_feet": {
                            "value": 2047,
                            "source": "county-record"
                          },
                          "property_type": {
                            "value": "Single Family",
                            "source": "county-record"
                          },
                          "lot_size_square_feet": {
                            "value": 7100,
                            "source": "county-record"
                          }
                        },
                        "address": {
                          "zip": "75203",
                          "city": "Dallas",
                          "state": "TX",
                          "street": "1026 N Beckley Ave"
                        },
                        "property_id": "00000000000000000000000000000001",
                        "address_quality": {
                          "code": "zip-confirmed",
                          "statement": "The house number matched exactly one county record, and that record sits in the same ZIP code your address resolved to. Check the address and property facts in this block before relying on these numbers."
                        },
                        "outside_model_range": {
                          "flagged": false,
                          "reasons": []
                        }
                      },
                      "as_is_similar_band": {
                        "basis": "all-comparable-sales",
                        "statement": "Too few comparable sales passed the size, age and recency filter this service applies to state a similar-sales range, so this price-per-square-foot range covers every comparable sale below that carries a usable sale price and square footage. `qualifying_sales` is how many passed the filter and fell short.",
                        "qualifying_sales": 1,
                        "price_per_square_foot": {
                          "low": 190,
                          "high": 460,
                          "median": 279
                        }
                      },
                      "rehab_adjusted_arv": 571000,
                      "max_allowable_offer": {
                        "amount": 414000,
                        "clamped": false
                      },
                      "valuation_quantiles": {
                        "0.02": 191787,
                        "0.10": 345336,
                        "0.20": 476815,
                        "0.30": 598093,
                        "0.40": 733771,
                        "0.50": 878872,
                        "0.60": 1110818,
                        "0.70": 1417051,
                        "0.80": 1988162,
                        "0.90": 3615373,
                        "0.98": 15505619
                      },
                      "effective_sample_size": 51.04950714111328,
                      "model_estimate_available": true,
                      "pricing_model_arv_estimate": 1417000
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "$ref": "#/components/responses/UpstreamTimeout"
          }
        }
      }
    },
    "/v1/predict/batch": {
      "post": {
        "operationId": "predict-batch",
        "summary": "Score a batch of property addresses",
        "description": "**Cost:** $1.00 per address answered\n\nScores up to the documented batch limit of properties in one request and returns one answer per property, in submission order.\n\n**Each answer carries the core numbers only.** A batch entry is the same answer `POST /v1/predict` returns for that property, minus the list of comparable sales: the Comp Band, the qualifying count, the price-per-square-foot range and every derived figure are all here, but the individual sales behind them are not. To see them, score that property on its own with `POST /v1/predict`, by address: a Scored Call identifies a property by address only, and `property_id` is not one of the members it accepts.\n\nThis is a Metered Call: it is charged per property submitted, and the price is resolved by the Ledger inside the same transaction that records the Spend — it is never sent by the client. The Spend for the whole batch is committed **before** any property is scored, so the cost of a batch is known and paid in full before any work begins. A batch the Account's Balance cannot afford is rejected in full — never partially: nothing is charged, nothing is split, and the request can be retried unchanged after a top-up.\n\nThe charge is per property submitted, and is refunded per property that fails for a reason the refund policy covers. A property that fails for one of the covered reasons does not stop the ones after it: its share of the batch's charge is returned to the Account as its own Refund, and every property after it is still attempted. The response is still `200`, and the failed property's entry in `results` is the same error object a single call would have returned for it — so an integration branching on `type` needs no second contract. A refusal outside those reasons stops the batch instead: the properties after it are not attempted, no `results` array is returned, the whole request answers 503 `spend-indeterminate`, and every charge recorded for the batch is returned to the Account as a Refund. The Account is charged for every property that produced an answer and for nothing else.\n\nSend an `Idempotency-Key` to make a retry safe. Keys behave exactly as on `POST /v1/predict`, and the same body sent to both endpoints under one key is a conflict, never a replay.",
        "tags": [
          "Scoring"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "description": "The batch envelope: a `properties` array carrying up to the documented limit of properties. Sending more properties than the limit allows is rejected before any Spend, with honest counts.",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "The batch envelope. It admits the `properties` array and one optional `confirmation` value, and nothing else: any other top-level member is rejected before any Spend, including a request option the single endpoint accepts — those belong on each entry inside `properties`, never on the envelope. The charge is per property submitted — a request option never changes what a batch costs. `maxItems` is the documented form of the batch limit this endpoint enforces: a batch carrying more properties returns 413 with honest `limit` and `submitted` counts, before any Spend. `gateway/tests/route-surface.test.ts` asserts that `maxItems` equals the route's `maxSubmittedProperties` option, so the published limit cannot drift from the enforced one.",
                "additionalProperties": false,
                "required": [
                  "properties"
                ],
                "properties": {
                  "properties": {
                    "type": "array",
                    "description": "The properties to score, each the same shape `POST /v1/predict` accepts. Order is preserved: the response's `results` array answers these properties in this order. Duplicate addresses are allowed and each is charged — two identical entries are two work items.",
                    "minItems": 1,
                    "maxItems": 10,
                    "items": {
                      "$ref": "#/components/schemas/ScoredCallRequest"
                    }
                  },
                  "confirmation": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256,
                    "description": "Optional. The confirmation value an assistant received when a question would cost more than the ask-first limit; send it back unchanged with the same request to run it. Ignored on calls made with an API key."
                  }
                }
              },
              "examples": {
                "score-a-batch": {
                  "summary": "Score two properties",
                  "value": {
                    "properties": [
                      {
                        "address": "1026 N Beckley Ave, Dallas, TX 75203"
                      },
                      {
                        "address": "100 Sample Street, Dallas, TX 75203",
                        "condition": "major_rehab"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The batch was processed. This was a Metered Call, so the call was charged to the Account's Balance as resolved by the Ledger, and any property that failed for a reason the refund policy covers has had its share returned as a Refund. Individual properties may have failed — each entry in `results` says which.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "The batch answer: one entry per submitted property, in submission order, none omitted and none reordered. An entry is EITHER a `BatchScoredCallItem` — the core-numbers answer, which is the single endpoint's answer minus the list of comparable sales — for a property that was scored, OR a Problem Detail describing why that property could not be scored and what happened to its charge. The two are told apart by shape: only the error entry carries `status` and `type`. Both are built by Investorlift Data Services member by member; the scoring service's own responses are never passed through. The Trace ID rides the `trace-id` response header, deliberately not this body — and every entry in a batch shares the one Trace ID of the call that produced it.",
                  "additionalProperties": false,
                  "required": [
                    "results"
                  ],
                  "properties": {
                    "results": {
                      "type": "array",
                      "description": "One entry per submitted property, in submission order. Entry `i` answers submitted property `i`: the position is how a failing property is identified, and no index is interpolated into any message.",
                      "items": {
                        "description": "A scored answer in the batch core-numbers shape, or the Problem Detail for a property that could not be scored. Only the error entry carries `status` and `type`.",
                        "oneOf": [
                          {
                            "$ref": "#/components/schemas/BatchScoredCallItem"
                          },
                          {
                            "$ref": "#/components/schemas/ProblemDetail"
                          }
                        ]
                      }
                    }
                  }
                },
                "examples": {
                  "sample": {
                    "value": {
                      "results": [
                        {
                          "comp_band": {
                            "low": 388634,
                            "high": 942020,
                            "median": 571412
                          },
                          "cost_stack": {
                            "loan": 331200,
                            "points": 6624,
                            "interest": 6533,
                            "hold_days": 60,
                            "down_payment": 82800,
                            "closing_costs": 29562,
                            "target_profit": 114282
                          },
                          "rehab_budget": 0,
                          "target_margin": 0.2,
                          "valuation_mean": 1016099,
                          "subject_property": {
                            "facts": {
                              "bathrooms": {
                                "value": 2,
                                "source": "county-record"
                              },
                              "year_built": {
                                "value": 1935,
                                "source": "county-record"
                              },
                              "square_feet": {
                                "value": 2047,
                                "source": "county-record"
                              },
                              "property_type": {
                                "value": "Single Family",
                                "source": "county-record"
                              },
                              "lot_size_square_feet": {
                                "value": 7100,
                                "source": "county-record"
                              }
                            },
                            "address": {
                              "zip": "75203",
                              "city": "Dallas",
                              "state": "TX",
                              "street": "1026 N Beckley Ave"
                            },
                            "property_id": "00000000000000000000000000000001",
                            "address_quality": {
                              "code": "zip-confirmed",
                              "statement": "The house number matched exactly one county record, and that record sits in the same ZIP code your address resolved to. Check the address and property facts in this block before relying on these numbers."
                            },
                            "outside_model_range": {
                              "flagged": false,
                              "reasons": []
                            }
                          },
                          "as_is_similar_band": {
                            "basis": "all-comparable-sales",
                            "statement": "Too few comparable sales passed the size, age and recency filter this service applies to state a similar-sales range, so this price-per-square-foot range covers every comparable sale below that carries a usable sale price and square footage. `qualifying_sales` is how many passed the filter and fell short.",
                            "qualifying_sales": 1,
                            "price_per_square_foot": {
                              "low": 190,
                              "high": 460,
                              "median": 279
                            }
                          },
                          "rehab_adjusted_arv": 571000,
                          "max_allowable_offer": {
                            "amount": 414000,
                            "clamped": false
                          },
                          "valuation_quantiles": {
                            "0.02": 191787,
                            "0.10": 345336,
                            "0.20": 476815,
                            "0.30": 598093,
                            "0.40": 733771,
                            "0.50": 878872,
                            "0.60": 1110818,
                            "0.70": 1417051,
                            "0.80": 1988162,
                            "0.90": 3615373,
                            "0.98": 15505619
                          },
                          "effective_sample_size": 51.04950714111328,
                          "model_estimate_available": true,
                          "pricing_model_arv_estimate": 1417000
                        },
                        {
                          "type": "https://docs.investorliftdata.com/errors/unscorable-address",
                          "title": "Address cannot be scored",
                          "detail": "The submitted address could not be scored. The Credit for this call has been returned to the Account as a Refund.",
                          "status": 422,
                          "trace_id": "00000000-0000-4000-8000-000000000000"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "$ref": "#/components/responses/UpstreamTimeout"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v1/history": {
      "post": {
        "operationId": "history",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read a property’s recorded transaction history",
        "description": "**Cost:** $0.25 per property\n\nReturns one property’s recorded transaction story: the chain of title newest first, and any detected buy/sell flips.\n\n**Input is exactly one of `address` or `property_id`.** Send an address for your own lead, or send the `property_id` of a comparable property taken straight from a Scored Call answer. A request carrying **both**, or **neither**, is rejected with 400 before anything is charged.\n\nThis is a Metered Call. The price is resolved by the Ledger inside the same transaction that records the Spend; it is never sent by the client. The Spend is committed **before** the county records are read, so a call that reaches them has already been paid for, and a call that fails before the Spend consumes nothing. The History Call page in the Docs states what this endpoint costs.\n\n**A property with nothing on file is a chargeable answer.** If the county records are available and hold no recorded transactions for this property, the call returns 200 with an empty `transactions` array and a plain statement saying the records were checked and nothing was on file — and the Metered Call is **charged normally**, because “we checked; nothing on file” is an answer rather than a failure. If the records themselves could not be read, that is a failure: the call returns a 5xx and the charge is returned to the Account as a Refund.\n\n**Every category in the answer is a derived conclusion, not a statement made by the county.** The transaction categories and buyer types are this API’s reading of the recorded documents, and an unrecognised record is reported as `unknown` rather than guessed at.\n\n**No names appear.** Buyer and seller names in the underlying records are used only to reach a conclusion — that a buyer was a company, for instance — and never appear in the response.\n\nSend an `Idempotency-Key` to make a retry safe. A key is replayed only when the earlier call succeeded and its response was stored. If the earlier call was refunded, ended without a stored response, or is older than the replay window, the key is taken over: the new request runs and is charged, whatever body it carries. Otherwise the same key sent with a different body is refused as a conflict, and nothing is charged for it.\n\nA request sent from this page is a real call and is charged at the price shown for it; checking a request with `/v1/validate` is free.",
        "tags": [
          "History"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Exactly one property, identified by exactly one of `address` or `property_id`.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HistoryCallRequest"
              },
              "examples": {
                "by-address": {
                  "summary": "By address",
                  "value": {
                    "address": "1026 N Beckley Ave, Dallas, TX 75203"
                  }
                },
                "by-property-id": {
                  "summary": "By the property_id of a comp from a Scored Call",
                  "description": "Take `property_id` from any comparable property in a Scored Call answer and send it straight back. No address matching is performed on this arm, so the answer describes exactly that record.",
                  "value": {
                    "property_id": "a1b2c3d4e5f60718293a4b5c6d7e8f90"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The History Call succeeded. This was a Metered Call, so the call was charged to the Account’s Balance, as resolved by the Ledger. An empty `transactions` array here means the records were checked and nothing was on file — that is an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HistoryCallResponse"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "flips": [],
                      "permits": {
                        "hvac": {
                          "work_status": null,
                          "most_recent_date": null,
                          "most_recent_job_value": null
                        },
                        "roof": {
                          "work_status": null,
                          "most_recent_date": null,
                          "most_recent_job_value": null
                        },
                        "permits": [
                          {
                            "tags": [
                              "tags_electrical",
                              "tags_solar"
                            ],
                            "file_date": "2023-10-05",
                            "job_value": 16000,
                            "final_date": "2025-04-26",
                            "issue_date": "2023-10-05",
                            "work_status": "completed",
                            "construction_duration": 569
                          },
                          {
                            "tags": [
                              "tags_electrical"
                            ],
                            "file_date": null,
                            "job_value": null,
                            "final_date": null,
                            "issue_date": "2023-04-21",
                            "work_status": "open",
                            "construction_duration": null
                          },
                          {
                            "tags": [
                              "tags_plumbing"
                            ],
                            "file_date": null,
                            "job_value": null,
                            "final_date": null,
                            "issue_date": "2016-03-08",
                            "work_status": "completed",
                            "construction_duration": null
                          }
                        ],
                        "plumbing": {
                          "work_status": "completed",
                          "most_recent_date": "2016-03-08",
                          "most_recent_job_value": null
                        },
                        "statement": "Building-permit records were retrieved for this property. The permits below are the most recent recorded work in each trade, together with any permit still open and any demolition. Each category is a conclusion derived from the county record, not a statement made by the county.",
                        "demolition": {
                          "work_status": null,
                          "most_recent_date": null,
                          "most_recent_job_value": null
                        },
                        "electrical": {
                          "work_status": "completed",
                          "most_recent_date": "2023-10-05",
                          "most_recent_job_value": 16000
                        },
                        "water_heater": {
                          "work_status": null,
                          "most_recent_date": null,
                          "most_recent_job_value": null
                        },
                        "coverage_known": true,
                        "has_open_permit": true
                      },
                      "summary": {
                        "market_state": "off-market",
                        "flip_detected": false,
                        "open_permit_work": true,
                        "long_tenured_owner": true,
                        "demolition_recorded": false,
                        "asking_price_reduced": null,
                        "last_recorded_sale_kind": "family-transfer",
                        "recorded_loan_available": false,
                        "last_recorded_buyer_type": "individual",
                        "permit_records_available": true,
                        "has_recorded_transactions": true
                      },
                      "transactions": [
                        {
                          "kind": "family-transfer",
                          "reo_sale": null,
                          "sale_date": "2008-03-29",
                          "buyer_type": "individual",
                          "sale_price": 0,
                          "foreclosure": null,
                          "inter_family": true,
                          "price_is_estimated": null
                        }
                      ],
                      "market_status": {
                        "state": "off-market",
                        "sold_date": null,
                        "sold_price": null,
                        "price_reduced": null,
                        "days_on_market": null,
                        "list_price_low": null,
                        "rental_listing": false,
                        "list_price_high": null,
                        "failed_listing_date": "2023-08-09",
                        "list_price_low_date": null,
                        "list_price_high_date": null,
                        "original_listing_date": null
                      },
                      "seller_position": {
                        "basis": "No recorded loan is available for this property, so no payoff estimate and no equity estimate can be made. Nothing is inferred from that absence: it does not mean the property is owned free and clear, and it does not mean the last purchase was made in cash. What this section does report is how long the current owner has held title, taken from the chain of title above.",
                        "days_owned": 6783,
                        "owned_since": "2008-03-29",
                        "recorded_loan_available": false
                      },
                      "subject_property": {
                        "facts": {
                          "bathrooms": {
                            "value": 2,
                            "source": "county-record"
                          },
                          "year_built": {
                            "value": 1935,
                            "source": "county-record"
                          },
                          "square_feet": {
                            "value": 2047,
                            "source": "county-record"
                          },
                          "property_type": {
                            "value": "Single Family",
                            "source": "county-record"
                          },
                          "lot_size_square_feet": {
                            "value": 7100,
                            "source": "county-record"
                          }
                        },
                        "address": {
                          "zip": "75203",
                          "city": "Dallas",
                          "state": "TX",
                          "street": "1026 N Beckley Ave"
                        },
                        "property_id": "00000000000000000000000000000001",
                        "address_quality": {
                          "code": "zip-confirmed",
                          "statement": "The house number matched exactly one county record, and that record sits in the same ZIP code your address resolved to. Check the address and property facts in this block before relying on these numbers."
                        },
                        "outside_model_range": {
                          "flagged": false,
                          "reasons": []
                        }
                      },
                      "records_statement": "The recorded sale and deed records for this property were checked. The transactions below are what is on file, newest first. Each category and each buyer type is a conclusion derived from the county record, not a statement made by the county."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "$ref": "#/components/responses/UpstreamTimeout"
          }
        }
      }
    },
    "/v1/validate": {
      "post": {
        "operationId": "validate",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Check a request without spending",
        "description": "**Cost:** Free\n\nChecks that a request body would be accepted by `POST /v1/predict`, and returns a verdict.\n\nThis endpoint is free. It charges nothing and never calls the scoring service, so it keeps working at a zero Balance. With an API Key it answers even while the Ledger is down. A connected app — one that signed you in instead of holding an API Key — makes one Ledger read here to confirm the connection is still approved, so while that read is failing it answers 503 `call-not-started`. Nothing is charged either way. While this endpoint is temporarily switched off by its operator it answers 503 `route-unavailable`: other endpoints are unaffected, nothing was charged, and `Retry-After` says how long to wait before sending the same call again. It requires a valid credential — an API Key, or an account sign-in — and nothing else.\n\nAny `Idempotency-Key` header sent to this endpoint is **ignored**. There is no Spend to make idempotent, so no claim is recorded and no key is stored.\n\nA verdict of `false` is returned only for a body this endpoint can judge on its own — shape, required fields and the property cap. The scoring service remains the authority on whether a well-formed address can actually be scored.",
        "tags": [
          "Scoring"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SingleScoredCallRequest"
              },
              "examples": {
                "check-a-request-shape": {
                  "summary": "Check a request shape",
                  "value": {
                    "address": "1026 N Beckley Ave, Dallas, TX 75203"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The request body was checked. Nothing was charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationVerdict"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "valid": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "429": {
            "$ref": "#/components/responses/ValidateTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/ValidateUnavailable"
          }
        },
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          }
        ]
      }
    },
    "/v1/data/properties/resolve": {
      "get": {
        "operationId": "data-properties-resolve",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Find a property by address",
        "description": "**Cost:** $0.10 per address found\n\nFinds the one property at a street address and returns its whole record — the same answer as the property record call.\n\nSend the street line as `address` and its five-digit ZIP code as `zip`; both are required. An address that matches no property the data service holds is answered as not found. An address that matches more than one property is refused, never answered with a list of candidates.\n\nThis is a Metered Call. If the data service rejects the request, finds no such property, fails or does not answer in time, the charge is returned to the Account as a Refund. That includes an address that matches more than one property.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers.",
        "tags": [
          "Properties"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "address",
            "in": "query",
            "required": true,
            "description": "The street line of the address: the number, the street and any unit. Required. The data service checks this value: one it refuses is answered [`400 upstream-rejected-request`](/errors/upstream-rejected-request), and the charge comes back as a Refund.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zip",
            "in": "query",
            "required": true,
            "description": "The five-digit ZIP code of the address. Required. The data service checks this value: one it refuses is answered [`400 upstream-rejected-request`](/errors/upstream-rejected-request), and the charge comes back as a Refund.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{5}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "line": "100 Sample Street",
                        "unit": null,
                        "city": "Phoenix",
                        "zip": "85008",
                        "county_fips": "04013",
                        "apn": "0000-000-000",
                        "latitude": 33.474412,
                        "longitude": -111.997848,
                        "address_held_back": null,
                        "location_radius_m": null,
                        "property_id": "b6219fe62b8b51a0efa988aa8e6e0189",
                        "state": "AZ",
                        "n_deeds": 0,
                        "n_flagged": 0,
                        "holder": null,
                        "owner": {
                          "n_owners": 1,
                          "names": [],
                          "display_names": [],
                          "is_company": false,
                          "is_trust": true,
                          "is_government": false,
                          "ownership_rights": "Trust",
                          "status_type": "Company Owned",
                          "ownership_start_date": null,
                          "length_of_residence_months": null,
                          "owner_occupied": true,
                          "absentee": false,
                          "mailing": null,
                          "mailing_out_of_state": false,
                          "last_purchase": null,
                          "last_deed": {
                            "position": 1,
                            "sale_date": "2016-05-19",
                            "document_type": "Intra-Family Transfer"
                          },
                          "purchase_match": "none",
                          "purchase_match_strength": "none",
                          "deed_match": "exact",
                          "deed_match_strength": "strong",
                          "acquisition_basis": "transfer",
                          "held_since": "2016-05-19",
                          "held_since_basis": "transfer_deed",
                          "months_held": 124.6
                        },
                        "attributes": {
                          "property_type_category": "Residential",
                          "property_type_detail": "Single Family",
                          "segment": "SFR",
                          "land_use_code": "R2",
                          "vacant": false,
                          "year_built": 1955,
                          "effective_year_built": 1955,
                          "living_area_sqft": 1477,
                          "building_sqft": 1477,
                          "bedrooms": 3,
                          "bathrooms": 2,
                          "full_bathrooms": 2,
                          "partial_bathrooms": null,
                          "stories": 1,
                          "garage_spaces": 1,
                          "pool": null,
                          "buildings": 1,
                          "units": 1,
                          "construction_type": "Concrete Block",
                          "lot_sqft": 7710,
                          "lot_acres": 0.177,
                          "zoning_code": "R-6",
                          "assessed_total": 42930,
                          "assessed_land": null,
                          "assessed_improvement": null,
                          "assessment_year": 2027,
                          "market_value_total": 429300,
                          "market_value_year": 2027,
                          "tax_amount": 1908,
                          "tax_year": 2025,
                          "tax_delinquent_year": null,
                          "tax_exemptions": null
                        },
                        "financing": {
                          "open_lien_count": 0,
                          "open_lien_balance": null,
                          "free_and_clear": true,
                          "has_heloc": false,
                          "cash_purchase": null,
                          "first_lien": null,
                          "last_mortgage": null,
                          "avm": {
                            "value": 420781,
                            "low": 332416,
                            "high": 509145,
                            "sd": 21,
                            "confidence": 79,
                            "as_of": "2026-04-08"
                          },
                          "equity": {
                            "balance": 420781,
                            "percent": 100,
                            "ltv": 0
                          },
                          "involuntary_lien_count": 1,
                          "open_liens": [],
                          "history": [],
                          "liens": [
                            {
                              "position": 1,
                              "lien_type": "Economic Lien",
                              "document_type": "Financing Statement",
                              "document_number": "0000000001",
                              "recording_date": "2024-02-08",
                              "filing_date": null,
                              "lien_amount": null,
                              "judgement_amount": null,
                              "tax_period_end_date": null,
                              "parties": [],
                              "attorney": {
                                "company": null,
                                "phone": null
                              }
                            }
                          ],
                          "as_of": "2026-06-25",
                          "recordings_through": "2026-06-11",
                          "contact_redacted": true
                        },
                        "short_term_rental": null,
                        "contact_redacted": true
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:18:01.462Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take, or an address that matches more than one property. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/properties/{property_id}": {
      "get": {
        "operationId": "data-properties-record",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read a property’s record",
        "description": "**Cost:** $0.10 per property\n\nReturns one property’s record: its address and point, who holds it, the owner on the county roll, its building and tax facts, and a financing block, which is empty where the data service holds no financing for the property.\n\nThis is a Metered Call. If the data service rejects the request, finds no such property, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Properties"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "property_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one property: 32 lowercase hexadecimal characters, with no prefix. The address lookup returns it. It is not the `property_id` a Scored Call returns for a comparable property. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{32}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "line": "100 Sample Street",
                        "unit": null,
                        "city": "Phoenix",
                        "zip": "85008",
                        "county_fips": "04013",
                        "apn": "0000-000-000",
                        "latitude": 33.474412,
                        "longitude": -111.997848,
                        "address_held_back": null,
                        "location_radius_m": null,
                        "property_id": "b6219fe62b8b51a0efa988aa8e6e0189",
                        "state": "AZ",
                        "n_deeds": 0,
                        "n_flagged": 0,
                        "holder": null,
                        "owner": {
                          "n_owners": 1,
                          "names": [],
                          "display_names": [],
                          "is_company": false,
                          "is_trust": true,
                          "is_government": false,
                          "ownership_rights": "Trust",
                          "status_type": "Company Owned",
                          "ownership_start_date": null,
                          "length_of_residence_months": null,
                          "owner_occupied": true,
                          "absentee": false,
                          "mailing": null,
                          "mailing_out_of_state": false,
                          "last_purchase": null,
                          "last_deed": {
                            "position": 1,
                            "sale_date": "2016-05-19",
                            "document_type": "Intra-Family Transfer"
                          },
                          "purchase_match": "none",
                          "purchase_match_strength": "none",
                          "deed_match": "exact",
                          "deed_match_strength": "strong",
                          "acquisition_basis": "transfer",
                          "held_since": "2016-05-19",
                          "held_since_basis": "transfer_deed",
                          "months_held": 124.6
                        },
                        "attributes": {
                          "property_type_category": "Residential",
                          "property_type_detail": "Single Family",
                          "segment": "SFR",
                          "land_use_code": "R2",
                          "vacant": false,
                          "year_built": 1955,
                          "effective_year_built": 1955,
                          "living_area_sqft": 1477,
                          "building_sqft": 1477,
                          "bedrooms": 3,
                          "bathrooms": 2,
                          "full_bathrooms": 2,
                          "partial_bathrooms": null,
                          "stories": 1,
                          "garage_spaces": 1,
                          "pool": null,
                          "buildings": 1,
                          "units": 1,
                          "construction_type": "Concrete Block",
                          "lot_sqft": 7710,
                          "lot_acres": 0.177,
                          "zoning_code": "R-6",
                          "assessed_total": 42930,
                          "assessed_land": null,
                          "assessed_improvement": null,
                          "assessment_year": 2027,
                          "market_value_total": 429300,
                          "market_value_year": 2027,
                          "tax_amount": 1908,
                          "tax_year": 2025,
                          "tax_delinquent_year": null,
                          "tax_exemptions": null
                        },
                        "financing": {
                          "open_lien_count": 0,
                          "open_lien_balance": null,
                          "free_and_clear": true,
                          "has_heloc": false,
                          "cash_purchase": null,
                          "first_lien": null,
                          "last_mortgage": null,
                          "avm": {
                            "value": 420781,
                            "low": 332416,
                            "high": 509145,
                            "sd": 21,
                            "confidence": 79,
                            "as_of": "2026-04-08"
                          },
                          "equity": {
                            "balance": 420781,
                            "percent": 100,
                            "ltv": 0
                          },
                          "involuntary_lien_count": 1,
                          "open_liens": [],
                          "history": [],
                          "liens": [
                            {
                              "position": 1,
                              "lien_type": "Economic Lien",
                              "document_type": "Financing Statement",
                              "document_number": "0000000001",
                              "recording_date": "2024-02-08",
                              "filing_date": null,
                              "lien_amount": null,
                              "judgement_amount": null,
                              "tax_period_end_date": null,
                              "parties": [],
                              "attorney": {
                                "company": null,
                                "phone": null
                              }
                            }
                          ],
                          "as_of": "2026-06-25",
                          "recordings_through": "2026-06-11",
                          "contact_redacted": true
                        },
                        "short_term_rental": null,
                        "contact_redacted": true
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:19:18.979Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/properties/{property_id}/history": {
      "get": {
        "operationId": "data-properties-history",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read a property’s ownership history",
        "description": "**Cost:** $0.10 per property\n\nReturns every recorded deed of one property, oldest first, with both sides of each transfer. It is a different call from the History Call: it reads the data service’s own record.\n\nThis is a Metered Call. If the data service rejects the request, finds no such property, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Properties"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "property_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one property: 32 lowercase hexadecimal characters, with no prefix. The address lookup returns it. It is not the `property_id` a Scored Call returns for a comparable property. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{32}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "property_id": "b6219fe62b8b51a0efa988aa8e6e0189",
                        "deeds": [],
                        "contact_redacted": false
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:19:19.308Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/properties/{property_id}/listing-history": {
      "get": {
        "operationId": "data-properties-listing-history",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read a property’s listing history",
        "description": "**Cost:** $0.10 per property\n\nReturns every version of every listing of one property since the start of the data service’s listing records, by listing then version.\n\nThis is a Metered Call. If the data service rejects the request, finds no such property, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Properties"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "property_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one property: 32 lowercase hexadecimal characters, with no prefix. The address lookup returns it. It is not the `property_id` a Scored Call returns for a comparable property. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{32}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "property_id": "b6219fe62b8b51a0efa988aa8e6e0189",
                        "versions": [
                          {
                            "listing_id": "00000000000000000000000000000001",
                            "version_no": 1,
                            "is_current": true,
                            "seen_from": "2026-10-21",
                            "seen_to": null,
                            "closed_by": null,
                            "status": "ACTIVE",
                            "status_basis": "category",
                            "status_detail": null,
                            "status_raw": "Active",
                            "off_market_reason": null,
                            "is_rental": false,
                            "on_market": true,
                            "list_price": 400000,
                            "price_low": 400000,
                            "price_low_on": "2026-10-18",
                            "price_high": 400000,
                            "price_high_on": "2026-10-18",
                            "listed_on": "2026-10-18",
                            "status_updated_on": "2026-10-18",
                            "off_market_on": null,
                            "sold_on": null,
                            "sold_price": null,
                            "days_on_market": 1,
                            "mls_name": "Sample MLS",
                            "mls_number": "0000000001",
                            "brokerage_name": "Sample Realty",
                            "bedrooms": 3,
                            "bathrooms": 1,
                            "living_area": 1477,
                            "lot_sqft": 7840,
                            "year_built": 1955,
                            "property_type": "SINGLE_FAMILY",
                            "property_subtype": null,
                            "n_agents": 1,
                            "modified_at": "2026-10-20T11:43:08.027Z"
                          }
                        ]
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:19:19.645Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/listings": {
      "get": {
        "operationId": "data-listings",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List properties for sale near a place",
        "description": "**Cost:** $0.25 per page\n\nReturns a page of the sale listings near one place.\n\n**Where.** Send exactly one place: a point (`lat` and `lng`) with an optional `radius_miles` of at most 20; a street `address` with its `zip`; a list of up to 60 ZIP codes (`zip`); or a box (`bbox`). None, or two at once, is rejected.\n\n`on_market` and `is_rental` narrow the listings; `sort`, `limit` and `cursor` page through them.\n\nThis is a Metered Call: one page is one call, whatever the page holds. If the data service rejects the request, answers that what it names does not exist, fails or does not answer in time, the charge is returned to the Account as a Refund. An empty page for a place inside the data’s coverage is an answer, and it is charged.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers. When the place a request names cannot be checked against the coverage and the answer is empty, the call answers `422` `property-not-found` and its charge is returned.",
        "tags": [
          "Listings and sales"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the point. Send with `lng`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "description": "Longitude of the point. Send with `lat`.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_miles",
            "in": "query",
            "description": "The radius around the point, in miles, at most 20.",
            "schema": {
              "type": "number",
              "maximum": 20
            }
          },
          {
            "name": "address",
            "in": "query",
            "description": "A street line, sent with its one five-digit `zip`: the data service finds that property and searches around it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zip",
            "in": "query",
            "description": "Up to 60 five-digit ZIP codes, comma-separated or as repeated `zip` parameters — or the one ZIP code of an `address`.",
            "schema": {
              "type": "array",
              "maxItems": 60,
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "description": "A box to search inside.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "on_market",
            "in": "query",
            "description": "Whether to return only listings on the market now. Defaults to true.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "is_rental",
            "in": "query",
            "description": "Narrows the listings by whether each one is a rental.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "One of the data service’s sort orders. Some need a point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "How many rows to return, from 1 to 500. Defaults to 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "The `next_cursor` of the previous page, to ask for the next one. A cursor stops working when the data is refreshed: start again from the first page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "listing_id": "fb954c6e27240d74bf7540a56e5d0eeb",
                          "property_id": "00000000000000000000000000000001",
                          "address": {
                            "line": "100 Sample Street",
                            "city": "Phoenix",
                            "zip": "85008",
                            "apn": "0000-000-000"
                          },
                          "latitude": 33.474412,
                          "longitude": -111.997848,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "distance_miles": null,
                          "status": "ACTIVE",
                          "status_detail": null,
                          "on_market": true,
                          "is_rental": false,
                          "listed_on": "2026-10-18",
                          "sold_on": null,
                          "off_market_on": null,
                          "status_updated_on": "2026-10-18",
                          "list_price": 400000,
                          "sold_price": null,
                          "price_high": 400000,
                          "days_on_market": 1,
                          "bedrooms": 3,
                          "bathrooms": 1,
                          "living_area": 1477,
                          "lot_sqft": 7840,
                          "year_built": 1955,
                          "property_type": "SINGLE_FAMILY",
                          "mls_number": "0000000001",
                          "mls_name": "Sample MLS",
                          "brokerage_name": "Sample Realty",
                          "n_agents": 1,
                          "agent_ids": [
                            "00000000000000000000000000000001"
                          ],
                          "holder_org_ids": [],
                          "n_holder_orgs": 2,
                          "holder_from_registry": false
                        },
                        {
                          "listing_id": "9e056b3eace51c9f9e18e316e077d232",
                          "property_id": "00000000000000000000000000000001",
                          "address": {
                            "line": "100 Sample Street",
                            "city": "Phoenix",
                            "zip": "85008",
                            "apn": "0000-000-000"
                          },
                          "latitude": 33.476573,
                          "longitude": -112.024229,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "distance_miles": null,
                          "status": "ACTIVE",
                          "status_detail": null,
                          "on_market": true,
                          "is_rental": false,
                          "listed_on": "2026-10-17",
                          "sold_on": null,
                          "off_market_on": null,
                          "status_updated_on": "2026-10-17",
                          "list_price": 325000,
                          "sold_price": null,
                          "price_high": 325000,
                          "days_on_market": 2,
                          "bedrooms": 3,
                          "bathrooms": 3,
                          "living_area": null,
                          "lot_sqft": 7840,
                          "year_built": 1969,
                          "property_type": "SINGLE_FAMILY",
                          "mls_number": "0000000001",
                          "mls_name": "Sample MLS",
                          "brokerage_name": "Sample Realty",
                          "n_agents": 1,
                          "agent_ids": [
                            "00000000000000000000000000000001"
                          ],
                          "holder_org_ids": [],
                          "n_holder_orgs": 1,
                          "holder_from_registry": false
                        },
                        {
                          "listing_id": "9f78c37bb7983504870173e15dc32c63",
                          "property_id": "00000000000000000000000000000001",
                          "address": {
                            "line": "100 Sample Street",
                            "city": "Phoenix",
                            "zip": "85008",
                            "apn": "0000-000-000"
                          },
                          "latitude": 33.470544,
                          "longitude": -111.981495,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "distance_miles": null,
                          "status": "ACTIVE",
                          "status_detail": null,
                          "on_market": true,
                          "is_rental": false,
                          "listed_on": "2026-10-17",
                          "sold_on": null,
                          "off_market_on": null,
                          "status_updated_on": "2026-10-17",
                          "list_price": 499900,
                          "sold_price": null,
                          "price_high": null,
                          "days_on_market": 2,
                          "bedrooms": 4,
                          "bathrooms": 2,
                          "living_area": 1710,
                          "lot_sqft": 6534,
                          "year_built": 1956,
                          "property_type": "SINGLE_FAMILY",
                          "mls_number": "0000000001",
                          "mls_name": "Sample MLS",
                          "brokerage_name": "Sample Realty",
                          "n_agents": 1,
                          "agent_ids": [
                            "00000000000000000000000000000001"
                          ],
                          "holder_org_ids": [],
                          "n_holder_orgs": 1,
                          "holder_from_registry": false
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 100
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:00.511Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take, or an address that matches more than one property. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/listings/{listing_id}": {
      "get": {
        "operationId": "data-listing",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read one listing in full",
        "description": "**Cost:** $0.10 per item\n\nReturns one listing with every version of it, its agents and the holder at the time of listing.\n\nThis is a Metered Call. If the data service rejects the request, finds no such listing, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Listings and sales"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "listing_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one listing: 32 lowercase hexadecimal characters, with no prefix. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{32}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "listing": {
                          "listing_id": "fb954c6e27240d74bf7540a56e5d0eeb",
                          "property_id": "00000000000000000000000000000001",
                          "address": {
                            "line": "100 Sample Street",
                            "city": "Phoenix",
                            "zip": "85008",
                            "apn": "0000-000-000"
                          },
                          "latitude": 33.474412,
                          "longitude": -111.997848,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "distance_miles": null,
                          "status": "ACTIVE",
                          "status_detail": null,
                          "on_market": true,
                          "is_rental": false,
                          "listed_on": "2026-10-18",
                          "sold_on": null,
                          "off_market_on": null,
                          "status_updated_on": "2026-10-18",
                          "list_price": 400000,
                          "sold_price": null,
                          "price_high": 400000,
                          "days_on_market": 1,
                          "bedrooms": 3,
                          "bathrooms": 1,
                          "living_area": 1477,
                          "lot_sqft": 7840,
                          "year_built": 1955,
                          "property_type": "SINGLE_FAMILY",
                          "mls_number": "0000000001",
                          "mls_name": "Sample MLS",
                          "brokerage_name": "Sample Realty",
                          "n_agents": 1,
                          "agent_ids": [
                            "00000000000000000000000000000001"
                          ],
                          "holder_org_ids": [],
                          "n_holder_orgs": 2,
                          "holder_from_registry": false
                        },
                        "versions": [
                          {
                            "listing_id": "00000000000000000000000000000001",
                            "version_no": 1,
                            "is_current": true,
                            "seen_from": "2026-10-21",
                            "seen_to": null,
                            "closed_by": null,
                            "status": "ACTIVE",
                            "status_basis": "category",
                            "status_detail": null,
                            "status_raw": "Active",
                            "off_market_reason": null,
                            "is_rental": false,
                            "on_market": true,
                            "list_price": 400000,
                            "price_low": 400000,
                            "price_low_on": "2026-10-18",
                            "price_high": 400000,
                            "price_high_on": "2026-10-18",
                            "listed_on": "2026-10-18",
                            "status_updated_on": "2026-10-18",
                            "off_market_on": null,
                            "sold_on": null,
                            "sold_price": null,
                            "days_on_market": 1,
                            "mls_name": "Sample MLS",
                            "mls_number": "0000000001",
                            "brokerage_name": "Sample Realty",
                            "bedrooms": 3,
                            "bathrooms": 1,
                            "living_area": 1477,
                            "lot_sqft": 7840,
                            "year_built": 1955,
                            "property_type": "SINGLE_FAMILY",
                            "property_subtype": null,
                            "n_agents": 1,
                            "modified_at": "2026-10-20T11:43:08.027Z"
                          }
                        ],
                        "agents": [
                          {
                            "agent_id": "00000000000000000000000000000001",
                            "person_id": "00000000000000000000000000000001",
                            "name": null,
                            "roles": "Listing Agent",
                            "is_team": false,
                            "brokerage_name": "Sample Realty",
                            "office_name": null,
                            "is_current": true
                          }
                        ],
                        "holder": {
                          "org_ids": [],
                          "n_orgs": 2,
                          "from_registry": false,
                          "deed_date": "2016-05-19",
                          "doc_class": "NOT_ECONOMIC",
                          "price": 0,
                          "basis": "deed"
                        },
                        "contact_redacted": true
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:18:01.041Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/rental-listings": {
      "get": {
        "operationId": "data-rental-listings",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List rentals near a place",
        "description": "**Cost:** $0.25 per page\n\nReturns a page of the rental listings near one place.\n\n**Where.** Send exactly one place: a point (`lat` and `lng`) with an optional `radius_miles` of at most 20; a street `address` with its `zip`; a list of up to 60 ZIP codes (`zip`); or a box (`bbox`). None, or two at once, is rejected.\n\n`sort`, `limit` and `cursor` page through them.\n\nThis is a Metered Call: one page is one call, whatever the page holds. If the data service rejects the request, answers that what it names does not exist, fails or does not answer in time, the charge is returned to the Account as a Refund. An empty page for a place inside the data’s coverage is an answer, and it is charged.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers. When the place a request names cannot be checked against the coverage and the answer is empty, the call answers `422` `property-not-found` and its charge is returned.",
        "tags": [
          "Listings and sales"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the point. Send with `lng`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "description": "Longitude of the point. Send with `lat`.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_miles",
            "in": "query",
            "description": "The radius around the point, in miles, at most 20.",
            "schema": {
              "type": "number",
              "maximum": 20
            }
          },
          {
            "name": "address",
            "in": "query",
            "description": "A street line, sent with its one five-digit `zip`: the data service finds that property and searches around it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zip",
            "in": "query",
            "description": "Up to 60 five-digit ZIP codes, comma-separated or as repeated `zip` parameters — or the one ZIP code of an `address`.",
            "schema": {
              "type": "array",
              "maxItems": 60,
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "description": "A box to search inside.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "One of the data service’s sort orders. Some need a point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "How many rows to return, from 1 to 500. Defaults to 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "The `next_cursor` of the previous page, to ask for the next one. A cursor stops working when the data is refreshed: start again from the first page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [],
                      "page": {
                        "next_cursor": null,
                        "limit": 100,
                        "returned": 0
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:01.013Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take, or an address that matches more than one property. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/sold-listing-history": {
      "get": {
        "operationId": "data-sold-listing-history",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List recent sales near a place",
        "description": "**Cost:** $0.25 per page\n\nReturns a page of the sold listings near one place, each with the recorded deed it matched.\n\n**Where.** Send exactly one place: a point (`lat` and `lng`) with an optional `radius_miles` of at most 20; a street `address` with its `zip`; a list of up to 60 ZIP codes (`zip`); or a box (`bbox`). None, or two at once, is rejected.\n\n`from` and `to` bound the sale date; `sort`, `limit` and `cursor` page through them.\n\nThis is a Metered Call: one page is one call, whatever the page holds. If the data service rejects the request, answers that what it names does not exist, fails or does not answer in time, the charge is returned to the Account as a Refund. An empty page for a place inside the data’s coverage is an answer, and it is charged.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers. When the place a request names cannot be checked against the coverage and the answer is empty, the call answers `422` `property-not-found` and its charge is returned.",
        "tags": [
          "Listings and sales"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the point. Send with `lng`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "description": "Longitude of the point. Send with `lat`.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_miles",
            "in": "query",
            "description": "The radius around the point, in miles, at most 20.",
            "schema": {
              "type": "number",
              "maximum": 20
            }
          },
          {
            "name": "address",
            "in": "query",
            "description": "A street line, sent with its one five-digit `zip`: the data service finds that property and searches around it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zip",
            "in": "query",
            "description": "Up to 60 five-digit ZIP codes, comma-separated or as repeated `zip` parameters — or the one ZIP code of an `address`.",
            "schema": {
              "type": "array",
              "maxItems": 60,
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "description": "A box to search inside.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "The earliest sale date to include. Without `from` and `to`, the twelve months before the end of the data service’s listing records.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "The latest sale date to include.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "One of the data service’s sort orders. Some need a point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "How many rows to return, from 1 to 500. Defaults to 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "The `next_cursor` of the previous page, to ask for the next one. A cursor stops working when the data is refreshed: start again from the first page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "listing_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "address": {
                            "line": "100 Sample Street",
                            "city": "Phoenix",
                            "zip": "85008",
                            "apn": "0000-000-000"
                          },
                          "latitude": 33.468679,
                          "longitude": -111.974933,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "distance_miles": null,
                          "status": "SOLD",
                          "status_detail": null,
                          "on_market": false,
                          "is_rental": true,
                          "listed_on": "2026-10-08",
                          "sold_on": "2026-10-15",
                          "off_market_on": null,
                          "status_updated_on": "2026-10-15",
                          "list_price": 2495,
                          "sold_price": 435000,
                          "price_high": null,
                          "days_on_market": 7,
                          "bedrooms": 4,
                          "bathrooms": 2,
                          "living_area": 1813,
                          "lot_sqft": 6534,
                          "year_built": 1955,
                          "property_type": "SINGLE_FAMILY",
                          "mls_number": "0000000001",
                          "mls_name": "Sample MLS",
                          "brokerage_name": "Sample Realty",
                          "n_agents": 1,
                          "agent_ids": [
                            "00000000000000000000000000000001"
                          ],
                          "holder_org_ids": [],
                          "n_holder_orgs": 2,
                          "holder_from_registry": false,
                          "deed": null
                        },
                        {
                          "listing_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "address": {
                            "line": "100 Sample Street",
                            "city": "Phoenix",
                            "zip": "85008",
                            "apn": "0000-000-000"
                          },
                          "latitude": 33.470035,
                          "longitude": -111.987639,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "distance_miles": null,
                          "status": "SOLD",
                          "status_detail": null,
                          "on_market": false,
                          "is_rental": false,
                          "listed_on": "2026-10-01",
                          "sold_on": "2026-10-14",
                          "off_market_on": null,
                          "status_updated_on": "2026-10-15",
                          "list_price": 425000,
                          "sold_price": 425000,
                          "price_high": 425000,
                          "days_on_market": 13,
                          "bedrooms": 3,
                          "bathrooms": 2,
                          "living_area": 1162,
                          "lot_sqft": 8712,
                          "year_built": 1955,
                          "property_type": "SINGLE_FAMILY",
                          "mls_number": "0000000001",
                          "mls_name": "Sample MLS",
                          "brokerage_name": "Sample Realty",
                          "n_agents": 2,
                          "agent_ids": [
                            "00000000000000000000000000000001",
                            "00000000000000000000000000000001"
                          ],
                          "holder_org_ids": [],
                          "n_holder_orgs": 1,
                          "holder_from_registry": false,
                          "deed": null
                        },
                        {
                          "listing_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "address": {
                            "line": "100 Sample Street",
                            "city": "Phoenix",
                            "zip": "85008",
                            "apn": "0000-000-000"
                          },
                          "latitude": 33.470235,
                          "longitude": -111.97989,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "distance_miles": null,
                          "status": "SOLD",
                          "status_detail": null,
                          "on_market": false,
                          "is_rental": false,
                          "listed_on": "2026-09-11",
                          "sold_on": "2026-10-14",
                          "off_market_on": null,
                          "status_updated_on": "2026-10-14",
                          "list_price": 365000,
                          "sold_price": 372500,
                          "price_high": 372500,
                          "days_on_market": 33,
                          "bedrooms": 3,
                          "bathrooms": 1,
                          "living_area": 1198,
                          "lot_sqft": 6969,
                          "year_built": 1956,
                          "property_type": "SINGLE_FAMILY",
                          "mls_number": "0000000001",
                          "mls_name": "Sample MLS",
                          "brokerage_name": "Sample Realty",
                          "n_agents": 1,
                          "agent_ids": [
                            "00000000000000000000000000000001"
                          ],
                          "holder_org_ids": [],
                          "n_holder_orgs": 1,
                          "holder_from_registry": false,
                          "deed": null
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 100
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:01.344Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take, or an address that matches more than one property. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investor-purchases": {
      "get": {
        "operationId": "data-investor-purchases",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List investor purchases near a place",
        "description": "**Cost:** $0.50 per page · desks only\n\nReturns the investor purchases in one place.\n\n**Where.** Send exactly one place: a point (`lat` and `lng`) with a `radius_miles`, a box (`bbox`), or a list of ZIP codes (`zip`).\n\n**Filters.** Besides the parameters below, the data service accepts its own filters on the purchase date, the price, the kind of purchase and its flags. A parameter or value it does not accept is rejected as `400 upstream-rejected-request`, and the charge comes back.\n\nThis is a Metered Call: one page is one call, whatever the page holds. If the data service rejects the request, answers that what it names does not exist, fails or does not answer in time, the charge is returned to the Account as a Refund. An empty page for a place inside the data’s coverage is an answer, and it is charged.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers. When the place a request names cannot be checked against the coverage and the answer is empty, the call answers `422` `property-not-found` and its charge is returned.",
        "tags": [
          "Investors"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the point. Send with `lng`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "description": "Longitude of the point. Send with `lat`.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_miles",
            "in": "query",
            "description": "The radius around the point, in miles.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "description": "A box to search inside.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zip",
            "in": "query",
            "description": "Five-digit ZIP codes, comma-separated or as repeated `zip` parameters.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "deal_id": "7d617834449db897a2589e87f756e3dc",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-10-06",
                          "price": 294000,
                          "zip": "85008",
                          "county_fips": "04013",
                          "segment": "SFR",
                          "doc_class": "ECONOMIC",
                          "buyer": {
                            "name": "LPC HOLDINGS LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "LPC HOLDINGS LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "sellers": [
                            {
                              "name": "ACTIVE FUNDING GROUP LLC",
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "ACTIVE FUNDING GROUP LLC",
                              "from_registry": true,
                              "match_basis": "filed",
                              "company_like": true,
                              "tags": [
                                "institution"
                              ],
                              "person_id": null
                            }
                          ],
                          "is_entity": true,
                          "ibuyer_brand": null,
                          "repeat_buyer": true,
                          "repeat_n_12m": 6,
                          "resale": {
                            "within_12m": false,
                            "sale_date": null,
                            "price": null,
                            "days_held": null
                          },
                          "seller_hold_days": 224,
                          "same_day_resale": false,
                          "match": {
                            "basis": "filed",
                            "entity_no": "000000001",
                            "n_candidates": 2,
                            "existed_on_deed_date": true,
                            "name_at_deed_date": true
                          },
                          "tags": [],
                          "hard_reasons": [],
                          "auction_kind": null,
                          "is_auction_purchase": null,
                          "is_reo": true,
                          "marketplace_listing_id": null,
                          "purchase_loan_status": "not_measured",
                          "purchase_loan": null,
                          "short_term_rental": null,
                          "contact_redacted": false,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Phoenix",
                            "zip": "85008",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.471135,
                            "longitude": -112.010868,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 6,
                            "bathrooms": 2,
                            "living_area_sqft": 1903,
                            "year_built": 1951
                          },
                          "distance_miles": null
                        },
                        {
                          "deal_id": "2b9ca03c0d4751adca7a3ca34433669d",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-09-29",
                          "price": 290000,
                          "zip": "85008",
                          "county_fips": "04013",
                          "segment": "SFR",
                          "doc_class": "ECONOMIC",
                          "buyer": {
                            "name": "LPC HOLDINGS LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "LPC HOLDINGS LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "sellers": [
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001"
                            }
                          ],
                          "is_entity": true,
                          "ibuyer_brand": null,
                          "repeat_buyer": true,
                          "repeat_n_12m": 5,
                          "resale": {
                            "within_12m": false,
                            "sale_date": null,
                            "price": null,
                            "days_held": null
                          },
                          "seller_hold_days": 4117,
                          "same_day_resale": false,
                          "match": {
                            "basis": "filed",
                            "entity_no": "000000001",
                            "n_candidates": 2,
                            "existed_on_deed_date": true,
                            "name_at_deed_date": true
                          },
                          "tags": [],
                          "hard_reasons": [],
                          "auction_kind": null,
                          "is_auction_purchase": null,
                          "is_reo": false,
                          "marketplace_listing_id": null,
                          "purchase_loan_status": "not_measured",
                          "purchase_loan": null,
                          "short_term_rental": null,
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Phoenix",
                            "zip": "85008",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.473308,
                            "longitude": -112.026341,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 3,
                            "bathrooms": 2,
                            "living_area_sqft": 1713,
                            "year_built": 1948
                          },
                          "distance_miles": null
                        },
                        {
                          "deal_id": "cc86341046e78687cb2922e2831c2719",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-09-29",
                          "price": 300000,
                          "zip": "85008",
                          "county_fips": "04013",
                          "segment": "SFR",
                          "doc_class": "ECONOMIC",
                          "buyer": {
                            "name": "ECH RESIDENTIAL LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "ECH RESIDENTIAL LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "sellers": [
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001"
                            }
                          ],
                          "is_entity": true,
                          "ibuyer_brand": null,
                          "repeat_buyer": false,
                          "repeat_n_12m": 1,
                          "resale": {
                            "within_12m": false,
                            "sale_date": null,
                            "price": null,
                            "days_held": null
                          },
                          "seller_hold_days": null,
                          "same_day_resale": false,
                          "match": {
                            "basis": "filed",
                            "entity_no": "000000001",
                            "n_candidates": 1,
                            "existed_on_deed_date": true,
                            "name_at_deed_date": true
                          },
                          "tags": [],
                          "hard_reasons": [],
                          "auction_kind": null,
                          "is_auction_purchase": null,
                          "is_reo": false,
                          "marketplace_listing_id": null,
                          "purchase_loan_status": "not_measured",
                          "purchase_loan": null,
                          "short_term_rental": null,
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Phoenix",
                            "zip": "85008",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.467015,
                            "longitude": -112.009035,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": null,
                            "bathrooms": 2,
                            "living_area_sqft": 1521,
                            "year_built": 1952
                          },
                          "distance_miles": null
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 100
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:01.841Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take, or an address that matches more than one property. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investor-purchases/{purchase_id}": {
      "get": {
        "operationId": "data-investor-purchase",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read one investor purchase",
        "description": "**Cost:** $0.10 per item · desks only\n\nReturns one investor purchase: both sides of the deed, the property, the price, any resale, the chain of transfers around it and the loan that financed the purchase.\n\nThis is a Metered Call. If the data service rejects the request, finds no such purchase, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Investors"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "purchase_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one investor purchase: 32 lowercase hexadecimal characters, with no prefix. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{32}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "deal_id": "7d617834449db897a2589e87f756e3dc",
                        "property_id": "00000000000000000000000000000001",
                        "parcel": {
                          "line": "100 Sample Street",
                          "unit": null,
                          "city": "Phoenix",
                          "zip": "85008",
                          "county_fips": "04013",
                          "apn": "0000-000-000",
                          "latitude": 33.471135,
                          "longitude": -112.010868,
                          "address_held_back": null,
                          "location_radius_m": null,
                          "bedrooms": 6,
                          "bathrooms": 2,
                          "living_area_sqft": 1903,
                          "year_built": 1951
                        },
                        "sale_date": "2026-10-06",
                        "price": 294000,
                        "doc_class": "ECONOMIC",
                        "segment": "SFR",
                        "transaction_id": "00000000000000000000000000000001",
                        "document_number": "0000000001",
                        "flagged": true,
                        "hard_reasons": [],
                        "buyer_is_entity": true,
                        "buyer_has_trust": false,
                        "repeat_buyer": true,
                        "repeat_n_12m": 6,
                        "resale": {
                          "within_12m": false,
                          "sale_date": null,
                          "price": null,
                          "days_held": null
                        },
                        "seller_hold_days": 224,
                        "same_day_resale": false,
                        "buyers": [
                          {
                            "name": "LPC HOLDINGS LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "LPC HOLDINGS LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          }
                        ],
                        "sellers": [
                          {
                            "name": "ACTIVE FUNDING GROUP LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "ACTIVE FUNDING GROUP LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [
                              "institution"
                            ],
                            "person_id": null
                          }
                        ],
                        "chain": [
                          {
                            "deal_id": "00000000000000000000000000000001",
                            "position": 1,
                            "sale_date": "2026-10-06",
                            "price": 294000,
                            "doc_class": "ECONOMIC",
                            "flagged": true,
                            "buyers": [
                              {
                                "name": "LPC HOLDINGS LLC",
                                "org_id": "00000000000000000000000000000001",
                                "org_name": "LPC HOLDINGS LLC",
                                "from_registry": true,
                                "match_basis": "filed",
                                "company_like": true,
                                "tags": [],
                                "person_id": null
                              }
                            ]
                          },
                          {
                            "deal_id": "00000000000000000000000000000001",
                            "position": 2,
                            "sale_date": "2026-02-24",
                            "price": 303000,
                            "doc_class": "DISTRESSED",
                            "flagged": true,
                            "buyers": [
                              {
                                "name": "ACTIVE FUNDING GROUP LLC",
                                "org_id": "00000000000000000000000000000001",
                                "org_name": "ACTIVE FUNDING GROUP LLC",
                                "from_registry": true,
                                "match_basis": "filed",
                                "company_like": true,
                                "tags": [
                                  "institution"
                                ],
                                "person_id": null
                              }
                            ]
                          },
                          {
                            "deal_id": "00000000000000000000000000000001",
                            "position": 4,
                            "sale_date": "2024-11-11",
                            "price": 285000,
                            "doc_class": "ECONOMIC",
                            "flagged": true,
                            "buyers": [
                              {
                                "name": "YOHRE HOLDINGS LLC",
                                "org_id": "00000000000000000000000000000001",
                                "org_name": "YOHRE HOLDINGS LLC",
                                "from_registry": true,
                                "match_basis": "filed",
                                "company_like": true,
                                "tags": [],
                                "person_id": null
                              }
                            ]
                          }
                        ],
                        "auction": null,
                        "reo": {
                          "takeback_position": 2,
                          "takeback_date": "2026-02-24",
                          "takeback_type": "Deed in Lieu of Foreclosure",
                          "takeback_kind": "NOT_AUCTION",
                          "hops": 1,
                          "grantor_class": "INSTITUTION",
                          "evidence": "BOTH"
                        },
                        "marketplace": [],
                        "financing": {
                          "purchase_loan_status": "not_measured",
                          "purchase_loan": null,
                          "secondary_loans_n": null,
                          "link_window": null,
                          "outcome": null,
                          "resolved_on": null,
                          "months_to_resolution": null,
                          "foreclosed": null,
                          "as_of": "2026-06-25"
                        },
                        "short_term_rental": null,
                        "contact_redacted": false
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:18:02.654Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investors/active": {
      "get": {
        "operationId": "data-investors-active",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List the investors buying in ZIP codes",
        "description": "**Cost:** $1.00 per list · desks only\n\nReturns the companies buying in a list of ZIP codes, ranked. `zip` is required.\n\nThis is a Metered Call. If the data service rejects the request, fails or does not answer in time, the charge is returned to the Account as a Refund. An empty answer for a place inside the data’s coverage is an answer, and it is charged.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers. When the place a request names cannot be checked against the coverage and the answer is empty, the call answers `422` `property-not-found` and its charge is returned.",
        "tags": [
          "Investors"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "zip",
            "in": "query",
            "required": true,
            "description": "One or more five-digit ZIP codes, comma-separated or as repeated `zip` parameters. Required.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "org_id": "AZ:name:FEDERAL NATIONAL MORTGAGE ASSOCIATION",
                          "org_name": "FEDERAL NATIONAL MORTGAGE ASSOCIATION",
                          "from_registry": false,
                          "n_deals": 379,
                          "n_parcels": 378,
                          "n_resold": 340,
                          "first_deal_date": "1994-01-13",
                          "last_deal_date": "2019-03-12",
                          "total_price": 60886542,
                          "n_deals_all": null,
                          "n_entities": null,
                          "is_active": true,
                          "n_auction_buys": 0,
                          "is_active_auction_buyer": false,
                          "n_reo_buys": 0,
                          "is_active_reo_buyer": false,
                          "n_marketplace_buys": 0,
                          "financing": {
                            "n_loans": 2,
                            "n_loans_24m": 0,
                            "n_lenders": 2,
                            "n_lenders_tagged_hard_money": 0,
                            "top_lender": {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "ARIZONA INDUSTRIAL DEVELOPMENT AUTHORITY",
                              "from_registry": true,
                              "tags": [
                                "government"
                              ]
                            },
                            "last_loan_on": "2022-11-29",
                            "as_of": "2026-06-25"
                          },
                          "short_term_rental": null
                        },
                        {
                          "org_id": "AZ:name:DEUTSCHE BANK NATIONAL",
                          "org_name": "DEUTSCHE BANK NATIONAL TRUST COMPANY",
                          "from_registry": false,
                          "n_deals": 165,
                          "n_parcels": 162,
                          "n_resold": 146,
                          "first_deal_date": "2003-08-13",
                          "last_deal_date": "2026-05-11",
                          "total_price": 20770818,
                          "n_deals_all": null,
                          "n_entities": null,
                          "is_active": true,
                          "n_auction_buys": 0,
                          "is_active_auction_buyer": false,
                          "n_reo_buys": 0,
                          "is_active_reo_buyer": false,
                          "n_marketplace_buys": 0,
                          "financing": {
                            "n_loans": 0,
                            "n_loans_24m": 0,
                            "n_lenders": 0,
                            "n_lenders_tagged_hard_money": 0,
                            "top_lender": null,
                            "last_loan_on": null,
                            "as_of": "2026-06-25"
                          },
                          "short_term_rental": null
                        },
                        {
                          "org_id": "AZ:name:FEDERAL HOME LOAN MORTGAGE",
                          "org_name": "FEDERAL HOME LOAN MORTGAGE CORP",
                          "from_registry": false,
                          "n_deals": 160,
                          "n_parcels": 160,
                          "n_resold": 127,
                          "first_deal_date": "1993-10-08",
                          "last_deal_date": "2019-09-16",
                          "total_price": 16679756,
                          "n_deals_all": null,
                          "n_entities": null,
                          "is_active": true,
                          "n_auction_buys": 0,
                          "is_active_auction_buyer": false,
                          "n_reo_buys": 0,
                          "is_active_reo_buyer": false,
                          "n_marketplace_buys": 1,
                          "financing": {
                            "n_loans": 6,
                            "n_loans_24m": 1,
                            "n_lenders": 5,
                            "n_lenders_tagged_hard_money": 0,
                            "top_lender": {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "SUNSTREET MORTGAGE LLC",
                              "from_registry": true,
                              "tags": [
                                "institution"
                              ]
                            },
                            "last_loan_on": "2025-05-21",
                            "as_of": "2026-06-25"
                          },
                          "short_term_rental": null
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 97
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:04.524Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take, or an address that matches more than one property. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investors/match": {
      "get": {
        "operationId": "data-investors-match",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Rank the investors who buy homes like this one",
        "description": "**Cost:** $2.00 per call, up to 25 buyers · desks only\n\nRanks the companies whose recent purchases look like one property. Send the property as `property_id`; it is required.\n\nThe answer is a ranking of buyers. It is not a price, a value or an offer.\n\nThis is a Metered Call. If the data service rejects the request, finds no such property, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Investors"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "property_id",
            "in": "query",
            "required": true,
            "description": "The data service’s own identifier for the property: 32 lowercase hexadecimal characters, with no prefix, as the address lookup returns it. Required. The data service checks this value: one it refuses is answered [`400 upstream-rejected-request`](/errors/upstream-rejected-request), and the charge comes back as a Refund.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{32}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "OPENDOOR PROPERTY TRUST",
                          "from_registry": false,
                          "n_like": 11,
                          "n_zip": 11,
                          "n_near": 11,
                          "n_near_12m": 1,
                          "last_like_date": "2026-08-20",
                          "last_near_date": "2026-08-20",
                          "nearest_miles": null,
                          "median_like_price": 325800,
                          "price_p25_like": 303800,
                          "price_p75_like": 351150,
                          "n_deals_all": null,
                          "n_entities": null,
                          "company_like": true,
                          "is_active": true,
                          "days_since_last_purchase": 3,
                          "n_closings_as_buyer": 49,
                          "financing": {
                            "n_loans": 8,
                            "n_loans_24m": 3,
                            "n_lenders": 7,
                            "n_lenders_tagged_hard_money": 0,
                            "top_lender": {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "NRP MORTGAGE TRUST I",
                              "from_registry": false,
                              "tags": [
                                "institution"
                              ]
                            },
                            "last_loan_on": "2026-03-18",
                            "as_of": "2026-06-25"
                          },
                          "short_term_rental": null
                        },
                        {
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "WHOLESALE AUCTION HOMES LLC",
                          "from_registry": true,
                          "n_like": 9,
                          "n_zip": 9,
                          "n_near": 9,
                          "n_near_12m": 3,
                          "last_like_date": "2026-02-17",
                          "last_near_date": "2026-02-17",
                          "nearest_miles": null,
                          "median_like_price": 173370,
                          "price_p25_like": 172000,
                          "price_p75_like": 183370,
                          "n_deals_all": 426,
                          "n_entities": 28,
                          "company_like": null,
                          "is_active": true,
                          "days_since_last_purchase": 2,
                          "n_closings_as_buyer": 37,
                          "financing": {
                            "n_loans": 74,
                            "n_loans_24m": 21,
                            "n_lenders": 6,
                            "n_lenders_tagged_hard_money": 1,
                            "top_lender": {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "PAJ ENTERPRISES LLC",
                              "from_registry": true,
                              "tags": []
                            },
                            "last_loan_on": "2016-06-03",
                            "as_of": "2026-06-25"
                          },
                          "short_term_rental": null
                        },
                        {
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "BLACK ARROW CAPITAL LLC",
                          "from_registry": true,
                          "n_like": 7,
                          "n_zip": 7,
                          "n_near": 7,
                          "n_near_12m": 0,
                          "last_like_date": "2025-03-21",
                          "last_near_date": "2025-03-21",
                          "nearest_miles": null,
                          "median_like_price": 307500,
                          "price_p25_like": 255000,
                          "price_p75_like": 329500,
                          "n_deals_all": 436,
                          "n_entities": 15,
                          "company_like": null,
                          "is_active": true,
                          "days_since_last_purchase": 8,
                          "n_closings_as_buyer": 20,
                          "financing": {
                            "n_loans": 12,
                            "n_loans_24m": 0,
                            "n_lenders": 9,
                            "n_lenders_tagged_hard_money": 3,
                            "top_lender": {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "RFLF 4 LLC",
                              "from_registry": false,
                              "tags": []
                            },
                            "last_loan_on": "2023-06-12",
                            "as_of": "2026-06-25"
                          },
                          "short_term_rental": null
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 90
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:19:20.111Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      },
                      "subject": {
                        "property_id": "b6219fe62b8b51a0efa988aa8e6e0189",
                        "place": "zip",
                        "zip": "85008",
                        "lat": null,
                        "lng": null,
                        "radius_miles": null,
                        "segment": null,
                        "price": null,
                        "price_low": null,
                        "price_high": null,
                        "period": "36m",
                        "since": "2023-10-08",
                        "financing_as_of": "2026-06-25"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take, or an identifier it refuses. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investors/search": {
      "get": {
        "operationId": "data-investors-search",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Find an investor company by name",
        "description": "**Cost:** Free · desks only\n\nReturns the investor companies the data service holds whose names match the name you send as `q`, best first. `q` is required.\n\nFree: nothing is charged. An `Idempotency-Key` is ignored here.",
        "tags": [
          "Investors"
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer; this call is free either way.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "kind": "lender",
                          "match": "exact",
                          "text": "FEDERAL NATIONAL MORTGAGE ASSOCIATION",
                          "id": "00000000000000000000000000000001",
                          "state": "AZ",
                          "person_id": null,
                          "agent_id": null,
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "FEDERAL NATIONAL MORTGAGE ASSOCIATION",
                          "roles": [],
                          "n_listings": 0,
                          "n_deals": 15,
                          "n_entities": 0
                        },
                        {
                          "kind": "lender",
                          "match": "prefix",
                          "text": "FEDERAL NATIONAL MORTGAGE ASSN CHARTER A",
                          "id": "00000000000000000000000000000001",
                          "state": "AZ",
                          "person_id": null,
                          "agent_id": null,
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "FEDERAL NATIONAL MORTGAGE ASSN CHARTER A",
                          "roles": [],
                          "n_listings": 0,
                          "n_deals": 1,
                          "n_entities": 0
                        },
                        {
                          "kind": "lender",
                          "match": "prefix",
                          "text": "FEDERAL NATL MTG ASSN FNMA",
                          "id": "00000000000000000000000000000001",
                          "state": "AZ",
                          "person_id": null,
                          "agent_id": null,
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "FEDERAL NATL MTG ASSN FNMA",
                          "roles": [],
                          "n_listings": 0,
                          "n_deals": 1,
                          "n_entities": 0
                        }
                      ],
                      "page": {
                        "next_cursor": null,
                        "limit": 10,
                        "returned": 3,
                        "capped": false
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:26:56.407Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request was refused, by our own checks or by the data service: a malformed query string, or a parameter or value the data service does not accept. This call is free, so nothing was charged either way. Correct the request and send it again.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-request`\n\nThe body never echoes what you sent.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-request"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/ValidateTooManyRequests"
          },
          "503": {
            "description": "One of three distinct outcomes that share a status. **Branch on `type`, never on the status alone.** This call is free, so none of them charged anything.\n\n`https://docs.investorliftdata.com/errors/call-not-started` — no answer was produced: the data service failed, did not answer in time, or refused the call for a reason that is ours to fix rather than yours. Nothing was charged. For a connected app, one that signed you in instead of holding an API Key, it is also the answer when the one Ledger read that confirms the connection is still approved fails.\n\n`https://docs.investorliftdata.com/errors/spend-indeterminate` — the API's single catch-all failure type. Its body carries the general wording written for a Metered Call; that wording does not apply here, because this call records no Spend whose result could be in doubt. Nothing was charged.\n\n`https://docs.investorliftdata.com/errors/route-unavailable` — the endpoint is temporarily switched off by its operator, and **nothing was charged**. Other endpoints are unaffected.\n\nAll three carry `Retry-After`. Wait for that interval, then send the request again. Quote the `trace-id` header if you contact support.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "retry_after"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/call-not-started",
                        "https://docs.investorliftdata.com/errors/spend-indeterminate",
                        "https://docs.investorliftdata.com/errors/route-unavailable"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "retry_after": {
                      "type": "integer",
                      "description": "The `Retry-After` interval, in seconds, repeated in the body."
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "The name to look for. Required. The data service checks this value: one it refuses is answered [`400 invalid-request`](/errors/invalid-request), and nothing is charged.",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/data/investor-companies/{company_id}": {
      "get": {
        "operationId": "data-investor-companies-profile",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read an investor company’s profile",
        "description": "**Cost:** $0.50 per company · desks only\n\nReturns one investor company: its registered entities, its profile, what it holds, and its lending and borrowing.\n\nThis is a Metered Call. If the data service rejects the request, finds no such company, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Investor companies"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one investor company: a two-letter state code, a colon and the business-registry number. Percent-encode it in the path, so the colon is sent as `%3A`. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "id": "AZ:L07997410",
                        "kind": "registry",
                        "state": "AZ",
                        "display_name": "HOUSEOPOLY LLC",
                        "n_entities": 75,
                        "anchor_entity_no": "000000001",
                        "anchor_formation_date": "1997-02-12",
                        "display_entity_no": "000000001",
                        "display_basis": "deeds_5y",
                        "n_display_deeds": 185,
                        "deals": {
                          "n_deals": 1302,
                          "first_deal_date": "1996-06-25",
                          "last_deal_date": "2026-09-08",
                          "total_price": 109823737,
                          "n_sold": 1243,
                          "n_bought_from": 1496,
                          "n_sold_to": 1563
                        },
                        "profile": {
                          "data_end": "2026-10-08",
                          "n_purchases": 1306,
                          "n_sales": 1243,
                          "first_purchase_date": "1995-10-13",
                          "last_purchase_date": "2026-09-08",
                          "last_sale_date": "2026-09-21",
                          "n_purchases_12m": 64,
                          "n_purchases_24m": 101,
                          "n_purchases_36m": 148,
                          "is_active": true,
                          "days_since_last_purchase": 30,
                          "days_since_last_sale": 17,
                          "median_gap_days": 5,
                          "n_resold": 1200,
                          "n_held": 106,
                          "n_quick_resales": 118,
                          "n_flips": 521,
                          "n_flip_window_other": 192,
                          "n_long_holds_sold": 369,
                          "n_builds": 72,
                          "median_hold_days": 177,
                          "median_spread": 0.722,
                          "n_priced_purchases": 1207,
                          "price_p25": 80500,
                          "price_p50": 127056,
                          "price_p75": 230551,
                          "price_band_window": "5y",
                          "n_priced_purchases_24m": 92,
                          "price_p25_24m": 75000,
                          "price_p50_24m": 120446,
                          "price_p75_24m": 232501,
                          "n_sfr": 1004,
                          "n_condo_th": 145,
                          "n_other": 157,
                          "total_price": 110536433,
                          "n_bought_from_quick_resellers_24m": 0,
                          "top_quick_reseller": null,
                          "auction": {
                            "n_auction_buys": 945,
                            "n_auction_buys_24m": 85,
                            "last_auction_buy_date": "2026-09-08",
                            "is_active_auction_buyer": true,
                            "n_reo_buys": 23,
                            "n_reo_buys_24m": 0,
                            "last_reo_buy_date": "2012-10-24",
                            "is_active_reo_buyer": false
                          }
                        },
                        "entities": [
                          {
                            "entity_no": "000000001",
                            "name": "AMERICAN BUILDING MOVERS & SALVAGE, L.L.C.",
                            "display_name": "AMERICAN BUILDING MOVERS & SALVAGE LLC",
                            "kind": "LLC",
                            "type_as_filed": "Domestic Limited Liability Company",
                            "status": "Inactive",
                            "formation_date": "1997-02-12",
                            "is_foreign": false,
                            "is_anchor": true,
                            "former_names": [],
                            "agent_name": null,
                            "principal_address": {
                              "line1": "100 Sample Street",
                              "city": "dallas",
                              "state": "TX",
                              "zip": "75203"
                            },
                            "links": [
                              {
                                "link_class": "sample",
                                "link_key": null,
                                "rule": "sample",
                                "kept": true,
                                "joined": true,
                                "drop_reason": null,
                                "n_entities": 16
                              }
                            ]
                          },
                          {
                            "entity_no": "000000001",
                            "name": "STAGHORN VISTA, L.L.C.",
                            "display_name": "STAGHORN VISTA LLC",
                            "kind": "LLC",
                            "type_as_filed": "Domestic Limited Liability Company",
                            "status": "Active",
                            "formation_date": "1998-04-23",
                            "is_foreign": false,
                            "is_anchor": false,
                            "former_names": [],
                            "agent_name": null,
                            "principal_address": {
                              "line1": "100 Sample Street",
                              "city": "dallas",
                              "state": "TX",
                              "zip": "75203"
                            },
                            "links": [
                              {
                                "link_class": "sample",
                                "link_key": null,
                                "rule": "sample",
                                "kept": true,
                                "joined": true,
                                "drop_reason": null,
                                "n_entities": 13
                              },
                              {
                                "link_class": "sample",
                                "link_key": null,
                                "rule": "sample",
                                "kept": true,
                                "joined": false,
                                "drop_reason": "sample",
                                "n_entities": 2
                              },
                              {
                                "link_class": "sample",
                                "link_key": null,
                                "rule": "sample",
                                "kept": false,
                                "joined": false,
                                "drop_reason": "sample",
                                "n_entities": 24
                              }
                            ]
                          },
                          {
                            "entity_no": "000000001",
                            "name": "BAYSHORE HOLDINGS LLC",
                            "display_name": "BAYSHORE HOLDINGS LLC",
                            "kind": "LLC",
                            "type_as_filed": "Domestic Limited Liability Company",
                            "status": "Active",
                            "formation_date": "1999-06-21",
                            "is_foreign": false,
                            "is_anchor": false,
                            "former_names": [],
                            "agent_name": null,
                            "principal_address": {
                              "line1": "100 Sample Street",
                              "city": "dallas",
                              "state": "TX",
                              "zip": "75203"
                            },
                            "links": [
                              {
                                "link_class": "sample",
                                "link_key": null,
                                "rule": "sample",
                                "kept": true,
                                "joined": true,
                                "drop_reason": null,
                                "n_entities": 16
                              },
                              {
                                "link_class": "sample",
                                "link_key": null,
                                "rule": "sample",
                                "kept": true,
                                "joined": true,
                                "drop_reason": null,
                                "n_entities": 16
                              },
                              {
                                "link_class": "sample",
                                "link_key": "00000000000000000000000000000001",
                                "rule": "sample",
                                "kept": false,
                                "joined": false,
                                "drop_reason": "sample",
                                "n_entities": 4
                              }
                            ]
                          }
                        ],
                        "people": [],
                        "companies": [
                          {
                            "name": "Sample Owner",
                            "name_key": "00000000000000000000000000000001",
                            "n_filings": 20,
                            "org": {
                              "match": "ambiguous",
                              "org_id": null,
                              "entity_no": null,
                              "display_name": null
                            },
                            "filings": [
                              {
                                "entity_no": "000000001",
                                "title": "Statutory Agent",
                                "role": "agent",
                                "source": "agent",
                                "names_itself": false
                              },
                              {
                                "entity_no": "000000001",
                                "title": "Statutory Agent",
                                "role": "agent",
                                "source": "agent",
                                "names_itself": false
                              },
                              {
                                "entity_no": "000000001",
                                "title": "Statutory Agent",
                                "role": "agent",
                                "source": "agent",
                                "names_itself": false
                              }
                            ]
                          },
                          {
                            "name": "Sample Owner",
                            "name_key": "00000000000000000000000000000001",
                            "n_filings": 8,
                            "org": {
                              "match": "filed",
                              "org_id": "00000000000000000000000000000001",
                              "entity_no": "000000001",
                              "display_name": "Sample Owner"
                            },
                            "filings": [
                              {
                                "entity_no": "000000001",
                                "title": "Member",
                                "role": "member",
                                "source": "principal",
                                "names_itself": false
                              },
                              {
                                "entity_no": "000000001",
                                "title": "Member",
                                "role": "member",
                                "source": "principal",
                                "names_itself": false
                              },
                              {
                                "entity_no": "000000001",
                                "title": "Member",
                                "role": "member",
                                "source": "principal",
                                "names_itself": false
                              }
                            ]
                          },
                          {
                            "name": "Sample Owner",
                            "name_key": "00000000000000000000000000000001",
                            "n_filings": 8,
                            "org": {
                              "match": "none",
                              "org_id": null,
                              "entity_no": null,
                              "display_name": null
                            },
                            "filings": [
                              {
                                "entity_no": "000000001",
                                "title": "Member",
                                "role": "member",
                                "source": "principal",
                                "names_itself": false
                              },
                              {
                                "entity_no": "000000001",
                                "title": "Member",
                                "role": "member",
                                "source": "principal",
                                "names_itself": false
                              },
                              {
                                "entity_no": "000000001",
                                "title": "Member",
                                "role": "member",
                                "source": "principal",
                                "names_itself": false
                              }
                            ]
                          }
                        ],
                        "holdings": [
                          {
                            "entity_no": "000000001",
                            "name": "MARICOPOLY LLC",
                            "status": "Active",
                            "formation_date": "2016-05-24",
                            "org_id": "00000000000000000000000000000001",
                            "org_display_name": "MARICOPOLY LLC",
                            "role": "member",
                            "title": "Member",
                            "holder_entity_no": "000000001"
                          },
                          {
                            "entity_no": "000000001",
                            "name": "MARICOPOLY LLC",
                            "status": "Active",
                            "formation_date": "2016-05-24",
                            "org_id": "00000000000000000000000000000001",
                            "org_display_name": "MARICOPOLY LLC",
                            "role": "member",
                            "title": "Member",
                            "holder_entity_no": "000000001"
                          },
                          {
                            "entity_no": "000000001",
                            "name": "QUICK CASH FOR HOMES LLC",
                            "status": "Active",
                            "formation_date": "2012-06-13",
                            "org_id": "00000000000000000000000000000001",
                            "org_display_name": "QUICK CASH FOR HOMES LLC",
                            "role": "member",
                            "title": "Member",
                            "holder_entity_no": "000000001"
                          }
                        ],
                        "n_holdings": 4,
                        "n_agent_for": 0,
                        "n_agents": 32,
                        "marketplace": {
                          "n_listings": 0,
                          "n_closed": 0,
                          "n_closed_late": 0,
                          "n_open": 0,
                          "n_late_window": 0,
                          "n_no_deed": 0,
                          "n_unresolved": 0,
                          "first_published_on": null,
                          "last_published_on": null,
                          "n_closings_as_buyer": 3,
                          "last_closing_as_buyer_on": "2025-10-09",
                          "listings": [],
                          "seller_accounts": null
                        },
                        "lending": {
                          "lender_id": "00000000000000000000000000000001",
                          "display_name": "HOUSEOPOLY LLC",
                          "recorded_name": "HOUSEOPOLY LLC",
                          "from_registry": true,
                          "tags": [
                            "institution"
                          ],
                          "nmls": null,
                          "successor": null,
                          "counts": {
                            "n_loans": 265,
                            "n_loans_12m": 3,
                            "n_loans_24m": 10,
                            "n_loans_36m": 15,
                            "volume_24m": 5009325,
                            "n_unpriced_24m": 0,
                            "n_amount_excluded_24m": 0,
                            "n_blanket_positions_24m": 0,
                            "n_parcels": 213,
                            "n_in_history": 234,
                            "n_in_history_24m": 4,
                            "n_in_both_24m": 2,
                            "n_first_lien_24m": 8,
                            "n_heloc_24m": 0,
                            "n_construction_24m": 0,
                            "n_purchase_label_24m": 1,
                            "n_priced_24m": 10,
                            "n_rated_24m": 10,
                            "n_term_known_24m": 4,
                            "n_loans_since_2015": 117,
                            "n_before_2002": 0,
                            "n_undated": 0,
                            "first_recording_date": "2003-08-07",
                            "last_recording_date": "2025-10-27"
                          },
                          "open": {
                            "n_liens": 47,
                            "n_first_liens": 40,
                            "n_junior_liens": 7,
                            "n_due_known": 0,
                            "n_maturing_12m": 0,
                            "n_on_resold_parcels": 3,
                            "n_open_24m": 8,
                            "balance": 6648162,
                            "n_balance_excluded": 3
                          },
                          "terms": {
                            "amount_window": "all",
                            "amount_p25": 25825,
                            "amount_p50": 53000,
                            "amount_p75": 100000,
                            "rate_p50": 4.46,
                            "term_p50_months": 360,
                            "share_le_24m": 0,
                            "share_25_120m": 0,
                            "share_121_359m": 0,
                            "share_ge_360m": 1
                          },
                          "places": {
                            "n_zips_24m": 8,
                            "n_counties_24m": 4,
                            "top_zip5_24m": "85031",
                            "top_zip_share_24m": 0.2
                          },
                          "rank_in_state": {
                            "loans_24m": 1231,
                            "volume_24m": 1225
                          },
                          "deals": {
                            "n_deals": 1302,
                            "first_deal_date": "1996-06-25",
                            "last_deal_date": "2026-09-08"
                          },
                          "is_active_12m": true,
                          "has_open_book": true,
                          "borrowers": {
                            "n_borrowers": 145,
                            "n_borrowers_24m": 6,
                            "n_borrower_orgs_24m": 6,
                            "n_repeat_borrowers_24m": 2
                          },
                          "financed": {
                            "n_investor_loans": 108,
                            "n_investor_loans_24m": 4,
                            "n_investor_orgs_24m": 3,
                            "n_investor_loans_since_2015": 62,
                            "n_deals_financed": 35,
                            "n_deals_financed_24m": 5,
                            "n_auction_purchases_financed_24m": 1,
                            "n_marketplace_purchases_financed_24m": 0,
                            "n_purchase_24m": 6,
                            "n_not_purchase_24m": 3,
                            "n_purpose_unknown_24m": 1,
                            "investor_lender_by_count": false
                          },
                          "outcomes": {
                            "n_strict_all": 40,
                            "n_strict_24m": 5,
                            "n_captured_24m": 5,
                            "n_foreclosed": 0,
                            "n_foreclosed_24m": 0,
                            "n_resolved_by_resale": 24,
                            "n_refinanced": 10,
                            "n_open_outcome": 5,
                            "n_takebacks": 102,
                            "n_takebacks_24m": 21,
                            "median_months_to_payoff": null,
                            "is_auction_lender": false
                          },
                          "as_of": "2026-06-25",
                          "recordings_through": "2026-06-11"
                        },
                        "financing": {
                          "n_loans": 1128,
                          "n_loans_12m": 27,
                          "n_loans_24m": 38,
                          "n_lenders": 117,
                          "n_lenders_tagged_hard_money": 4,
                          "first_loan_on": "2003-10-21",
                          "last_loan_on": "2026-06-03",
                          "total_amount": 77077296,
                          "top_lenders": [
                            {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "VAN OAK CAPITAL LLC",
                              "from_registry": true,
                              "tags": [],
                              "n_deeds": 152
                            },
                            {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "COTTERKEY INVESTMENTS LTD",
                              "from_registry": true,
                              "tags": [],
                              "n_deeds": 126
                            },
                            {
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "RLS CAPITAL INC",
                              "from_registry": true,
                              "tags": [],
                              "n_deeds": 112
                            }
                          ],
                          "n_deals_financed_24m": 13,
                          "share_deals_financed_24m": 0.134020619,
                          "as_of": "2026-06-25"
                        },
                        "short_term_rental": null,
                        "ledger": [
                          {
                            "kind": "deed",
                            "role": "bought",
                            "via": "own",
                            "n": 1229
                          },
                          {
                            "kind": "deed",
                            "role": "bought",
                            "via": "principal",
                            "n": 86
                          },
                          {
                            "kind": "deed",
                            "role": "sold",
                            "via": "own",
                            "n": 1193
                          }
                        ],
                        "addresses": null,
                        "channels": null,
                        "accounts": null,
                        "contact_redacted": true
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:19:20.819Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investor-companies/{company_id}/purchases": {
      "get": {
        "operationId": "data-investor-companies-purchases",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List an investor company’s purchases",
        "description": "**Cost:** $0.50 per page · desks only\n\nReturns one investor company’s purchases, newest first.\n\nThis is a Metered Call. If the data service rejects the request, finds no such company, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Investor companies"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one investor company: a two-letter state code, a colon and the business-registry number. Percent-encode it in the path, so the colon is sent as `%3A`. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "deal_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-09-08",
                          "price": 116500,
                          "zip": "85351",
                          "county_fips": "04013",
                          "segment": "CONDO_TH",
                          "doc_class": "DISTRESSED",
                          "buyer": {
                            "name": "BURQWEST RE LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "HOUSEOPOLY LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "sellers": [
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001"
                            }
                          ],
                          "is_entity": true,
                          "ibuyer_brand": null,
                          "repeat_buyer": true,
                          "repeat_n_12m": 7,
                          "resale": {
                            "within_12m": false,
                            "sale_date": null,
                            "price": null,
                            "days_held": null
                          },
                          "seller_hold_days": 6133,
                          "same_day_resale": false,
                          "match": {
                            "basis": "filed",
                            "entity_no": "000000001",
                            "n_candidates": 1,
                            "existed_on_deed_date": true,
                            "name_at_deed_date": true
                          },
                          "tags": [],
                          "hard_reasons": [],
                          "auction_kind": "TRUSTEE_SALE",
                          "is_auction_purchase": true,
                          "is_reo": false,
                          "marketplace_listing_id": null,
                          "purchase_loan_status": "not_measured",
                          "purchase_loan": null,
                          "short_term_rental": null,
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": "Unit 1",
                            "city": "Sun City",
                            "zip": "85351",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.604238,
                            "longitude": -112.272153,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 2,
                            "bathrooms": 1,
                            "living_area_sqft": 1224,
                            "year_built": 1972
                          },
                          "distance_miles": null
                        },
                        {
                          "deal_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-09-01",
                          "price": 112600,
                          "zip": "85715",
                          "county_fips": "04019",
                          "segment": "CONDO_TH",
                          "doc_class": "DISTRESSED",
                          "buyer": {
                            "name": "J AND J DESERT ENTERPRISES LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "HOUSEOPOLY LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "sellers": [
                            {
                              "name": "COUNTY SHERIFF OF PIMA",
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "COUNTY SHERIFF OF PIMA",
                              "from_registry": false,
                              "match_basis": "none",
                              "company_like": true,
                              "tags": [
                                "government"
                              ],
                              "person_id": null
                            }
                          ],
                          "is_entity": true,
                          "ibuyer_brand": null,
                          "repeat_buyer": true,
                          "repeat_n_12m": 40,
                          "resale": {
                            "within_12m": false,
                            "sale_date": null,
                            "price": null,
                            "days_held": null
                          },
                          "seller_hold_days": 7757,
                          "same_day_resale": false,
                          "match": {
                            "basis": "filed",
                            "entity_no": "000000001",
                            "n_candidates": 1,
                            "existed_on_deed_date": true,
                            "name_at_deed_date": true
                          },
                          "tags": [],
                          "hard_reasons": [],
                          "auction_kind": "SHERIFF_SALE",
                          "is_auction_purchase": true,
                          "is_reo": false,
                          "marketplace_listing_id": null,
                          "purchase_loan_status": "not_measured",
                          "purchase_loan": null,
                          "short_term_rental": null,
                          "contact_redacted": false,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": "Unit 1",
                            "city": "Tucson",
                            "zip": "85715",
                            "county_fips": "04019",
                            "apn": "0000-000-000",
                            "latitude": 32.249559,
                            "longitude": -110.828599,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 2,
                            "bathrooms": 2,
                            "living_area_sqft": 1010,
                            "year_built": 1986
                          },
                          "distance_miles": null
                        },
                        {
                          "deal_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-09-01",
                          "price": 19683,
                          "zip": "85138",
                          "county_fips": "04021",
                          "segment": "SFR",
                          "doc_class": "DISTRESSED",
                          "buyer": {
                            "name": "J AND J DESERT ENTERPRISES LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "HOUSEOPOLY LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "sellers": [
                            {
                              "name": "OF SHERIFF OF THE COUNTY OF PINAL STATE",
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "OF SHERIFF OF THE COUNTY OF PINAL STATE",
                              "from_registry": false,
                              "match_basis": "none",
                              "company_like": true,
                              "tags": [
                                "government",
                                "institution"
                              ],
                              "person_id": null
                            }
                          ],
                          "is_entity": true,
                          "ibuyer_brand": null,
                          "repeat_buyer": true,
                          "repeat_n_12m": 40,
                          "resale": {
                            "within_12m": false,
                            "sale_date": null,
                            "price": null,
                            "days_held": null
                          },
                          "seller_hold_days": 2728,
                          "same_day_resale": false,
                          "match": {
                            "basis": "filed",
                            "entity_no": "000000001",
                            "n_candidates": 1,
                            "existed_on_deed_date": true,
                            "name_at_deed_date": true
                          },
                          "tags": [],
                          "hard_reasons": [],
                          "auction_kind": "SHERIFF_SALE",
                          "is_auction_purchase": true,
                          "is_reo": false,
                          "marketplace_listing_id": null,
                          "purchase_loan_status": "not_measured",
                          "purchase_loan": null,
                          "short_term_rental": null,
                          "contact_redacted": false,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Maricopa",
                            "zip": "85138",
                            "county_fips": "04021",
                            "apn": "0000-000-000",
                            "latitude": 33.045184,
                            "longitude": -112.00949,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 4,
                            "bathrooms": 3,
                            "living_area_sqft": 2294,
                            "year_built": 2008
                          },
                          "distance_miles": null
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 100
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:19:21.403Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investor-companies/{company_id}/sales": {
      "get": {
        "operationId": "data-investor-companies-sales",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List an investor company’s sales",
        "description": "**Cost:** $0.50 per page · desks only\n\nReturns what one investor company sold, and to whom.\n\nThis is a Metered Call. If the data service rejects the request, finds no such company, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Investor companies"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one investor company: a two-letter state code, a colon and the business-registry number. Percent-encode it in the path, so the colon is sent as `%3A`. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "deal_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-09-21",
                          "price": 299900,
                          "zip": "86323",
                          "flagged": true,
                          "seller": {
                            "name": "HOUSEOPOLY LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "HOUSEOPOLY LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "buyers": [
                            {
                              "name": "TULE RIVER HOME BUYER EARNED EQUITY AGENCY",
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "TULE RIVER HOME BUYER EARNED EQUITY AGENCY",
                              "from_registry": false,
                              "match_basis": "none",
                              "company_like": true,
                              "tags": [],
                              "person_id": null
                            }
                          ],
                          "contact_redacted": false,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Chino Valley",
                            "zip": "86323",
                            "county_fips": "04025",
                            "apn": "0000-000-000",
                            "latitude": 34.803176,
                            "longitude": -112.499848,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 5,
                            "bathrooms": 3,
                            "living_area_sqft": 1792,
                            "year_built": 1998
                          },
                          "distance_miles": null
                        },
                        {
                          "deal_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-09-17",
                          "price": 245000,
                          "zip": "85326",
                          "flagged": false,
                          "seller": {
                            "name": "J & J DESERT ENTERPRISES LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "HOUSEOPOLY LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "buyers": [
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001"
                            },
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001"
                            }
                          ],
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Buckeye",
                            "zip": "85326",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.384087,
                            "longitude": -112.583342,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 2,
                            "bathrooms": 1,
                            "living_area_sqft": 816,
                            "year_built": 1954
                          },
                          "distance_miles": null
                        },
                        {
                          "deal_id": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "sale_date": "2026-08-27",
                          "price": 320000,
                          "zip": "85138",
                          "flagged": false,
                          "seller": {
                            "name": "HOUSEOPOLY LLC",
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "HOUSEOPOLY LLC",
                            "from_registry": true,
                            "match_basis": "filed",
                            "company_like": true,
                            "tags": [],
                            "person_id": null
                          },
                          "buyers": [
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001"
                            }
                          ],
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Maricopa",
                            "zip": "85138",
                            "county_fips": "04021",
                            "apn": "0000-000-000",
                            "latitude": 33.044917,
                            "longitude": -112.00949,
                            "address_held_back": null,
                            "location_radius_m": null,
                            "bedrooms": 3,
                            "bathrooms": 3,
                            "living_area_sqft": 2294,
                            "year_built": 2008
                          },
                          "distance_miles": null
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 100
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:19:23.759Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/lenders": {
      "get": {
        "operationId": "data-lenders",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List the lenders active in a place",
        "description": "**Cost:** $1.00 per list · desks only\n\nReturns the lenders of a state, a county or a list of ZIP codes, ranked.\n\n**Where.** Send the two-letter `state`; the data service requires it. Narrow it with a `county`, or send a list of ZIP codes (`zip`).\n\nThis is a Metered Call. If the data service rejects the request, answers that what it names does not exist, fails or does not answer in time, the charge is returned to the Account as a Refund. An empty answer for a place inside the data’s coverage is an answer, and it is charged.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers. When the place a request names cannot be checked against the coverage and the answer is empty, the call answers `422` `property-not-found` and its charge is returned.",
        "tags": [
          "Lenders"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "state",
            "in": "query",
            "required": true,
            "description": "The two-letter state code of the place. Required. The data service checks this value: one it refuses is answered [`400 upstream-rejected-request`](/errors/upstream-rejected-request), and the charge comes back as a Refund.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "county",
            "in": "query",
            "required": false,
            "description": "A county of the `state`, to narrow the lenders to it. The data service checks this value: one it refuses is answered [`400 upstream-rejected-request`](/errors/upstream-rejected-request), and the charge comes back as a Refund.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zip",
            "in": "query",
            "required": false,
            "description": "Five-digit ZIP codes, comma-separated or as repeated `zip` parameters.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "rank": 1,
                          "lender": {
                            "org_id": "AZ:02332544",
                            "org_name": "DESERT FINANCIAL CREDIT UNION",
                            "from_registry": true,
                            "tags": [
                              "credit_union",
                              "institution"
                            ]
                          },
                          "recorded_name": "DESERT FINANCIAL CU",
                          "n": 121,
                          "n_recordings": 121,
                          "volume": 15333587,
                          "n_first_lien": 101,
                          "n_heloc": 106,
                          "n_construction": 1,
                          "n_open_liens": null,
                          "open_balance": null,
                          "share": 0.081591369,
                          "n_investor_loans": 7,
                          "n_investor_recordings": 7,
                          "n_investor_orgs": 8,
                          "n_deals_financed": 0,
                          "investor_share": 0.05785124,
                          "last_recorded_on": "2026-06-11",
                          "as_of": "2026-06-25",
                          "recordings_through": "2026-06-11",
                          "contact_redacted": true
                        },
                        {
                          "rank": 2,
                          "lender": {
                            "org_id": "AZ:R17517033",
                            "org_name": "UNITED WHOLESALE MORTGAGE LLC",
                            "from_registry": true,
                            "tags": [
                              "institution"
                            ]
                          },
                          "recorded_name": "UNITED WHOLESALE MORTGAGE",
                          "n": 78,
                          "n_recordings": 78,
                          "volume": 27787883,
                          "n_first_lien": 69,
                          "n_heloc": 9,
                          "n_construction": 0,
                          "n_open_liens": null,
                          "open_balance": null,
                          "share": 0.052596089,
                          "n_investor_loans": 1,
                          "n_investor_recordings": 1,
                          "n_investor_orgs": 1,
                          "n_deals_financed": 0,
                          "investor_share": 0.012820513,
                          "last_recorded_on": "2026-05-21",
                          "as_of": "2026-06-25",
                          "recordings_through": "2026-06-11",
                          "contact_redacted": true
                        },
                        {
                          "rank": 3,
                          "lender": {
                            "org_id": "AZ:23078262",
                            "org_name": "ROCKET MORTGAGE LLC",
                            "from_registry": true,
                            "tags": [
                              "institution"
                            ]
                          },
                          "recorded_name": "ROCKET MORTGAGE LLC",
                          "n": 70,
                          "n_recordings": 70,
                          "volume": 21276903,
                          "n_first_lien": 63,
                          "n_heloc": 0,
                          "n_construction": 0,
                          "n_open_liens": null,
                          "open_balance": null,
                          "share": 0.047201618,
                          "n_investor_loans": 0,
                          "n_investor_recordings": 0,
                          "n_investor_orgs": 0,
                          "n_deals_financed": 0,
                          "investor_share": 0,
                          "last_recorded_on": "2026-06-11",
                          "as_of": "2026-06-25",
                          "recordings_through": "2026-06-11",
                          "contact_redacted": true
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 100
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:05.369Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/lenders/{lender_id}": {
      "get": {
        "operationId": "data-lenders-profile",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read a lender’s profile",
        "description": "**Cost:** $0.50 per lender · desks only\n\nReturns one lender: its loan counts, its open book, the spread of its loan amounts, rates and terms, and the places it lends in.\n\nThis is a Metered Call. If the data service rejects the request, finds no such lender, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Lenders"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lender_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one lender: a two-letter state code, a colon, then a registry number or a name key. Percent-encode it in the path, so each colon is sent as `%3A`. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "id": "AZ:02332544",
                        "state": "AZ",
                        "kind": "registry",
                        "display_name": "DESERT FINANCIAL CREDIT UNION",
                        "recorded_name": "DESERT FINANCIAL CU",
                        "from_registry": true,
                        "tags": [
                          "credit_union",
                          "institution"
                        ],
                        "nmls": {
                          "id": 509455,
                          "url": "https://example.com/listing/1"
                        },
                        "successor": null,
                        "counts": {
                          "n_loans": 123288,
                          "n_loans_12m": 10017,
                          "n_loans_24m": 19297,
                          "n_loans_36m": 26677,
                          "volume_24m": 2928121539,
                          "n_unpriced_24m": 1,
                          "n_amount_excluded_24m": 14,
                          "n_blanket_positions_24m": 5,
                          "n_parcels": 88168,
                          "n_in_history": 107319,
                          "n_in_history_24m": 11332,
                          "n_in_both_24m": 9554,
                          "n_first_lien_24m": 17247,
                          "n_heloc_24m": 17767,
                          "n_construction_24m": 10,
                          "n_purchase_label_24m": 60,
                          "n_priced_24m": 19282,
                          "n_rated_24m": 18163,
                          "n_term_known_24m": 15627,
                          "n_loans_since_2015": 64040,
                          "n_before_2002": 81,
                          "n_undated": 0,
                          "first_recording_date": "1994-08-19",
                          "last_recording_date": "2026-06-11"
                        },
                        "open": {
                          "n_liens": 44291,
                          "n_first_liens": 39782,
                          "n_junior_liens": 4509,
                          "n_due_known": 39461,
                          "n_maturing_12m": 70,
                          "n_on_resold_parcels": 513,
                          "n_open_24m": 17512,
                          "balance": 5446379138,
                          "n_balance_excluded": 562
                        },
                        "terms": {
                          "amount_window": "24m",
                          "amount_p25": 70000,
                          "amount_p50": 100000,
                          "amount_p75": 150000,
                          "rate_p50": 6.64,
                          "term_p50_months": 360,
                          "share_le_24m": 0.00019108,
                          "share_25_120m": 0.014556825,
                          "share_121_359m": 0.303426412,
                          "share_ge_360m": 0.681825683
                        },
                        "places": {
                          "n_zips_24m": 277,
                          "n_counties_24m": 15,
                          "top_zip5_24m": "85142",
                          "top_zip_share_24m": 0.021091361
                        },
                        "rank_in_state": {
                          "loans_24m": 3,
                          "volume_24m": 5
                        },
                        "deals": {
                          "n_deals": 13,
                          "first_deal_date": "2000-06-15",
                          "last_deal_date": "2026-09-28"
                        },
                        "is_active_12m": true,
                        "has_open_book": true,
                        "borrowers": {
                          "n_borrowers": 144053,
                          "n_borrowers_24m": 27348,
                          "n_borrower_orgs_24m": 27198,
                          "n_repeat_borrowers_24m": 949
                        },
                        "financed": {
                          "n_investor_loans": 7215,
                          "n_investor_loans_24m": 1101,
                          "n_investor_orgs_24m": 1123,
                          "n_investor_loans_since_2015": 3957,
                          "n_deals_financed": 79,
                          "n_deals_financed_24m": 11,
                          "n_auction_purchases_financed_24m": 0,
                          "n_marketplace_purchases_financed_24m": 0,
                          "n_purchase_24m": 757,
                          "n_not_purchase_24m": 17481,
                          "n_purpose_unknown_24m": 1059,
                          "investor_lender_by_count": false
                        },
                        "outcomes": {
                          "n_strict_all": 83,
                          "n_strict_24m": 11,
                          "n_captured_24m": 12,
                          "n_foreclosed": 0,
                          "n_foreclosed_24m": 0,
                          "n_resolved_by_resale": 23,
                          "n_refinanced": 26,
                          "n_open_outcome": 48,
                          "n_takebacks": 35,
                          "n_takebacks_24m": 9,
                          "median_months_to_payoff": 92.3,
                          "is_auction_lender": true
                        },
                        "as_of": "2026-06-25",
                        "recordings_through": "2026-06-11",
                        "names": [
                          {
                            "name": "DESERT SCHOOLS FCU",
                            "lender_key": "DESERT SCHOOLS FEDERAL CREDIT UNION",
                            "identity_basis": "dictionary",
                            "company_like": true,
                            "tags": [
                              "credit_union",
                              "institution"
                            ],
                            "entity_no": "000000001",
                            "match_basis": "filed",
                            "n_rows": 86934,
                            "n_rows_24m": 1,
                            "first_recording_date": "1994-08-19",
                            "last_recording_date": "2025-07-15"
                          },
                          {
                            "name": "DESERT FINANCIAL CU",
                            "lender_key": "DESERT FINANCIAL CREDIT UNION",
                            "identity_basis": "key",
                            "company_like": true,
                            "tags": [
                              "credit_union",
                              "institution"
                            ],
                            "entity_no": "000000001",
                            "match_basis": "filed",
                            "n_rows": 78844,
                            "n_rows_24m": 33174,
                            "first_recording_date": "2018-01-08",
                            "last_recording_date": "2026-06-09"
                          },
                          {
                            "name": "DESERT FINANCIAL CREDIT UNION",
                            "lender_key": "DESERT FINANCIAL CREDIT UNION",
                            "identity_basis": "key",
                            "company_like": true,
                            "tags": [
                              "credit_union",
                              "institution"
                            ],
                            "entity_no": "000000001",
                            "match_basis": "filed",
                            "n_rows": 30288,
                            "n_rows_24m": 13195,
                            "first_recording_date": "2018-01-16",
                            "last_recording_date": "2026-06-11"
                          }
                        ],
                        "lender_key": "DESERT FINANCIAL CREDIT UNION",
                        "identity_bases": [
                          "dictionary",
                          "key"
                        ],
                        "by_county": [
                          {
                            "key": "04013",
                            "n_24m": 16961,
                            "n_all": 113270,
                            "volume_24m": 2570595982,
                            "share_of_lender": 0.878944914,
                            "rank_in_place": 1,
                            "share_of_place": 0.065396598,
                            "n_investor_loans_24m": 985,
                            "n_investor_loans_all": 6666
                          },
                          {
                            "key": "04021",
                            "n_24m": 1336,
                            "n_all": 5904,
                            "volume_24m": 158287076,
                            "share_of_lender": 0.06923356,
                            "rank_in_place": 6,
                            "share_of_place": 0.032134696,
                            "n_investor_loans_24m": 62,
                            "n_investor_loans_all": 284
                          },
                          {
                            "key": "04025",
                            "n_24m": 347,
                            "n_all": 1182,
                            "volume_24m": 59624805,
                            "share_of_lender": 0.01798207,
                            "rank_in_place": 6,
                            "share_of_place": 0.020533759,
                            "n_investor_loans_24m": 22,
                            "n_investor_loans_all": 107
                          }
                        ],
                        "by_zip": [
                          {
                            "key": "85142",
                            "n_24m": 407,
                            "n_all": 1781,
                            "volume_24m": 71906932,
                            "share_of_lender": 0.021091361,
                            "rank_in_place": 2,
                            "share_of_place": 0.05648855,
                            "n_investor_loans_24m": 31,
                            "n_investor_loans_all": 123
                          },
                          {
                            "key": "85383",
                            "n_24m": 403,
                            "n_all": 2259,
                            "volume_24m": 66320078,
                            "share_of_lender": 0.020884075,
                            "rank_in_place": 2,
                            "share_of_place": 0.064202645,
                            "n_investor_loans_24m": 30,
                            "n_investor_loans_all": 171
                          },
                          {
                            "key": "85326",
                            "n_24m": 365,
                            "n_all": 1347,
                            "volume_24m": 35009769,
                            "share_of_lender": 0.018914857,
                            "rank_in_place": 4,
                            "share_of_place": 0.043478261,
                            "n_investor_loans_24m": 17,
                            "n_investor_loans_all": 95
                          }
                        ],
                        "other_states": [],
                        "contact_redacted": true
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:18:04.580Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/lenders/{lender_id}/loans": {
      "get": {
        "operationId": "data-lenders-loans",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List a lender’s loans",
        "description": "**Cost:** $0.50 per page · desks only\n\nReturns one lender’s loans, newest first.\n\nThis is a Metered Call. If the data service rejects the request, finds no such lender, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Lenders"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lender_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one lender: a two-letter state code, a colon, then a registry number or a name key. Percent-encode it in the path, so each colon is sent as `%3A`. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "loan_key": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "source": "recorded",
                          "position": 2,
                          "is_instrument": true,
                          "in_both": false,
                          "lender": {
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "DESERT FINANCIAL CREDIT UNION",
                            "from_registry": true,
                            "tags": [
                              "credit_union",
                              "institution"
                            ]
                          },
                          "lender_name_as_recorded": "DESERT FINANCIAL CREDIT UNION",
                          "assigned_lender_name": null,
                          "lender_open": null,
                          "lender_disagrees": false,
                          "recording_date": "2026-06-11",
                          "document_date": "2026-06-06",
                          "due_date": null,
                          "loan_amount": 50000,
                          "amount_outlier": false,
                          "current_balance": null,
                          "balance_outlier": null,
                          "interest_rate": null,
                          "interest_rate_type": null,
                          "estimated_payment": null,
                          "term_months": null,
                          "months": null,
                          "term_band": "unknown",
                          "loan_type": "Credit Line (Revolving)",
                          "loan_type_code": "K",
                          "financing_type": null,
                          "label": "heloc",
                          "label_as_recorded": "HELOCS - both purchase money and non-purchase money HELOCS",
                          "product": "heloc",
                          "product_basis": null,
                          "product_proxy": null,
                          "purpose_of_loan": null,
                          "heloc": null,
                          "construction_loan": null,
                          "standalone_refi": null,
                          "cash_purchase": null,
                          "adjustable_rate_rider": null,
                          "ltv": null,
                          "blanket": null,
                          "link": {
                            "purpose": "not_purchase",
                            "deed_deal_id": null,
                            "deed_date": null,
                            "deed_price": null,
                            "loan_to_price": null,
                            "sale_mtg_match": false,
                            "deal": null,
                            "outcome": null,
                            "resolved_on": null,
                            "months_to_resolution": null,
                            "foreclosed": null
                          },
                          "borrowers": [
                            {
                              "name": null,
                              "org_id": "00000000000000000000000000000001",
                              "org_name": "Sample Company LLC",
                              "from_registry": true,
                              "match_basis": "principal",
                              "company_like": false,
                              "tags": [],
                              "person_id": null,
                              "borrower_basis": "registry"
                            }
                          ],
                          "as_of": "2026-06-25",
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Tempe",
                            "zip": "85282",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.388398,
                            "longitude": -111.951252,
                            "address_held_back": null,
                            "location_radius_m": null
                          }
                        },
                        {
                          "loan_key": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "source": "recorded",
                          "position": 2,
                          "is_instrument": true,
                          "in_both": false,
                          "lender": {
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "DESERT FINANCIAL CREDIT UNION",
                            "from_registry": true,
                            "tags": [
                              "credit_union",
                              "institution"
                            ]
                          },
                          "lender_name_as_recorded": "DESERT FINANCIAL CREDIT UNION",
                          "assigned_lender_name": null,
                          "lender_open": null,
                          "lender_disagrees": false,
                          "recording_date": "2026-06-11",
                          "document_date": "2026-06-06",
                          "due_date": null,
                          "loan_amount": 45000,
                          "amount_outlier": false,
                          "current_balance": null,
                          "balance_outlier": null,
                          "interest_rate": null,
                          "interest_rate_type": null,
                          "estimated_payment": null,
                          "term_months": null,
                          "months": null,
                          "term_band": "unknown",
                          "loan_type": "Credit Line (Revolving)",
                          "loan_type_code": "K",
                          "financing_type": null,
                          "label": "heloc",
                          "label_as_recorded": "HELOCS - both purchase money and non-purchase money HELOCS",
                          "product": "heloc",
                          "product_basis": null,
                          "product_proxy": null,
                          "purpose_of_loan": null,
                          "heloc": null,
                          "construction_loan": null,
                          "standalone_refi": null,
                          "cash_purchase": null,
                          "adjustable_rate_rider": null,
                          "ltv": null,
                          "blanket": null,
                          "link": {
                            "purpose": "not_purchase",
                            "deed_deal_id": null,
                            "deed_date": null,
                            "deed_price": null,
                            "loan_to_price": null,
                            "sale_mtg_match": false,
                            "deal": null,
                            "outcome": null,
                            "resolved_on": null,
                            "months_to_resolution": null,
                            "foreclosed": null
                          },
                          "borrowers": [
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001",
                              "borrower_basis": "party"
                            }
                          ],
                          "as_of": "2026-06-25",
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Chandler",
                            "zip": "85226",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.300603,
                            "longitude": -111.929896,
                            "address_held_back": null,
                            "location_radius_m": null
                          }
                        },
                        {
                          "loan_key": "00000000000000000000000000000001",
                          "property_id": "00000000000000000000000000000001",
                          "source": "recorded",
                          "position": 3,
                          "is_instrument": true,
                          "in_both": false,
                          "lender": {
                            "org_id": "00000000000000000000000000000001",
                            "org_name": "DESERT FINANCIAL CREDIT UNION",
                            "from_registry": true,
                            "tags": [
                              "credit_union",
                              "institution"
                            ]
                          },
                          "lender_name_as_recorded": "DESERT FINANCIAL CREDIT UNION",
                          "assigned_lender_name": null,
                          "lender_open": null,
                          "lender_disagrees": false,
                          "recording_date": "2026-06-11",
                          "document_date": "2026-06-06",
                          "due_date": null,
                          "loan_amount": 365467,
                          "amount_outlier": false,
                          "current_balance": null,
                          "balance_outlier": null,
                          "interest_rate": null,
                          "interest_rate_type": null,
                          "estimated_payment": null,
                          "term_months": null,
                          "months": null,
                          "term_band": "unknown",
                          "loan_type": "Credit Line (Revolving)",
                          "loan_type_code": "K",
                          "financing_type": null,
                          "label": "heloc",
                          "label_as_recorded": "HELOCS - both purchase money and non-purchase money HELOCS",
                          "product": "heloc",
                          "product_basis": null,
                          "product_proxy": null,
                          "purpose_of_loan": null,
                          "heloc": null,
                          "construction_loan": null,
                          "standalone_refi": null,
                          "cash_purchase": null,
                          "adjustable_rate_rider": null,
                          "ltv": null,
                          "blanket": null,
                          "link": {
                            "purpose": "not_purchase",
                            "deed_deal_id": null,
                            "deed_date": null,
                            "deed_price": null,
                            "loan_to_price": null,
                            "sale_mtg_match": false,
                            "deal": null,
                            "outcome": null,
                            "resolved_on": null,
                            "months_to_resolution": null,
                            "foreclosed": null
                          },
                          "borrowers": [
                            {
                              "name": null,
                              "org_id": null,
                              "org_name": null,
                              "from_registry": null,
                              "match_basis": "none",
                              "company_like": false,
                              "tags": [],
                              "person_id": "00000000000000000000000000000001",
                              "borrower_basis": "mortgage_only"
                            }
                          ],
                          "as_of": "2026-06-25",
                          "contact_redacted": true,
                          "parcel": {
                            "line": "100 Sample Street",
                            "unit": null,
                            "city": "Gilbert",
                            "zip": "85295",
                            "county_fips": "04013",
                            "apn": "0000-000-000",
                            "latitude": 33.306305,
                            "longitude": -111.728761,
                            "address_held_back": null,
                            "location_radius_m": null
                          }
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 100
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:18:10.503Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/lenders/{lender_id}/borrowers": {
      "get": {
        "operationId": "data-lenders-borrowers",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List who a lender lends to",
        "description": "**Cost:** $0.50 per page · desks only\n\nReturns one lender’s borrowers, as companies.\n\nThis is a Metered Call. If the data service rejects the request, finds no such lender, fails or does not answer in time, the charge is returned to the Account as a Refund.",
        "tags": [
          "Lenders"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lender_id",
            "in": "path",
            "required": true,
            "description": "The data service’s own identifier for one lender: a two-letter state code, a colon, then a registry number or a name key. Percent-encode it in the path, so each colon is sent as `%3A`. An identifier in any other form is refused before anything is charged.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "relation": "lent_to",
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "ESTRELLA LOGISTICS LLC",
                          "from_registry": true,
                          "is_investor": false,
                          "n_deals_all": 0,
                          "tags": [],
                          "n_deeds": 33,
                          "first_date": "2023-09-05",
                          "last_date": "2024-10-03",
                          "total_price": 1204000,
                          "n_deeds_24m": 1,
                          "window_end": "2026-06-25",
                          "n_zips": 1,
                          "cp_n_purchases": 1,
                          "cp_n_quick_resales": 0,
                          "cp_median_hold_days": null
                        },
                        {
                          "relation": "lent_to",
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "SOUL SISTERS 412 LLC",
                          "from_registry": true,
                          "is_investor": false,
                          "n_deals_all": 0,
                          "tags": [],
                          "n_deeds": 26,
                          "first_date": "2023-12-15",
                          "last_date": "2025-06-30",
                          "total_price": 1675000,
                          "n_deeds_24m": 1,
                          "window_end": "2026-06-25",
                          "n_zips": 2,
                          "cp_n_purchases": 3,
                          "cp_n_quick_resales": 0,
                          "cp_median_hold_days": null
                        },
                        {
                          "relation": "lent_to",
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "INCLEDON 2 LLC",
                          "from_registry": true,
                          "is_investor": true,
                          "n_deals_all": 1,
                          "tags": [],
                          "n_deeds": 24,
                          "first_date": "2021-07-21",
                          "last_date": "2022-04-27",
                          "total_price": 2680000,
                          "n_deeds_24m": 0,
                          "window_end": "2026-06-25",
                          "n_zips": 1,
                          "cp_n_purchases": 1,
                          "cp_n_quick_resales": 0,
                          "cp_median_hold_days": 475
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 69
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:18:11.095Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: an identifier outside its documented form, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: an identifier, parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds no property for the identifier on this request: a well-formed identifier it does not know, or one it has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the identifier and send the request again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/zips/{zip}/summary": {
      "get": {
        "operationId": "data-zips-summary",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read a ZIP code’s snapshot",
        "description": "**Cost:** Free\n\nReturns the headline numbers the data service holds for one ZIP code: its purchases, prices, buyers, listings and agents.\n\nFree: nothing is charged. An `Idempotency-Key` is ignored here.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers.",
        "tags": [
          "ZIP codes and coverage"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "zip",
            "in": "path",
            "required": true,
            "description": "A five-digit ZIP code. A ZIP code in any other form is refused before anything is charged.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{5}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer; this call is free either way.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "zip": "85008",
                        "deeds_since": "2025-10-08",
                        "listings_since": "2025-10-19",
                        "deeds": {
                          "n_purchases": 28461,
                          "n_flagged": 9582,
                          "n_purchases_12m": 385,
                          "n_flagged_12m": 114,
                          "median_price_12m": 380000,
                          "n_buyers_12m": 104,
                          "n_registry_buyers_12m": 77
                        },
                        "listings": {
                          "n_active": 132,
                          "n_pending": 4,
                          "n_rentals_active": 0,
                          "n_sold_12m": 202,
                          "n_off_market_12m": 217,
                          "median_list_price": 415000,
                          "median_sold_price_12m": 386250
                        },
                        "agents": {
                          "n_agents_12m": 380,
                          "n_brokerages_12m": 123
                        }
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:05.884Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request was refused, by our own checks or by the data service: a malformed query string, or a parameter or value the data service does not accept. This call is free, so nothing was charged either way. Correct the request and send it again.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-request`\n\nThe body never echoes what you sent.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-request"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/ValidateTooManyRequests"
          },
          "503": {
            "description": "One of three distinct outcomes that share a status. **Branch on `type`, never on the status alone.** This call is free, so none of them charged anything.\n\n`https://docs.investorliftdata.com/errors/call-not-started` — no answer was produced: the data service failed, did not answer in time, or refused the call for a reason that is ours to fix rather than yours. Nothing was charged. For a connected app, one that signed you in instead of holding an API Key, it is also the answer when the one Ledger read that confirms the connection is still approved fails.\n\n`https://docs.investorliftdata.com/errors/spend-indeterminate` — the API's single catch-all failure type. Its body carries the general wording written for a Metered Call; that wording does not apply here, because this call records no Spend whose result could be in doubt. Nothing was charged.\n\n`https://docs.investorliftdata.com/errors/route-unavailable` — the endpoint is temporarily switched off by its operator, and **nothing was charged**. Other endpoints are unaffected.\n\nAll three carry `Retry-After`. Wait for that interval, then send the request again. Quote the `trace-id` header if you contact support.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "retry_after"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/call-not-started",
                        "https://docs.investorliftdata.com/errors/spend-indeterminate",
                        "https://docs.investorliftdata.com/errors/route-unavailable"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "retry_after": {
                      "type": "integer",
                      "description": "The `Retry-After` interval, in seconds, repeated in the body."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/zips/{zip}/sellers": {
      "get": {
        "operationId": "data-zips-sellers",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "List the sellers in a ZIP code",
        "description": "**Cost:** $1.00 per list · desks only\n\nReturns the companies that sold homes in one ZIP code, most sales first, with how quickly they resold.\n\nThis is a Metered Call. If the data service rejects the request, fails or does not answer in time, the charge is returned to the Account as a Refund. An empty answer for a place inside the data’s coverage is an answer, and it is charged.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers. When the place a request names cannot be checked against the coverage and the answer is empty, the call answers `422` `property-not-found` and its charge is returned.",
        "tags": [
          "ZIP codes and coverage"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "zip",
            "in": "path",
            "required": true,
            "description": "A five-digit ZIP code. A ZIP code in any other form is refused before anything is charged.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{5}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same request — the same path and the same query string — within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. If the earlier call was refunded or ended without a stored response, the key is taken over: the new request runs and is charged. Otherwise reusing a key with a different request, or on another endpoint, is refused as a conflict, and nothing is charged for it. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is consumed for it. Keys are scoped to your Account — one Account never replays another Account’s result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-Customer-Reference",
            "in": "header",
            "required": false,
            "description": "Optional. Your own ID for the customer this call is for — an ID, not a name or email. Shown back to you grouped by customer on the Usage page.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer, and it is charged.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": [
                        {
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "FANNIE-MAE LLC",
                          "from_registry": true,
                          "n_sales": 308,
                          "n_quick_resales": 3,
                          "n_same_day": 0,
                          "n_hold_known": 285,
                          "median_hold_days": 1128,
                          "first_sale_date": "2005-04-29",
                          "last_sale_date": "2018-01-18",
                          "total_price": 42087287,
                          "company_like": null
                        },
                        {
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "SUNVEST RR DEVELOPMENT LLC",
                          "from_registry": true,
                          "n_sales": 106,
                          "n_quick_resales": 1,
                          "n_same_day": 0,
                          "n_hold_known": 4,
                          "median_hold_days": 160.5,
                          "first_sale_date": "2006-06-12",
                          "last_sale_date": "2009-03-23",
                          "total_price": 23110627,
                          "company_like": null
                        },
                        {
                          "org_id": "00000000000000000000000000000001",
                          "org_name": "FEDERAL HOME LOAN MORTGAGE CORP",
                          "from_registry": false,
                          "n_sales": 63,
                          "n_quick_resales": 2,
                          "n_same_day": 0,
                          "n_hold_known": 61,
                          "median_hold_days": 77,
                          "first_sale_date": "1993-11-24",
                          "last_sale_date": "2019-10-30",
                          "total_price": 3381226,
                          "company_like": true
                        }
                      ],
                      "page": {
                        "next_cursor": "c2FtcGxlLWN1cnNvcg",
                        "limit": 100,
                        "returned": 78
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:06.207Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to the charge.\n\n`https://docs.investorliftdata.com/errors/invalid-request` — our own checks refused the request before anything was charged: a ZIP code outside its documented form, a place outside the data’s coverage, a malformed query string, or an unusable `Idempotency-Key` header. Nothing was charged and the data service was not called. The body never echoes what you sent.\n\n`https://docs.investorliftdata.com/errors/upstream-rejected-request` — the data service rejected the request as one it does not accept: a parameter, value or cursor it does not take. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Correct the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/invalid-request",
                        "https://docs.investorliftdata.com/errors/upstream-rejected-request"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The Account's Balance is not enough for this Metered Call. Nothing was charged and the data service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (what the Account holds now), `required` (what this call needs) and `top_up_url` (where to add more). Both numbers come from the Ledger, not from this gateway.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "balance",
                    "required",
                    "top_up_url"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "balance": {
                      "type": "integer",
                      "description": "What the Account holds now."
                    },
                    "required": {
                      "type": "integer",
                      "description": "What this call needs."
                    },
                    "top_up_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to add more."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/DuplicateInFlight"
          },
          "422": {
            "description": "One of two distinct outcomes. **Branch on `type`, never on the status alone.**\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a different request — a different path, query string or body, or another endpoint — so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/property-not-found` — the data service holds nothing for what this request names: an address that matches no property it holds, or an identifier it does not know or has retired. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Check the request and send it again.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                        "https://docs.investorliftdata.com/errors/property-not-found"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "502": {
            "description": "The data service could not complete this call, or refused it for a reason that is ours to fix rather than yours, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "504": {
            "description": "The data service did not answer in time, so no answer was produced. The charge for the call is returned to the Account as a Refund. If the Refund cannot be recorded at once, the body says it is pending, and it is applied to the Account later. Send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/zip-summaries": {
      "get": {
        "operationId": "data-zip-summaries",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Read a snapshot of several ZIP codes",
        "description": "**Cost:** Free\n\nReturns the headline numbers the data service holds for a list of ZIP codes read together (the ZIP snapshot), and says which of them the data covers. `zip` is required.\n\nFree: nothing is charged. An `Idempotency-Key` is ignored here.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers.",
        "tags": [
          "ZIP codes and coverage"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "zip",
            "in": "query",
            "required": true,
            "description": "Five-digit ZIP codes, comma-separated or as repeated `zip` parameters. Required. The data service checks the list: a list it refuses is answered [`400 upstream-rejected-request`](/errors/upstream-rejected-request), and the charge comes back as a Refund.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer; this call is free either way.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "deeds_since": "2025-10-08",
                        "listings_since": "2025-10-19",
                        "deeds": {
                          "n_purchases": 28461,
                          "n_flagged": 9582,
                          "n_purchases_12m": 385,
                          "n_flagged_12m": 114,
                          "median_price_12m": 380000,
                          "n_buyers_12m": 104,
                          "n_registry_buyers_12m": 77
                        },
                        "listings": {
                          "n_active": 132,
                          "n_pending": 4,
                          "n_rentals_active": 0,
                          "n_sold_12m": 202,
                          "n_off_market_12m": 217,
                          "median_list_price": 415000,
                          "median_sold_price_12m": 386250
                        },
                        "agents": {
                          "n_agents_12m": 380,
                          "n_brokerages_12m": 123
                        },
                        "zips": [
                          "85008"
                        ],
                        "zips_covered": [
                          "85008"
                        ]
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:06.581Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request was refused, by our own checks or by the data service: a malformed query string, or a parameter or value the data service does not accept. This call is free, so nothing was charged either way. Correct the request and send it again.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-request`\n\nThe body never echoes what you sent.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-request"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/ValidateTooManyRequests"
          },
          "503": {
            "description": "One of three distinct outcomes that share a status. **Branch on `type`, never on the status alone.** This call is free, so none of them charged anything.\n\n`https://docs.investorliftdata.com/errors/call-not-started` — no answer was produced: the data service failed, did not answer in time, or refused the call for a reason that is ours to fix rather than yours. Nothing was charged. For a connected app, one that signed you in instead of holding an API Key, it is also the answer when the one Ledger read that confirms the connection is still approved fails.\n\n`https://docs.investorliftdata.com/errors/spend-indeterminate` — the API's single catch-all failure type. Its body carries the general wording written for a Metered Call; that wording does not apply here, because this call records no Spend whose result could be in doubt. Nothing was charged.\n\n`https://docs.investorliftdata.com/errors/route-unavailable` — the endpoint is temporarily switched off by its operator, and **nothing was charged**. Other endpoints are unaffected.\n\nAll three carry `Retry-After`. Wait for that interval, then send the request again. Quote the `trace-id` header if you contact support.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "retry_after"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/call-not-started",
                        "https://docs.investorliftdata.com/errors/spend-indeterminate",
                        "https://docs.investorliftdata.com/errors/route-unavailable"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "retry_after": {
                      "type": "integer",
                      "description": "The `Retry-After` interval, in seconds, repeated in the body."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/investor-activity/summary": {
      "get": {
        "operationId": "data-investor-activity-summary",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "Summarize the investor purchases in a place",
        "description": "**Cost:** Free\n\nReturns the headline numbers the data service holds for the investor purchases in one place.\n\n**Where.** Send exactly one place: a point (`lat` and `lng`) with a `radius_miles`, a box (`bbox`), or a list of ZIP codes (`zip`).\n\nFree: nothing is charged. An `Idempotency-Key` is ignored here.\n\n**Coverage.** A place outside the data’s coverage is refused before anything is charged; the [docs page](/data#coverage) states where the data covers.",
        "tags": [
          "Investors"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the point. Send with `lng`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "description": "Longitude of the point. Send with `lat`.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_miles",
            "in": "query",
            "description": "The radius around the point, in miles.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "description": "A box to search inside.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zip",
            "in": "query",
            "description": "Five-digit ZIP codes, comma-separated or as repeated `zip` parameters.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[0-9]{5}$"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer; this call is free either way.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "n_deals": 9579,
                        "n_rows": 11231,
                        "n_buyers": 6143,
                        "n_registry_buyers": 2609,
                        "n_parcels": 5030,
                        "n_priced": 11231,
                        "median_price": 120495,
                        "total_volume": 3475795568,
                        "repeat_share": 0.788,
                        "resold_share": 0.526,
                        "registry_share": 0.472,
                        "median_days_held": 239,
                        "n_marketplace": 72,
                        "by_year": [
                          {
                            "year": 1993,
                            "n": 60
                          },
                          {
                            "year": 1994,
                            "n": 162
                          },
                          {
                            "year": 1995,
                            "n": 120
                          }
                        ],
                        "by_segment": [
                          {
                            "segment": "SFR",
                            "n": 6499
                          },
                          {
                            "segment": "CONDO_TH",
                            "n": 2751
                          },
                          {
                            "segment": "OTHER",
                            "n": 1981
                          }
                        ],
                        "by_doc_class": [
                          {
                            "doc_class": "ECONOMIC",
                            "n": 8223
                          },
                          {
                            "doc_class": "DISTRESSED",
                            "n": 3008
                          }
                        ]
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:17:02.765Z",
                        "geometry": {
                          "kind": "place",
                          "lat": null,
                          "lng": null,
                          "radius_miles": null,
                          "bbox": null,
                          "property_id": null,
                          "address": null,
                          "zip": [
                            "85008"
                          ],
                          "city": null
                        },
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request was refused, by our own checks or by the data service: a malformed query string, or a parameter or value the data service does not accept. This call is free, so nothing was charged either way. Correct the request and send it again.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-request`\n\nThe body never echoes what you sent.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-request"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/ValidateTooManyRequests"
          },
          "503": {
            "description": "One of three distinct outcomes that share a status. **Branch on `type`, never on the status alone.** This call is free, so none of them charged anything.\n\n`https://docs.investorliftdata.com/errors/call-not-started` — no answer was produced: the data service failed, did not answer in time, or refused the call for a reason that is ours to fix rather than yours. Nothing was charged. For a connected app, one that signed you in instead of holding an API Key, it is also the answer when the one Ledger read that confirms the connection is still approved fails.\n\n`https://docs.investorliftdata.com/errors/spend-indeterminate` — the API's single catch-all failure type. Its body carries the general wording written for a Metered Call; that wording does not apply here, because this call records no Spend whose result could be in doubt. Nothing was charged.\n\n`https://docs.investorliftdata.com/errors/route-unavailable` — the endpoint is temporarily switched off by its operator, and **nothing was charged**. Other endpoints are unaffected.\n\nAll three carry `Retry-After`. Wait for that interval, then send the request again. Quote the `trace-id` header if you contact support.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "retry_after"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/call-not-started",
                        "https://docs.investorliftdata.com/errors/spend-indeterminate",
                        "https://docs.investorliftdata.com/errors/route-unavailable"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "retry_after": {
                      "type": "integer",
                      "description": "The `Retry-After` interval, in seconds, repeated in the body."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data/coverage": {
      "get": {
        "operationId": "data-coverage",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "See where the data service has data",
        "description": "**Cost:** Free\n\nReturns which states the data service covers, with the dates of the data behind each.\n\nFree: nothing is charged. An `Idempotency-Key` is ignored here.",
        "tags": [
          "ZIP codes and coverage"
        ],
        "responses": {
          "200": {
            "description": "The data service’s answer: a JSON object carrying `data` and `meta`. A valid answer with nothing in it is still an answer; this call is free either way.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sample": {
                    "value": {
                      "data": {
                        "states": [
                          {
                            "state": "AZ",
                            "build_id": null,
                            "built_at": "2026-10-22T11:47:47.520Z",
                            "published_at": "2026-10-22T15:09:59.945Z",
                            "run_id": 1792675938,
                            "financing_as_of": "2026-06-25",
                            "recordings_through": "2026-06-11",
                            "financing_source": "sample",
                            "str_as_of": "2026-10-22",
                            "deeds_through": "2026-10-08",
                            "listings_through": "2026-10-19",
                            "registry_rows": 2812108,
                            "counties": [
                              {
                                "fips": "04001",
                                "n_parcels": 23982,
                                "zips": [
                                  {
                                    "zip": "85901",
                                    "n_parcels": 560
                                  },
                                  {
                                    "zip": "85920",
                                    "n_parcels": 1583
                                  },
                                  {
                                    "zip": "85924",
                                    "n_parcels": 8023
                                  }
                                ]
                              },
                              {
                                "fips": "04003",
                                "n_parcels": 59895,
                                "zips": [
                                  {
                                    "zip": "00000",
                                    "n_parcels": 1
                                  },
                                  {
                                    "zip": "08607",
                                    "n_parcels": 1
                                  },
                                  {
                                    "zip": "85067",
                                    "n_parcels": 1
                                  }
                                ]
                              },
                              {
                                "fips": "04005",
                                "n_parcels": 75444,
                                "zips": [
                                  {
                                    "zip": "85931",
                                    "n_parcels": 1015
                                  },
                                  {
                                    "zip": "86001",
                                    "n_parcels": 10721
                                  },
                                  {
                                    "zip": "86004",
                                    "n_parcels": 15685
                                  }
                                ]
                              }
                            ],
                            "counts": {
                              "org": 2125837,
                              "reo": 222035,
                              "deal": 1790829,
                              "lien": 334472,
                              "loan": 6291319,
                              "agent": 81299,
                              "alias": 3621403,
                              "owner": 2994239,
                              "party": 16988903,
                              "entity": 2812108,
                              "filing": 7171397,
                              "holder": 1152408,
                              "parcel": 2994383,
                              "person": 13767132,
                              "search": 46245077,
                              "address": 2990671,
                              "auction": 500063,
                              "channel": 316161,
                              "listing": 3852247,
                              "org_str": 3064,
                              "org_link": 4972748,
                              "purchase": 6425781,
                              "agent_org": 2116578,
                              "financing": 2992231,
                              "loan_link": 6291319,
                              "agent_edge": 66935,
                              "loan_party": 16159970,
                              "org_record": 15456878,
                              "str_parcel": 5667,
                              "lender_name": 139248,
                              "listing_geo": 1236963,
                              "org_profile": 9587327,
                              "person_edge": 82649,
                              "account_link": 5433,
                              "counterparty": 7085809,
                              "lender_place": 980882,
                              "place_seller": 1758071,
                              "str_coverage": 679894,
                              "agent_listing": 3527513,
                              "entity_holder": 1012374,
                              "parcel_search": 2994383,
                              "person_record": 70087286,
                              "deal_financing": 1421902,
                              "lender_profile": 124329,
                              "person_linkage": 13205021,
                              "contact_address": 11865534,
                              "person_sighting": 18786349,
                              "agent_person_org": 8206,
                              "borrower_profile": 4897145,
                              "str_jurisdiction": 107,
                              "lender_place_link": 980882,
                              "marketplace_match": 12959,
                              "lender_counterparty": 14114928,
                              "lender_link_profile": 124329
                            },
                            "short_term_rental": null
                          }
                        ],
                        "place": null
                      },
                      "meta": {
                        "generated_at": "2026-10-24T08:26:52.789Z",
                        "coverage": [],
                        "build": {
                          "states": [
                            {
                              "state": "AZ",
                              "build_id": null,
                              "built_at": "2026-10-22T11:47:47.520Z",
                              "published_at": "2026-10-22T15:09:59.945Z",
                              "run_id": 1792675938,
                              "financing_as_of": "2026-06-25",
                              "recordings_through": "2026-06-11",
                              "financing_source": "sample",
                              "str_as_of": "2026-10-22"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request was refused, by our own checks or by the data service: a malformed query string, or a parameter or value the data service does not accept. This call is free, so nothing was charged either way. Correct the request and send it again.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-request`\n\nThe body never echoes what you sent.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-request"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the data service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "const": "https://docs.investorliftdata.com/errors/invalid-key"
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/ValidateTooManyRequests"
          },
          "503": {
            "description": "One of three distinct outcomes that share a status. **Branch on `type`, never on the status alone.** This call is free, so none of them charged anything.\n\n`https://docs.investorliftdata.com/errors/call-not-started` — no answer was produced: the data service failed, did not answer in time, or refused the call for a reason that is ours to fix rather than yours. Nothing was charged. For a connected app, one that signed you in instead of holding an API Key, it is also the answer when the one Ledger read that confirms the connection is still approved fails.\n\n`https://docs.investorliftdata.com/errors/spend-indeterminate` — the API's single catch-all failure type. Its body carries the general wording written for a Metered Call; that wording does not apply here, because this call records no Spend whose result could be in doubt. Nothing was charged.\n\n`https://docs.investorliftdata.com/errors/route-unavailable` — the endpoint is temporarily switched off by its operator, and **nothing was charged**. Other endpoints are unaffected.\n\nAll three carry `Retry-After`. Wait for that interval, then send the request again. Quote the `trace-id` header if you contact support.",
            "headers": {
              "trace-id": {
                "$ref": "#/components/headers/TraceId"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "status",
                    "trace_id",
                    "retry_after"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                      "enum": [
                        "https://docs.investorliftdata.com/errors/call-not-started",
                        "https://docs.investorliftdata.com/errors/spend-indeterminate",
                        "https://docs.investorliftdata.com/errors/route-unavailable"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "description": "A short, stable summary."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What happened, what it means for your balance, and what to do next."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "trace_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "The Trace ID for this request. Quote it to support."
                    },
                    "retry_after": {
                      "type": "integer",
                      "description": "The `Retry-After` interval, in seconds, repeated in the body."
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          }
        ]
      }
    },
    "/mcp": {
      "post": {
        "operationId": "mcp",
        "security": [
          {
            "api_key": []
          },
          {
            "connected_app": []
          }
        ],
        "summary": "MCP Endpoint",
        "description": "Connect an AI agent over the Model Context Protocol (MCP). A connected agent discovers four tools — `score_property`, `score_property_batch`, `property_history` and `validate_request` — and calls them as your Account. There are two ways to connect, and either one works: with the API Key you already hold, sent as an `Authorization: Bearer` header, or by signing in — some clients send you here to approve the connection, so you never handle a key. Tool calls run through the same contract as direct HTTP: the same validation, the same error catalogue, the same idempotency semantics, and the same price, resolved by the Ledger and identical whichever way the client connected. `validate_request` stays free on every path. There is no separate MCP price and no separate MCP key — one Account, one Balance, however you call it.\n\n**Each tool is one HTTP route, called for you.** `score_property` is `POST /v1/predict`, `score_property_batch` is `POST /v1/predict/batch`, `property_history` is `POST /v1/history` and `validate_request` is `POST /v1/validate` — the same answer, in the same shape, with the same headline `max_allowable_offer`.",
        "tags": [
          "MCP"
        ],
        "responses": {
          "200": {
            "description": "A JSON-RPC 2.0 answer to the message you sent. The example is the answer to `tools/list`: the four tools a connected agent can call.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "jsonrpc",
                    "id",
                    "result"
                  ],
                  "properties": {
                    "jsonrpc": {
                      "const": "2.0"
                    },
                    "id": {},
                    "result": {
                      "type": "object"
                    }
                  }
                },
                "examples": {
                  "sample": {
                    "value": {
                      "result": {
                        "tools": [
                          {
                            "name": "score_property",
                            "description": "Score a single property address and return a rehab-aware valuation and the maximum allowable offer (MAO) — the most a flip buyer on standard financing can pay for the property and still clear the target margin. It is a ceiling, not a prediction of the sale price: an offer to the seller is this figure less whatever fee the caller intends to take. When the answer reports the offer as clamped, no purchase price at all clears the target margin on that deal and the amount must not be presented as an offer. This is a Metered Call: it consumes Credits from the Account's Balance, and the Credit cost is resolved by the Ledger at the moment of the Spend — identical to calling POST /v1/predict directly. Send an Idempotency-Key header to make a retry safe; errors are RFC 9457 Problem Details whose type member is stable.",
                            "inputSchema": {
                              "$schema": "https://json-schema.org/draft/2020-12/schema",
                              "type": "object",
                              "properties": {
                                "body": {
                                  "type": "object",
                                  "properties": {
                                    "address": {
                                      "type": "string",
                                      "description": "The full street address of the property to score."
                                    },
                                    "condition": {
                                      "default": "turn_key",
                                      "description": "The property's condition, which sets the repair budget the derived numbers are built on. Optional: omit it and the property is priced as though it needs no repairs, which is exactly what `turn_key` does. It is a request option rather than a second property, so sending it never changes what the call costs.\n\n`tear_down` is accepted by this schema and **refused** by the endpoint with a 400, before any Credits are consumed. That is deliberate rather than an oversight: the scoring service has no land-value estimate, so there is no honest way to price a tear-down here. Analyse lot value separately.\n\nRepair figures are a screening range, not a contractor bid.",
                                      "examples": [
                                        "major_rehab"
                                      ],
                                      "type": "string",
                                      "enum": [
                                        "turn_key",
                                        "light_rehab",
                                        "major_rehab",
                                        "full_gut",
                                        "tear_down"
                                      ]
                                    },
                                    "rehab_budget": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 10000000,
                                      "description": "Your own repair budget for this property, in **whole dollars**. Optional, and additive: an integration that does not send it is unaffected.\n\nWhen you send it, the repaired value and the maximum allowable offer are built from **your figure** instead of the bracket `condition` maps to, and the `rehab_budget` in the response is the number the arithmetic actually used. Sending `rehab_budget` and `condition` together is legal — `rehab_budget` wins, every time — so you never have to choose the bracket that comes closest to a number you already know.\n\n`condition: tear_down` is still refused with a 400 even when you send a repair budget. A repair budget does not answer what a tear-down needs, which is a land value, and there is no land-value estimate behind these numbers.\n\nRepair figures are a screening range, not a contractor bid.",
                                      "examples": [
                                        48000
                                      ]
                                    },
                                    "target_margin": {
                                      "default": 0.2,
                                      "description": "The profit margin your buyer needs, as a **fraction** of the repaired value — `0.2` means twenty percent. Optional, and additive: an integration that does not send it is unaffected, and is priced at the default of `0.2`.\n\nWhen you send it, the maximum allowable offer is solved at **your** margin rather than the default one. The `target_margin` in the response is always the margin the answer was priced at, whether you sent one or not, so \"what margin is this price built on?\" is answerable on every response.\n\nThe target margin is a **policy figure calibrated by judgment**, not a parameter fitted to a data set — which is exactly why you can override it.",
                                      "examples": [
                                        0.25
                                      ],
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.9
                                    },
                                    "overrides": {
                                      "type": "object",
                                      "properties": {
                                        "square_feet": {
                                          "type": "number",
                                          "exclusiveMinimum": 0,
                                          "description": "Finished living area, in **square feet**. Must be above zero.",
                                          "examples": [
                                            2400
                                          ]
                                        },
                                        "bedrooms": {
                                          "type": "number",
                                          "minimum": 0,
                                          "description": "Bedroom count. Zero or above; `0` is accepted, because a studio genuinely has none.",
                                          "examples": [
                                            4
                                          ]
                                        },
                                        "bathrooms": {
                                          "type": "number",
                                          "minimum": 0,
                                          "description": "Bathroom count, as the property data service counts them. Zero or above, and **may be fractional** — `2.5` is ordinary. It does not include `partial_bathrooms`, which stays at the county's figure and is not overridable; this service does not add the two together.",
                                          "examples": [
                                            2.5
                                          ]
                                        },
                                        "year_built": {
                                          "type": "number",
                                          "exclusiveMinimum": 0,
                                          "description": "Year the structure was built. Must be above zero.",
                                          "examples": [
                                            1998
                                          ]
                                        },
                                        "lot_size_square_feet": {
                                          "type": "number",
                                          "exclusiveMinimum": 0,
                                          "description": "Lot size, in **square feet** — never acres. Must be above zero. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                                          "examples": [
                                            8100
                                          ]
                                        },
                                        "property_type": {
                                          "type": "string",
                                          "description": "Property type, as free text. Must not be blank or only spaces; surrounding spaces are trimmed, exactly as the county record's own value is, so the trimmed value is what appears in `subject_property.facts`. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                                          "examples": [
                                            "Single Family"
                                          ]
                                        }
                                      },
                                      "additionalProperties": false,
                                      "description": "Price the property **as you describe it**, not as the county record has it. Optional, and additive: an integration that does not send it is unaffected and its answers do not move.\n\nSend any of the six facts below and that value is used in place of the county record's, for the model, for the comparable-sales band and for the price derived from it. Every fact in `subject_property.facts` says where it came from, so a value you stated reads `caller-stated` and everything else reads `county-record` — a claim can never be mistaken for a record.\n\n**A value you supply reads `caller-stated` even when it matches the county's own figure.** The label says where the number came from, not whether it changed.\n\n**Only these six facts, and nothing else.** Any other key — including `latitude`, `longitude`, `partial_bathrooms`, `address`, or a misspelling of one of the six — is refused with a 400 before any Credit is spent, rather than being ignored. **The coordinates are never overridable, and that is a rule rather than an omission: a what-if changes the house's facts, never *which house*.**\n\n**Values must be usable, and an empty `overrides` is refused.** A value must be the right JSON type, and must satisfy the rule stated on each fact below; `null` is refused, because an override may state a value but never erase one. `overrides: {}` is refused too — it declares a what-if while stating no claim, and its answer would be indistinguishable from a call that sent no `overrides` at all. Every one of these is a 400 before any Credit is spent.\n\n**The required facts are still required.** If the property still lacks a fact the valuation needs after your values are applied, the call is refused and the Credit is refunded, exactly as an ordinary request would be. There is no \"score it anyway\". Your `lot_size_square_feet` or `property_type` **can** supply a fact the county record was missing, in which case the call scores and that fact reads `caller-stated`.\n\n**Overriding `bathrooms` does not change `partial_bathrooms`**, which stays at the county's figure and is not overridable. This service does not add the two together, so do not read your stated bathroom count plus a county partial count as one total.",
                                      "examples": [
                                        {
                                          "square_feet": 2400,
                                          "bathrooms": 2.5
                                        }
                                      ]
                                    }
                                  },
                                  "required": [
                                    "address"
                                  ],
                                  "additionalProperties": {},
                                  "description": "Exactly one property, plus optional request options. `maxProperties` is the documented form of the cap these endpoints enforce, and it counts the property together with every option this endpoint accepts. `condition`, `rehab_budget`, `target_margin` and `overrides` are options, not properties — sending any or all of them never changes what the call costs. Every OTHER body member counts as a property, so a mistyped member name is counted as one: a one-property body carrying it returns 413 with `submitted` one higher than the properties you meant to send, and the fix is the member name, not a smaller batch. `gateway/tests/route-surface.test.ts` asserts that `maxProperties` equals the route's `maxSubmittedProperties` option plus the number of options it declares, so the published cap cannot drift from the enforced one."
                                },
                                "headers": {
                                  "type": "object",
                                  "properties": {
                                    "Idempotency-Key": {
                                      "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same body within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. Only successful responses are stored: if the earlier call was refunded or ended without a stored response, the key is taken over and the new request runs and is charged, whatever body it carries. Otherwise reusing a key with a different body is rejected as a conflict, and nothing is charged for it. The replay window is 24 hours, measured from the request that produced the stored result; after 24 hours the same key is a new request and is charged. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and no Credits are consumed for it. Keys are scoped to your Account — one Account never replays another Account's result. POST /v1/validate ignores this header: it is not a Metered Call, so there is nothing to replay.",
                                      "type": "string"
                                    }
                                  },
                                  "additionalProperties": false
                                }
                              },
                              "required": [
                                "body",
                                "headers"
                              ],
                              "additionalProperties": false
                            }
                          },
                          {
                            "name": "validate_request",
                            "description": "Check that a request body would be accepted by score_property, without spending. This call is free: it consumes no Credits and never calls the scoring service, so it keeps working at a zero Balance. With an API Key it answers even while the Ledger is down. When the client is signed in through a connected app instead of holding an API Key — which is how most agents connect — this call makes one Ledger read to confirm the connection is still approved, and while that read is failing it answers 503 call-not-started. Nothing is charged either way. While this endpoint is temporarily switched off by its operator it answers 503 route-unavailable: no Credit was used, and Retry-After says how long to wait before sending the same call again. It requires a valid credential — an API Key, or an account sign-in — and nothing else.",
                            "inputSchema": {
                              "$schema": "https://json-schema.org/draft/2020-12/schema",
                              "type": "object",
                              "properties": {
                                "body": {
                                  "type": "object",
                                  "properties": {
                                    "address": {
                                      "type": "string",
                                      "description": "The full street address of the property to score."
                                    },
                                    "condition": {
                                      "default": "turn_key",
                                      "description": "The property's condition, which sets the repair budget the derived numbers are built on. Optional: omit it and the property is priced as though it needs no repairs, which is exactly what `turn_key` does. It is a request option rather than a second property, so sending it never changes what the call costs.\n\n`tear_down` is accepted by this schema and **refused** by the endpoint with a 400, before any Credits are consumed. That is deliberate rather than an oversight: the scoring service has no land-value estimate, so there is no honest way to price a tear-down here. Analyse lot value separately.\n\nRepair figures are a screening range, not a contractor bid.",
                                      "examples": [
                                        "major_rehab"
                                      ],
                                      "type": "string",
                                      "enum": [
                                        "turn_key",
                                        "light_rehab",
                                        "major_rehab",
                                        "full_gut",
                                        "tear_down"
                                      ]
                                    },
                                    "rehab_budget": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 10000000,
                                      "description": "Your own repair budget for this property, in **whole dollars**. Optional, and additive: an integration that does not send it is unaffected.\n\nWhen you send it, the repaired value and the maximum allowable offer are built from **your figure** instead of the bracket `condition` maps to, and the `rehab_budget` in the response is the number the arithmetic actually used. Sending `rehab_budget` and `condition` together is legal — `rehab_budget` wins, every time — so you never have to choose the bracket that comes closest to a number you already know.\n\n`condition: tear_down` is still refused with a 400 even when you send a repair budget. A repair budget does not answer what a tear-down needs, which is a land value, and there is no land-value estimate behind these numbers.\n\nRepair figures are a screening range, not a contractor bid.",
                                      "examples": [
                                        48000
                                      ]
                                    },
                                    "target_margin": {
                                      "default": 0.2,
                                      "description": "The profit margin your buyer needs, as a **fraction** of the repaired value — `0.2` means twenty percent. Optional, and additive: an integration that does not send it is unaffected, and is priced at the default of `0.2`.\n\nWhen you send it, the maximum allowable offer is solved at **your** margin rather than the default one. The `target_margin` in the response is always the margin the answer was priced at, whether you sent one or not, so \"what margin is this price built on?\" is answerable on every response.\n\nThe target margin is a **policy figure calibrated by judgment**, not a parameter fitted to a data set — which is exactly why you can override it.",
                                      "examples": [
                                        0.25
                                      ],
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.9
                                    },
                                    "overrides": {
                                      "type": "object",
                                      "properties": {
                                        "square_feet": {
                                          "type": "number",
                                          "exclusiveMinimum": 0,
                                          "description": "Finished living area, in **square feet**. Must be above zero.",
                                          "examples": [
                                            2400
                                          ]
                                        },
                                        "bedrooms": {
                                          "type": "number",
                                          "minimum": 0,
                                          "description": "Bedroom count. Zero or above; `0` is accepted, because a studio genuinely has none.",
                                          "examples": [
                                            4
                                          ]
                                        },
                                        "bathrooms": {
                                          "type": "number",
                                          "minimum": 0,
                                          "description": "Bathroom count, as the property data service counts them. Zero or above, and **may be fractional** — `2.5` is ordinary. It does not include `partial_bathrooms`, which stays at the county's figure and is not overridable; this service does not add the two together.",
                                          "examples": [
                                            2.5
                                          ]
                                        },
                                        "year_built": {
                                          "type": "number",
                                          "exclusiveMinimum": 0,
                                          "description": "Year the structure was built. Must be above zero.",
                                          "examples": [
                                            1998
                                          ]
                                        },
                                        "lot_size_square_feet": {
                                          "type": "number",
                                          "exclusiveMinimum": 0,
                                          "description": "Lot size, in **square feet** — never acres. Must be above zero. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                                          "examples": [
                                            8100
                                          ]
                                        },
                                        "property_type": {
                                          "type": "string",
                                          "description": "Property type, as free text. Must not be blank or only spaces; surrounding spaces are trimmed, exactly as the county record's own value is, so the trimmed value is what appears in `subject_property.facts`. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                                          "examples": [
                                            "Single Family"
                                          ]
                                        }
                                      },
                                      "additionalProperties": false,
                                      "description": "Price the property **as you describe it**, not as the county record has it. Optional, and additive: an integration that does not send it is unaffected and its answers do not move.\n\nSend any of the six facts below and that value is used in place of the county record's, for the model, for the comparable-sales band and for the price derived from it. Every fact in `subject_property.facts` says where it came from, so a value you stated reads `caller-stated` and everything else reads `county-record` — a claim can never be mistaken for a record.\n\n**A value you supply reads `caller-stated` even when it matches the county's own figure.** The label says where the number came from, not whether it changed.\n\n**Only these six facts, and nothing else.** Any other key — including `latitude`, `longitude`, `partial_bathrooms`, `address`, or a misspelling of one of the six — is refused with a 400 before any Credit is spent, rather than being ignored. **The coordinates are never overridable, and that is a rule rather than an omission: a what-if changes the house's facts, never *which house*.**\n\n**Values must be usable, and an empty `overrides` is refused.** A value must be the right JSON type, and must satisfy the rule stated on each fact below; `null` is refused, because an override may state a value but never erase one. `overrides: {}` is refused too — it declares a what-if while stating no claim, and its answer would be indistinguishable from a call that sent no `overrides` at all. Every one of these is a 400 before any Credit is spent.\n\n**The required facts are still required.** If the property still lacks a fact the valuation needs after your values are applied, the call is refused and the Credit is refunded, exactly as an ordinary request would be. There is no \"score it anyway\". Your `lot_size_square_feet` or `property_type` **can** supply a fact the county record was missing, in which case the call scores and that fact reads `caller-stated`.\n\n**Overriding `bathrooms` does not change `partial_bathrooms`**, which stays at the county's figure and is not overridable. This service does not add the two together, so do not read your stated bathroom count plus a county partial count as one total.",
                                      "examples": [
                                        {
                                          "square_feet": 2400,
                                          "bathrooms": 2.5
                                        }
                                      ]
                                    }
                                  },
                                  "required": [
                                    "address"
                                  ],
                                  "additionalProperties": {},
                                  "description": "Exactly one property, plus optional request options. `maxProperties` is the documented form of the cap these endpoints enforce, and it counts the property together with every option this endpoint accepts. `condition`, `rehab_budget`, `target_margin` and `overrides` are options, not properties — sending any or all of them never changes what the call costs. Every OTHER body member counts as a property, so a mistyped member name is counted as one: a one-property body carrying it returns 413 with `submitted` one higher than the properties you meant to send, and the fix is the member name, not a smaller batch. `gateway/tests/route-surface.test.ts` asserts that `maxProperties` equals the route's `maxSubmittedProperties` option plus the number of options it declares, so the published cap cannot drift from the enforced one."
                                }
                              },
                              "required": [
                                "body"
                              ],
                              "additionalProperties": false
                            }
                          },
                          {
                            "name": "property_history",
                            "description": "Read one property's recorded story from the county record: the chain of title newest first with each event in a small fixed vocabulary, any detected buy/sell flips, the current listing state, a rollup of the most recent recorded permit work by trade, and a short set of at-a-glance facts. Identify the property with EXACTLY ONE of address or property_id — a request carrying both, or neither, is rejected before any Credits are consumed. Take property_id straight from a comparable property in a score_property answer to ask about that exact record with no address matching at all. This is a Metered Call: it consumes Credits from the Account's Balance, and the Credit cost is resolved by the Ledger at the moment of the Spend — identical to calling POST /v1/history directly. A property with nothing on file is a chargeable answer, not a failure. Every category in the answer is a derived conclusion rather than a statement made by the county, an unrecognised record is reported as unknown rather than guessed at, and no owner, buyer, seller, agent or applicant name ever appears. Permit records that could not be retrieved are reported as unavailable and are never reported as an absence of permits. Send an Idempotency-Key header to make a retry safe; errors are RFC 9457 Problem Details whose type member is stable.",
                            "inputSchema": {
                              "$schema": "https://json-schema.org/draft/2020-12/schema",
                              "type": "object",
                              "properties": {
                                "body": {
                                  "type": "object",
                                  "properties": {
                                    "address": {
                                      "type": "string",
                                      "minLength": 1,
                                      "description": "The full street address of the property whose history you want."
                                    },
                                    "property_id": {
                                      "type": "string",
                                      "pattern": "^[0-9a-f]{32}$",
                                      "description": "A property identifier taken from a Scored Call answer — the subject's own, or any comparable property's. 32 lowercase hexadecimal characters. On this arm **no address matching is performed**: the record is looked up directly, and `subject_property` reads back exactly which record answered. Identifiers are looked up in the same identifier space the Scored Call publishes them in.",
                                      "examples": [
                                        "a1b2c3d4e5f60718293a4b5c6d7e8f90"
                                      ]
                                    }
                                  },
                                  "additionalProperties": false,
                                  "description": "**Exactly one of `address` or `property_id`.** A body carrying both, or neither, is rejected with 400 before any Credits are consumed. Presence is what counts: sending an empty `address` alongside a real `property_id` still counts as sending both, and is rejected — rather than have this API quietly choose which of the two you meant.\n\nThis endpoint accepts no other members and no request options. `condition`, `rehab_budget`, `target_margin` and `overrides` belong to the Scored Call and are rejected here."
                                },
                                "headers": {
                                  "type": "object",
                                  "properties": {
                                    "Idempotency-Key": {
                                      "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same body within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. Only successful responses are stored: if the earlier call was refunded or ended without a stored response, the key is taken over and the new request runs and is charged, whatever body it carries. Otherwise reusing a key with a different body is rejected as a conflict, and nothing is charged for it. The replay window is 24 hours, measured from the request that produced the stored result; after 24 hours the same key is a new request and is charged. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and no Credits are consumed for it. Keys are scoped to your Account — one Account never replays another Account's result. POST /v1/validate ignores this header: it is not a Metered Call, so there is nothing to replay.",
                                      "type": "string"
                                    }
                                  },
                                  "additionalProperties": false
                                }
                              },
                              "required": [
                                "body",
                                "headers"
                              ],
                              "additionalProperties": false
                            }
                          },
                          {
                            "name": "score_property_batch",
                            "description": "Score several property addresses in one call and return one answer per property, in submission order. Each answer carries the core numbers only — the same answer score_property returns, minus the list of comparable sales; score a property on its own to see those. This is a Metered Call: Credits are charged per property submitted and resolved by the Ledger at the moment of the Spend, identical to calling POST /v1/predict/batch directly. The whole batch is charged before any property is scored, and a batch the Balance cannot afford is rejected in full with nothing consumed. A property that fails for a refundable reason — the address matched more than one property, the address is outside current coverage, the property could not be scored, an upstream service could not complete the call, or an upstream service did not answer in time — does not stop the ones after it: its entry is the same Problem Detail a single call would have returned and its share of the Credits is refunded. A refusal outside those five stops the batch instead: no results array is returned, the request answers 503 spend-indeterminate, and every Credit recorded for the batch is returned as a Refund. Send an Idempotency-Key header to make a retry safe; errors are RFC 9457 Problem Details whose type member is stable.",
                            "inputSchema": {
                              "$schema": "https://json-schema.org/draft/2020-12/schema",
                              "type": "object",
                              "properties": {
                                "body": {
                                  "type": "object",
                                  "properties": {
                                    "properties": {
                                      "minItems": 1,
                                      "maxItems": 10,
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "address": {
                                            "type": "string",
                                            "description": "The full street address of the property to score."
                                          },
                                          "condition": {
                                            "default": "turn_key",
                                            "description": "The property's condition, which sets the repair budget the derived numbers are built on. Optional: omit it and the property is priced as though it needs no repairs, which is exactly what `turn_key` does. It is a request option rather than a second property, so sending it never changes what the call costs.\n\n`tear_down` is accepted by this schema and **refused** by the endpoint with a 400, before any Credits are consumed. That is deliberate rather than an oversight: the scoring service has no land-value estimate, so there is no honest way to price a tear-down here. Analyse lot value separately.\n\nRepair figures are a screening range, not a contractor bid.",
                                            "examples": [
                                              "major_rehab"
                                            ],
                                            "type": "string",
                                            "enum": [
                                              "turn_key",
                                              "light_rehab",
                                              "major_rehab",
                                              "full_gut",
                                              "tear_down"
                                            ]
                                          },
                                          "rehab_budget": {
                                            "type": "integer",
                                            "minimum": 0,
                                            "maximum": 10000000,
                                            "description": "Your own repair budget for this property, in **whole dollars**. Optional, and additive: an integration that does not send it is unaffected.\n\nWhen you send it, the repaired value and the maximum allowable offer are built from **your figure** instead of the bracket `condition` maps to, and the `rehab_budget` in the response is the number the arithmetic actually used. Sending `rehab_budget` and `condition` together is legal — `rehab_budget` wins, every time — so you never have to choose the bracket that comes closest to a number you already know.\n\n`condition: tear_down` is still refused with a 400 even when you send a repair budget. A repair budget does not answer what a tear-down needs, which is a land value, and there is no land-value estimate behind these numbers.\n\nRepair figures are a screening range, not a contractor bid.",
                                            "examples": [
                                              48000
                                            ]
                                          },
                                          "target_margin": {
                                            "default": 0.2,
                                            "description": "The profit margin your buyer needs, as a **fraction** of the repaired value — `0.2` means twenty percent. Optional, and additive: an integration that does not send it is unaffected, and is priced at the default of `0.2`.\n\nWhen you send it, the maximum allowable offer is solved at **your** margin rather than the default one. The `target_margin` in the response is always the margin the answer was priced at, whether you sent one or not, so \"what margin is this price built on?\" is answerable on every response.\n\nThe target margin is a **policy figure calibrated by judgment**, not a parameter fitted to a data set — which is exactly why you can override it.",
                                            "examples": [
                                              0.25
                                            ],
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.9
                                          },
                                          "overrides": {
                                            "type": "object",
                                            "properties": {
                                              "square_feet": {
                                                "type": "number",
                                                "exclusiveMinimum": 0,
                                                "description": "Finished living area, in **square feet**. Must be above zero.",
                                                "examples": [
                                                  2400
                                                ]
                                              },
                                              "bedrooms": {
                                                "type": "number",
                                                "minimum": 0,
                                                "description": "Bedroom count. Zero or above; `0` is accepted, because a studio genuinely has none.",
                                                "examples": [
                                                  4
                                                ]
                                              },
                                              "bathrooms": {
                                                "type": "number",
                                                "minimum": 0,
                                                "description": "Bathroom count, as the property data service counts them. Zero or above, and **may be fractional** — `2.5` is ordinary. It does not include `partial_bathrooms`, which stays at the county's figure and is not overridable; this service does not add the two together.",
                                                "examples": [
                                                  2.5
                                                ]
                                              },
                                              "year_built": {
                                                "type": "number",
                                                "exclusiveMinimum": 0,
                                                "description": "Year the structure was built. Must be above zero.",
                                                "examples": [
                                                  1998
                                                ]
                                              },
                                              "lot_size_square_feet": {
                                                "type": "number",
                                                "exclusiveMinimum": 0,
                                                "description": "Lot size, in **square feet** — never acres. Must be above zero. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                                                "examples": [
                                                  8100
                                                ]
                                              },
                                              "property_type": {
                                                "type": "string",
                                                "description": "Property type, as free text. Must not be blank or only spaces; surrounding spaces are trimmed, exactly as the county record's own value is, so the trimmed value is what appears in `subject_property.facts`. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                                                "examples": [
                                                  "Single Family"
                                                ]
                                              }
                                            },
                                            "additionalProperties": false,
                                            "description": "Price the property **as you describe it**, not as the county record has it. Optional, and additive: an integration that does not send it is unaffected and its answers do not move.\n\nSend any of the six facts below and that value is used in place of the county record's, for the model, for the comparable-sales band and for the price derived from it. Every fact in `subject_property.facts` says where it came from, so a value you stated reads `caller-stated` and everything else reads `county-record` — a claim can never be mistaken for a record.\n\n**A value you supply reads `caller-stated` even when it matches the county's own figure.** The label says where the number came from, not whether it changed.\n\n**Only these six facts, and nothing else.** Any other key — including `latitude`, `longitude`, `partial_bathrooms`, `address`, or a misspelling of one of the six — is refused with a 400 before any Credit is spent, rather than being ignored. **The coordinates are never overridable, and that is a rule rather than an omission: a what-if changes the house's facts, never *which house*.**\n\n**Values must be usable, and an empty `overrides` is refused.** A value must be the right JSON type, and must satisfy the rule stated on each fact below; `null` is refused, because an override may state a value but never erase one. `overrides: {}` is refused too — it declares a what-if while stating no claim, and its answer would be indistinguishable from a call that sent no `overrides` at all. Every one of these is a 400 before any Credit is spent.\n\n**The required facts are still required.** If the property still lacks a fact the valuation needs after your values are applied, the call is refused and the Credit is refunded, exactly as an ordinary request would be. There is no \"score it anyway\". Your `lot_size_square_feet` or `property_type` **can** supply a fact the county record was missing, in which case the call scores and that fact reads `caller-stated`.\n\n**Overriding `bathrooms` does not change `partial_bathrooms`**, which stays at the county's figure and is not overridable. This service does not add the two together, so do not read your stated bathroom count plus a county partial count as one total.",
                                            "examples": [
                                              {
                                                "square_feet": 2400,
                                                "bathrooms": 2.5
                                              }
                                            ]
                                          }
                                        },
                                        "required": [
                                          "address"
                                        ],
                                        "additionalProperties": {},
                                        "description": "Exactly one property, plus optional request options. `maxProperties` is the documented form of the cap these endpoints enforce, and it counts the property together with every option this endpoint accepts. `condition`, `rehab_budget`, `target_margin` and `overrides` are options, not properties — sending any or all of them never changes what the call costs. Every OTHER body member counts as a property, so a mistyped member name is counted as one: a one-property body carrying it returns 413 with `submitted` one higher than the properties you meant to send, and the fix is the member name, not a smaller batch. `gateway/tests/route-surface.test.ts` asserts that `maxProperties` equals the route's `maxSubmittedProperties` option plus the number of options it declares, so the published cap cannot drift from the enforced one."
                                      },
                                      "description": "The properties to score, each the same shape `POST /v1/predict` accepts. Order is preserved: the response's `results` array answers these properties in this order. Duplicate addresses are allowed and each is charged — two identical entries are two work items."
                                    }
                                  },
                                  "required": [
                                    "properties"
                                  ],
                                  "additionalProperties": false,
                                  "description": "The batch envelope. It admits exactly the `properties` array and nothing else: any other top-level member is rejected before any Spend, including a request option the single endpoint accepts — those belong on each entry inside `properties`, never on the envelope. Credits are charged per property submitted — a request option never changes what a batch costs. `maxItems` is the documented form of the batch limit this endpoint enforces: a batch carrying more properties returns 413 with honest `limit` and `submitted` counts, before any Spend. `gateway/tests/route-surface.test.ts` asserts that `maxItems` equals the route's `maxSubmittedProperties` option, so the published limit cannot drift from the enforced one."
                                },
                                "headers": {
                                  "type": "object",
                                  "properties": {
                                    "Idempotency-Key": {
                                      "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same body within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. Only successful responses are stored: if the earlier call was refunded or ended without a stored response, the key is taken over and the new request runs and is charged, whatever body it carries. Otherwise reusing a key with a different body is rejected as a conflict, and nothing is charged for it. The replay window is 24 hours, measured from the request that produced the stored result; after 24 hours the same key is a new request and is charged. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and no Credits are consumed for it. Keys are scoped to your Account — one Account never replays another Account's result. POST /v1/validate ignores this header: it is not a Metered Call, so there is nothing to replay.",
                                      "type": "string"
                                    }
                                  },
                                  "additionalProperties": false
                                }
                              },
                              "required": [
                                "body",
                                "headers"
                              ],
                              "additionalProperties": false
                            }
                          }
                        ]
                      },
                      "jsonrpc": "2.0",
                      "id": 1
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer YOUR_KEY_HERE",
            "schema": {
              "type": "string"
            },
            "description": "The `Authorization` header is used to authenticate with the API using your API key. Value is of the format `Bearer YOUR_KEY_HERE`."
          }
        ],
        "x-mcp-server": {
          "name": "Investorlift Data Services",
          "version": "1.2.0",
          "tools": [
            {
              "name": "score_property",
              "description": "Score a single property address and return a rehab-aware valuation and the maximum allowable offer (MAO) — the most a flip buyer on standard financing can pay for the property and still clear the target margin. It is a ceiling, not a prediction of the sale price: an offer to the seller is this figure less whatever fee the caller intends to take. When the answer reports the offer as clamped, no purchase price at all clears the target margin on that deal and the amount must not be presented as an offer. This is a Metered Call: it is charged to the Account's Balance, and the price is resolved by the Ledger at the moment of the Spend — identical to calling POST /v1/predict directly. Send an Idempotency-Key header to make a retry safe; errors are RFC 9457 Problem Details whose type member is stable.",
              "inputSchema": {
                "body": {
                  "$ref": "#/components/schemas/SingleScoredCallRequest"
                }
              }
            },
            {
              "name": "validate_request",
              "description": "Check that a request body would be accepted by score_property, without spending. This call is free: it charges nothing and never calls the scoring service, so it keeps working at a zero Balance. With an API Key it answers even while the Ledger is down. When the client is signed in through a connected app instead of holding an API Key — which is how most agents connect — this call makes one Ledger read to confirm the connection is still approved, and while that read is failing it answers 503 call-not-started. Nothing is charged either way. While this endpoint is temporarily switched off by its operator it answers 503 route-unavailable: nothing was charged, and Retry-After says how long to wait before sending the same call again. It requires a valid credential — an API Key, or an account sign-in — and nothing else.",
              "inputSchema": {
                "body": {
                  "$ref": "#/components/schemas/SingleScoredCallRequest"
                }
              }
            },
            {
              "name": "property_history",
              "description": "Read one property's recorded story from the county record: the chain of title newest first with each event in a small fixed vocabulary, any detected buy/sell flips, the current listing state, a rollup of the most recent recorded permit work by trade, and a short set of at-a-glance facts. Identify the property with EXACTLY ONE of address or property_id — a request carrying both, or neither, is rejected before anything is charged. Take property_id straight from a comparable property in a score_property answer to ask about that exact record with no address matching at all. This is a Metered Call: it is charged to the Account's Balance, and the price is resolved by the Ledger at the moment of the Spend — identical to calling POST /v1/history directly. A property with nothing on file is a chargeable answer, not a failure. Every category in the answer is a derived conclusion rather than a statement made by the county, an unrecognised record is reported as unknown rather than guessed at, and no owner, buyer, seller, agent or applicant name ever appears. Permit records that could not be retrieved are reported as unavailable and are never reported as an absence of permits. Send an Idempotency-Key header to make a retry safe; errors are RFC 9457 Problem Details whose type member is stable.",
              "inputSchema": {
                "body": {
                  "$ref": "#/components/schemas/HistoryCallRequest"
                }
              }
            },
            {
              "name": "score_property_batch",
              "description": "Score several property addresses in one call and return one answer per property, in submission order. Each answer carries the core numbers only — the same answer score_property returns, minus the list of comparable sales; score a property on its own to see those. This is a Metered Call: it is charged per property submitted, at a price resolved by the Ledger at the moment of the Spend, identical to calling POST /v1/predict/batch directly. The whole batch is charged before any property is scored, and a batch the Balance cannot afford is rejected in full with nothing consumed. A property that fails for a refundable reason — the address matched more than one property, the address is outside current coverage, the property could not be scored, an upstream service could not complete the call, or an upstream service did not answer in time — does not stop the ones after it: its entry is the same Problem Detail a single call would have returned and its share of the charge is refunded. A refusal outside those five stops the batch instead: no results array is returned, the request answers 503 spend-indeterminate, and every charge recorded for the batch is returned as a Refund. Send an Idempotency-Key header to make a retry safe; errors are RFC 9457 Problem Details whose type member is stable.",
              "inputSchema": {
                "body": {
                  "type": "object",
                  "description": "The batch envelope. It admits the `properties` array and one optional `confirmation` value, and nothing else: any other top-level member is rejected before any Spend, including a request option the single endpoint accepts — those belong on each entry inside `properties`, never on the envelope. The charge is per property submitted — a request option never changes what a batch costs. `maxItems` is the documented form of the batch limit this endpoint enforces: a batch carrying more properties returns 413 with honest `limit` and `submitted` counts, before any Spend. `gateway/tests/route-surface.test.ts` asserts that `maxItems` equals the route's `maxSubmittedProperties` option, so the published limit cannot drift from the enforced one.",
                  "additionalProperties": false,
                  "required": [
                    "properties"
                  ],
                  "properties": {
                    "properties": {
                      "type": "array",
                      "description": "The properties to score, each the same shape `POST /v1/predict` accepts. Order is preserved: the response's `results` array answers these properties in this order. Duplicate addresses are allowed and each is charged — two identical entries are two work items.",
                      "minItems": 1,
                      "maxItems": 10,
                      "items": {
                        "$ref": "#/components/schemas/ScoredCallRequest"
                      }
                    },
                    "confirmation": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 256,
                      "description": "Optional. The confirmation value an assistant received when a question would cost more than the ask-first limit; send it back unchanged with the same request to run it. Ignored on calls made with an API key."
                    }
                  }
                }
              }
            }
          ],
          "security": [
            {
              "api_key": []
            },
            {
              "connected_app": []
            }
          ],
          "securitySchemes": {
            "api_key": {
              "type": "http",
              "scheme": "bearer",
              "description": "A request sent from this page is a real call and is charged at the price shown for it; checking a request with `/v1/validate` is free.\n\nThe Account's API Key, sent as `Authorization: Bearer <API Key>`. Issue and revoke API Keys from the Portal.",
              "bearerFormat": "API key"
            },
            "connected_app": {
              "type": "openIdConnect",
              "openIdConnectUrl": "https://api.investorliftdata.com/.well-known/oauth-protected-resource/mcp",
              "description": "Connected-app sign-in (OAuth 2.1). A client connects you by sending you to approve the connection in a browser — you sign in with your existing account and never handle a key. A connected app acts as your Account and spends from the same balance at the same price as your API Keys do; disconnect it at any time from Account Settings. Clients discover the sign-in flow automatically from this endpoint."
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "api_key": {
        "type": "http",
        "scheme": "bearer",
        "description": "A request sent from this page is a real call and is charged at the price shown for it; checking a request with `/v1/validate` is free.\n\nThe Account's API Key, sent as `Authorization: Bearer <API Key>`. Issue and revoke API Keys from the Portal.",
        "bearerFormat": "API key"
      },
      "connected_app": {
        "type": "openIdConnect",
        "openIdConnectUrl": "https://api.investorliftdata.com/.well-known/oauth-protected-resource/mcp",
        "description": "Connected-app sign-in (OAuth 2.1). A client connects you by sending you to approve the connection in a browser — you sign in with your existing account and never handle a key. A connected app acts as your Account and spends from the same balance at the same price as your API Keys do; disconnect it at any time from Account Settings. Clients discover the sign-in flow automatically from this endpoint."
      }
    },
    "headers": {
      "TraceId": {
        "description": "The Trace ID for this request. Present on every response, success or failure. Quote it to support and it identifies the call exactly.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "RetryAfter": {
        "description": "How long to wait, in seconds, before sending the request again (RFC 9110).",
        "required": true,
        "schema": {
          "type": "string"
        }
      }
    },
    "parameters": {
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "description": "An opaque string of your choosing that makes retrying this request safe. Optional — a request without one is never an error, and is charged per call. Reusing a key with the same body within 24 hours returns the stored result and is not charged again, but only when the earlier call succeeded and its response was stored. Only successful responses are stored: if the earlier call was refunded or ended without a stored response, the key is taken over and the new request runs and is charged, whatever body it carries. Otherwise reusing a key with a different body is rejected as a conflict, and nothing is charged for it. The replay window is 24 hours, measured from the request that produced the stored result; after 24 hours the same key is a new request and is charged. If an identical request carrying the same key is still in flight, this one waits briefly for that result; if it does not arrive, the response is 409 with a Retry-After header and nothing is charged for it. Keys are scoped to your Account — one Account never replays another Account's result. POST /v1/validate ignores this header: it is not a Metered Call, so there is nothing to replay.",
        "schema": {
          "type": "string"
        }
      }
    },
    "schemas": {
      "ScoredCallRequest": {
        "type": "object",
        "description": "Exactly one property, plus optional request options. `maxProperties` is the documented form of the cap these endpoints enforce, and it counts the property together with every option this endpoint accepts. `condition`, `rehab_budget`, `target_margin` and `overrides` are options, not properties — sending any or all of them never changes what the call costs. Every OTHER body member counts as a property, so a mistyped member name is counted as one: a one-property body carrying it returns 413 with `submitted` one higher than the properties you meant to send, and the fix is the member name, not a smaller batch. `gateway/tests/route-surface.test.ts` asserts that `maxProperties` equals the route's `maxSubmittedProperties` option plus the number of options it declares, so the published cap cannot drift from the enforced one.",
        "maxProperties": 5,
        "required": [
          "address"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "The full street address of the property to score.",
            "examples": [
              "1026 N Beckley Ave, Dallas, TX 75203"
            ]
          },
          "condition": {
            "type": "string",
            "description": "The property's condition, which sets the repair budget the derived numbers are built on. Optional: omit it and the property is priced as though it needs no repairs, which is exactly what `turn_key` does. It is a request option rather than a second property, so sending it never changes what the call costs.\n\n`tear_down` is accepted by this schema and **refused** by the endpoint with a 400, before anything is charged. That is deliberate rather than an oversight: the scoring service has no land-value estimate, so there is no honest way to price a tear-down here. Analyse lot value separately.\n\nRepair figures are a screening range, not a contractor bid.",
            "enum": [
              "turn_key",
              "light_rehab",
              "major_rehab",
              "full_gut",
              "tear_down"
            ],
            "default": "turn_key",
            "examples": [
              "major_rehab"
            ]
          },
          "rehab_budget": {
            "type": "integer",
            "description": "Your own repair budget for this property, in **whole dollars**. Optional, and additive: an integration that does not send it is unaffected.\n\nWhen you send it, the repaired value and the maximum allowable offer are built from **your figure** instead of the bracket `condition` maps to, and the `rehab_budget` in the response is the number the arithmetic actually used. Sending `rehab_budget` and `condition` together is legal — `rehab_budget` wins, every time — so you never have to choose the bracket that comes closest to a number you already know.\n\n`condition: tear_down` is still refused with a 400 even when you send a repair budget. A repair budget does not answer what a tear-down needs, which is a land value, and there is no land-value estimate behind these numbers.\n\nRepair figures are a screening range, not a contractor bid.",
            "minimum": 0,
            "maximum": 10000000,
            "examples": [
              48000
            ]
          },
          "target_margin": {
            "type": "number",
            "description": "The profit margin your buyer needs, as a **fraction** of the repaired value — `0.2` means twenty percent. Optional, and additive: an integration that does not send it is unaffected, and is priced at the default of `0.2`.\n\nWhen you send it, the maximum allowable offer is solved at **your** margin rather than the default one. The `target_margin` in the response is always the margin the answer was priced at, whether you sent one or not, so \"what margin is this price built on?\" is answerable on every response.\n\nThe target margin is a **policy figure calibrated by judgment**, not a parameter fitted to a data set — which is exactly why you can override it.",
            "exclusiveMinimum": 0,
            "exclusiveMaximum": 1,
            "minimum": 0.01,
            "maximum": 0.9,
            "default": 0.2,
            "examples": [
              0.25
            ]
          },
          "overrides": {
            "type": "object",
            "description": "Price the property **as you describe it**, not as the county record has it. Optional, and additive: an integration that does not send it is unaffected and its answers do not move.\n\nSend any of the six facts below and that value is used in place of the county record's, for the model, for the comparable-sales band and for the price derived from it. Every fact in `subject_property.facts` says where it came from, so a value you stated reads `caller-stated` and everything else reads `county-record` — a claim can never be mistaken for a record.\n\n**A value you supply reads `caller-stated` even when it matches the county's own figure.** The label says where the number came from, not whether it changed.\n\n**Only these six facts, and nothing else.** Any other key — including `latitude`, `longitude`, `partial_bathrooms`, `address`, or a misspelling of one of the six — is refused with a 400 before anything is charged, rather than being ignored. **The coordinates are never overridable, and that is a rule rather than an omission: a what-if changes the house's facts, never *which house*.**\n\n**Values must be usable, and an empty `overrides` is refused.** A value must be the right JSON type, and must satisfy the rule stated on each fact below; `null` is refused, because an override may state a value but never erase one. `overrides: {}` is refused too — it declares a what-if while stating no claim, and its answer would be indistinguishable from a call that sent no `overrides` at all. Every one of these is a 400 before anything is charged.\n\n**The required facts are still required.** If the property still lacks a fact the valuation needs after your values are applied, the call is refused and the charge is refunded, exactly as an ordinary request would be. There is no \"score it anyway\". Your `lot_size_square_feet` or `property_type` **can** supply a fact the county record was missing, in which case the call scores and that fact reads `caller-stated`.\n\n**Overriding `bathrooms` does not change `partial_bathrooms`**, which stays at the county's figure and is not overridable. This service does not add the two together, so do not read your stated bathroom count plus a county partial count as one total.",
            "additionalProperties": false,
            "minProperties": 1,
            "properties": {
              "square_feet": {
                "type": "number",
                "description": "Finished living area, in **square feet**. Must be above zero.",
                "exclusiveMinimum": 0,
                "examples": [
                  2400
                ]
              },
              "bedrooms": {
                "type": "number",
                "description": "Bedroom count. Zero or above; `0` is accepted, because a studio genuinely has none.",
                "minimum": 0,
                "examples": [
                  4
                ]
              },
              "bathrooms": {
                "type": "number",
                "description": "Bathroom count, as the property data service counts them. Zero or above, and **may be fractional** — `2.5` is ordinary. It does not include `partial_bathrooms`, which stays at the county's figure and is not overridable; this service does not add the two together.",
                "minimum": 0,
                "examples": [
                  2.5
                ]
              },
              "year_built": {
                "type": "number",
                "description": "Year the structure was built. Must be above zero.",
                "exclusiveMinimum": 0,
                "examples": [
                  1998
                ]
              },
              "lot_size_square_feet": {
                "type": "number",
                "description": "Lot size, in **square feet** — never acres. Must be above zero. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                "exclusiveMinimum": 0,
                "examples": [
                  8100
                ]
              },
              "property_type": {
                "type": "string",
                "description": "Property type, as free text. Must not be blank or only spaces; surrounding spaces are trimmed, exactly as the county record's own value is, so the trimmed value is what appears in `subject_property.facts`. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                "examples": [
                  "Single Family"
                ]
              }
            },
            "examples": [
              {
                "square_feet": 2400,
                "bathrooms": 2.5
              }
            ]
          }
        }
      },
      "HistoryCallRequest": {
        "type": "object",
        "description": "**Exactly one of `address` or `property_id`.** A body carrying both, or neither, is rejected with 400 before anything is charged. Presence is what counts: sending an empty `address` alongside a real `property_id` still counts as sending both, and is rejected — rather than have this API quietly choose which of the two you meant.\n\nApart from the optional `confirmation` value an assistant sends back, this endpoint accepts no other members and no request options. `condition`, `rehab_budget`, `target_margin` and `overrides` belong to the Scored Call and are rejected here.",
        "additionalProperties": false,
        "properties": {
          "address": {
            "type": "string",
            "minLength": 1,
            "description": "The full street address of the property whose history you want.",
            "examples": [
              "1026 N Beckley Ave, Dallas, TX 75203"
            ]
          },
          "property_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{32}$",
            "description": "A property identifier taken from a Scored Call answer — the subject's own, or any comparable property's. 32 lowercase hexadecimal characters. On this arm **no address matching is performed**: the record is looked up directly, and `subject_property` reads back exactly which record answered. Identifiers are looked up in the same identifier space the Scored Call publishes them in.",
            "examples": [
              "a1b2c3d4e5f60718293a4b5c6d7e8f90"
            ]
          },
          "confirmation": {
            "type": "string",
            "minLength": 1,
            "maxLength": 256,
            "description": "Optional. The confirmation value an assistant received when a question would cost more than the ask-first limit; send it back unchanged with the same request to run it. Ignored on calls made with an API key."
          }
        },
        "oneOf": [
          {
            "required": [
              "address"
            ]
          },
          {
            "required": [
              "property_id"
            ]
          }
        ]
      },
      "ScoredCallResponse": {
        "type": "object",
        "description": "The underwriting answer for the submitted property. This body is built by Investorlift Data Services member by member; the scoring service's own response is never passed through. The member set below is closed: nothing else ever appears, and a member is added only as a documented, non-breaking addition. Every response also carries the Trace ID as the `trace-id` header — it is deliberately not repeated in this body, because a stored answer replayed under a later `Idempotency-Key` would otherwise carry the original call's handle and point support at the wrong call.\n\n**How well these numbers perform, stated honestly.** The distinction below matters more than any single figure, so it is published rather than left to be discovered.\n\n**What is verified.** The arithmetic is internally consistent and deterministic: the maximum allowable offer is the exact algebraic inverse of the flip pro forma it is solved from, verified to the cent, so a seller's suggested price and a buyer's underwriting agree by construction. The model's estimate is checked against the comparable sales before it is published, and withheld when the two disagree.\n\n**What is not verified.** There is **no published back-test of these numbers against realised sale prices** — not for the model's estimate, and not for the maximum allowable offer derived from the comparable sales. If accuracy matters to your use case, budget for your own back-test.\n\n**The policy figures.** The repair-lift thresholds, the target margin and the financing assumptions behind the maximum allowable offer are **policy figures, calibrated by judgment and intended to be tuned**. They are not parameters fitted to a data set, and they are not presented as if they were.\n\n**Coverage and caveats.** Residential property only: large multifamily and commercial subjects are outside coverage and will diverge rather than return an error. Tear-downs are unsupported — there is no land-value estimate behind them — so analyse lot value separately. Repair figures are a screening range, not a contractor bid. The model's estimate does not move when comparable sales are added or removed; the Comp Band does, and the Comp Band is what the maximum allowable offer is built on. A band computed over an uncurated set can be pulled by a single non-comparable sale, so read `effective_sample_size` alongside it. Property data is sparse in places, and a confident number computed from thin inputs still looks confident.",
        "additionalProperties": false,
        "required": [
          "model_estimate_available",
          "subject_property"
        ],
        "properties": {
          "model_estimate_available": {
            "type": "boolean",
            "description": "Whether the pricing model produced an estimate Investorlift Data Services was able to confirm for this property. Always present, alongside `subject_property`. On a priced answer, when `false`, the model's estimate and its distribution are withheld from this response: they were checked against the comparable sales below and did not agree with them, and a confidently wrong valuation is worse than none. The Comp Band and the comparable sales are unaffected — they are derived from the sales themselves — and this call is charged as normal, because it still carries a valuation. On a partial answer, it is also `false`: the model could not price the property, `max_allowable_offer` is null, and no valuation or Comp Band is supplied.",
            "examples": [
              true
            ]
          },
          "subject_property": {
            "type": "object",
            "examples": [
              {
                "property_id": "a1b2c3d4e5f60718293a4b5c6d7e8f90",
                "address": {
                  "street": "100 Sample Street",
                  "city": "Dallas",
                  "state": "TX",
                  "zip": "75203"
                },
                "facts": {
                  "square_feet": {
                    "value": 2416,
                    "source": "county-record"
                  },
                  "bedrooms": {
                    "value": 4,
                    "source": "county-record"
                  },
                  "bathrooms": {
                    "value": 2.5,
                    "source": "county-record"
                  },
                  "partial_bathrooms": {
                    "value": 1,
                    "source": "county-record"
                  },
                  "year_built": {
                    "value": 1998,
                    "source": "county-record"
                  },
                  "lot_size_square_feet": {
                    "value": 8276,
                    "source": "county-record"
                  },
                  "property_type": {
                    "value": "Single Family",
                    "source": "county-record"
                  }
                },
                "address_quality": {
                  "code": "zip-confirmed",
                  "statement": "The house number matched exactly one county record, and that record sits in the same ZIP code your address resolved to. Check the address and property facts in this block before relying on these numbers."
                },
                "outside_model_range": {
                  "flagged": false,
                  "reasons": []
                }
              }
            ],
            "description": "The property this answer is about, and the facts the valuation actually ran on. Always present on a scored answer, including one where the model's estimate was withheld. It is here so a mis-resolved address or a thin county record is visible before you act on the numbers: check that the address and the facts below describe the house you meant.\n\n**Every fact carries where it came from.** `county-record` means the property data service's stored value for this property; `caller-stated` means a value you supplied in its place. Those are the only two values. A fact reads `caller-stated` when you supplied it through the `overrides` request option, and `county-record` otherwise — including `partial_bathrooms`, which cannot be overridden. A value you supply reads `caller-stated` even when it matches the county record's own figure.\n\n**A fact that is missing is missing on purpose.** When the county record does not carry a usable value for something, that fact is left out of `facts` entirely rather than returned as `null`, `0` or an empty string. Absence is information: the valuation ran without it too. A recorded living area of zero is treated as no living area, not as a house that measures nothing.\n\n**This block is additive.** It was added without changing any other member, and an integration that ignores it is unaffected.",
            "additionalProperties": false,
            "required": [
              "property_id",
              "facts",
              "address_quality",
              "outside_model_range"
            ],
            "properties": {
              "latitude": {
                "type": "number",
                "minimum": -90,
                "maximum": 90,
                "description": "Supplier-resolved coordinate, published only together with its valid paired coordinate. Both omitted when either is unavailable or invalid."
              },
              "longitude": {
                "type": "number",
                "minimum": -180,
                "maximum": 180,
                "description": "Supplier-resolved coordinate, published only together with its valid paired coordinate. Both omitted when either is unavailable or invalid."
              },
              "property_id": {
                "type": "string",
                "description": "The property data service's identifier for the property this answer resolved to. Stable across calls, and the handle to use when you want the same property again rather than the same text."
              },
              "address": {
                "type": "object",
                "description": "The resolved property's address **as the county record stores it** — not the address you submitted. It is the record's own text, published without re-casing, so you can compare it against the county's data directly. A component the record does not carry is omitted, and the whole object is omitted when the record carries none of them.",
                "additionalProperties": false,
                "properties": {
                  "street": {
                    "type": "string",
                    "description": "The street line, as stored."
                  },
                  "city": {
                    "type": "string",
                    "description": "The city, as stored. The property data service files these in lower case and they are published unchanged."
                  },
                  "state": {
                    "type": "string",
                    "description": "The two-letter state code, as stored."
                  },
                  "zip": {
                    "type": "string",
                    "description": "The ZIP code, as stored. It may carry a ZIP+4 suffix."
                  }
                }
              },
              "facts": {
                "type": "object",
                "description": "The property facts the valuation ran on, each with where it came from. A fact the county record does not usably carry is omitted from this object entirely — see the note above.",
                "additionalProperties": false,
                "properties": {
                  "square_feet": {
                    "type": "object",
                    "description": "Finished living area, in square feet. Omitted when the county record carries no usable figure — including a recorded zero, which is an absence written as a digit rather than a measurement.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "bedrooms": {
                    "type": "object",
                    "description": "Bedroom count. A genuine zero is a count and is published as `0`; omitted only when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "bathrooms": {
                    "type": "object",
                    "description": "The bathroom count as the property data service calculates it, published exactly as it is stored. It can be fractional — `2.5` is the ordinary case here, not an edge one. `partial_bathrooms` below is a separate stored figure, and this service does not add the two together: it makes no claim about what the calculated count already includes. A genuine zero is published as `0`.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "partial_bathrooms": {
                    "type": "object",
                    "description": "The partial-bathroom count as the property data service stores it. The word *partial* is the record's own term and does not necessarily mean a half bath. It is a separate figure from `bathrooms` above, and this service does not add the two together. A genuine zero is published as `0`.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property, and `caller-stated` means a value you supplied in its place. **`partial_bathrooms` cannot be overridden**, so this `source` reads `county-record` on every answer. Both values are listed because the vocabulary is one shared list across all facts rather than a separate list per fact."
                      }
                    }
                  },
                  "year_built": {
                    "type": "object",
                    "description": "The year the structure was built. Omitted when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "lot_size_square_feet": {
                    "type": "object",
                    "description": "Lot size, in square feet — never acres. Omitted when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "property_type": {
                    "type": "object",
                    "description": "The property type as the county record describes it, in that record's own wording.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "string",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  }
                }
              },
              "address_quality": {
                "type": "object",
                "description": "How far the address you submitted was confirmed against the county record — two specific checks, reported plainly. **This is not a confidence score and not a probability.** Reaching an answer at all already required the house number to match exactly one complete county record; this member reports whether the ZIP code agreed as well.",
                "additionalProperties": false,
                "required": [
                  "code",
                  "statement"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "zip-confirmed",
                      "zip-unconfirmed",
                      "identified-by-property-id"
                    ],
                    "description": "`zip-confirmed`: address resolution derived a ZIP code for your address, and the matched county record sits in the same one. `zip-unconfirmed`: it did not — either no readable ZIP code was available for your address, or the county record does not carry that same ZIP code (a different one, or none at all). Note that the ZIP code compared is the one your address **resolved to**, which is not always one you typed. Both codes mean the house number matched exactly one complete county record; neither claims more than that. Branch on this, not on the wording below."
                  },
                  "statement": {
                    "type": "string",
                    "description": "The same finding in a sentence you can show a colleague. Fixed wording per code — it is selected from a table, never assembled — and it never repeats the address you submitted."
                  }
                }
              },
              "outside_model_range": {
                "type": "object",
                "description": "Whether this property sits outside the range of properties the pricing model covers well. **It is a caution about the estimate, not a claim about the house**: when it is flagged, read the numbers in this answer with extra scrutiny — it does not say the property is any particular thing. Always present, flagged or not.",
                "additionalProperties": false,
                "required": [
                  "flagged",
                  "reasons"
                ],
                "properties": {
                  "flagged": {
                    "type": "boolean",
                    "description": "`true` when at least one reason below applies. `false` with an empty `reasons` list means nothing about this property put it outside the covered range."
                  },
                  "reasons": {
                    "type": "array",
                    "description": "Why the caution applies, in a stable order. Empty when `flagged` is `false`. A property can carry more than one reason. A fact neither the county record nor your `overrides` supplies cannot raise its own reason — an unknown lot size is not a large lot. The reasons are read from the facts the valuation actually ran on, so a fact you stated yourself can raise one: this caution is about the estimate you are being handed, and that estimate was computed from your values.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "large-lot",
                        "large-structure",
                        "property-type"
                      ],
                      "description": "`large-lot`: the lot is larger than the sizes the model is calibrated over. `large-structure`: the finished living area is larger than the sizes the model is calibrated over. `property-type`: the property type the valuation ran on — the county record's, or yours if you overrode it — is one the model does not cover well, such as multifamily, commercial, mixed-use or industrial. The size thresholds behind the first two are policy figures, calibrated by judgment and intended to be tuned."
                    }
                  }
                }
              }
            }
          },
          "pricing_model_arv_estimate": {
            "type": "integer",
            "description": "The pricing model's after-repair-value estimate for this property, rounded to the nearest thousand dollars. Read from the model's own value distribution rather than from the comparable sales, so it does not move when comparable sales are added or removed — the Comp Band is the number that does. Absent when `model_estimate_available` is `false`."
          },
          "valuation_quantiles": {
            "type": "object",
            "description": "The predicted value distribution for this property, as quantile level to predicted value. The full distribution is returned rather than a single number: where the scoring service exposes its uncertainty, Investorlift Data Services surfaces it rather than hiding it. Absent when `model_estimate_available` is `false`.",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "valuation_mean": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The predicted value for this property as a single point estimate. Optional: the scoring service does not always produce one, and its absence does not make the distribution above any less complete. Absent when `model_estimate_available` is `false`."
          },
          "effective_sample_size": {
            "type": "number",
            "description": "How much comparable evidence supported the model's estimate. A low value means the distribution above rests on thin evidence and should be read with more caution. Absent when `model_estimate_available` is `false`, because it describes an estimate that was withheld.",
            "examples": [
              72.34
            ]
          },
          "comp_band": {
            "type": "object",
            "description": "The Comp Band: the value range implied by the comparable sales below, size-normalised to this property where their square footage allows it. This is the number derived from recorded sales rather than from a model. Absent when too few comparable sales carried a usable price to state a range honestly — a range built on one or two sales reads as high confidence over the thinnest possible evidence.",
            "additionalProperties": false,
            "required": [
              "low",
              "median",
              "high"
            ],
            "properties": {
              "low": {
                "type": "integer",
                "description": "The lower end of the range, in whole dollars."
              },
              "median": {
                "type": "integer",
                "description": "The middle of the range, in whole dollars."
              },
              "high": {
                "type": "integer",
                "description": "The upper end of the range, in whole dollars."
              }
            }
          },
          "rehab_budget": {
            "type": "integer",
            "description": "The repair budget the numbers below were built on, in whole dollars — **the figure the arithmetic actually used**. When you sent a `rehab_budget`, this is your number. When you did not, it is the whole-project midpoint for the `condition` you submitted, and zero when you sent no `condition`, which is the same as sending `turn_key`. A bracket figure is a screening range reduced to a single number, not a contractor bid: small homes skew high per square foot, and the heavier brackets are the least reliable in the set. Sending your own budget replaces that estimate with your own."
          },
          "rehab_adjusted_arv": {
            "type": "integer",
            "description": "The after-repair value this deal is priced against, in whole dollars: the Comp Band's middle value lifted toward its upper end in proportion to the repair budget, because a heavier renovation signals a higher-finish result. It equals the middle of the Comp Band when there is no repair signal and never exceeds the upper end, so the number stays anchored to sales that actually happened. It is derived from the comparable sales rather than from the model, so it moves when the comparable sales do. The thresholds that shape the lift are policy figures calibrated by judgment, not fitted parameters. Absent whenever the Comp Band is absent."
          },
          "target_margin": {
            "type": "number",
            "description": "The profit margin the maximum allowable offer (`max_allowable_offer`, below) was solved at, as a fraction of `rehab_adjusted_arv` — `0.2` means twenty percent. **Always present on a priced answer**, whether or not you sent a `target_margin`: when you sent one it is your figure, and when you did not it is the default this service priced at. It is published either way so that \"what margin is this price built on?\" is answerable on every response rather than only on the ones that named it. The default is a policy figure calibrated by judgment, not a fitted parameter. Absent whenever the Comp Band is absent.",
            "examples": [
              0.2
            ]
          },
          "max_allowable_offer": {
            "type": [
              "object",
              "null"
            ],
            "description": "The **maximum allowable offer (MAO)**: the highest purchase price at which a cash flip buyer on standard financing still clears the target margin. It is the algebraic inverse of a flip pro forma rather than a price quantile, so a seller's suggested price and a buyer's underwriting agree by construction.\n\n**This is the investor's ceiling — your offer to the seller is this minus your fee.**\n\nIt is not a prediction of what the property will trade at. The financing figures behind it — down payment, interest, points, closing costs, hold period and target margin — are policy figures calibrated by judgment and intended to be tuned; they are not fitted to any data set. On a priced answer, the object is absent whenever the Comp Band is absent. `null` only on a partial answer, when `outside_model_range` is present.",
            "additionalProperties": false,
            "required": [
              "amount",
              "clamped"
            ],
            "properties": {
              "amount": {
                "type": "integer",
                "description": "The price, in whole dollars, rounded to the nearest thousand."
              },
              "clamped": {
                "type": "boolean",
                "description": "`true` when no purchase price at all clears the target margin on this deal, at this repair budget. When it is `true` the amount above is **not an offer** and must not be presented as one — a zero-dollar price is not a price. This flag is the no-price-works alarm: read it on every answer before you act on the amount."
              }
            }
          },
          "outside_model_range": {
            "type": "object",
            "description": "Present only on a **partial answer**: you sent `partial_answer: true`, we found the property, and the pricing model does not price it. On that answer `max_allowable_offer` is `null`, `subject_property` carries the facts we hold, and no valuation, comparable sales or cost stack is included. Absent on every other answer.",
            "additionalProperties": false,
            "required": [
              "reasons"
            ],
            "properties": {
              "reasons": {
                "type": "array",
                "description": "Why there is no offer, in a stable order. At least one value.",
                "items": {
                  "type": "string",
                  "enum": [
                    "large-lot",
                    "large-structure",
                    "property-type",
                    "not-modelled"
                  ],
                  "description": "`large-lot`, `large-structure` and `property-type` mean what they mean in `subject_property.outside_model_range`. `not-modelled`: we found the property, but the pricing model did not price it, and none of the three named limits applies."
                }
              }
            }
          },
          "cost_stack": {
            "type": "object",
            "description": "The line items behind the maximum allowable offer — the deal as the flip buyer it is solved for would carry it. Present when `max_allowable_offer` is a priced object, and absent whenever the Comp Band is absent. A partial answer has `max_allowable_offer: null` and no cost stack.\n\n**These numbers are whole dollars, and `down_payment` plus `loan` is the maximum allowable offer exactly.** Rounding is applied once, above both the price and these lines, so the figures you read here are the figures that add up — there is never a rounded total that disagrees with its own rounded parts. That identity holds on every answer, including the ones where no price could be solved.\n\n**When a price was solved — `max_allowable_offer.clamped` is `false` — the whole stack reconciles.** Add `down_payment`, `loan`, `rehab_budget`, `interest`, `points`, `closing_costs` and `target_profit` and you land back at `rehab_adjusted_arv`. The gap is rounding and nothing else — the price to the nearest thousand, `rehab_adjusted_arv` to the nearest thousand, and each remaining line to the nearest dollar — so it stays a little over a thousand dollars across the repair budgets this API brackets, and grows with a very large repair budget because a longer hold puts more financing cost on each rounded dollar of price.\n\n**When `clamped` is `true` there is nothing to reconcile.** No price in range cleared the target margin, so the published price is a floor rather than a solution; the lines still describe that published price, but they will not add back to `rehab_adjusted_arv` and the difference can be large. Read `clamped` first on those answers.\n\nEvery figure here follows from the financing assumptions behind the maximum allowable offer, which are **policy figures calibrated by judgment and intended to be tuned** — not a quote from any lender, and not fitted to a data set.",
            "additionalProperties": false,
            "required": [
              "down_payment",
              "loan",
              "interest",
              "points",
              "hold_days",
              "closing_costs",
              "target_profit"
            ],
            "properties": {
              "down_payment": {
                "type": "integer",
                "description": "The cash the buyer puts into the purchase, in whole dollars."
              },
              "loan": {
                "type": "integer",
                "description": "The borrowed balance, in whole dollars: the maximum allowable offer less the down payment. The two add back to the price exactly."
              },
              "interest": {
                "type": "integer",
                "description": "Interest on the loan over the hold period below, in whole dollars."
              },
              "points": {
                "type": "integer",
                "description": "Lending points charged on the loan, in whole dollars."
              },
              "hold_days": {
                "type": "integer",
                "description": "How long the deal is modelled as being held, in days. It grows with the repair budget, because a heavier renovation takes longer."
              },
              "closing_costs": {
                "type": "integer",
                "description": "Closing costs, in whole dollars, charged on both the purchase and the resale."
              },
              "target_profit": {
                "type": "integer",
                "description": "The profit the maximum allowable offer was solved to leave on the table, in whole dollars: `target_margin` of the rehab-adjusted ARV, taken before that ARV was rounded for publication. Multiplying the published `rehab_adjusted_arv` by `target_margin` yourself lands close to this figure but not exactly on it — the difference is the ARV rounding, and the price was solved against the unrounded value."
              },
              "assumptions": {
                "type": "object",
                "description": "The figures the maximum allowable offer was solved with on this answer, so you can recompute it exactly. The repair-adjusted value moves between `comp_band.median` and `comp_band.high` as the repair budget grows, between the two lift shares below; the band itself is in `comp_band`. Present on every single-call answer from the 2026-10-26 release; it is listed as optional here only until the recorded example answer on this page is refreshed from a live call, when it becomes required.",
                "additionalProperties": false,
                "required": [
                  "down_fraction",
                  "annual_interest_rate",
                  "days_per_year",
                  "points_fraction",
                  "closing_fraction",
                  "closing_applies_to_purchase",
                  "carry",
                  "hold_base_days",
                  "hold_days_per_thousand_rehab",
                  "rehab_lift_low_share",
                  "rehab_lift_high_share",
                  "offer_rounding_increment",
                  "arv_rounding_increment"
                ],
                "properties": {
                  "down_fraction": {
                    "type": "number",
                    "description": "The share of the purchase price paid in cash; the rest is the loan."
                  },
                  "annual_interest_rate": {
                    "type": "number",
                    "description": "The yearly interest rate on the loan, as a fraction."
                  },
                  "days_per_year": {
                    "type": "number",
                    "description": "The days in a year the interest rate is spread over."
                  },
                  "points_fraction": {
                    "type": "number",
                    "description": "Lending points, as a fraction of the loan."
                  },
                  "closing_fraction": {
                    "type": "number",
                    "description": "Closing costs, as a fraction of the price they apply to."
                  },
                  "closing_applies_to_purchase": {
                    "type": "boolean",
                    "description": "`true` when closing costs apply to the purchase as well as the sale."
                  },
                  "carry": {
                    "type": "number",
                    "description": "A monthly carrying cost added to the deal, in dollars. `0` on the financing this API uses."
                  },
                  "hold_base_days": {
                    "type": "number",
                    "description": "The hold period before any repair time, in days."
                  },
                  "hold_days_per_thousand_rehab": {
                    "type": "number",
                    "description": "Days added to the hold for each thousand dollars of repair budget. The hold is rounded to a whole day."
                  },
                  "rehab_lift_low_share": {
                    "type": "number",
                    "description": "At or below this repair budget, as a share of `comp_band.median`, the repair-adjusted value is the median."
                  },
                  "rehab_lift_high_share": {
                    "type": "number",
                    "description": "At or above this repair budget, as a share of `comp_band.median`, the repair-adjusted value is `comp_band.high`; between the two shares it moves in a straight line."
                  },
                  "offer_rounding_increment": {
                    "type": "number",
                    "description": "The maximum allowable offer is rounded to the nearest multiple of this many dollars, then kept between zero and the repair-adjusted value."
                  },
                  "arv_rounding_increment": {
                    "type": "number",
                    "description": "The repaired value is published rounded to the nearest multiple of this many dollars. The offer and cost stack use the unrounded repaired value."
                  }
                }
              }
            }
          },
          "as_is_similar_band": {
            "type": "object",
            "description": "A price-per-square-foot range taken over the comparable sales listed in `comps`, stated as evidence beside `comp_band` rather than as part of the valuation. It feeds nothing: no other member of this response is computed from it. Read `basis` to learn which sales it covers. It is present whenever at least one comparable sale carries both a usable sale price and a usable square footage, INCLUDING on answers where the model estimate was withheld (`model_estimate_available: false`), because it is computed from the comparable sales rather than from the model. It is absent when no comparable sale carries both. No member of it is ever null.",
            "additionalProperties": false,
            "required": [
              "price_per_square_foot",
              "qualifying_sales",
              "basis",
              "statement"
            ],
            "properties": {
              "price_per_square_foot": {
                "type": "object",
                "description": "The 25th, 50th and 75th percentiles of the price per square foot of the sales this range covers, interpolated and then rounded once.",
                "additionalProperties": false,
                "required": [
                  "low",
                  "median",
                  "high"
                ],
                "properties": {
                  "low": {
                    "type": "integer",
                    "description": "The lower end of the range, in dollars per square foot."
                  },
                  "median": {
                    "type": "integer",
                    "description": "The middle of the range, in dollars per square foot."
                  },
                  "high": {
                    "type": "integer",
                    "description": "The upper end of the range, in dollars per square foot."
                  }
                }
              },
              "qualifying_sales": {
                "type": "integer",
                "description": "How many of the sales in `comps` passed this service's size, age and recency filter. This is ALWAYS the filter's count, on both values of `basis` — it is never the size of the comparable list. When `basis` is `all-comparable-sales` this number is below the minimum this service requires to state a similar-sales range, which is why that basis was used."
              },
              "basis": {
                "type": "string",
                "enum": [
                  "similar-sales",
                  "all-comparable-sales"
                ],
                "description": "Which sales `price_per_square_foot` covers. `similar-sales`: only the sales that passed the size, age and recency filter. `all-comparable-sales`: too few passed, so the three filters were dropped and the range covers every sale in `comps` carrying a usable sale price and square footage. Branch on this, not on the wording of `statement`."
              },
              "statement": {
                "type": "string",
                "description": "A plain-language sentence saying which sales the range covers, chosen from a fixed pair by `basis`. It is a constant: nothing you submit is interpolated into it, and it quotes no threshold. It is safe to show to a person and unsafe to parse — branch on `basis`."
              }
            }
          },
          "comps": {
            "type": "array",
            "description": "The comparable sales the Comp Band was derived from, in the order the scoring service ranked them, as stored by the property data service. The property's own prior sale is removed before anything is computed. Absent when the scoring service returned none.",
            "items": {
              "type": "object",
              "description": "One comparable sale.",
              "additionalProperties": false,
              "properties": {
                "latitude": {
                  "type": "number",
                  "minimum": -90,
                  "maximum": 90,
                  "description": "Supplier-resolved coordinate, published only together with its valid paired coordinate. Both omitted when either is unavailable or invalid."
                },
                "longitude": {
                  "type": "number",
                  "minimum": -180,
                  "maximum": 180,
                  "description": "Supplier-resolved coordinate, published only together with its valid paired coordinate. Both omitted when either is unavailable or invalid."
                },
                "property_id": {
                  "type": "string",
                  "description": "The property data service's identifier for the comparable property. This is the key that names this property to this API — keep it for any comparable you want to look up later."
                },
                "address_street": {
                  "type": "string",
                  "description": "The street line of the comparable property, as stored by the property data service."
                },
                "address_city": {
                  "type": "string",
                  "description": "The city of the comparable property."
                },
                "address_state": {
                  "type": "string",
                  "description": "The two-letter state code of the comparable property."
                },
                "address_zip": {
                  "type": "string",
                  "description": "The ZIP code of the comparable property."
                },
                "sale_date": {
                  "type": "string",
                  "description": "The date the comparable sale was recorded."
                },
                "sale_price": {
                  "type": "integer",
                  "description": "What the comparable property sold for, in whole dollars. Omitted when the recorded value is nominal — quitclaims and intra-family transfers record at token values that are not sale prices, and a comparable with no usable value is shown without one rather than shown as worthless."
                },
                "sqft": {
                  "type": "number",
                  "description": "The finished living area of the comparable property, in square feet."
                },
                "bedrooms": {
                  "type": "number",
                  "description": "The bedroom count of the comparable property."
                },
                "bathrooms": {
                  "type": "number",
                  "description": "The bathroom count of the comparable property."
                },
                "year_built": {
                  "type": "number",
                  "description": "The year the comparable property was built."
                },
                "similarity_rank": {
                  "type": "integer",
                  "description": "This sale's 1-based position in the `comps` array — that is, its place in the order the scoring service ranked them, after this property's own prior sale is removed and the list is capped. Positions run 1, 2, 3… with no gaps. IT IS A POSITION, NOT A SIMILARITY SCORE: rank 1 is the sale the scoring service returned first, and this service does not publish, and cannot explain, how that service ordered them."
                },
                "price_per_square_foot": {
                  "type": "integer",
                  "description": "This sale's `sale_price` divided by its `sqft`, rounded once, in dollars per square foot. Omitted when either is missing — including when `sale_price` was omitted as nominal, in which case no ratio is published either."
                },
                "distance_miles": {
                  "type": "number",
                  "description": "Straight-line (great-circle) distance in miles from the property this answer is about to this comparable, to two decimal places. Omitted when the comparable carries no usable coordinates. Valid paired latitude and longitude are published separately when available."
                },
                "lotsize": {
                  "type": "number",
                  "description": "The lot size recorded for the comparable property, republished unchanged and under the field name the upstream data carries. THE UNIT IS NOT STATED BECAUSE THIS SERVICE HAS NOT ESTABLISHED IT: naming one here would assert something unmeasured. Compare it against other comparables in the same answer rather than against a figure in units you have assumed."
                },
                "property_type": {
                  "type": "string",
                  "description": "The property type recorded for the comparable property, republished verbatim — this service does not normalise or map it. It carries the same member name as `subject_property.facts.property_type` so the subject and a comparable can be read side by side."
                }
              }
            }
          }
        }
      },
      "BatchScoredCallItem": {
        "type": "object",
        "description": "One property's answer inside a batch. It is the **core numbers only**: the same answer `POST /v1/predict` returns for that property, minus the list of comparable sales.\n\n**Why the comparable sales are not here.** A batch answers up to ten properties at once, and ten comp lists is a payload written for nobody. The evidence that supports each number is still here — the Comp Band, the qualifying count in `effective_sample_size`, and the price-per-square-foot range in `as_is_similar_band` — and the sales themselves are one follow-up call away: score the property on its own with `POST /v1/predict`, by address — a Scored Call takes no `property_id` — and the full `comps` list comes back.\n\nThe member set below is closed: nothing else ever appears. The Trace ID rides the `trace-id` response header and every entry in one batch shares it, so it is deliberately not repeated in this body.",
        "additionalProperties": false,
        "required": [
          "model_estimate_available",
          "subject_property"
        ],
        "properties": {
          "model_estimate_available": {
            "type": "boolean",
            "description": "Whether the pricing model produced an estimate Investorlift Data Services was able to confirm for this property. Always present, alongside `subject_property`. When `false`, the model's estimate and its distribution are withheld from this response: they were checked against the comparable sales found for this property and did not agree with them, and a confidently wrong valuation is worse than none. The Comp Band and the comparable sales are unaffected — they are derived from the sales themselves — and this call is charged as normal, because it still carries a valuation.",
            "examples": [
              true
            ]
          },
          "subject_property": {
            "type": "object",
            "examples": [
              {
                "property_id": "a1b2c3d4e5f60718293a4b5c6d7e8f90",
                "address": {
                  "street": "100 Sample Street",
                  "city": "Dallas",
                  "state": "TX",
                  "zip": "75203"
                },
                "facts": {
                  "square_feet": {
                    "value": 2416,
                    "source": "county-record"
                  },
                  "bedrooms": {
                    "value": 4,
                    "source": "county-record"
                  },
                  "bathrooms": {
                    "value": 2.5,
                    "source": "county-record"
                  },
                  "partial_bathrooms": {
                    "value": 1,
                    "source": "county-record"
                  },
                  "year_built": {
                    "value": 1998,
                    "source": "county-record"
                  },
                  "lot_size_square_feet": {
                    "value": 8276,
                    "source": "county-record"
                  },
                  "property_type": {
                    "value": "Single Family",
                    "source": "county-record"
                  }
                },
                "address_quality": {
                  "code": "zip-confirmed",
                  "statement": "The house number matched exactly one county record, and that record sits in the same ZIP code your address resolved to. Check the address and property facts in this block before relying on these numbers."
                },
                "outside_model_range": {
                  "flagged": false,
                  "reasons": []
                }
              }
            ],
            "description": "The property this answer is about, and the facts the valuation actually ran on. Always present on a scored answer, including one where the model's estimate was withheld. It is here so a mis-resolved address or a thin county record is visible before you act on the numbers: check that the address and the facts below describe the house you meant.\n\n**Every fact carries where it came from.** `county-record` means the property data service's stored value for this property; `caller-stated` means a value you supplied in its place. Those are the only two values. A fact reads `caller-stated` when you supplied it through the `overrides` request option, and `county-record` otherwise — including `partial_bathrooms`, which cannot be overridden. A value you supply reads `caller-stated` even when it matches the county record's own figure.\n\n**A fact that is missing is missing on purpose.** When the county record does not carry a usable value for something, that fact is left out of `facts` entirely rather than returned as `null`, `0` or an empty string. Absence is information: the valuation ran without it too. A recorded living area of zero is treated as no living area, not as a house that measures nothing.\n\n**This block is additive.** It was added without changing any other member, and an integration that ignores it is unaffected.",
            "additionalProperties": false,
            "required": [
              "property_id",
              "facts",
              "address_quality",
              "outside_model_range"
            ],
            "properties": {
              "property_id": {
                "type": "string",
                "description": "The property data service's identifier for the property this answer resolved to. Stable across calls, and the handle to use when you want the same property again rather than the same text."
              },
              "address": {
                "type": "object",
                "description": "The resolved property's address **as the county record stores it** — not the address you submitted. It is the record's own text, published without re-casing, so you can compare it against the county's data directly. A component the record does not carry is omitted, and the whole object is omitted when the record carries none of them.",
                "additionalProperties": false,
                "properties": {
                  "street": {
                    "type": "string",
                    "description": "The street line, as stored."
                  },
                  "city": {
                    "type": "string",
                    "description": "The city, as stored. The property data service files these in lower case and they are published unchanged."
                  },
                  "state": {
                    "type": "string",
                    "description": "The two-letter state code, as stored."
                  },
                  "zip": {
                    "type": "string",
                    "description": "The ZIP code, as stored. It may carry a ZIP+4 suffix."
                  }
                }
              },
              "facts": {
                "type": "object",
                "description": "The property facts the valuation ran on, each with where it came from. A fact the county record does not usably carry is omitted from this object entirely — see the note above.",
                "additionalProperties": false,
                "properties": {
                  "square_feet": {
                    "type": "object",
                    "description": "Finished living area, in square feet. Omitted when the county record carries no usable figure — including a recorded zero, which is an absence written as a digit rather than a measurement.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "bedrooms": {
                    "type": "object",
                    "description": "Bedroom count. A genuine zero is a count and is published as `0`; omitted only when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "bathrooms": {
                    "type": "object",
                    "description": "The bathroom count as the property data service calculates it, published exactly as it is stored. It can be fractional — `2.5` is the ordinary case here, not an edge one. `partial_bathrooms` below is a separate stored figure, and this service does not add the two together: it makes no claim about what the calculated count already includes. A genuine zero is published as `0`.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "partial_bathrooms": {
                    "type": "object",
                    "description": "The partial-bathroom count as the property data service stores it. The word *partial* is the record's own term and does not necessarily mean a half bath. It is a separate figure from `bathrooms` above, and this service does not add the two together. A genuine zero is published as `0`.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property, and `caller-stated` means a value you supplied in its place. **`partial_bathrooms` cannot be overridden**, so this `source` reads `county-record` on every answer. Both values are listed because the vocabulary is one shared list across all facts rather than a separate list per fact."
                      }
                    }
                  },
                  "year_built": {
                    "type": "object",
                    "description": "The year the structure was built. Omitted when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "lot_size_square_feet": {
                    "type": "object",
                    "description": "Lot size, in square feet — never acres. Omitted when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "property_type": {
                    "type": "object",
                    "description": "The property type as the county record describes it, in that record's own wording.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "string",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  }
                }
              },
              "address_quality": {
                "type": "object",
                "description": "How far the address you submitted was confirmed against the county record — two specific checks, reported plainly. **This is not a confidence score and not a probability.** Reaching an answer at all already required the house number to match exactly one complete county record; this member reports whether the ZIP code agreed as well.",
                "additionalProperties": false,
                "required": [
                  "code",
                  "statement"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "zip-confirmed",
                      "zip-unconfirmed"
                    ],
                    "description": "`zip-confirmed`: address resolution derived a ZIP code for your address, and the matched county record sits in the same one. `zip-unconfirmed`: it did not — either no readable ZIP code was available for your address, or the county record does not carry that same ZIP code (a different one, or none at all). Note that the ZIP code compared is the one your address **resolved to**, which is not always one you typed. Both codes mean the house number matched exactly one complete county record; neither claims more than that. Branch on this, not on the wording below."
                  },
                  "statement": {
                    "type": "string",
                    "description": "The same finding in a sentence you can show a colleague. Fixed wording per code — it is selected from a table, never assembled — and it never repeats the address you submitted."
                  }
                }
              },
              "outside_model_range": {
                "type": "object",
                "description": "Whether this property sits outside the range of properties the pricing model covers well. **It is a caution about the estimate, not a claim about the house**: when it is flagged, read the numbers in this answer with extra scrutiny — it does not say the property is any particular thing. Always present, flagged or not.",
                "additionalProperties": false,
                "required": [
                  "flagged",
                  "reasons"
                ],
                "properties": {
                  "flagged": {
                    "type": "boolean",
                    "description": "`true` when at least one reason below applies. `false` with an empty `reasons` list means nothing about this property put it outside the covered range."
                  },
                  "reasons": {
                    "type": "array",
                    "description": "Why the caution applies, in a stable order. Empty when `flagged` is `false`. A property can carry more than one reason. A fact neither the county record nor your `overrides` supplies cannot raise its own reason — an unknown lot size is not a large lot. The reasons are read from the facts the valuation actually ran on, so a fact you stated yourself can raise one: this caution is about the estimate you are being handed, and that estimate was computed from your values.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "large-lot",
                        "large-structure",
                        "property-type"
                      ],
                      "description": "`large-lot`: the lot is larger than the sizes the model is calibrated over. `large-structure`: the finished living area is larger than the sizes the model is calibrated over. `property-type`: the property type the valuation ran on — the county record's, or yours if you overrode it — is one the model does not cover well, such as multifamily, commercial, mixed-use or industrial. The size thresholds behind the first two are policy figures, calibrated by judgment and intended to be tuned."
                    }
                  }
                }
              }
            }
          },
          "pricing_model_arv_estimate": {
            "type": "integer",
            "description": "The pricing model's after-repair-value estimate for this property, rounded to the nearest thousand dollars. Read from the model's own value distribution rather than from the comparable sales, so it does not move when comparable sales are added or removed — the Comp Band is the number that does. Absent when `model_estimate_available` is `false`."
          },
          "valuation_quantiles": {
            "type": "object",
            "description": "The predicted value distribution for this property, as quantile level to predicted value. The full distribution is returned rather than a single number: where the scoring service exposes its uncertainty, Investorlift Data Services surfaces it rather than hiding it. Absent when `model_estimate_available` is `false`.",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "valuation_mean": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The predicted value for this property as a single point estimate. Optional: the scoring service does not always produce one, and its absence does not make the distribution above any less complete. Absent when `model_estimate_available` is `false`."
          },
          "effective_sample_size": {
            "type": "number",
            "description": "How much comparable evidence supported the model's estimate. A low value means the distribution above rests on thin evidence and should be read with more caution. Absent when `model_estimate_available` is `false`, because it describes an estimate that was withheld.",
            "examples": [
              72.34
            ]
          },
          "comp_band": {
            "type": "object",
            "description": "The Comp Band: the value range implied by the comparable sales found for this property, size-normalised to this property where their square footage allows it. This is the number derived from recorded sales rather than from a model. Absent when too few comparable sales carried a usable price to state a range honestly — a range built on one or two sales reads as high confidence over the thinnest possible evidence.",
            "additionalProperties": false,
            "required": [
              "low",
              "median",
              "high"
            ],
            "properties": {
              "low": {
                "type": "integer",
                "description": "The lower end of the range, in whole dollars."
              },
              "median": {
                "type": "integer",
                "description": "The middle of the range, in whole dollars."
              },
              "high": {
                "type": "integer",
                "description": "The upper end of the range, in whole dollars."
              }
            }
          },
          "rehab_budget": {
            "type": "integer",
            "description": "The repair budget the numbers below were built on, in whole dollars — **the figure the arithmetic actually used**. When you sent a `rehab_budget`, this is your number. When you did not, it is the whole-project midpoint for the `condition` you submitted, and zero when you sent no `condition`, which is the same as sending `turn_key`. A bracket figure is a screening range reduced to a single number, not a contractor bid: small homes skew high per square foot, and the heavier brackets are the least reliable in the set. Sending your own budget replaces that estimate with your own."
          },
          "rehab_adjusted_arv": {
            "type": "integer",
            "description": "The after-repair value this deal is priced against, in whole dollars: the Comp Band's middle value lifted toward its upper end in proportion to the repair budget, because a heavier renovation signals a higher-finish result. It equals the middle of the Comp Band when there is no repair signal and never exceeds the upper end, so the number stays anchored to sales that actually happened. It is derived from the comparable sales rather than from the model, so it moves when the comparable sales do. The thresholds that shape the lift are policy figures calibrated by judgment, not fitted parameters. Absent whenever the Comp Band is absent."
          },
          "target_margin": {
            "type": "number",
            "description": "The profit margin the maximum allowable offer (`max_allowable_offer`, below) was solved at, as a fraction of `rehab_adjusted_arv` — `0.2` means twenty percent. **Always present on a priced answer**, whether or not you sent a `target_margin`: when you sent one it is your figure, and when you did not it is the default this service priced at. It is published either way so that \"what margin is this price built on?\" is answerable on every response rather than only on the ones that named it. The default is a policy figure calibrated by judgment, not a fitted parameter. Absent whenever the Comp Band is absent.",
            "examples": [
              0.2
            ]
          },
          "max_allowable_offer": {
            "type": "object",
            "description": "The **maximum allowable offer (MAO)**: the highest purchase price at which a cash flip buyer on standard financing still clears the target margin. It is the algebraic inverse of a flip pro forma rather than a price quantile, so a seller's suggested price and a buyer's underwriting agree by construction.\n\n**This is the investor's ceiling — your offer to the seller is this minus your fee.**\n\nIt is not a prediction of what the property will trade at. The financing figures behind it — down payment, interest, points, closing costs, hold period and target margin — are policy figures calibrated by judgment and intended to be tuned; they are not fitted to any data set. Absent whenever the Comp Band is absent.",
            "additionalProperties": false,
            "required": [
              "amount",
              "clamped"
            ],
            "properties": {
              "amount": {
                "type": "integer",
                "description": "The price, in whole dollars, rounded to the nearest thousand."
              },
              "clamped": {
                "type": "boolean",
                "description": "`true` when no purchase price at all clears the target margin on this deal, at this repair budget. When it is `true` the amount above is **not an offer** and must not be presented as one — a zero-dollar price is not a price. This flag is the no-price-works alarm: read it on every answer before you act on the amount."
              }
            }
          },
          "cost_stack": {
            "type": "object",
            "description": "The line items behind the maximum allowable offer — the deal as the flip buyer it is solved for would carry it. Present on exactly the same answers `max_allowable_offer` is present on, and absent whenever the Comp Band is absent.\n\n**These numbers are whole dollars, and `down_payment` plus `loan` is the maximum allowable offer exactly.** Rounding is applied once, above both the price and these lines, so the figures you read here are the figures that add up — there is never a rounded total that disagrees with its own rounded parts. That identity holds on every answer, including the ones where no price could be solved.\n\n**When a price was solved — `max_allowable_offer.clamped` is `false` — the whole stack reconciles.** Add `down_payment`, `loan`, `rehab_budget`, `interest`, `points`, `closing_costs` and `target_profit` and you land back at `rehab_adjusted_arv`. The gap is rounding and nothing else — the price to the nearest thousand, `rehab_adjusted_arv` to the nearest thousand, and each remaining line to the nearest dollar — so it stays a little over a thousand dollars across the repair budgets this API brackets, and grows with a very large repair budget because a longer hold puts more financing cost on each rounded dollar of price.\n\n**When `clamped` is `true` there is nothing to reconcile.** No price in range cleared the target margin, so the published price is a floor rather than a solution; the lines still describe that published price, but they will not add back to `rehab_adjusted_arv` and the difference can be large. Read `clamped` first on those answers.\n\nEvery figure here follows from the financing assumptions behind the maximum allowable offer, which are **policy figures calibrated by judgment and intended to be tuned** — not a quote from any lender, and not fitted to a data set.",
            "additionalProperties": false,
            "required": [
              "down_payment",
              "loan",
              "interest",
              "points",
              "hold_days",
              "closing_costs",
              "target_profit"
            ],
            "properties": {
              "down_payment": {
                "type": "integer",
                "description": "The cash the buyer puts into the purchase, in whole dollars."
              },
              "loan": {
                "type": "integer",
                "description": "The borrowed balance, in whole dollars: the maximum allowable offer less the down payment. The two add back to the price exactly."
              },
              "interest": {
                "type": "integer",
                "description": "Interest on the loan over the hold period below, in whole dollars."
              },
              "points": {
                "type": "integer",
                "description": "Lending points charged on the loan, in whole dollars."
              },
              "hold_days": {
                "type": "integer",
                "description": "How long the deal is modelled as being held, in days. It grows with the repair budget, because a heavier renovation takes longer."
              },
              "closing_costs": {
                "type": "integer",
                "description": "Closing costs, in whole dollars, charged on both the purchase and the resale."
              },
              "target_profit": {
                "type": "integer",
                "description": "The profit the maximum allowable offer was solved to leave on the table, in whole dollars: `target_margin` of the rehab-adjusted ARV, taken before that ARV was rounded for publication. Multiplying the published `rehab_adjusted_arv` by `target_margin` yourself lands close to this figure but not exactly on it — the difference is the ARV rounding, and the price was solved against the unrounded value."
              }
            }
          },
          "as_is_similar_band": {
            "type": "object",
            "description": "A price-per-square-foot range taken over the comparable sales found for this property. A batch answer does not list those sales — score the property on its own with `POST /v1/predict` to see them. It is, stated as evidence beside `comp_band` rather than as part of the valuation. It feeds nothing: no other member of this response is computed from it. Read `basis` to learn which sales it covers. It is present whenever at least one comparable sale carries both a usable sale price and a usable square footage, INCLUDING on answers where the model estimate was withheld (`model_estimate_available: false`), because it is computed from the comparable sales rather than from the model. It is absent when no comparable sale carries both. No member of it is ever null.",
            "additionalProperties": false,
            "required": [
              "price_per_square_foot",
              "qualifying_sales",
              "basis",
              "statement"
            ],
            "properties": {
              "price_per_square_foot": {
                "type": "object",
                "description": "The 25th, 50th and 75th percentiles of the price per square foot of the sales this range covers, interpolated and then rounded once.",
                "additionalProperties": false,
                "required": [
                  "low",
                  "median",
                  "high"
                ],
                "properties": {
                  "low": {
                    "type": "integer",
                    "description": "The lower end of the range, in dollars per square foot."
                  },
                  "median": {
                    "type": "integer",
                    "description": "The middle of the range, in dollars per square foot."
                  },
                  "high": {
                    "type": "integer",
                    "description": "The upper end of the range, in dollars per square foot."
                  }
                }
              },
              "qualifying_sales": {
                "type": "integer",
                "description": "How many of the sales in `comps` passed this service's size, age and recency filter. This is ALWAYS the filter's count, on both values of `basis` — it is never the size of the comparable list. When `basis` is `all-comparable-sales` this number is below the minimum this service requires to state a similar-sales range, which is why that basis was used."
              },
              "basis": {
                "type": "string",
                "enum": [
                  "similar-sales",
                  "all-comparable-sales"
                ],
                "description": "Which sales `price_per_square_foot` covers. `similar-sales`: only the sales that passed the size, age and recency filter. `all-comparable-sales`: too few passed, so the three filters were dropped and the range covers every sale in `comps` carrying a usable sale price and square footage. Branch on this, not on the wording of `statement`."
              },
              "statement": {
                "type": "string",
                "description": "A plain-language sentence saying which sales the range covers, chosen from a fixed pair by `basis`. It is a constant: nothing you submit is interpolated into it, and it quotes no threshold. It is safe to show to a person and unsafe to parse — branch on `basis`."
              }
            }
          }
        }
      },
      "HistoryCallResponse": {
        "type": "object",
        "description": "One property's recorded transaction story, built by Investorlift Data Services member by member; no upstream response is ever passed through. Every response also carries the Trace ID as the `trace-id` header.\n\n**The member set below is closed.** This endpoint publishes the property readback, the chain of title, any detected flips, the seller's position, recorded permit work, the current listing story and an at-a-glance summary — and nothing else.\n\n**A chapter that could establish nothing says so, rather than publishing a zero.** You will not find an empty `permits` array standing alone: the permits chapter carries `coverage_known` and a plain sentence beside its list, because an empty array on its own would state that this property has no permits when in fact no permit record could be retrieved — and those two facts are indistinguishable to us. `seller_position` carries `recorded_loan_available` for the same reason, and publishes no payoff member and no equity member at all rather than a null one.\n\n**An empty `transactions` array is a verified emptiness and it is charged.** It means the county records were available, were read, and hold no recorded transactions for this property. `records_statement` says so in words. If the records could not be read at all, this endpoint does not return 200 — it returns an error and the charge is Refunded.\n\n**Every category in this answer is a derived conclusion, not an asserted fact.** Transaction categories, buyer types, seller postures, permit statuses and listing states are this API's reading of the recorded documents. An unrecognised record is reported as `unknown` rather than guessed at.",
        "additionalProperties": false,
        "required": [
          "subject_property",
          "records_statement",
          "transactions",
          "flips",
          "seller_position",
          "permits",
          "market_status",
          "summary"
        ],
        "properties": {
          "subject_property": {
            "type": "object",
            "examples": [
              {
                "property_id": "a1b2c3d4e5f60718293a4b5c6d7e8f90",
                "address": {
                  "street": "100 Sample Street",
                  "city": "Dallas",
                  "state": "TX",
                  "zip": "75203"
                },
                "facts": {
                  "square_feet": {
                    "value": 2416,
                    "source": "county-record"
                  },
                  "bedrooms": {
                    "value": 4,
                    "source": "county-record"
                  },
                  "bathrooms": {
                    "value": 2.5,
                    "source": "county-record"
                  },
                  "partial_bathrooms": {
                    "value": 1,
                    "source": "county-record"
                  },
                  "year_built": {
                    "value": 1998,
                    "source": "county-record"
                  },
                  "lot_size_square_feet": {
                    "value": 8276,
                    "source": "county-record"
                  },
                  "property_type": {
                    "value": "Single Family",
                    "source": "county-record"
                  }
                },
                "address_quality": {
                  "code": "zip-confirmed",
                  "statement": "The house number matched exactly one county record, and that record sits in the same ZIP code your address resolved to. Check the address and property facts in this block before relying on these numbers."
                },
                "outside_model_range": {
                  "flagged": false,
                  "reasons": []
                }
              }
            ],
            "description": "The property this history describes, read back to you. **This is the same block a Scored Call publishes** — same members, same provenance labels, same honesty members — so a comparable property you looked up by `property_id` can never be silently narrated as a different house. On this endpoint every fact carries the source `county-record`: there is no what-if on a History Call, so no fact here is ever caller-stated.",
            "additionalProperties": false,
            "required": [
              "property_id",
              "facts",
              "address_quality",
              "outside_model_range"
            ],
            "properties": {
              "property_id": {
                "type": "string",
                "description": "The property data service's identifier for the property this answer resolved to. Stable across calls, and the handle to use when you want the same property again rather than the same text."
              },
              "address": {
                "type": "object",
                "description": "The resolved property's address **as the county record stores it** — not the address you submitted. It is the record's own text, published without re-casing, so you can compare it against the county's data directly. A component the record does not carry is omitted, and the whole object is omitted when the record carries none of them.",
                "additionalProperties": false,
                "properties": {
                  "street": {
                    "type": "string",
                    "description": "The street line, as stored."
                  },
                  "city": {
                    "type": "string",
                    "description": "The city, as stored. The property data service files these in lower case and they are published unchanged."
                  },
                  "state": {
                    "type": "string",
                    "description": "The two-letter state code, as stored."
                  },
                  "zip": {
                    "type": "string",
                    "description": "The ZIP code, as stored. It may carry a ZIP+4 suffix."
                  }
                }
              },
              "facts": {
                "type": "object",
                "description": "The property facts the valuation ran on, each with where it came from. A fact the county record does not usably carry is omitted from this object entirely — see the note above.",
                "additionalProperties": false,
                "properties": {
                  "square_feet": {
                    "type": "object",
                    "description": "Finished living area, in square feet. Omitted when the county record carries no usable figure — including a recorded zero, which is an absence written as a digit rather than a measurement.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "bedrooms": {
                    "type": "object",
                    "description": "Bedroom count. A genuine zero is a count and is published as `0`; omitted only when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "bathrooms": {
                    "type": "object",
                    "description": "The bathroom count as the property data service calculates it, published exactly as it is stored. It can be fractional — `2.5` is the ordinary case here, not an edge one. `partial_bathrooms` below is a separate stored figure, and this service does not add the two together: it makes no claim about what the calculated count already includes. A genuine zero is published as `0`.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "partial_bathrooms": {
                    "type": "object",
                    "description": "The partial-bathroom count as the property data service stores it. The word *partial* is the record's own term and does not necessarily mean a half bath. It is a separate figure from `bathrooms` above, and this service does not add the two together. A genuine zero is published as `0`.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property, and `caller-stated` means a value you supplied in its place. **`partial_bathrooms` cannot be overridden**, so this `source` reads `county-record` on every answer. Both values are listed because the vocabulary is one shared list across all facts rather than a separate list per fact."
                      }
                    }
                  },
                  "year_built": {
                    "type": "object",
                    "description": "The year the structure was built. Omitted when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "lot_size_square_feet": {
                    "type": "object",
                    "description": "Lot size, in square feet — never acres. Omitted when the record carries no usable figure.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "number",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  },
                  "property_type": {
                    "type": "object",
                    "description": "The property type as the county record describes it, in that record's own wording.",
                    "additionalProperties": false,
                    "required": [
                      "value",
                      "source"
                    ],
                    "properties": {
                      "value": {
                        "type": "string",
                        "description": "The value the valuation used."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "county-record",
                          "caller-stated"
                        ],
                        "description": "Where this value came from. `county-record` means the property data service's stored value for this property. `caller-stated` means a value you supplied in its place through the `overrides` request option. A value you supply reads `caller-stated` **even when it matches the county record's own figure** — the label says where the number came from, not whether it changed."
                      }
                    }
                  }
                }
              },
              "address_quality": {
                "type": "object",
                "description": "How far the address you submitted was confirmed against the county record — two specific checks, reported plainly. **This is not a confidence score and not a probability.** Reaching an answer at all already required the house number to match exactly one complete county record; this member reports whether the ZIP code agreed as well.",
                "additionalProperties": false,
                "required": [
                  "code",
                  "statement"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "zip-confirmed",
                      "zip-unconfirmed",
                      "identified-by-property-id"
                    ],
                    "description": "`zip-confirmed`: address resolution derived a ZIP code for your address, and the matched county record sits in the same one. `zip-unconfirmed`: it did not — either no readable ZIP code was available for your address, or the county record does not carry that same ZIP code (a different one, or none at all). Both of those codes mean the house number matched exactly one complete county record. `identified-by-property-id`: **this call sent a `property_id` rather than an address, so no address matching was performed at all** — no house number and no ZIP code were compared, because the record was looked up directly by its identifier. That code appears on identifier lookups, including single predict. Branch on this, not on the wording below."
                  },
                  "statement": {
                    "type": "string",
                    "description": "The same finding in a sentence you can show a colleague. Fixed wording per code — it is selected from a table, never assembled — and it never repeats the address you submitted."
                  }
                }
              },
              "outside_model_range": {
                "type": "object",
                "description": "Whether this property sits outside the range of properties the pricing model covers well. **It is a caution about the estimate, not a claim about the house**: when it is flagged, read the numbers in this answer with extra scrutiny — it does not say the property is any particular thing. Always present, flagged or not.",
                "additionalProperties": false,
                "required": [
                  "flagged",
                  "reasons"
                ],
                "properties": {
                  "flagged": {
                    "type": "boolean",
                    "description": "`true` when at least one reason below applies. `false` with an empty `reasons` list means nothing about this property put it outside the covered range."
                  },
                  "reasons": {
                    "type": "array",
                    "description": "Why the caution applies, in a stable order. Empty when `flagged` is `false`. A property can carry more than one reason. A fact neither the county record nor your `overrides` supplies cannot raise its own reason — an unknown lot size is not a large lot. The reasons are read from the facts the valuation actually ran on, so a fact you stated yourself can raise one: this caution is about the estimate you are being handed, and that estimate was computed from your values.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "large-lot",
                        "large-structure",
                        "property-type"
                      ],
                      "description": "`large-lot`: the lot is larger than the sizes the model is calibrated over. `large-structure`: the finished living area is larger than the sizes the model is calibrated over. `property-type`: the property type the valuation ran on — the county record's, or yours if you overrode it — is one the model does not cover well, such as multifamily, commercial, mixed-use or industrial. The size thresholds behind the first two are policy figures, calibrated by judgment and intended to be tuned."
                    }
                  }
                }
              }
            }
          },
          "records_statement": {
            "type": "string",
            "description": "A plain sentence stating what was checked and what was found, suitable to show a colleague. Fixed wording selected from a table — never assembled, and it never repeats the address or identifier you submitted. **It makes no claim about your Balance:** what a call cost is recorded on the Ledger, not asserted in the answer."
          },
          "transactions": {
            "type": "array",
            "description": "The chain of title, **newest first**. Events the record leaves undated cannot be ordered and are listed last rather than presented as the oldest. A transaction that appears in more than one county record set is published once.",
            "items": {
              "type": "object",
              "description": "One recorded transaction in the chain of title. **Every category below is a derived conclusion, not a statement made by the county.** No buyer name, seller name, recorder document number, book number or page number ever appears here.",
              "additionalProperties": false,
              "required": [
                "sale_date",
                "sale_price",
                "price_is_estimated",
                "kind",
                "inter_family",
                "foreclosure",
                "reo_sale",
                "buyer_type"
              ],
              "properties": {
                "sale_date": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The recorded sale date, `YYYY-MM-DD`, or `null` where the record carries none. Undated events are real and are listed last, after every event that can be ordered — they are never presented as the oldest.",
                  "examples": [
                    "2024-02-14"
                  ]
                },
                "sale_price": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The recorded price in whole dollars, or `null` where the record carries none. Always read it beside `price_is_estimated`.",
                  "examples": [
                    291000
                  ]
                },
                "price_is_estimated": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Whether the county record marks this price as an estimate. `null` means the record does not say. **A price is never published without this flag beside it** — a price with `price_is_estimated: true` is not a figure to anchor an offer on."
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "standard-sale",
                    "foreclosure",
                    "bank-repo",
                    "family-transfer",
                    "new-construction",
                    "unknown"
                  ],
                  "description": "What kind of transaction this was, in plain language. `standard-sale` an ordinary arms-length sale; `foreclosure` an involuntary taking; `bank-repo` a lender reselling what it took; `family-transfer` a transfer between family members; `new-construction` a first conveyance from a builder. **`unknown` means the record did not establish a category and we did not guess one** — it is a real and common answer, and it is never a placeholder for one of the other five. A transfer recorded at a nominal or absent price is never reported as `standard-sale`: a title transfer is not a market sale."
                },
                "inter_family": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Whether the county concluded this was a transfer between family members. `null` means the record does not say — it does not mean `false`."
                },
                "foreclosure": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Whether the county concluded this was a foreclosure. `null` means the record does not say."
                },
                "reo_sale": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Whether the county concluded this was a lender reselling a repossessed property. `null` means the record does not say."
                },
                "buyer_type": {
                  "type": "string",
                  "enum": [
                    "individual",
                    "company",
                    "trust",
                    "unknown"
                  ],
                  "description": "What kind of party took title, **derived in memory from the recorded names and then discarded — the names themselves never leave our systems and never appear here.** `unknown` means no party was recorded, which is not the same as an individual."
                }
              }
            }
          },
          "flips": {
            "type": "array",
            "description": "Detected buy/sell pairs, newest first. A pair is reported only when both legs carry a real market price — a leg recorded at a nominal price would make the percentage gain a fabricated number — and only when neither leg was a family transfer.",
            "items": {
              "type": "object",
              "description": "A detected buy/sell pair: the property was bought and sold again within the configured hold period. **This is a derived conclusion drawn from the recorded dates and prices, not a label the county applies.**",
              "additionalProperties": false,
              "required": [
                "bought_on",
                "sold_on",
                "bought_for",
                "sold_for",
                "days_held",
                "percentage_gain",
                "seller_posture"
              ],
              "properties": {
                "bought_on": {
                  "type": "string",
                  "description": "The recorded sale date of the buy leg, `YYYY-MM-DD`.",
                  "examples": [
                    "2023-07-11"
                  ]
                },
                "sold_on": {
                  "type": "string",
                  "description": "The recorded sale date of the sell leg, `YYYY-MM-DD`.",
                  "examples": [
                    "2024-02-14"
                  ]
                },
                "bought_for": {
                  "type": "number",
                  "description": "The recorded purchase price in whole dollars.",
                  "examples": [
                    205000
                  ]
                },
                "sold_for": {
                  "type": "number",
                  "description": "The recorded resale price in whole dollars.",
                  "examples": [
                    291000
                  ]
                },
                "days_held": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Whole days between the two recorded sale dates. Zero is a real outcome — a same-day buy and sell is a simultaneous close.",
                  "examples": [
                    218
                  ]
                },
                "percentage_gain": {
                  "type": "number",
                  "description": "`(sold_for - bought_for) / bought_for`, as a fraction rather than a percent — `0.4195` is a 41.95% gain. **A negative value is a real outcome**: a flip that lost money is reported as it happened, never clamped at zero.",
                  "examples": [
                    0.4195
                  ]
                },
                "seller_posture": {
                  "type": "string",
                  "enum": [
                    "professional",
                    "private",
                    "unknown"
                  ],
                  "description": "Whether the party selling at the end of the hold was trading professionally (a company or a trust) or privately (an individual), **derived from the recorded names in memory and never published as a name**. `unknown` means no seller was recorded."
                }
              }
            }
          },
          "seller_position": {
            "type": "object",
            "description": "How long the current owner has held title, and a plain statement of what cannot be told you about their loan.\n\n**There is no payoff member and no equity member here, and there is no null one either.** This chapter was specified to publish a payoff range and an equity range derived from the loan recorded at the property's last sale. We went looking for that record — through the property data service's full published route list, through thirty-one candidate record-set names, and by matching every one of 579 distinct column names it returns across a sample of properties — and **no per-property loan, mortgage or lien record is available to us**: no loan amount, no loan date, no lender, no rate, no maturity and no payoff.\n\n**Nothing is inferred from that absence.** This answer never says a property is owned free and clear and never says a purchase was made in cash. A missing record means we did not find one to look at; it does not mean no loan exists.\n\nWere such a record to become available, a payoff derived from the loan recorded at the last sale would still be an estimate about the past — **refinances after that sale are invisible to the public record** — which is why it would be published as a range with its basis stated, never as a point figure.",
            "additionalProperties": false,
            "required": [
              "owned_since",
              "days_owned",
              "recorded_loan_available",
              "basis"
            ],
            "properties": {
              "owned_since": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The recorded date the current ownership period runs from — the newest **dated** event in `transactions` above, so the two can never disagree. `null` when the chain carries no dated event.",
                "examples": [
                  "2019-04-11"
                ]
              },
              "days_owned": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Whole days from `owned_since` to now. `null` when ownership length could not be established — and `null` rather than a negative number when the record carries a sale date in the future, which is a data condition rather than an ownership period.",
                "examples": [
                  2694
                ]
              },
              "recorded_loan_available": {
                "type": "boolean",
                "description": "Whether a recorded loan for this property is available to us. It is a measured statement rather than a placeholder: see this object's description for what was looked for and where. When it is `false`, no payoff or equity estimate can be made and none is published."
              },
              "basis": {
                "type": "string",
                "description": "A plain sentence stating what this chapter rests on, suitable to show a colleague. Fixed wording selected from a table — never assembled, and it never repeats the address or identifier you submitted."
              }
            }
          },
          "permits": {
            "type": "object",
            "description": "Recorded permit work on this property, and an honest word about coverage.\n\n**Records-unavailable is never reported as an absence of permits.** There is no signal available to us that distinguishes *this property has no permits* from *this county publishes no permit records* — an identifier that does not exist at all returns the same empty answer as a real property with a clean record. Three different facts, one identical response. So `coverage_known` is `true` **only when at least one permit record was actually returned**, and it is never inferred from an empty result.\n\n**A permit lookup that fails outright is reported the same way, and the call is still charged.** The statement it produces is identical because it is identical in truth: we cannot report permit records for this property. The rest of the answer is unaffected.\n\n**Read `coverage_known`, not the length of `permits`.**",
            "additionalProperties": false,
            "required": [
              "permits",
              "coverage_known",
              "statement",
              "roof",
              "hvac",
              "water_heater",
              "electrical",
              "demolition",
              "plumbing",
              "has_open_permit"
            ],
            "properties": {
              "permits": {
                "type": "array",
                "description": "The permits themselves — **a selection, not the whole file**. It carries the most recent permit in each of the six categories below, plus every permit still open and every demolition. A property with eighty-four recorded permits does not return eighty-four rows. Empty when no records could be retrieved, and also empty when the records retrieved fall into none of those categories — `statement` says which.",
                "items": {
                  "type": "object",
                  "description": "One recorded permit. **No permit number, no permit reference id, no applicant, no address and no free-text description appears here.** A permit number plus the county it was issued in retrieves a public record naming the applicant, so publishing it would withhold the name and hand over the lookup that retrieves it.",
                  "additionalProperties": false,
                  "required": [
                    "work_status",
                    "job_value",
                    "file_date",
                    "issue_date",
                    "final_date",
                    "construction_duration",
                    "tags"
                  ],
                  "properties": {
                    "work_status": {
                      "type": "string",
                      "enum": [
                        "completed",
                        "inactive",
                        "open",
                        "in-review",
                        "unknown"
                      ],
                      "description": "Where the permit stands, in a fixed vocabulary. **`unknown` is not `completed`**: a permit whose status the county did not state is a permit we cannot tell you is finished. It is derived from the county's own status token and never from the presence or absence of a completion date."
                    },
                    "job_value": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "The recorded value of the work, or `null`. **`null` is ordinary** — most permit records carry no job value.",
                      "examples": [
                        18500
                      ]
                    },
                    "file_date": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The recorded filing date, or `null`."
                    },
                    "issue_date": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The recorded issue date, or `null`.",
                      "examples": [
                        "2024-03-11"
                      ]
                    },
                    "final_date": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The recorded completion date, or `null`. **A null here does not mean the permit is open** — most completed permits carry none. Read `work_status` instead."
                    },
                    "construction_duration": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "The recorded construction duration, as recorded. **It carries no unit and we will not invent one**: the record holds a bare number with nothing anywhere naming days, weeks, months or inspection cycles, so publishing it under a unit-bearing name would be asserting something we have not established.",
                      "examples": [
                        42
                      ]
                    },
                    "tags": {
                      "type": "array",
                      "description": "What the work was, as a fixed set of categories drawn from the record's own classification. **Never the county's free-text description**, which is a clerk's sentence rather than a conclusion. An empty list means the record classified the work as none of them.",
                      "items": {
                        "type": "string"
                      },
                      "examples": [
                        {
                          "0": "tags_roofing"
                        }
                      ]
                    }
                  }
                }
              },
              "coverage_known": {
                "type": "boolean",
                "description": "`true` **only when at least one permit record was actually returned** — the only case in which the record positively demonstrates coverage. `false` means records could not be retrieved, and is **not** a statement that this property has no permits."
              },
              "statement": {
                "type": "string",
                "description": "The same finding in a sentence you can show a colleague. Fixed wording selected from a table — never assembled, and it never repeats the address or identifier you submitted. Present on every answer, not only the unavailable one."
              },
              "roof": {
                "type": "object",
                "description": "The most recent recorded permit in one category. All three members are `null` when no permit for that category came back — which is not a statement that no such work was done.",
                "additionalProperties": false,
                "required": [
                  "most_recent_date",
                  "most_recent_job_value",
                  "work_status"
                ],
                "properties": {
                  "most_recent_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "That permit's recorded issue date, or `null`.",
                    "examples": [
                      "2024-03-11"
                    ]
                  },
                  "most_recent_job_value": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "That permit's recorded job value, or `null`. **`null` is the ordinary case** — most permit records carry no job value at all.",
                    "examples": [
                      18500
                    ]
                  },
                  "work_status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "completed",
                      "inactive",
                      "open",
                      "in-review",
                      "unknown",
                      null
                    ],
                    "description": "That permit's status in a fixed vocabulary, or `null` when no permit for this category came back. `unknown` means the county did not state a status we recognise — it is **not** `completed`."
                  }
                }
              },
              "hvac": {
                "type": "object",
                "description": "The most recent recorded permit in one category. All three members are `null` when no permit for that category came back — which is not a statement that no such work was done.",
                "additionalProperties": false,
                "required": [
                  "most_recent_date",
                  "most_recent_job_value",
                  "work_status"
                ],
                "properties": {
                  "most_recent_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "That permit's recorded issue date, or `null`.",
                    "examples": [
                      "2024-03-11"
                    ]
                  },
                  "most_recent_job_value": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "That permit's recorded job value, or `null`. **`null` is the ordinary case** — most permit records carry no job value at all.",
                    "examples": [
                      18500
                    ]
                  },
                  "work_status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "completed",
                      "inactive",
                      "open",
                      "in-review",
                      "unknown",
                      null
                    ],
                    "description": "That permit's status in a fixed vocabulary, or `null` when no permit for this category came back. `unknown` means the county did not state a status we recognise — it is **not** `completed`."
                  }
                }
              },
              "water_heater": {
                "type": "object",
                "description": "The most recent recorded permit in one category. All three members are `null` when no permit for that category came back — which is not a statement that no such work was done.",
                "additionalProperties": false,
                "required": [
                  "most_recent_date",
                  "most_recent_job_value",
                  "work_status"
                ],
                "properties": {
                  "most_recent_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "That permit's recorded issue date, or `null`.",
                    "examples": [
                      "2024-03-11"
                    ]
                  },
                  "most_recent_job_value": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "That permit's recorded job value, or `null`. **`null` is the ordinary case** — most permit records carry no job value at all.",
                    "examples": [
                      18500
                    ]
                  },
                  "work_status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "completed",
                      "inactive",
                      "open",
                      "in-review",
                      "unknown",
                      null
                    ],
                    "description": "That permit's status in a fixed vocabulary, or `null` when no permit for this category came back. `unknown` means the county did not state a status we recognise — it is **not** `completed`."
                  }
                }
              },
              "electrical": {
                "type": "object",
                "description": "The most recent recorded permit in one category. All three members are `null` when no permit for that category came back — which is not a statement that no such work was done.",
                "additionalProperties": false,
                "required": [
                  "most_recent_date",
                  "most_recent_job_value",
                  "work_status"
                ],
                "properties": {
                  "most_recent_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "That permit's recorded issue date, or `null`.",
                    "examples": [
                      "2024-03-11"
                    ]
                  },
                  "most_recent_job_value": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "That permit's recorded job value, or `null`. **`null` is the ordinary case** — most permit records carry no job value at all.",
                    "examples": [
                      18500
                    ]
                  },
                  "work_status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "completed",
                      "inactive",
                      "open",
                      "in-review",
                      "unknown",
                      null
                    ],
                    "description": "That permit's status in a fixed vocabulary, or `null` when no permit for this category came back. `unknown` means the county did not state a status we recognise — it is **not** `completed`."
                  }
                }
              },
              "plumbing": {
                "type": "object",
                "description": "The most recent recorded permit in one category. All three members are `null` when no permit for that category came back — which is not a statement that no such work was done.",
                "additionalProperties": false,
                "required": [
                  "most_recent_date",
                  "most_recent_job_value",
                  "work_status"
                ],
                "properties": {
                  "most_recent_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "That permit's recorded issue date, or `null`.",
                    "examples": [
                      "2024-03-11"
                    ]
                  },
                  "most_recent_job_value": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "That permit's recorded job value, or `null`. **`null` is the ordinary case** — most permit records carry no job value at all.",
                    "examples": [
                      18500
                    ]
                  },
                  "work_status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "completed",
                      "inactive",
                      "open",
                      "in-review",
                      "unknown",
                      null
                    ],
                    "description": "That permit's status in a fixed vocabulary, or `null` when no permit for this category came back. `unknown` means the county did not state a status we recognise — it is **not** `completed`."
                  }
                }
              },
              "demolition": {
                "type": "object",
                "description": "The most recent recorded permit in one category. All three members are `null` when no permit for that category came back — which is not a statement that no such work was done.",
                "additionalProperties": false,
                "required": [
                  "most_recent_date",
                  "most_recent_job_value",
                  "work_status"
                ],
                "properties": {
                  "most_recent_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "That permit's recorded issue date, or `null`.",
                    "examples": [
                      "2024-03-11"
                    ]
                  },
                  "most_recent_job_value": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "That permit's recorded job value, or `null`. **`null` is the ordinary case** — most permit records carry no job value at all.",
                    "examples": [
                      18500
                    ]
                  },
                  "work_status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "completed",
                      "inactive",
                      "open",
                      "in-review",
                      "unknown",
                      null
                    ],
                    "description": "That permit's status in a fixed vocabulary, or `null` when no permit for this category came back. `unknown` means the county did not state a status we recognise — it is **not** `completed`."
                  }
                }
              },
              "has_open_permit": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Whether work is still open on this property. **Three-valued on purpose.** `true` when a returned permit is open or in review. `false` **only** when records were retrieved and every permit's status was readable. `null` whenever records were unavailable, or any permit's status was unreadable — because `false` claims we checked, and an unreadable status has not been checked."
              }
            }
          },
          "market_status": {
            "type": "object",
            "description": "The current listing story for this property.\n\n**No agent, no office, no brokerage and no listing URL appears here.** The underlying record carries a full marketing contact list — names, e-mail addresses, phone numbers and licence numbers — and none of it is published. What is published is the listing's state.",
            "additionalProperties": false,
            "required": [
              "state",
              "rental_listing",
              "days_on_market",
              "original_listing_date",
              "failed_listing_date",
              "sold_price",
              "sold_date",
              "list_price_high",
              "list_price_high_date",
              "list_price_low",
              "list_price_low_date",
              "price_reduced"
            ],
            "properties": {
              "state": {
                "type": "string",
                "enum": [
                  "active",
                  "sold",
                  "failed",
                  "off-market",
                  "rental",
                  "unknown"
                ],
                "description": "Where this property stands. **A rental listing is not a sale listing**: when the record marks a listing as a rental, `state` is `rental` and the sale-specific figures below are withheld rather than reported as though they described a sale. **`unknown` is a real answer** — the listing status vocabulary the underlying record publishes is not a fixed list we can rely on, so a status we have not seen before is reported as `unknown` rather than filed under the nearest-looking category. In particular a cancelled listing is **not** reported as `failed`: a withdrawn listing may simply have been relisted, and `failed_listing_date` is published separately for the case the record does establish."
              },
              "rental_listing": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Whether the listing is a rental. `null` means the record does not say."
              },
              "days_on_market": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Days on market for a **sale**. Withheld — `null` — on a rental listing, because days a rental sat on the market is not days a sale sat on the market. Sparse in any case: most records carry none.",
                "examples": [
                  34
                ]
              },
              "original_listing_date": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "When the listing first appeared, or `null`."
              },
              "failed_listing_date": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "When a listing **ended without a sale**, or `null`. A negative outcome the record states for itself."
              },
              "sold_price": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "The recorded sale price from the listing, or `null`. Withheld on a rental listing.",
                "examples": [
                  412000
                ]
              },
              "sold_date": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The recorded sale date from the listing, or `null`. Withheld on a rental listing."
              },
              "list_price_high": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "The high-water asking price, or `null`.",
                "examples": [
                  435000
                ]
              },
              "list_price_high_date": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "When the high-water price was recorded."
              },
              "list_price_low": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "The low-water asking price, or `null`.",
                "examples": [
                  399000
                ]
              },
              "list_price_low_date": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "When the low-water price was recorded."
              },
              "price_reduced": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Whether the asking price was cut. **`true` only when the low price was recorded *after* the high one** — the two figures are high- and low-water marks with no order of their own, so a low price recorded first is a price that went **up**. `null` whenever any of the four figures above is missing, because “we could not tell” is not “it was not cut”, and missing is the common case here."
              }
            }
          },
          "summary": {
            "type": "object",
            "description": "The same facts, shaped for a CRM field or an agent chain. **Every member is a boolean, a fixed category or `null` — no free text and no sentence.**\n\n**It is computed from the chapters above it**, never from a second reading of the underlying record, so it is structurally incapable of disagreeing with the detail it summarises.\n\n**A value whose chapter established nothing is `null` or `unknown`, never `false`.** `false` means *we checked, and no*.",
            "additionalProperties": false,
            "required": [
              "has_recorded_transactions",
              "last_recorded_sale_kind",
              "last_recorded_buyer_type",
              "flip_detected",
              "long_tenured_owner",
              "permit_records_available",
              "open_permit_work",
              "demolition_recorded",
              "market_state",
              "asking_price_reduced",
              "recorded_loan_available"
            ],
            "properties": {
              "has_recorded_transactions": {
                "type": "boolean",
                "description": "Whether the chain of title carries any recorded transaction. **`false` here is a real claim**: the records were available and were read, and they hold none."
              },
              "last_recorded_sale_kind": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "standard-sale",
                  "foreclosure",
                  "bank-repo",
                  "family-transfer",
                  "new-construction",
                  "unknown",
                  null
                ],
                "description": "The newest recorded event's category, or `null` when the chain is empty."
              },
              "last_recorded_buyer_type": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "individual",
                  "company",
                  "trust",
                  "unknown",
                  null
                ],
                "description": "The newest recorded event's buyer category, or `null` when the chain is empty. Derived in memory from recorded names that are then discarded; the names never appear."
              },
              "flip_detected": {
                "type": "boolean",
                "description": "Whether any buy/sell pair qualified as a flip. **`false` here is a real claim**: the chain was read and none did."
              },
              "long_tenured_owner": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Whether the current owner has held the property for at least a configured number of days. `null` when ownership length could not be established at all."
              },
              "permit_records_available": {
                "type": "boolean",
                "description": "`permits.coverage_known`, verbatim. `false` means permit records could not be retrieved — **not** that this property has no permits."
              },
              "open_permit_work": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "`permits.has_open_permit`, verbatim. `null` whenever permit records were unavailable or any permit's status was unreadable — never `false` in either case."
              },
              "demolition_recorded": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Whether a demolition permit was among the records retrieved. `null` when permit records were unavailable, because an unavailable chapter checked nothing."
              },
              "market_state": {
                "type": "string",
                "enum": [
                  "active",
                  "sold",
                  "failed",
                  "off-market",
                  "rental",
                  "unknown"
                ],
                "description": "`market_status.state`, verbatim. `unknown` is its own honest value."
              },
              "asking_price_reduced": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "`market_status.price_reduced`, verbatim. `null` when the record did not carry both asking prices and both of their dates."
              },
              "recorded_loan_available": {
                "type": "boolean",
                "description": "`seller_position.recorded_loan_available`, verbatim. `false` on every answer today, and it is a measured statement rather than a placeholder."
              }
            }
          }
        }
      },
      "ValidationVerdict": {
        "type": "object",
        "required": [
          "valid"
        ],
        "additionalProperties": false,
        "properties": {
          "valid": {
            "type": "boolean",
            "description": "Whether this body would be accepted by `POST /v1/predict`. Always `true` on a 200 — a body that would be rejected returns the same 400 or 413 the Metered Call returns."
          }
        }
      },
      "ProblemDetail": {
        "type": "object",
        "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
        "required": [
          "type",
          "title",
          "detail",
          "status",
          "trace_id"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "A stable URI identifying what went wrong. Branch on this, not on the wording."
          },
          "title": {
            "type": "string",
            "description": "A short, stable summary."
          },
          "detail": {
            "type": "string",
            "description": "What happened, what it means for your balance, and what to do next."
          },
          "status": {
            "type": "integer",
            "description": "The HTTP status code, repeated in the body."
          },
          "trace_id": {
            "type": "string",
            "format": "uuid",
            "description": "The Trace ID for this request. Quote it to support."
          }
        }
      },
      "SingleScoredCallRequest": {
        "type": "object",
        "description": "Exactly one of address or property_id, plus optional underwriting inputs. Both or neither refuses before any spend. Identifier resolution uses the existing property lookup; no address matching is performed.",
        "maxProperties": 7,
        "properties": {
          "address": {
            "type": "string",
            "description": "The full street address of the property to score.",
            "examples": [
              "1026 N Beckley Ave, Dallas, TX 75203"
            ]
          },
          "condition": {
            "type": "string",
            "description": "The property's condition, which sets the repair budget the derived numbers are built on. Optional: omit it and the property is priced as though it needs no repairs, which is exactly what `turn_key` does. It is a request option rather than a second property, so sending it never changes what the call costs.\n\n`tear_down` is accepted by this schema and **refused** by the endpoint with a 400, before anything is charged. That is deliberate rather than an oversight: the scoring service has no land-value estimate, so there is no honest way to price a tear-down here. Analyse lot value separately.\n\nRepair figures are a screening range, not a contractor bid.",
            "enum": [
              "turn_key",
              "light_rehab",
              "major_rehab",
              "full_gut",
              "tear_down"
            ],
            "default": "turn_key",
            "examples": [
              "major_rehab"
            ]
          },
          "rehab_budget": {
            "type": "integer",
            "description": "Your own repair budget for this property, in **whole dollars**. Optional, and additive: an integration that does not send it is unaffected.\n\nWhen you send it, the repaired value and the maximum allowable offer are built from **your figure** instead of the bracket `condition` maps to, and the `rehab_budget` in the response is the number the arithmetic actually used. Sending `rehab_budget` and `condition` together is legal — `rehab_budget` wins, every time — so you never have to choose the bracket that comes closest to a number you already know.\n\n`condition: tear_down` is still refused with a 400 even when you send a repair budget. A repair budget does not answer what a tear-down needs, which is a land value, and there is no land-value estimate behind these numbers.\n\nRepair figures are a screening range, not a contractor bid.",
            "minimum": 0,
            "maximum": 10000000,
            "examples": [
              48000
            ]
          },
          "target_margin": {
            "type": "number",
            "description": "The profit margin your buyer needs, as a **fraction** of the repaired value — `0.2` means twenty percent. Optional, and additive: an integration that does not send it is unaffected, and is priced at the default of `0.2`.\n\nWhen you send it, the maximum allowable offer is solved at **your** margin rather than the default one. The `target_margin` in the response is always the margin the answer was priced at, whether you sent one or not, so \"what margin is this price built on?\" is answerable on every response.\n\nThe target margin is a **policy figure calibrated by judgment**, not a parameter fitted to a data set — which is exactly why you can override it.",
            "exclusiveMinimum": 0,
            "exclusiveMaximum": 1,
            "minimum": 0.01,
            "maximum": 0.9,
            "default": 0.2,
            "examples": [
              0.25
            ]
          },
          "overrides": {
            "type": "object",
            "description": "Price the property **as you describe it**, not as the county record has it. Optional, and additive: an integration that does not send it is unaffected and its answers do not move.\n\nSend any of the six facts below and that value is used in place of the county record's, for the model, for the comparable-sales band and for the price derived from it. Every fact in `subject_property.facts` says where it came from, so a value you stated reads `caller-stated` and everything else reads `county-record` — a claim can never be mistaken for a record.\n\n**A value you supply reads `caller-stated` even when it matches the county's own figure.** The label says where the number came from, not whether it changed.\n\n**Only these six facts, and nothing else.** Any other key — including `latitude`, `longitude`, `partial_bathrooms`, `address`, or a misspelling of one of the six — is refused with a 400 before anything is charged, rather than being ignored. **The coordinates are never overridable, and that is a rule rather than an omission: a what-if changes the house's facts, never *which house*.**\n\n**Values must be usable, and an empty `overrides` is refused.** A value must be the right JSON type, and must satisfy the rule stated on each fact below; `null` is refused, because an override may state a value but never erase one. `overrides: {}` is refused too — it declares a what-if while stating no claim, and its answer would be indistinguishable from a call that sent no `overrides` at all. Every one of these is a 400 before anything is charged.\n\n**The required facts are still required.** If the property still lacks a fact the valuation needs after your values are applied, the call is refused and the charge is refunded, exactly as an ordinary request would be. There is no \"score it anyway\". Your `lot_size_square_feet` or `property_type` **can** supply a fact the county record was missing, in which case the call scores and that fact reads `caller-stated`.\n\n**Overriding `bathrooms` does not change `partial_bathrooms`**, which stays at the county's figure and is not overridable. This service does not add the two together, so do not read your stated bathroom count plus a county partial count as one total.",
            "additionalProperties": false,
            "minProperties": 1,
            "properties": {
              "square_feet": {
                "type": "number",
                "description": "Finished living area, in **square feet**. Must be above zero.",
                "exclusiveMinimum": 0,
                "examples": [
                  2400
                ]
              },
              "bedrooms": {
                "type": "number",
                "description": "Bedroom count. Zero or above; `0` is accepted, because a studio genuinely has none.",
                "minimum": 0,
                "examples": [
                  4
                ]
              },
              "bathrooms": {
                "type": "number",
                "description": "Bathroom count, as the property data service counts them. Zero or above, and **may be fractional** — `2.5` is ordinary. It does not include `partial_bathrooms`, which stays at the county's figure and is not overridable; this service does not add the two together.",
                "minimum": 0,
                "examples": [
                  2.5
                ]
              },
              "year_built": {
                "type": "number",
                "description": "Year the structure was built. Must be above zero.",
                "exclusiveMinimum": 0,
                "examples": [
                  1998
                ]
              },
              "lot_size_square_feet": {
                "type": "number",
                "description": "Lot size, in **square feet** — never acres. Must be above zero. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                "exclusiveMinimum": 0,
                "examples": [
                  8100
                ]
              },
              "property_type": {
                "type": "string",
                "description": "Property type, as free text. Must not be blank or only spaces; surrounding spaces are trimmed, exactly as the county record's own value is, so the trimmed value is what appears in `subject_property.facts`. This is one of the facts the valuation requires, so supplying it can make a property scorable that the county record alone could not score.",
                "examples": [
                  "Single Family"
                ]
              }
            },
            "examples": [
              {
                "square_feet": 2400,
                "bathrooms": 2.5
              }
            ]
          },
          "property_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{32}$",
            "description": "A property identifier taken from a Scored Call answer — the subject's own, or any comparable property's. 32 lowercase hexadecimal characters. On this arm **no address matching is performed**: the record is looked up directly, and `subject_property` reads back exactly which record answered. Identifiers are looked up in the same identifier space the Scored Call publishes them in.",
            "examples": [
              "a1b2c3d4e5f60718293a4b5c6d7e8f90"
            ]
          },
          "partial_answer": {
            "type": "boolean",
            "description": "Opt in to a charged description when the model cannot price the identified property. Absent or false retains the existing refund behavior."
          },
          "confirmation": {
            "type": "string",
            "minLength": 1,
            "maxLength": 256,
            "description": "Optional. The confirmation value an assistant received when a question would cost more than the ask-first limit; send it back unchanged with the same request to run it. Ignored on calls made with an API key."
          }
        },
        "oneOf": [
          {
            "required": [
              "address"
            ]
          },
          {
            "required": [
              "property_id"
            ]
          }
        ]
      }
    },
    "responses": {
      "BadRequest": {
        "description": "The request did not match the documented schema for this endpoint, or its `Idempotency-Key` header was malformed. Nothing was charged and the scoring service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-request`\n\nThe body never echoes what you sent.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/invalid-request"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                }
              }
            },
            "examples": {
              "sample": {
                "value": {
                  "type": "https://docs.investorliftdata.com/errors/invalid-request",
                  "title": "Malformed request",
                  "detail": "The request did not match the documented schema for this endpoint, including an identifier that is not in its documented form (look the property up again to get its current identifier) or a place outside the data's coverage. Nothing was charged. Correct the request and send it again.",
                  "status": 400,
                  "trace_id": "00000000-0000-4000-8000-000000000000"
                }
              }
            }
          }
        }
      },
      "Unauthorized": {
        "description": "The API Key is missing, unrecognised or revoked, or the Account is still in Provisioning and its API Key has not been issued yet. Nothing was charged and the scoring service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/invalid-key`",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/invalid-key"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                }
              }
            },
            "examples": {
              "sample": {
                "value": {
                  "type": "https://docs.investorliftdata.com/errors/invalid-key",
                  "title": "Invalid API Key",
                  "detail": "This API Key is not valid, or it has been revoked. Nothing was charged. Check the API Key in your request, or issue a new one from the Portal.",
                  "status": 401,
                  "trace_id": "00000000-0000-4000-8000-000000000000"
                }
              }
            }
          }
        }
      },
      "PaymentRequired": {
        "description": "The Account's balance is not enough for this Metered Call. Nothing was charged and the scoring service was not called. Add funds and send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/insufficient-credits`\n\nThe body carries `balance` (the balance now) and `required` (what this call costs), both in US dollars with two decimals, the same two figures in whole US cents as `balance_cents` and `required_cents`, and `top_up_url` (where to add funds). The figures come from the Ledger, not from this gateway.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id",
                "balance",
                "required",
                "top_up_url",
                "balance_cents",
                "required_cents"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/insufficient-credits"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "balance": {
                  "type": "number",
                  "multipleOf": 0.01,
                  "minimum": 0,
                  "description": "The balance now, in US dollars (two decimals, for example 74.20)."
                },
                "required": {
                  "type": "number",
                  "multipleOf": 0.01,
                  "minimum": 0,
                  "description": "What this call costs, in US dollars (for example 1.00)."
                },
                "top_up_url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Where to add funds."
                },
                "balance_cents": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "The same figure as balance, in whole US cents (for example 7420)."
                },
                "required_cents": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "The same figure as required, in whole US cents (for example 100)."
                }
              }
            },
            "examples": {
              "sample": {
                "value": {
                  "type": "https://docs.investorliftdata.com/errors/insufficient-credits",
                  "title": "Not enough balance",
                  "detail": "This Account's balance is not enough for this Metered Call. Nothing was charged. Add funds to the Account and send the request again.",
                  "status": 402,
                  "trace_id": "00000000-0000-4000-8000-000000000000",
                  "balance": 0,
                  "required": 1,
                  "top_up_url": "https://investorliftdata.com/app/billing",
                  "balance_cents": 0,
                  "required_cents": 100
                }
              }
            }
          }
        }
      },
      "DuplicateInFlight": {
        "description": "An identical request carrying this `Idempotency-Key` is already in flight. Nothing was consumed for this one. Wait for the interval in `Retry-After`, then ask for the result again.\n\n`type`: `https://docs.investorliftdata.com/errors/duplicate-request-in-flight`\n\nThis is deliberately a 409 and not a 503, so that a 503 keeps its single published meaning: our infrastructure failed. Your own duplicate collisions are not our downtime.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id",
                "retry_after"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/duplicate-request-in-flight"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "retry_after": {
                  "type": "integer",
                  "description": "The `Retry-After` interval, in seconds, repeated in the body."
                }
              }
            }
          }
        }
      },
      "PayloadTooLarge": {
        "description": "The request carried more properties than this endpoint accepts. Nothing was charged and the scoring service was not called.\n\n`type`: `https://docs.investorliftdata.com/errors/payload-too-large`\n\nThe body carries `limit` (the most properties this endpoint accepts) and `submitted` (how many this request was counted as carrying). On `/v1/predict/batch`, `submitted` is the number of entries in the `properties` array, so a request over the limit really is a batch to split. On the single-property endpoints it is the number of body members that are not documented request options, so an unrecognised member name is counted as a property and raises `submitted` — check the member names against this reference before splitting anything.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id",
                "limit",
                "submitted"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/payload-too-large"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "limit": {
                  "type": "integer",
                  "description": "How many properties this endpoint accepts."
                },
                "submitted": {
                  "type": "integer",
                  "description": "How many properties this request was counted as carrying. On the batch endpoint that is the number of entries in the `properties` array. On a single-property endpoint it is the number of body members that are not documented request options, so an unrecognised member name is counted as a property."
                }
              }
            }
          }
        }
      },
      "Unprocessable": {
        "description": "One of four distinct outcomes. Branch on `type`, never on the status alone.\n\n`https://docs.investorliftdata.com/errors/idempotency-key-conflict` — this `Idempotency-Key` was already used for a request with a different body, so it cannot be replayed. Nothing was charged. Send the request again with a new key. Your key is never echoed back.\n\n`https://docs.investorliftdata.com/errors/ambiguous-address` — the submitted address matched more than one property. The body carries `candidates`, each with an `id` and the address on file. Pick one, or add a city or ZIP, and send the request again. The charge for the call is returned to the Account as a Refund.\n\n`https://docs.investorliftdata.com/errors/address-out-of-coverage` — the address is in a state this API does not cover yet. Coverage is a data-loading state and not a product boundary. The charge for the call is returned to the Account as a Refund.\n\n`https://docs.investorliftdata.com/errors/unscorable-address` — the submitted address could not be matched to a property, or the property could not be scored. The charge for the call is returned to the Account as a Refund.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "enum": [
                    "https://docs.investorliftdata.com/errors/idempotency-key-conflict",
                    "https://docs.investorliftdata.com/errors/ambiguous-address",
                    "https://docs.investorliftdata.com/errors/address-out-of-coverage",
                    "https://docs.investorliftdata.com/errors/unscorable-address"
                  ]
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "candidates": {
                  "type": "array",
                  "description": "Present only on `ambiguous-address`. The properties the submitted address matched, as stored by the property data service. Never empty.",
                  "items": {
                    "type": "object",
                    "required": [
                      "id",
                      "address"
                    ],
                    "properties": {
                      "id": {
                        "type": "string",
                        "description": "The property identifier to disambiguate with."
                      },
                      "address": {
                        "type": "string",
                        "description": "The address on file for that property."
                      },
                      "latitude": {
                        "type": "number",
                        "minimum": -90,
                        "maximum": 90,
                        "description": "Optional supplied address coordinate, paired with longitude. No extra lookup."
                      },
                      "longitude": {
                        "type": "number",
                        "minimum": -180,
                        "maximum": 180,
                        "description": "Optional supplied address coordinate, paired with latitude."
                      }
                    }
                  }
                },
                "covered_states": {
                  "type": "array",
                  "description": "Present only on `address-out-of-coverage`. The two-letter state codes queryable at the time of this call, read live rather than from a fixed list. Never empty.",
                  "items": {
                    "type": "string",
                    "description": "A two-letter USPS state or territory code."
                  }
                }
              }
            },
            "examples": {
              "sample": {
                "value": {
                  "type": "https://docs.investorliftdata.com/errors/ambiguous-address",
                  "title": "Address is ambiguous",
                  "detail": "The submitted address matched more than one property, so no score was produced. The price of this call has been returned to the Account's balance. Choose one of the candidates below, or add a city or ZIP, and send the request again.",
                  "status": 422,
                  "trace_id": "00000000-0000-4000-8000-000000000000",
                  "candidates": [
                    {
                      "id": "sample",
                      "address": "1026 N Beckley Ave, Dallas, TX 75203"
                    },
                    {
                      "id": "sample",
                      "address": "100 Sample Street, Dallas, TX 75203"
                    }
                  ]
                }
              }
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "One of two distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is which limit was reached and whether an interval is given.\n\n`https://docs.investorliftdata.com/errors/rate-limited` — the Account sent too many requests. Nothing was charged. This response carries a `Retry-After` header and repeats it as `retry_after` in the body. Wait for that interval, then send the request again.\n\n`https://docs.investorliftdata.com/errors/spend-cap-exceeded` — the Account reached its daily spending cap, the most it may spend in a rolling window, so the Metered Call was not started and nothing was charged. **This response carries no `Retry-After` header and no `retry_after` member.** A call costing more than the whole cap never fits, however long you wait, so no single honest interval exists. The body carries `cap`, `consumed` and `required` in US dollars with two decimals, the same figures in whole US cents as `cap_cents`, `consumed_cents` and `required_cents`, `window_seconds` instead — enough to compute your own backoff — and `cap_scope`, which says which cap refused the call: `account` for the Account's daily spending cap, `connection` for one assistant connection's daily limit.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          },
          "Retry-After": {
            "description": "How long to wait, in seconds, before sending the request again (RFC 9110). Sent on `rate-limited` only — a `spend-cap-exceeded` refusal publishes no interval and this header is absent.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "enum": [
                    "https://docs.investorliftdata.com/errors/rate-limited",
                    "https://docs.investorliftdata.com/errors/spend-cap-exceeded"
                  ]
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "retry_after": {
                  "type": "integer",
                  "description": "Present only on `rate-limited`. The `Retry-After` interval, in seconds, repeated in the body."
                },
                "cap": {
                  "type": "number",
                  "multipleOf": 0.01,
                  "minimum": 0,
                  "description": "Present only on `spend-cap-exceeded`. The daily spending cap for this Account — the most it may spend in one rolling window, in US dollars (two decimals)."
                },
                "consumed": {
                  "type": "number",
                  "multipleOf": 0.01,
                  "minimum": 0,
                  "description": "Present only on `spend-cap-exceeded`. What this Account has already spent in the window, in US dollars (two decimals)."
                },
                "required": {
                  "type": "number",
                  "multipleOf": 0.01,
                  "minimum": 0,
                  "description": "Present only on `spend-cap-exceeded`. What this call costs, in US dollars (two decimals)."
                },
                "window_seconds": {
                  "type": "integer",
                  "description": "Present only on `spend-cap-exceeded`. The length of the window in seconds. The window rolls continuously rather than resetting on a clock boundary."
                },
                "cap_cents": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Present only on `spend-cap-exceeded`. The same figure as cap, in whole US cents."
                },
                "consumed_cents": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Present only on `spend-cap-exceeded`. The same figure as consumed, in whole US cents."
                },
                "required_cents": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Present only on `spend-cap-exceeded`. The same figure as required, in whole US cents."
                },
                "cap_scope": {
                  "type": "string",
                  "enum": [
                    "account",
                    "connection"
                  ],
                  "description": "Present only on `spend-cap-exceeded`. Which cap refused the call: `account` for the Account's daily spending cap, `connection` for one assistant connection's daily limit."
                }
              }
            }
          }
        }
      },
      "ValidateTooManyRequests": {
        "description": "The Account sent too many requests. Nothing was charged. Wait for the interval in `Retry-After`, then send the request again.\n\n`type`: `https://docs.investorliftdata.com/errors/rate-limited`\n\nThis endpoint is not a Metered Call and records no Spend, so the Spend Cap cannot refuse it: `rate-limited` is the only 429 it can answer.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id",
                "retry_after"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/rate-limited"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "retry_after": {
                  "type": "integer",
                  "description": "The `Retry-After` interval, in seconds, repeated in the body."
                }
              }
            }
          }
        }
      },
      "Unavailable": {
        "description": "One of four distinct outcomes that share a status. **Branch on `type`, never on the status alone** — the difference is what happened to your balance.\n\n`https://docs.investorliftdata.com/errors/ledger-unreachable` — the Ledger could not be reached, so the call was never started and **nothing was charged**. This is stated only when it is provable.\n\n`https://docs.investorliftdata.com/errors/spend-indeterminate` — the call did not complete and the outcome of its Spend **is not known**. No claim is made about what was consumed. Any charge recorded for it is returned to the Account as a Refund.\n\n`https://docs.investorliftdata.com/errors/call-not-started` — the call was never started and **nothing was charged** — the same claim `ledger-unreachable` makes, sent when the failure happened before the Ledger was called at all. There is no Spend to return, because none was ever recorded.\n\n`https://docs.investorliftdata.com/errors/route-unavailable` — the endpoint is temporarily switched off by its operator, so the call was not started and **nothing was charged**. Other endpoints are unaffected; send the same call again after the `Retry-After` interval.\n\nAll four carry `Retry-After`. This API does not retry on your behalf; use an `Idempotency-Key` so that your retry is safe.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id",
                "retry_after"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "enum": [
                    "https://docs.investorliftdata.com/errors/ledger-unreachable",
                    "https://docs.investorliftdata.com/errors/spend-indeterminate",
                    "https://docs.investorliftdata.com/errors/call-not-started",
                    "https://docs.investorliftdata.com/errors/route-unavailable"
                  ]
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "retry_after": {
                  "type": "integer",
                  "description": "The `Retry-After` interval, in seconds, repeated in the body."
                }
              }
            }
          }
        }
      },
      "ValidateUnavailable": {
        "description": "This request could not be processed, and nothing was charged — this endpoint is not a Metered Call and records no Spend, so nothing could have been charged.\n\n`type`: `https://docs.investorliftdata.com/errors/spend-indeterminate`\n\nThis is the API's single catch-all failure type, so the body carries the general wording written for a Metered Call. That wording does not apply here: this endpoint has no Metered Call and no Spend whose result could be in doubt.\n\n`type`: `https://docs.investorliftdata.com/errors/route-unavailable`\n\nThis endpoint is temporarily switched off by its operator, and **nothing was charged**. Other endpoints are unaffected.\n\nThe response carries `Retry-After`. Wait for that interval, then send the request again. Quote the `trace-id` header if you contact support.",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id",
                "retry_after"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "enum": [
                    "https://docs.investorliftdata.com/errors/spend-indeterminate",
                    "https://docs.investorliftdata.com/errors/route-unavailable"
                  ]
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                },
                "retry_after": {
                  "type": "integer",
                  "description": "The `Retry-After` interval, in seconds, repeated in the body."
                }
              }
            }
          }
        }
      },
      "UpstreamUnavailable": {
        "description": "An upstream service could not complete this call, so no score was produced. This covers the scoring service, the property data service and geocoding — any one of them can be the one that failed, and this response does not distinguish them. The charge for the call is returned to the Account as a Refund.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-unavailable`",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/upstream-unavailable"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                }
              }
            }
          }
        }
      },
      "UpstreamTimeout": {
        "description": "An upstream service did not respond in time, so no score was produced. This covers the scoring service, the property data service and geocoding. The charge for the call is returned to the Account as a Refund.\n\n`type`: `https://docs.investorliftdata.com/errors/upstream-timeout`",
        "headers": {
          "trace-id": {
            "$ref": "#/components/headers/TraceId"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "type": "object",
              "description": "An RFC 9457 Problem Detail. Sent as `application/problem+json`.",
              "required": [
                "type",
                "title",
                "detail",
                "status",
                "trace_id"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "format": "uri",
                  "description": "A stable URI identifying what went wrong. Branch on this, not on the wording.",
                  "const": "https://docs.investorliftdata.com/errors/upstream-timeout"
                },
                "title": {
                  "type": "string",
                  "description": "A short, stable summary."
                },
                "detail": {
                  "type": "string",
                  "description": "What happened, what it means for your balance, and what to do next."
                },
                "status": {
                  "type": "integer",
                  "description": "The HTTP status code, repeated in the body."
                },
                "trace_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "The Trace ID for this request. Quote it to support."
                }
              }
            }
          }
        }
      }
    }
  }
}
