meta.coverage[].parcel.financing.as_of. Every response that carries a value from one of them says so.
Why
The financing and valuation numbers come from BatchData’s Recorder and Mortgage and AVM datasets. Those datasets are not in the current order, so the API serves the latest delivery that carried them. The API estimates nothing forward and fills in no week after the delivery’s date. A mortgage recorded after the slice date is not here, and an equity figure is equity as it stood then. The alternative was to leave the blocks out. A six-week-old lien balance is useful when its age is on the label. The stamp is that label.The stamp: meta.dated[]
Any response that carries a dated value gets an entry per block:
lenders beside financing, because the registry comes from the same slice.
meta.dated is absent when nothing in the response is dated. So its presence is the test, not its contents.
Show the date next to the numbers it belongs to. The stamp exists to stop one common mistake. Do not compare a
dated equity figure against a current list price and call the difference an opportunity.
What is dated
A filter on a dated column stamps the response too, even when the response has no dated block. The API chose
those rows by June’s numbers, and you need to know that.
POST /v1/properties/search also echoes the parts of your own
request that did it, in summary.dated_filters.
Refuse it: require_current
If your product cannot use a six-week-old number, do not filter the stamp out afterwards. Ask the API to refuse
the request:
- On the search, send
"require_current": truein the body. - On the financing route and the seven lender routes, send
require_current=true.
422 dated_refused instead of the snapshot.
errors[] names every part of the request that caused it: the filter group, the quicklist, the sort, the dataset.
Drop those parts, and the same request succeeds with current data only. Or drop require_current and take the
snapshot with its stamp.
require_current is false by default, so a caller who never thinks about this gets the data and the label.
The edge of the slice: recordings_through
Recordings in the slice stop fourteen days before as_of. The slice did not measure the two weeks between. Not
measured does not mean empty. A mortgage recorded in those two weeks is not a loan the lender did not make. It is a
loan the slice did not see.
So the API measures every recency on a lender against recordings_through, never against as_of. The recency
fields are last_recording_date, last_recorded_on and days_before_recordings_through.
meta.coverage[].lenders.recordings_through carries the date, so a client never hard-codes it.
When the datasets come back
Nothing about your integration changes. The same routes, the same fields and the same filters serve current data.meta.dated[] no longer appears. data.dated on the financing route goes false. require_current: true no longer
refuses anything. Code that reads meta.dated when it is present, and ignores it when it is not, needs no edit on
that day.
The lender registry then rebuilds from the current week. recordings_through moves with each delivery, and the
counts grow weekly. Lender ids do not move, because an id is a function of the folded name alone. The history’s
shape does not change: five recorded mortgages per parcel and about one open loan in five. That shape comes from
the age of the file, not from the age of the slice. So a history count stays a floor, and the union of the two tables
stays the origination count.
meta.coverage[].parcel.financing carries the same facts per market in advance: as_of, dated and
dated_reason, beside the counts of what the slice covers. Read it. Do not hard-code the date.
meta.coverage[].lenders does the same for the registry: as_of, recordings_through, the covered counties,
history_capture_share and the *_measured flags. Since 0.19.0 the flags include takebacks_measured and
counties_measured beside the four of 0.16.0. The block is null where the market has no published registry.