# NJ Property Tax Assessment Lookup (MOD-IV) (`muhammadafzal/nj-property-tax-assessment-lookup`) Actor

Look up New Jersey MOD-IV assessments by municipality, address, block, lot, or PAMS PIN with values, taxes, sale, deed, and parcel fields.

- **URL**: https://apify.com/muhammadafzal/nj-property-tax-assessment-lookup.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 property assessment records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## NJ Property Tax Assessment Lookup (MOD-IV)

Look up current New Jersey property tax assessments by PAMS PIN, municipality, address, tax block, tax lot, or property class using the State of New Jersey's public `Parcel_MOD4` service.

The Actor is designed for real-estate research, tax-comparison workflows, parcel screening, GIS enrichment, and agent/API use. It reads the official NJGIN layer directly—no browser, account, or third-party data provider is required.

### What it returns

| Field group | Included data |
|---|---|
| Parcel identity | PAMS PIN, parcel GUID, municipality code, county, municipality, block, lot, qualifier |
| Assessment | Land value, improvement value, net assessed value, prior-year tax, property class and use |
| Property | Situs address, building and land descriptions, acreage, building class, year built, dwelling counts |
| Deed and sale | Deed book/page/date, sale price, sale code |
| Freshness | Parcel update date, publication date, retrieval timestamp, exact source query |
| Optional GIS | Parcel polygon in WGS84 longitude/latitude coordinates |

Owner names and owner mailing addresses are not returned. The State of New Jersey redacts owner names in its hosted parcel and tax-list products under Daniel's Law; this Actor preserves that privacy boundary.

### When to use it

Use this Actor when you need the current assessment record exposed by NJGIN for a known parcel, a small municipal block/lot search, a property-address search inside one municipality, or a bounded municipal/property-class list.

Do not use it for tax-bill payment status, liens, title verification, ownership discovery, market-value estimates, historical year-by-year records, or legal boundary surveys. Assessment values are not automatically equal to market value, and parcel geometry is a planning framework rather than survey data.

### Input

Choose one parcel scope:

- `pamsPin` for an exact statewide lookup, such as `0714_702_11`; or
- `municipalityCode`, such as `0714`; or
- both `county` and `municipality`, such as `ESSEX` and `NEWARK CITY`.

Then optionally narrow with `address`, `block`, `lot`, `qualifier`, or `propertyClass`. `maxResults` defaults to 100 and is capped at 1,000. Set `includeGeometry` to `true` only when polygon coordinates are useful.

#### Exact block and lot

```json
{
  "municipalityCode": "0714",
  "block": "702",
  "lot": "11",
  "maxResults": 1
}
```

#### Address inside a municipality

```json
{
  "county": "ESSEX",
  "municipality": "NEWARK CITY",
  "address": "N 8TH ST",
  "maxResults": 25
}
```

#### Exact PAMS PIN with GIS geometry

```json
{
  "pamsPin": "0714_702_11",
  "includeGeometry": true,
  "maxResults": 1
}
```

### Output example

```json
{
  "pamsPin": "0714_702_11",
  "municipalityCode": "0714",
  "county": "ESSEX",
  "municipality": "NEWARK CITY",
  "block": "702",
  "lot": "11",
  "propertyLocation": "718-720 N 8TH ST",
  "propertyClass": "2",
  "landValue": 43800,
  "improvementValue": 170700,
  "netAssessedValue": 214500,
  "priorYearTax": 8157.44,
  "yearBuilt": 1918,
  "salePrice": 101000,
  "deedDate": "1984-01-06",
  "geometry": null,
  "sourceUrl": "https://maps.nj.gov/arcgis/rest/services/Applications/NJ_TaxListSearch/MapServer/2/query?...",
  "retrievedAt": "2026-09-07T12:00:00.000Z"
}
```

