Rent Roll to Excel: Yardi, AppFolio & RealPage Normalizer avatar

Rent Roll to Excel: Yardi, AppFolio & RealPage Normalizer

Pricing

from $20.00 / 1,000 unit normalizeds

Go to Apify Store
Rent Roll to Excel: Yardi, AppFolio & RealPage Normalizer

Rent Roll to Excel: Yardi, AppFolio & RealPage Normalizer

Rent roll to Excel: normalize Yardi, AppFolio, RealPage, Entrata, Buildium or Rent Manager rent rolls (XLSX, CSV, PDF) into one standard unit table plus occupancy, loss-to-lease, rent by floorplan and lease expirations, checked against the report's own totals. Rules-based, no AI.

Pricing

from $20.00 / 1,000 unit normalizeds

Rating

0.0

(0)

Developer

Haniel Azevedo

Haniel Azevedo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

Rent Roll Normalizer: Yardi, AppFolio, RealPage, Entrata, Buildium, Rent Manager to one clean Excel

Drop in a rent roll export in XLSX, XLS, CSV or text PDF. You get back:

  1. One standard unit-level table: unit, floorplan, sq ft, beds/baths, status (occupied / notice / vacant / model / down), market rent, lease rent, other charges by type (concession, pet, parking, storage, utility, insurance, fees, other), lease start/end, move-in/out, balance and deposit.
  2. An underwriting summary: physical, economic and sq ft occupancy; gross potential rent; vacancy loss; loss-to-lease; average in-place vs market rent by floorplan; and lease expirations by month, with cumulative %.
  3. Validation against the report's own totals. The Actor re-adds every column and compares the result with the report's grand-total and summary rows: unit count, sq ft, market rent, lease rent, deposits, balances and occupancy. Each file is marked validated or needs_review, and you can see the reason.
  4. CSV, JSON and a formatted XLSX file per rent roll. The XLSX has these sheets: Units, Summary, Floorplans, Expirations, Validation, Charges, Future residents.

The extraction is rules-based: no AI, no LLM, no third-party APIs. Your rent roll is not sent anywhere, and the same file always gives the same output.

Pricing: $0.02 per unit, charged only for rent rolls that reconcile with their own totals (validated). A 200-unit roll costs $4.00. Failed files, needs_review files and the demo file are free.

Who it is for

  • Multifamily acquisitions analysts and underwriters who re-key seller rent rolls into their model.
  • Lenders, brokers and appraisers who receive rent rolls from many different property-management systems.
  • Asset managers who compare properties that run on different software.

Re-keying and checking one 200-unit rent roll by hand usually takes 1–3 hours. This Actor takes about 2 seconds.

Supported formats

SystemTypical reportDetected by
Yardi VoyagerRent Roll / Rent Roll with Lease ChargesHeaders, charge-code rows, "Current/Notice/Vacant Residents" summary
AppFolioRent RollHeaders ("Rent", "Market Rent", "Past Due"…), "Total" rows
RealPage OneSiteRent RollHeaders ("Lease Rent", "Mkt + Addl"…)
EntrataRent RollHeaders ("Lease Status", "Scheduled Rent"…)
BuildiumRent RollHeaders
Rent ManagerRent RollHeaders
Anything elseAny table with a unit column and a rent columnGeneric column rules

The parser handles multi-row headers, subtotal and total rows, one-row-per-charge-code layouts (Yardi), vacant, model, down and admin units, future/applicant residents (kept apart; add them with includeFutureResidents), and columns in any order or with extra columns. Set sourceSystem if auto-detection picks the wrong system.

