For platforms & data teams

Already have an extractor? Add the validation layer.

RentRollIQ's validation registry encodes 43 institutional underwriting rules — mixed-basis NOI conflation, mislabeled rent-only EGI, dropped-line-item extraction artifacts, synthesized rent rolls treated as ground truth — as a callable API. You keep your extraction pipeline; we run the rules and return typed, per-check findings your UI can render.

One endpoint, two modes

POST /v1/validate accepts either a source PDF (we run the full pipeline) or your already-extracted JSON (we run only the validation registry — the common integration path). Checks that lack the artifacts you supplied are skipped, not errored: send only a rent roll and you get the rent-roll-applicable subset.

Request — Mode B (JSON in)
curl -sS https://api.rentrolliq.com/v1/validate \
  -H "X-API-Key: <your-partner-key>" \
  -H "Content-Type: application/json" \
  -d @extraction.json | jq '.summary'
Response — summary block
{
  "checks_run": 10,
  "checks_passed": 3,
  "checks_info": 3,
  "checks_warned": 2,
  "checks_failed": 1,
  "checks_skipped": 1,
  "overall_status": "fail",
  "headline_concern": "Cap rate variance 118 bps > 75 bps tolerance."
}

Every result row carries check_id, status, a human-readable message, the affected fields, and a structured data block with the underlying math — plus page citations where the source discloses them.

43 checks, regression-pinned

Each check is pinned against a 22-fixture corpus of real broker OMs across 5 asset classes, so a model or prompt change that breaks a rule is caught the day it happens. The full machine-readable catalog ships at GET /v1/checks.

Income statement

NOI reconciliation with opex-basis classification, cap-rate basis checks, monthly×12 tie-outs, capex-reclass hygiene.

noi_reconciliationcap_rate_reconciliationcap_rate_basis_reconciliationopex_year_over_year_sanitycapex_reclassified_from_opex

Extraction QA

Separates a broken extraction from a bad deal: non-positive NOI, impossible expense ratios, dropped income lines caught via GRM × asking cross-checks.

extraction_artifact_screenextractor_failedsynthetic_rent_rollocr_recovery_inferences

Rent roll

Internal consistency, unit-count reconciliation that respects commercial/garage classifications, banked rent, non-arms-length leases.

rent_roll_internal_consistencyunit_count_reconciliationbanked_rent_aggregationnon_arms_length_leases_detected

Cross-document

Broker-headline KPI cross-checks, cross-property consistency, jurisdiction and property-tax basis checks, material disclosures.

broker_headline_consistencycross_property_consistencyjurisdiction_consistencyproperty_tax_basis_conflationmaterial_disclosures_detected

Latency and integration

ModeTypical latencyUse case
JSON (validation only)<500 msYou keep your extractor; we run the rules. The common partner path.
PDF (full pipeline)~30–180 sSection discovery → extraction → validation, end to end.
  • • Per-key token-bucket rate limiting; typed Pydantic request/response shapes; the OpenAPI spec is generated from the route handlers and pinned by tests.
  • • Registry versioning on every response, with an X-Registry-Version pin header so an upgrade never surprises your CI.
  • • Two-week integration target behind an existing extraction stack.