Every business record is written to the default dataset. `OUTPUT` in the default key-value store contains `DATA`, `EMPTY`, `LIMIT_REACHED`, `REJECTED`, or `FAILED`, the exact normalized query, record count, warnings, and source note. A valid no-match query returns an empty dataset with an explicit `EMPTY` summary; it never fabricates a property. When a run spending cap allows fewer records than `maxResults`, the Actor reduces work before querying and reports the applied limit.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~nj-property-tax-assessment-lookup/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"municipalityCode":"0714","block":"702","lot":"11","maxResults":1}'
```

For production integrations, send the token in an authorization header rather than a URL and retrieve items from the run's default dataset.

### Pricing

This Actor uses transparent pay-per-event pricing:

| Event | Price |
|---|---:|
| Actor start | $0.00005 per run |
| Property assessment record | $0.001 per delivered dataset item |

A one-record lookup costs up to `$0.00105` in event charges. A 100-record run costs up to `$0.10005`. A zero-result or rejected query has no result events; only the configured start event applies. `maxResults` is both a workload and billing cap. Platform pricing shown in Apify Console remains authoritative.

### Reliability and limits

The Actor queries the public State of New Jersey ArcGIS service with bounded pagination, 30-second request timeouts, and three attempts for rate limits, transient server errors, and network failures. It deduplicates records by PAMS PIN and validates required identity fields before writing any dataset item.

The upstream service currently caps each response at 1,000 records; the Actor pages in batches and caps each run at 1,000 results. Searches are case-normalized. Address matching uses the text recorded in `PROP_LOC`, so abbreviations and punctuation must resemble the assessor record. For broad research or historical years, use the official bulk MOD-IV downloads or Rutgers historical database instead.

### Data source and responsible use

Data comes from the [NJGIN Parcels and MOD-IV program](https://www.nj.gov/njgin/edata/parcels/) and its public [NJ Tax List Search ArcGIS service](https://maps.nj.gov/arcgis/rest/services/Applications/NJ_TaxListSearch/MapServer). Municipal assessors and county tax boards remain the authorities for corrections and official determinations.

Use the data lawfully, minimize retention of sensitive parcel information, and independently verify decisions involving taxation, lending, insurance, title, valuation, or legal rights. This Actor does not bypass authentication, CAPTCHAs, paywalls, redactions, or access controls.

### Support

When reporting a problem, include the run ID, input with secrets removed, expected parcel, and whether the official NJGIN Property Explorer shows it. Do not send private credentials or unredacted personal documents.

# Actor input Schema

## `pamsPin` (type: `string`):

Use this for one exact statewide parcel lookup. Enter the official PAMS PIN, for example 0714\_702\_11. When set, other search filters are ignored.

## `municipalityCode` (type: `string`):

Use this to select one taxing district by its 4-digit county/municipal code, for example 0714 for Newark City. This replaces county plus municipality when provided.

## `county` (type: `string`):

Use this with Municipality when you do not know the 4-digit code. Enter the official county name, for example ESSEX. Ignored when Municipality code or PAMS PIN is set.

## `municipality` (type: `string`):

Use this with County and enter the official MOD-IV municipality name, for example NEWARK CITY. This is not a neighborhood or ZIP code.

## `address` (type: `string`):

Use this to match text inside the official property location, for example N 8TH ST. A municipality selector is required; this is not a mailing-address or owner search.

## `block` (type: `string`):

Use this for an exact tax-block lookup within the selected municipality, for example 702. Preserve any suffix shown in the official tax record.

## `lot` (type: `string`):

Use this for an exact tax-lot lookup within Block, for example 11. Lot requires Block; preserve decimal or suffix formatting when present.

## `qualifier` (type: `string`):

Use this only to distinguish qualified parcels after setting Block and Lot, for example C0001. Leave empty for an unqualified parcel.

## `propertyClass` (type: `string`):

Use this to restrict results to an exact MOD-IV class code, for example 2 for residential property or 15F for other exempt property. This is not a zoning code.

## `maxResults` (type: `integer`):

Use this to cap delivered and billed assessment records. Defaults to 100; allowed range is 1 to 1,000 records per run.

## `includeGeometry` (type: `boolean`):

Use this when polygon coordinates are needed for GIS or mapping. Defaults to false to keep records compact; geometry is returned in WGS84 longitude/latitude coordinates.

## Actor input object example

```json
{
  "municipalityCode": "0714",
  "block": "702",
  "lot": "11",
  "maxResults": 100,
  "includeGeometry": false
}
```

# Actor output Schema

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

Schema-validated New Jersey property assessment records.

## `dataset` (type: `string`):

Default dataset page in Apify Console.

## `summary` (type: `string`):

Outcome, query, record count, source note, and warnings.

# 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 = {
    "municipalityCode": "0714",
    "block": "702",
    "lot": "11"
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/nj-property-tax-assessment-lookup").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 = {
    "municipalityCode": "0714",
    "block": "702",
    "lot": "11",
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/nj-property-tax-assessment-lookup").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "municipalityCode": "0714",
  "block": "702",
  "lot": "11"
}' |
apify call muhammadafzal/nj-property-tax-assessment-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/nj-property-tax-assessment-lookup"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kG9uLwJheGCeOqZJM/builds/29880KOLLoSOV5LCc/openapi.json