How to use it

  1. Paste one or more public links to rent roll files into fileUrls. For confidential files, upload them to one of your Apify key-value stores, pick that store in fileStore, and list the record keys in fileKeys. The Actor gets read-only access to that store only.
  2. Optional: set asOfDate (otherwise it is read from the report, or today's date is used), propertyName, and redactTenantNames. Redaction replaces names with [redacted] in every output.
  3. Run it. Open the Files view for links to each XLSX and CSV, or the Units view for the rows.

Example input

The Console form is prefilled with a real public rent roll: a 4-unit AppFolio PDF published by Triumph Property Management. Click Start without changing anything:

{
"fileUrls": [
"https://triumphpropertymanagement.com/wp-content/uploads/2024/03/Rent-Roll-Sample.pdf"
]
}

Example output

That run takes about 5 seconds, detects AppFolio, marks the file validated and is free (demo file). Summary (run of 1 Nov 2026):

{"asOfDate": "2024-03-05", "unitCount": 4, "occupiedUnits": 4, "physicalOccupancyPct": 100,
"grossPotentialRent": 4145, "inPlaceRent": 5570, "lossToLease": -130, "lossToLeasePct": -3.14,
"avgMarketRent": 1381.67, "avgInPlaceRent": 1392.5, "unitsMissingMarketRent": 1,
"totalBalance": 2975.42, "totalDeposits": 4840}

One unit row, with redactTenantNames: true:

{"unit": "Unit 102", "floorplan": "2BR/2BA", "sqft": 994, "beds": 2, "baths": 2, "tenantName": "[redacted]",
"status": "occupied", "marketRent": 1450, "contractRent": 1475, "totalCharges": 1475,
"leaseStart": "2023-02-01", "leaseEnd": "2024-07-31", "moveIn": "2022-09-01", "balance": 1550.42, "deposit": 750}

Validation for that file: 14 of 14 checks passed. Sq ft 3,976, market rent 4,145, lease rent 5,570, deposits 4,840, balance 2,975.42, 4 units and 100% occupancy all match the report's totals.

Accuracy (measured)

  • Public rent rolls (6 real reports from Yardi and AppFolio, 4 to 232 units, published in bond disclosures and by property managers): every unit was found, and all 6 files reconciled to their own totals (validated).
  • Synthetic held-out set: 480 files across 7 systems × 3 formats (XLSX, CSV, PDF) with known ground truth, generated after the rules were frozen. 100% unit recall, 0 extra units, 100% field accuracy over 193,456 fields, and 100% system detection. The same score held on a stress variant with shuffled columns and extra noise columns.
  • The synthetic files are modelled on the same layouts the rules target, so treat the public-file result as the real-world evidence. Always check the Validation sheet before you rely on a number.

Use from code (apify-client) or an AI agent (MCP)

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("hanielazevedo/rent-roll-normalizer").call(run_input={
"fileUrls": ["https://triumphpropertymanagement.com/wp-content/uploads/2024/03/Rent-Roll-Sample.pdf"], "redactTenantNames": True})
units = client.dataset(run["defaultDatasetId"]).list_items().items
summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("OUTPUT")["value"]
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('hanielazevedo/rent-roll-normalizer').call({ fileUrls: ['https://triumphpropertymanagement.com/wp-content/uploads/2024/03/Rent-Roll-Sample.pdf'] });

With the Apify MCP server (https://mcp.apify.com), add this Actor as a tool. An agent can then call it with fileUrls and read the OUTPUT record.

Pricing

Pay per event, with platform usage included:

EventPriceWhen
unit-normalized$0.02 per current unitOnce per rent roll, after its outputs are saved, and only when the file is validated
Actor start$0.00005 per GB of memoryOnce per run
Rent rollCost
50 units$1.00
200 units$4.00
1,000 units$20.00

Files that fail, files marked needs_review and the prefilled demo file are never charged. If your maximum total charge does not cover a whole file, that file is skipped without charge.

FAQ

Is my data used to train AI or sent to a third party? No. Everything runs inside your Apify run, with rules and no AI. Use redactTenantNames to keep names out of the outputs.

What does needs_review mean? The units were extracted, but at least one total did not match the report's own totals, or the report has no totals to check against. You get every output so you can check them, and you are not charged for that file.

Scanned PDFs? They are not supported (no OCR). Export the report to Excel, CSV or a text PDF from your PM system.

Is T-12 / operating statement support planned? Yes. It is planned as a second version.

What happens with a negative loss-to-lease? Leases above market give a negative loss-to-lease, which the Actor reports as is. Units with no market rent are left out of loss-to-lease and economic occupancy, and are counted in unitsMissingMarketRent.

Limitations

  • Text PDFs only. Scanned images are not read (no OCR).
  • One property per file works best. A portfolio roll with several properties is parsed, but its totals only reconcile when each property has its own total rows.
  • Columns the rules cannot place are left out of the standard table. Charge codes that are not recognised go to charge_other, with the raw codes kept in chargeDetail.
  • Real-world testing so far covers Yardi and AppFolio public reports. RealPage, Entrata, Buildium and Rent Manager are covered by their documented column layouts and synthetic tests. If one of your files fails, you are not charged for it.
  • Maximum file size is 100 MB (default 50 MB).

Other Actors by Haniel