Pull Expense Data (Property, Floor Plan, and Unit)
Learn how expenses are structured across property, floor plan, and unit levels, and how to retrieve them efficiently using our API. This guide walks through each attribution level, explains how expenses are associated, and provides step-by-step instructions for accessing the data you need.
Overview:
- Base URL: https://api.sightmap.com/v1
- Auth: Pass your API key in the header as “API-Key: {your_key}”
- All endpoints below are scoped to a single asset. Replace {asset_id} with the Engrain asset ID.
Data Model:
- Engrain supports expenses at all three levels. We ingest fees at those three levels from various sources of truth (e.g. PMS, proprietary database, custom API), leverage them within our fee transparency SightMap features (calculator, unit list, holistic SightMap pricing displays) and make the fees available within our APIs for usage within other proptech platforms (ILSs, CRM, AI platforms, websites).
- Asset level: where an expense is consistent across the property (e.g. $100 application fee)
- Floor plan level: where an expense is specific to the floor plan (e.g. $500 deposit for 2 bedroom - 2C floor plan, $300 deposit for 1 bedroom - 1B floor plan)
- Unit level: where an expense is specific to the unit (e.g. $20/mo for electricity for Unit 303, $15/mo for electricity for Unit 101)
- Floor plan and unit expenses are split into two pieces — the fee metadata, and fee entries (the actual dollar values keyed to each floor plan or unit).
- How to handle unit-type fees? Some clients and PMSs (Entrata) treat Unit Type and Floor Plan as the same thing, where as others (Yardi and RealPage) treat Unit Type as its own concept that sits between the Unit level and Floor Plan level. When Engrain receives unit type fees, we break them down to unit level fees so that they are attributed to the correct unit. In our expenses endpoints, we display these as as unit level fees and we include a 'provider group id' field.
How to retrieve expenses for a property
Step 1: Pull Asset Level Expenses
Make a call to GET: List asset expenses - to ingest all asset level expenses and their values.
Example response: assets/7778/multifamily/expenses
"data": [
{
"id": "327",
"asset_id": "7778",
"label": "Renters Insurance",
"disclaimer": null,
"provider_id": null,
"provider_group": null,
"provider_code": "7620",
"provider_method": null,
"provider_references": null,
"tooltip_label": null,
"type": "renters_insurance",
"category": "administrative",
"group": "insurance",
"frequency": "annually",
"due_at_timing": "move_in",
"limit": 1,
"proration_method": null,
"value_cap_type": "amount",
"value_cap": "250.00",
"percentage_value_cap": null,
"value_type": "amount",
"amount": "175.00",
"is_enabled": true,
"is_required": true,
"is_refundable": false,
"is_taxable": false,
"is_included": false,
"is_third_party": true,
"is_per_applicant": false,
"is_situational": false,
"created_at": "2025-01-14T16:09:28+00:00",
"updated_at": "2025-10-28T17:01:51+00:00"
},
{
"id": "328",
"asset_id": "7778",
"label": "Gov Fee (138)",
"disclaimer": null,
"provider_id": null,
"provider_group": null,
"provider_code": "3140",
"provider_method": null,
"provider_references": null,
"tooltip_label": null,
"type": "government",
"category": "administrative",
"group": "contracting",
"frequency": "annually",
"due_at_timing": "move_in",
"limit": 1,
"proration_method": null,
"value_cap_type": null,
"value_cap": null,
"percentage_value_cap": null,
"value_type": "amount",
"amount": "10.23",
"is_enabled": false,
"is_required": true,
"is_refundable": false,
"is_taxable": true,
"is_included": false,
"is_third_party": false,
"is_per_applicant": false,
"is_situational": false,
"created_at": "2025-01-14T16:09:28+00:00",
"updated_at": "2025-01-14T16:25:04+00:00"
},The expense “value_type” and “value” are right on the expense object. No entry call needed.
Step 2: Pull Floor Plan Level Expenses
Make a call to GET: List floor plan expenses - to ingest all floor plan expenses.
Example response: assets/7778/multifamily/floor-plans/expenses
"data": [
{
"id": "348",
"asset_id": "7778",
"label": "Security Deposit",
"disclaimer": null,
"provider_id": null,
"provider_group": null,
"provider_code": "2500",
"provider_method": null,
"provider_references": null,
"tooltip_label": "Damage deposit fee paid at move in, and refundable at move out. ",
"type": "deposit",
"category": "administrative",
"group": "contracting",
"frequency": "one_time",
"due_at_timing": "move_in",
"limit": 1,
"proration_method": null,
"value_cap_type": null,
"value_cap": null,
"percentage_value_cap": null,
"value_type": "amount",
"is_enabled": true,
"is_required": true,
"is_refundable": true,
"is_taxable": false,
"is_included": false,
"is_third_party": false,
"is_per_applicant": false,
"is_situational": false,
"created_at": "2025-01-14T16:09:28+00:00",
"updated_at": "2026-04-14T21:07:10+00:00"
}
]
}If there is data for floor plan expenses, then make one call for each expense ID to GET: List Floor Plan Expense Entries - to get a list of each of the units that the expense applies to, and their values.
"data": [
{
"asset_id": "7778",
"expense_id": "348",
"floor_plan_id": "133265",
"amount": "500.00"
},
{
"asset_id": "7778",
"expense_id": "348",
"floor_plan_id": "133266",
"amount": "300.00"
},
{
"asset_id": "7778",
"expense_id": "348",
"floor_plan_id": "133267",
"amount": "500.00"
},
{
"asset_id": "7778",
"expense_id": "348",
"floor_plan_id": "141274",
"amount": "700.00"
},
The fields you care about:
- expense_id: The expense ID from the first call.
- floor_plan_id: The floor plan ID the entry value applies to.
Step 3: Pull Unit Level Expenses
Make a call to_ GET: List unit expenses - to ingest all unit level expenses.
Example response: assets/7778/multifamily/units/expenses
"data": [
{
"id": "345258",
"asset_id": "7778",
"label": "Pest Control",
"disclaimer": null,
"provider_id": null,
"provider_group": null,
"provider_code": null,
"provider_method": null,
"provider_references": null,
"tooltip_label": null,
"type": "pest_control",
"category": "services",
"group": "utilities",
"frequency": "monthly",
"due_at_timing": null,
"limit": 1,
"proration_method": null,
"value_cap_type": null,
"value_cap": null,
"percentage_value_cap": null,
"value_type": "amount",
"is_enabled": true,
"is_required": true,
"is_refundable": false,
"is_taxable": false,
"is_included": false,
"is_third_party": false,
"is_per_applicant": false,
"is_situational": false,
"created_at": "2025-12-17T00:42:41+00:00",
"updated_at": "2025-12-17T00:42:41+00:00"
}
]
}If there is data for unit expenses in step #3, then make one call for each expense ID to GET: List Unit Expense Entries - to get a list of each of the units that the expense applies to, and their values.
Example response: List unit expense entries assets/7778/multifamily/units/expenses/345258/entries
"data": [
{
"asset_id": "7778",
"expense_id": "345258",
"unit_id": "2879571",
"amount": "1.50"
},
{
"asset_id": "7778",
"expense_id": "345258",
"unit_id": "2879572",
"amount": "1.51"
},
{
"asset_id": "7778",
"expense_id": "345258",
"unit_id": "2879573",
"amount": "1.52"
},
{
"asset_id": "7778",
"expense_id": "345258",
"unit_id": "2879574",
"amount": "1.53"
},The fields you care about:
- expense_id: The expense ID from the first call.
- unit_id: The unit ID the entry value applies to.
Explore Our New Expense Data IntegrationWe’ve launched three new example properties in the SightMap REST API featuring realistic expense data models. Use these assets to test and visualize expenses across the asset, floor plan, and unit levels.
- Demo Asset IDs: 7778 • 7779 • 7780
Ready to get started?
- Request a Technical Demo Discover how our advanced APIs deliver granular expense data across every asset level. Contact Partnerships
- Become an Engrain Partner Not currently integrated? Let’s get you up and running with our expense-enabled APIs. Start Your Integration
- Existing Partner Support Need access to these assets or help with permissions? Contact API Support
Updated about 1 hour ago
Putting Floor Plans, Units & Expenses Together
