# NMTC Low-Income Community Screener — IRA 48(e) Solar Bonus (`malonestar/cdfi-nmtc-lowincome-energy-bonus-screener`) Actor

Coordinate lookup for the IRA 48(e) low-income clean-energy bonus. Batch lat/lon against CDFI Fund NMTC Low-Income Communities (IRC 45D(e)); each returns in\_nmtc\_low\_income\_community, tract GEOID, poverty/MFI basis, Category 1 bonus flag, adder, and an optional HUD QCT flag. MCP-ready.

- **URL**: https://apify.com/malonestar/cdfi-nmtc-lowincome-energy-bonus-screener.md
- **Developed by:** [Kyle Maloney](https://apify.com/malonestar) (community)
- **Categories:** Real estate, Developer tools, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## NMTC Low-Income Community Screener — IRA 48(e) Clean-Energy Bonus

Checks whether a coordinate sits in a New Markets Tax Credit (NMTC) Low-Income Community — the geography that qualifies a clean-energy facility for the IRA Low-Income Communities Bonus Credit (IRC 48(e) / 48E(h)), Category 1, a +10 percentage-point adder on the Investment Tax Credit. For community and rooftop solar developers, EPCs, and tax-equity teams screening a site pipeline for the bonus.

### How it works

IRC 48(e) defines a Category 1 "low-income community" by cross-reference to IRC 45D(e), which is the NMTC definition. A tract qualifies on a poverty rate of at least 20%, or a median family income at or below 80% of the applicable area median (with additional metro/rural rules). For each site you pass (`lat`/`lon`, WGS84), the actor runs a point-in-polygon query against the U.S. Treasury CDFI Fund CIMS layer of NMTC Qualified Census Tracts (ACS 2016-2020 vintage) — the same data behind the official CDFI mapping tool. A tract either contains the point or it doesn't, so you get exactly one tract back.

By default it also checks HUD's LIHTC Qualified Census Tract layer and returns an `also_in_lihtc_qct` flag. That is informational context only — QCT is a LIHTC concept, not itself a 48(e) pathway. Set `checkQct` to false to skip it.

### Example input

```json
{
  "assets": [
    { "lat": 40.815, "lon": -73.904, "label": "South Bronx, NY" },
    { "lat": 41.878, "lon": -87.702, "label": "West Side Chicago, IL" },
    { "lat": 34.073, "lon": -118.400, "label": "Beverly Hills, CA (control)" }
  ],
  "checkQct": true,
  "maxAssets": 500
}
````

### Key output fields (one row per site)

- `in_nmtc_low_income_community` — true if the point is inside a NMTC low-income-community tract, false if clear, null on an error row.
- `qualifies_48e_lowincome_bonus` — equals the field above; the 48(e) Category 1 verdict.
- `tract_geoid` — 11-digit census tract GEOID of the containing tract; `state`, `county`, `county_fips`, `metro_designation` locate it.
- `poverty_rate` — tract poverty rate (%, ACS 2016-2020).
- `pct_median_family_income` — tract median family income as a percent of area median.
- `lic_basis` — which 45D(e) criteria the tract meets (poverty ≥20%, MFI ≤80%, unemployment ratio, or high out-migration).
- `bonus_category`, `adder` — populated when qualifying (`48(e) Category 1 - Low-Income Community`, `+10 percentage-point ITC bonus`).
- `also_in_lihtc_qct` — HUD LIHTC QCT overlap (null if the check is off or failed).
- `nmtc_vintage`, `citation`, `source_url`, `checked_at`, `error`.

A point outside any low-income community returns a clean `false` row, not an error. Invalid coordinates produce an error row without failing the run.

### Who uses it

- Community and rooftop solar developers site-screening a pipeline for the low-income bonus.
- Solar EPCs and originators qualifying leads before spending on interconnection or a capacity-allocation application.
- Tax-equity and renewable-finance teams running IRA bonus diligence across a portfolio.
- Community-development lenders and CDFIs cross-referencing NMTC and clean-energy eligibility.
- AI agents needing a point-to-low-income-community lookup.

### Use as an MCP tool

A Pay-Per-Result API callable by AI agents through mcp.apify.com. Each row is self-describing, so an agent can screen sites for the low-income bonus and chain the result into an energy-community or QCT check.

### FAQ

**Does a hit guarantee the bonus?** No. It confirms the site is in a qualifying low-income community, which is the geographic gate. The 48(e) bonus is capacity-limited and allocated by the IRS/DOE each program year; confirm with tax counsel.

**Which categories are covered?** Category 1 (low-income community) only. Categories 2–4 (Indian land, low-income residential, low-income economic-benefit — some worth up to +20 points) use different tests and are not screened here.

**What data vintage?** CDFI Fund CIMS NMTC eligibility, ACS 2016-2020 (the current published series).

**Is it official?** The tract layer is the Treasury CDFI Fund's own CIMS service. This is an informational screen, not tax advice.

# Actor input Schema

## `assets` (type: `array`):

List of points to check against CDFI Fund NMTC Low-Income Communities (LIC). Each item is an object with numeric lat and lon (WGS84 decimal degrees) and an optional label echoed into the output. One billable result row is produced per asset, telling you whether the coordinate falls in a NMTC low-income community and therefore qualifies for the IRA 48(e) Category 1 clean-energy ITC bonus.

## `checkQct` (type: `boolean`):

When true (default), each asset is also checked against HUD's LIHTC Qualified Census Tract layer and the result carries an also\_in\_lihtc\_qct flag (informational context; QCT is a LIHTC concept, not itself a 48(e) pathway). Set false to skip the extra lookup.

## `maxAssets` (type: `integer`):

Safety cap on how many assets to screen in one run. Extra assets beyond this limit are skipped.

## Actor input object example

```json
{
  "assets": [
    {
      "lat": 40.815,
      "lon": -73.904,
      "label": "South Bronx, NY"
    }
  ],
  "checkQct": true,
  "maxAssets": 500
}
```

# Actor output Schema

## `results` (type: `string`):

The default dataset with one NMTC LIC screening row per asset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "assets": [
        {
            "lat": 40.815,
            "lon": -73.904,
            "label": "South Bronx, NY (low-income community)"
        },
        {
            "lat": 41.878,
            "lon": -87.702,
            "label": "West Side Chicago, IL (low-income community)"
        },
        {
            "lat": 34.073,
            "lon": -118.4,
            "label": "Beverly Hills, CA (affluent control)"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/cdfi-nmtc-lowincome-energy-bonus-screener").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "assets": [
        {
            "lat": 40.815,
            "lon": -73.904,
            "label": "South Bronx, NY (low-income community)",
        },
        {
            "lat": 41.878,
            "lon": -87.702,
            "label": "West Side Chicago, IL (low-income community)",
        },
        {
            "lat": 34.073,
            "lon": -118.4,
            "label": "Beverly Hills, CA (affluent control)",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malonestar/cdfi-nmtc-lowincome-energy-bonus-screener").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "assets": [
    {
      "lat": 40.815,
      "lon": -73.904,
      "label": "South Bronx, NY (low-income community)"
    },
    {
      "lat": 41.878,
      "lon": -87.702,
      "label": "West Side Chicago, IL (low-income community)"
    },
    {
      "lat": 34.073,
      "lon": -118.4,
      "label": "Beverly Hills, CA (affluent control)"
    }
  ]
}' |
apify call malonestar/cdfi-nmtc-lowincome-energy-bonus-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malonestar/cdfi-nmtc-lowincome-energy-bonus-screener",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "NMTC Low-Income Community Screener — IRA 48(e) Solar Bonus",
        "description": "Coordinate lookup for the IRA 48(e) low-income clean-energy bonus. Batch lat/lon against CDFI Fund NMTC Low-Income Communities (IRC 45D(e)); each returns in_nmtc_low_income_community, tract GEOID, poverty/MFI basis, Category 1 bonus flag, adder, and an optional HUD QCT flag. MCP-ready.",
        "version": "1.0",
        "x-build-id": "lpnUaOquS5WGTQRDy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/malonestar~cdfi-nmtc-lowincome-energy-bonus-screener/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-malonestar-cdfi-nmtc-lowincome-energy-bonus-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/malonestar~cdfi-nmtc-lowincome-energy-bonus-screener/runs": {
            "post": {
                "operationId": "runs-sync-malonestar-cdfi-nmtc-lowincome-energy-bonus-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/malonestar~cdfi-nmtc-lowincome-energy-bonus-screener/run-sync": {
            "post": {
                "operationId": "run-sync-malonestar-cdfi-nmtc-lowincome-energy-bonus-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "assets": {
                        "title": "Assets (coordinates to screen)",
                        "type": "array",
                        "description": "List of points to check against CDFI Fund NMTC Low-Income Communities (LIC). Each item is an object with numeric lat and lon (WGS84 decimal degrees) and an optional label echoed into the output. One billable result row is produced per asset, telling you whether the coordinate falls in a NMTC low-income community and therefore qualifies for the IRA 48(e) Category 1 clean-energy ITC bonus."
                    },
                    "checkQct": {
                        "title": "Also flag HUD LIHTC Qualified Census Tract (QCT)",
                        "type": "boolean",
                        "description": "When true (default), each asset is also checked against HUD's LIHTC Qualified Census Tract layer and the result carries an also_in_lihtc_qct flag (informational context; QCT is a LIHTC concept, not itself a 48(e) pathway). Set false to skip the extra lookup.",
                        "default": true
                    },
                    "maxAssets": {
                        "title": "Max assets",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Safety cap on how many assets to screen in one run. Extra assets beyond this limit are skipped.",
                        "default": 500
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
