How we build the data

What happens between a source listing and the record you receive.

We do not treat a successful request as a finished dataset. Before a record reaches you, we check the persisted rows, keep the source evidence, record every normalization decision, resolve identity conservatively, and preserve the observations used to derive changes.

What happens to a record

Six checks between the source and your database.

Each check leaves evidence you can inspect before accepting the final delivery.

  1. 01

    Source scope

    Name the market, source and collection boundary.

    Open supporting article
  2. 02

    Observation

    Capture the source assertion and its observed time.

    Jump to section
  3. 03

    Normalization

    Map comparable facts without erasing local evidence.

    Open supporting article
  4. 04

    Identity

    Associate offers only when independent signals agree.

    Open supporting article
  5. 05

    Change

    Derive events from accepted observation sequences.

    Open supporting article
  6. 06

    Delivery

    Accept rows, receipts and completeness at one boundary.

    Open supporting article
01

Keep the source claim intact

We capture a listing with its source URL, external identifiers, collection time, and raw context before interpreting it. An acquisition failure stays a failure; it never becomes zero inventory.

02

Show how every value changed

We map prices, areas, locations, property types, and attributes into a versioned contract. The original assertion stays attached, so a normalized value can always be traced back to its evidence.

03

Prefer a missed match to a false merge

A source listing ID identifies an offer, not a building or unit. We group offers only when address, coordinates, facts, media, and other independent signals agree. Uncertain candidates remain separate.

04

Report only the change we observed

First-seen, last-seen, price, status, removal, and reactivation events describe what we observed over time. They do not prove a deed transfer, completed transaction, or event before tracking began.

Acceptance gates

A green request is not the finish line.

Each stage advances only when its persisted evidence agrees with the claim being made.

BoundaryAccept withReject when
CoverageNamed source and market scopeA broad country or inventory claim
CollectionTerminal state, persisted rows and matching countsHTTP 200 or process success alone
NormalizationOriginal assertion, units and transformationA plausible value without lineage
IdentitySeveral independent signals and reversible associationOne fuzzy similarity score
FreshnessObservation time plus workflow policyRequest time presented as source freshness
DeliverySchema, identifiers, row parity and usage receiptAn unverified response body
01

How to tell what our coverage claim really includes

Our public coverage directory counts source families and markets, not actor variants, endpoints, or internal collection paths. That avoids turning several technical routes to the same inventory into an inflated source count.

A source in the directory means we maintain an integration surface for it. It does not mean every field, geography, asset class, or historical date is equally available. The useful question is narrower: does the current serving snapshot contain the sources, records, fields, and observation times your workflow needs?

  • Name the required markets and asset classes.
  • Identify the sources that materially define inventory in each market.
  • Specify required fields and acceptable omission rules.
  • Define freshness and recovery expectations per source or market.
02

Why a successful request can still produce a failed dataset

Every source has different pagination, retry, parsing, and blocking behavior. We keep those mechanics inside the source integration while exposing one stable delivery contract to you.

We accept a collection only when its terminal state, persisted rows, reported count, identifiers, required fields, and stored artifacts agree. An HTTP 200 can still hide an empty parser result, truncated pagination, duplicate rows, or a response that never reached storage.

  • Source URL and external identifiers are retained.
  • Collection and snapshot timestamps are explicit.
  • Partial coverage and acquisition failures identify themselves.
  • Retries do not silently create duplicate deliveries or charges.
03

What we normalize—and what we refuse to guess

Our common schema aligns transaction type, property category, price, currency, typed areas, bedrooms, location, media, and contact information. Units and enums are explicit. Unknown values remain absent or null according to the contract instead of being filled with a convenient default.

Derived values are allowed only when their inputs and transformation are transparent. For example, price per area can be calculated when compatible price and area values are present; it should never conceal which measurements produced it.

  • Retain the raw assertion beside the normalized value.
  • Convert units only with explicit source units.
  • Separate missing, unavailable, and not applicable states.
  • Version breaking semantic or structural changes.
04

How we decide that two listings describe the same property

A portal listing ID identifies one source offer, not necessarily one physical property. Canonical identity uses multiple signals to associate likely offers for the same property while preserving every underlying source assertion.

We start with deterministic identifiers when they exist, then compare address, coordinates, unit, floor, area, bedrooms, description fingerprints, and media. Signals that can fail for the same reason do not count as independent proof. Every association remains reviewable and reversible because a false merge is more damaging than a duplicate row.

  • Keep source offer IDs stable and queryable.
  • Use several independent signals before merging.
  • Preserve the offers grouped under each property.
  • Make uncertain matches separable and auditable.
05

How old is too old depends on the decision

Different sources and markets change at different speeds. We record when a listing was first seen, last observed, and last changed so you can apply a freshness policy that fits the decision being made.

When a source is temporarily unavailable, the last-known record is not relabeled as current. Delivery can distinguish current observations, stale evidence, unavailable sources, and incomplete coverage so a customer can proceed, defer, or exclude the affected market.

  • Read snapshot and observation timestamps.
  • Set a maximum acceptable age for the workflow.
  • Treat source unavailability separately from zero inventory.
  • Contract stricter recovery objectives only where required.
06

What to check before trusting a delivery

Before accepting a snapshot, check that the returned count equals the rows you persisted. Then validate the schema version, required identifiers, uniqueness, freshness, completeness markers, provenance, and usage receipt.

The runtime capabilities manifest is the current authority for enabled markets, filters, limits, schemas, and machine-access gates. Static documentation explains the contract but does not override runtime state.

  • Confirm returned count equals the number of rows.
  • Check required identifiers and uniqueness.
  • Reject stale or truncated output when the workflow requires completeness.
  • Persist the request ID, usage receipt, and source context.

What the terms mean

Five data terms that are easy to overstate.

Source listingOne advertisement published by one source

Not the physical property

Source observationWhat we accepted from a source at a stated time

Not a real-world transaction

Canonical propertyThe likely physical asset associated with one or more offers

Not permission to discard source evidence

Serving snapshotThe dated projection available for delivery

Not a universal real-time market view

Listing eventA change derived between accepted observations

Not proof of a sale, deed or transfer

Choose your problem

Read the guide that answers your next question.

From our identity modelWhy a listing ID cannot identify a property.From our matching pipelineHow to deduplicate listings without merging different homes.From our observation historyWhen a listing disappears, you still do not know it sold.From our field lineageCan you explain where one property field came from?From our cross-country schemaOne property schema should not erase how local markets work.From our acceptance processA property API demo can pass while the dataset fails.