PIP (Property Information Portal) architecture
Project goal
The Property Information Portal (PIP) is the public lookup for a property on the tax map of the City of New York, published by the Department of Finance. Its purpose is that anyone looking up a lot — an owner, a professional, or staff of the department itself — can see, on one screen, that property’s tax identity, its physical description, its assessment, its exemptions, the register documents, the tax map history, and its position on the map. Today each of those pieces lives in a different system; the portal brings them together so nobody has to open each system separately.
That assembly has one shared key: the BBL (Borough-Block-Lot), a ten-character identifier made of the borough (1 digit), the block (5), and the lot (4). Almost every query in the portal filters on that value, or on a field derived from it (PARID, CONDO_BILLING_BBL, UNIT_BBL, PARENT_BBL, AIR_LOT_BBL, SUB_LOT_BBL).
The source systems the portal reads, and which it does not replace, are these:
| Source | What it contributes to the lookup |
|---|---|
| Digital Tax Map | The drawn parcel and the lot variants: condominium, unit, air rights, subterranean lot, appurtenant utility record (REUC), and lots that no longer appear on the current map. |
| Assessment views | Market value and taxable assessed value for the current year, and the historical series ordered by tax year. |
| Exemption view | Exemptions tied to the same property identifier. |
| ACRIS | Sales and mortgages from the city register (Automated City Register Information System), requested through the portal proxy. |
| Tax map library | PDF plans, change-book transactions, and historical books for the block. |
| MapPLUTO | Neighborhood context: community district, council district, land use, and school and health districts. |
| Cyclomedia | Street-level imagery of the point, in coordinate system EPSG:26918. |
| ArcGIS Online web maps | The official 2D map and the 3D scene (units, air, subsurface, and buildings). |
The goal is met when the application does these four things, in this order.
- Locate the property with the key the user brings. The Find a Property panel accepts borough, block, and lot; an address; the condominium number; the REUC identifier; the air or subterranean lot number; a click on the map; or an external link that already carries borough, block, and lot separately. An address is turned into a point and intersected with the parcel layer. If the point falls inside no parcel, the search is repeated over a 100-foot area around it.
- Classify that BBL. The same ten-digit number can be a condominium unit, a condominium billing BBL, an air lot, a subterranean lot, a current parcel, a dropped lot, or a dropped condominium. The search queries those layers in that order and stops at the first one that returns records. The resulting type (
unit,condo,air,sub,parcel,dropParcel, ordropCondo) decides which parcel is highlighted on the map and which extra cards the detail panel shows. A unit, for example, is drawn on the condominium base parcel (CONDO_BASE_BBL); an air or subterranean lot is drawn on its parent parcel (PARENT_BBL). - Compose the detail panel and place it on the map. Once the BBL is classified, the browser queries the ArcGIS Online feature services in parallel (organization
yG5s3afENB5iO9fj, portalhttps://nyc.maps.arcgis.com) and the ACRIS documents. The result is split across cards: property data, building, land, condominium and unit when they apply, REUC, assessment, exemptions, sales, mortgages, tax map history, and neighborhood. The 2D map frames and highlights the parcel. In 3D it leaves visible only the unit, air, subsurface, and building volumes that belong to that BBL. A block, with no lot, opens a shorter view: only the tax map history for that block. - Leave any data change in the source systems. The portal reads; it does not write to the geodatabase and it does not calculate the tax. Paying, opening the property tax account, filing a tax map action, or reviewing exemptions and assessments are links to Department of Finance sites (
*.nyc.gov). Those links carry the BBL as the account identifier (pin).
Technically, PIP is a static site written in React, TypeScript, and Vite. It has no business server of its own: every query leaves the browser for ArcGIS Online, for the ACRIS proxy (propertyinformationportal.nyc.gov), and for the Cyclomedia imagery API. The feature services that feed the detail panel respond without a sign-in. IIS publishes the site and rewrites the single-page application routes so that an address such as /parcels/parcel/1001230045 opens the detail panel even though the server has no such folder.
For anyone maintaining the code, that goal is also the test of a change. A modification fits the portal if it still lets someone locate a lot, classify it, compose its detail panel, and show it on the map. The rest of this documentation describes how that path is built, so the effect of a change can be judged before it is made.
How this is organized
| Document | Contents |
|---|---|
| 1. Overview | The four layers of the system, the cadastral data infrastructure the portal sits in, and the path of a lookup from the browser to the services. Read this next, after the goal. |
| 2. Application | Screen layout, routes, shared state, and web maps. |
| 3. Components | The panels, the detail-panel cards, and the modules that load data. |
| 4. Lookup flow | How a search is resolved, and what is shown for each lot type. |
| 5. Data and services | The BBL identifier, the feature service catalog, and who reads each layer. |
| 6. Build and deployment | The Vite build, the IIS rules, and the Azure Pipelines channel. |
| 7. Using the portal | A walkthrough of the public site, with screenshots from a recorded lookup. |
The annexes in generated/ hold the inventory: routes, components, and services. The interactive diagrams are in diagrams/, and index.html gathers everything into one page that can be opened offline.
Glossary
| Term | Meaning |
|---|---|
| BBL | Borough-Block-Lot. A ten-digit identifier: one borough digit, five block digits, and four lot digits. Example: borough 1, block 123, and lot 45 are written 1001230045. |
| Borough | Numeric code of the borough. On the forms the value runs from 1 to 9. |
| Tax lot / parcel | The tax lot drawn on the map. In the code it is queried by the BBL field. |
| Condo billing BBL | The condominium’s billing BBL (CONDO_BILLING_BBL). Units hang off that condominium. |
| Air lot / subterranean lot | Air-rights lots (AIR_LOT_BBL) or subterranean lots (SUB_LOT_BBL), tied to a parent parcel (PARENT_BBL). |
| REUC | An appurtenant utility record attached to a parcel. It is identified by IDENT and SUBIDENT and related by APPURTENANT_BBL. |
| Feature service | An ArcGIS service that exposes layers and tables so the browser can query them. |
| Web map | A map published on the ArcGIS Online portal. The application loads one in 2D and another in 3D. |
Scope
| Item | What was reviewed |
|---|---|
| Application | Code in src/: routes, context, search and detail panels, map, and street viewer. |
| Configuration | Map and service addresses in AppConfig.ts. |
| Deployment | vite.config.ts, web.config, and azure-pipelines.yml. |
Out of scope:
- The published schema of each feature service (fields, domains, and permissions). The tables in this document list the layers the code queries, not the full service contract.
- Cyclomedia credentials and package-registry keys. They live in configuration and are not reproduced here.
- The contents of the portal web maps and the quality dashboard (
/qa), which live outside this repository.
Change history
| Date | Change |
|---|---|
| 29/09/2026 | First version. |
| 29/09/2026 | Project goal placed at the start of the documentation. |
| 29/09/2026 | Documentation translated to English. |
| 29/09/2026 | Walkthrough of the public site, with screenshots from a recorded lookup. |
| 29/09/2026 | Overview: data section on the national and local cadastral spatial-data infrastructure. |
Diagrams
1. Overview
In short: the platform has four layers. The user works in a single-page web application; that application draws an ArcGIS web map; the detail-panel data is read from ArcGIS Online feature services; and several external systems (ACRIS, Cyclomedia, and the Department of Finance pages) complete the lookup without a business server of their own. The data layer is the city’s cadastral record: it follows the national spatial-data conventions for property information, and the portal only reads it.
Diagram: System architecture
The four layers
| Layer | What it is | Where it lives |
|---|---|---|
| 1. Web application | The interface: header, search or detail panel, and map. | src/ — entry in main.tsx and composition in App.tsx |
| 2. Maps | A 2D map and a 3D scene published on the portal https://nyc.maps.arcgis.com. | Identifiers in AppConfig.webmap2d and AppConfig.webmap3d |
| 3. Data | Daily tax map layers, assessments, exemptions, history, and 3D volumes. | ArcGIS Online feature services and scene services (organization yG5s3afENB5iO9fj) |
| 4. External systems | Register documents, street imagery, and links to filings. | The ACRIS proxy, the Cyclomedia API, and *.nyc.gov sites |
Data
PIP’s data layer is the city’s piece of a Spatial Data Infrastructure (SDI) for property and cadastral information. In the United States that infrastructure is coordinated nationally as the National Spatial Data Infrastructure (NSDI). The NSDI connects policy, technology, and standards so that counties and cities can exchange parcel and infrastructure data without each government inventing its own model.
The Department of Finance publishes the Digital Tax Map and the property views that the portal reads. Those layers are the authoritative local record. The portal does not replace that record; it queries it. The four pieces below are the conventions that record follows, and that the feature services therefore expose. The catalog of those services is in 5. Data and services.
National and local governance
The Federal Geographic Data Committee (FGDC) sets the NSDI framework. Local governments — counties in most of the country, and the city itself in New York — remain the source of cadastral truth. They decide how a lot is identified, when a parcel is created or dropped, and which assessment and exemption views sit beside the map.
In this portal that governance shows up as a single key, the BBL, and as a set of published feature services on ArcGIS Online. Changing a lot, an assessment, or a register document happens in those source systems, not in the application.
Property and cadastral standards
Parcel and real-property information is described under two FGDC technical standards:
| Standard | What it covers | How it appears in PIP |
|---|---|---|
| FGDC Cadastral Data Content Standard | The elements of a cadastral record: parcel, owner, legal description, and the relationships among lots. | The daily tax map layers, condominium, unit, air, and subterranean records, and the BBL / PARID fields. |
| FGDC Geographic Information Framework Data Standard, Part 1: Cadastral | How those records sit in the national framework so they can be exchanged. | The same parcel geometry and identifiers published as queryable feature services. |
The BBL is the city’s implementation of that cadastral identifier: borough, block, and lot, padded to ten characters. Derived fields (CONDO_BILLING_BBL, UNIT_BBL, PARENT_BBL, AIR_LOT_BBL, SUB_LOT_BBL) keep the special lots inside the same standard.
Associated public infrastructure standards
Local governments do not only map private property. They also map the services that meet that property in the public right-of-way: addresses, streets, and utilities.
In the portal that associated infrastructure is the REUC (appurtenant utility) record, the street-level imagery at the parcel, and the neighborhood districts from MapPLUTO. None of those replace the cadastral lot; they hang off it.
Interoperability and commercial platforms
Day-to-day cadastral management in the United States sits with the local government. Those offices typically run commercial GIS that already implements FGDC content, Open Geospatial Consortium (OGC) service interfaces, and ISO/TC 211 geographic-information models.
PIP is built on that stack. The maps and the detail-panel data are ArcGIS Online web maps and feature services. The browser reads them with the ArcGIS Maps SDK — query over REST — and never writes back.
Path of a lookup
The example below follows what happens when the user searches for a lot by borough, block, and lot. Every other search ends on the same detail panel.
- Form.
SearchBBLbuilds the ten-digit BBL and looks it up, in this order, as a condominium unit, a condominium, an air lot, a subterranean lot, a map parcel, a dropped lot, and a dropped condominium. - Navigation. If there is a result, the application opens
/parcels/<type>/<bbl>. The type (unit,condo,air,sub,parcel,dropParcel, ordropCondo) decides which extra card is shown. - Map.
AppContexthighlights the parcel on the map and, in 3D, filters the unit, air, and subsurface layers by the parent BBL. - Detail panel.
useDetailsqueries, in parallel, the detail layers, the assessment, the exemptions, the tax map history, and, through the portal proxy, the ACRIS documents. - Presentation.
DetailsPanelBBLsplits that response across the cards of the detail panel.
Diagram: Sequence of a BBL lookup
Technology
| Component | Detail |
|---|---|
| Application | React 18, TypeScript, and Vite 4. Routing with React Router 6. Styles with Reactstrap, Bootstrap 5, and styled-components. |
| Maps | ArcGIS Maps SDK for JavaScript 4.30 (@arcgis/core). The map starts in 2D and the user can switch to the 3D scene. |
| Portal | ArcGIS Online https://nyc.maps.arcgis.com. The OAuth application identifier is in AppConfig.auth; the current startup does not mount sign-in. |
| Data | Read-only queries with query.executeQueryJSON and FeatureLayer.queryFeatures against ArcGIS Online feature services. |
| Street imagery | Cyclomedia Street Smart API, loaded in index.html. Coordinates in EPSG:26918. |
| Register | ACRIS, through https://propertyinformationportal.nyc.gov/proxy/proxy.ashx. |
| Analytics | Google Analytics, tag in index.html. |
| Hosting | Static site. IIS rewrites the React routes in web.config. |
Design principles
- Everything is organized by BBL. The detail panel, the map highlight, and the 3D layers filter on that identifier or on a derived field (
PARID,CONDO_BILLING_BBL,PARENT_BBL,UNIT_BBL). - Configuration lives in one module. Map and service addresses are in
AppConfig.ts. Changing environment means changing those URLs. - The map and the panel share state.
AppContextholds the view, the selected parcel, and the 3D layers. Panels do not talk to each other: they navigate and read that context. - The application only reads. There are no geoprocessing jobs and no writes to the geodatabase. Actions that change data (pay, file a request, open the property tax account) are links to Department of Finance sites.
2. Application
In short: PIP is a single page with three zones: header, side panel, and map. The route decides which panel is shown. Below 768 px the panel and the map take turns; on desktop they sit side by side and the panel can be hidden. Map state lives in AppContext.
Annexes: routes · components
Layout
App.tsx chooses the layout from the window width:
| Width | What is visible | Behavior |
|---|---|---|
| Under 768 px | Header, panel or map, and a View Data / View Map button. | The panel fills the screen. The button swaps it for the map. |
| 768 px or more | Header, panel on the left, and map on the right. | A button on the map edge hides the panel. |
The routes /cyclomedia/:x/:y/ and /qa/ show neither header nor map: they fill the window with the street viewer or the quality dashboard.
The header (Header.tsx) carries the Department of Finance logo, the title Property Information Portal, and external links: tax map filings, exemptions and assessments, the user guide (/pdf/PIP_UserGuide.pdf), and the Map Tool experience.
Routes
Defined in AppRoutes.ts and mounted in App.tsx.
| Route | Panel | What it is for |
|---|---|---|
/ | SearchPanel | Search for a property. |
/parcels/:type/:bbl | DetailsPanelBBL | The lot’s detail panel. type records how the BBL was resolved. |
/block/:boro/:block | DetailsPanelBlock | Tax map history for a block. |
/parcels/:boro/:block/:lot | RedirectPanel | External link. It builds the BBL and redirects to the detail panel of the matching type. |
/cyclomedia/:x/:y/ | Cyclomedia | Street-imagery viewer at those coordinates. |
/qa/ | iframe | ArcGIS Dashboards quality panel. |
/searchHistory | History | History lookup by borough and block. Desktop only. |
AppRoutes also declares /reuc/:boro/:reucNumber and /history/:type/:bbl. Those routes are not mounted in App.tsx. The REUC search navigates to /reuc/…, so today it does not open a panel.
Shared state
AppContext is the only global UI state. It stores:
| Data | Who writes it | Who reads it |
|---|---|---|
mapView | Map, once the view is ready | Search, highlight, and map click |
parcelLayerView, blockLayerView | MapController, when it resolves the web map layers | BBL search and click |
selectedParcel | The detail panel and the address search | Cards, Cyclomedia, and the 3D filter |
areasViews, selectedArea | useAreas | 3D layers for unit, air, subsurface, and building |
Operations the context exposes:
updateSelectedParcel/updateSelectedParcelByBBL. Highlight the parcel and frame the map. In 3D they apply adefinitionExpressionto the volume layers so only what belongs to that BBL is drawn; if nothing is selected, the expression is1=2(nothing is drawn).updateBlockHighLight. Finds the block (BOROandBLOCK) and highlights it.multipleHighlight. Highlights a list of BBLs. The detail panel uses it when a condominium groups several parcels.changeSelectedAreaByBBL. Locates a 3D volume by its BBL field.
Startup is in main.tsx: BrowserRouter, AppContextProvider, and App. The accounts provider (AccountsContext) and the AppSecured variant exist in the repository, but they are not mounted.
Web maps
Map.tsx loads the 2D map first and offers a control to switch to the 3D scene. The identifiers are in AppConfig:
| View | Item id | Layers the code names |
|---|---|---|
| 2D | 255d7693e1f242139d35b8f626f07700 | Parcel (parcelLayer) and block (blockLayer), both from item 2cf51c5f165c4c569691617a492d9b21 |
| 3D | 608e246adb914558b9e4b04db520eb4a | The same, plus units, extrusion, air lots, subterranean lots, and buildings |
A click on the map queries the parcel layer at the point. If there is a BBL different from the current one, it navigates to /parcels/parcel/<bbl>. Otherwise it runs a hit test and, if it hits a 3D volume, selects it with changeSelectedAreaByGraphic.
The initial extent and the fallback basemap are in ArcGIS.ts (Web Mercator, basemap topo-vector). As soon as the web map is ready, its own extent and layers take over.
Authentication
AppConfig.auth points at the portal https://nyc.maps.arcgis.com and stores the registered application identifier. useAccountManager implements sign-in with ArcGIS REST JS. Because main.tsx does not mount that flow, queries to the feature services go out without a user token. The services the detail panel uses respond anonymously.
3. Components
In short: the interface is split into a shell (header, panel, map), a search panel with seven modes, the lot detail panel, and two history views. Almost all detail-panel data passes through the useDetails hook. Paths in this document are relative to src/.
Annex: component inventory
Shell
Header — Header
- Role: Department of Finance branding and menus of external links. It does not query data.
- Where: every route except Cyclomedia and the quality dashboard.
- File: components/Header/Header.tsx.
Panel — Side frame
- Role: title, back button, and the slot where search or the detail panel is mounted.
- File: components/Panel/Panel.tsx.
Map — Map
- Role: creates the 2D or 3D view, registers the click, and switches web map.
- Depends on: hooks/useWebMap.ts, context/MapController.ts.
- File: components/Map/Map.tsx.
Cyclomedia — Street imagery
- Role: opens a Street Smart panorama at the coordinates that arrive on the route. The spatial reference is EPSG:26918. A 2D variant (Cyclomedia2D.tsx) requests a rendered image from the Atlas API.
- Where: route
/cyclomedia/:x/:y/, opened from the detail-panel header. The detail panel projects the parcel centroid into that projection before navigating. - File: components/Cyclomedia/Cyclomedia.tsx.
DisclaimerPopup — Notice
- Role: a terms notice, remembered in a
disclaimerAcceptedcookie. In the desktop layout ofApp.tsxthe call is commented out, so it is not shown.
Search
SearchPanel titles the side panel Find a Property and offers seven modes. Each mode is a form built with React Hook Form and Yup. The address widget is the ArcGIS SDK Search, limited to six results.
| Mode | Component | Destination |
|---|---|---|
| Borough / Block / Lot | SearchBBL | /parcels/<type>/<bbl>, after the BBL is classified |
| Borough / Block | SearchBlock | /block/<borough>/<block> if the block exists in the historical library |
| Address | Search widget inside SearchPanel | /parcels/parcel/<bbl> of the parcel that contains the point, or the nearest one inside a 100-foot buffer |
| Condominium Number | SearchCondo | /parcels/condo/<bbl> |
| REUC Ident | SearchReuc | /reuc/<borough>/<number> (route not mounted) |
| Air Lot Number | SearchAir | /parcels/air/<bbl> |
| Subterranean Lot Number | SearchSub | /parcels/sub/<bbl> |
The panel also links to the Department of Finance property tax account (Open Property Tax Account).
Lot detail panel
DetailsPanelBBL reads :type and :bbl from the route, locates the parent parcel when the type is not the parcel itself, and calls useDetails.
| Route type | What it resolves before drawing | Parcel selected on the map |
|---|---|---|
parcel | The BBL itself on the parcel layer | That BBL |
unit | The unit (UNIT_BBL) and the condominium it belongs to | CONDO_BASE_BBL |
condo | The condominium (CONDO_BILLING_BBL) | CONDO_BASE_BBL |
air | The air lot (AIR_LOT_BBL) | PARENT_BBL |
sub | The subterranean lot (SUB_LOT_BBL) | PARENT_BBL |
dropParcel | A BBL that is no longer on the current map but is in the change book | No current geometry |
dropCondo | A condominium dropped from the daily condominium layer | Whatever the matching record provides |
The detail-panel header (HeaderCard) shows the address, the BBL, and a card index. From there the user prints the panel (a new window with the panel contents), opens Cyclomedia, and, if the lot is a condominium, picks the unit.
| Card | When it appears | Data |
|---|---|---|
| Property Info | Always | Address, owner, class, and borough-block-lot |
| Building | Always | Area, floors, year, and units |
| Condo | condo or unit | Condominium number, suffix, and building units |
| Condo unit | unit | The chosen unit and the unit list |
| REUC | If there are appurtenant records | Identifier, tax year, and appurtenant BBL |
| Land | Always | Frontage, depth, area, and zoning |
| Assessments | Always | Market value and taxable assessed value, current year and history |
| Exemptions | Always | Exemptions from EXDET_PIP_VIEW |
| Sales | Always | ACRIS documents of type sale |
| Mortgages | Always | ACRIS documents that are not sales |
| Tax Map History | Always | Library PDFs, change-book transactions, and historical books |
| Neighborhood | Always | Community district, council district, land use, and school and health districts (MapPLUTO) |
TaxCard and LibraryCard exist as components. TaxCard is not mounted in the panel: it groups links to the property tax account (balance, bill, benefits, assessment). Those links use the BBL as pin.
Block and history
DetailsPanelBlock
- Role: a reduced record for a block. It shows only tax map history (library, change book, and historical books).
- Data: hooks/useDetailsBlock.tsx, the same three layers as the history card on the detail panel, filtered by borough and block.
- File: components/panels/DetailsPanelBlock/DetailsPanelBlock.tsx.
History
- Role: a desktop screen for looking up history by typing borough and block, without going through the detail panel.
- Route:
/searchHistory. - File: components/History/History.tsx.
RedirectPanel
- Role: turns a URL
/parcels/<borough>/<block>/<lot>into the ten-digit BBL and applies the same classification order asSearchBBL. - File: components/panels/RedirectPanel/RedirectPanel.tsx.
Data loading
useDetails is the only place that assembles the detail panel. queryMain(bbl) fires these reads as a sequence of functions, and in parallel inside each function:
| Function | Service | What it fills |
|---|---|---|
queryPropertyDetails | DTM_ETL_DAILY_view layers 18, 19, and 3 | Address, building, land, and condominium table |
queryAssessmentDetails | PROPMAST_HIST_VIEW/0 | Historical assessment series |
queryAssessmentMainDetails | PROPMAST__VIEW/0 | Assessment for the current period |
queryREUCDetails | DTM_ETL_DAILY_view/5 | Appurtenant REUC records that are not deleted |
queryHistoryDetails | DTM_ETL_DAILY_view/8 | Map-library PDFs |
queryHistoryHOTMC | layers 9, 14, and 13 | Change-book transactions; for condominium units it filters on TRANS_NUM |
queryHistoryHAB | DTM_ETL_DAILY_view/7 | Historical books |
queryMoreDetails | EXDET_PIP_VIEW/0 and the ACRIS proxy | Exemptions, sales, and other documents |
The panel also calls queryNeighborhoodDetails, queryCondoDetails, queryBuildingDetails, and queryPropertyTypes in addition to queryMain, for the neighborhood, the condominium record, and the list of air, subterranean, and condominium lots associated with the parcel.
4. Lookup flow
In short: every lookup ends on one of two screens. If the user brings a lot, the application classifies the BBL and opens the detail panel. If the user brings a block, it opens only the tax map history. The map follows both: it highlights the parcel or the block.
Diagrams: Property search · Sequence of a BBL lookup
Classifying a BBL
SearchBBL and RedirectPanel use the same order. They stop at the first service that returns records.
| Order | Query | Field | Route type |
|---|---|---|---|
| 1 | DTM_ETL_DAILY_view/4 | UNIT_BBL | unit |
| 2 | DTM_ETL_DAILY_view/3 | CONDO_BILLING_BBL | condo |
| 3 | DTM_ETL_DAILY_view/2 | AIR_LOT_BBL | air |
| 4 | DTM_ETL_DAILY_view/6 | SUB_LOT_BBL | sub |
| 5 | Map parcel layer | BBL | parcel |
| 6 | DTM_ETL_DAILY_view/9 | BBL | dropParcel |
| 7 | DTM_ETL_DAILY_view/19 | PARID | dropCondo |
If none of them respond, the form shows BBL was not found. The external link /parcels/<borough>/<block>/<lot> pads the block to five digits and the lot to four before it enters this list.
The BBL is built like this: one borough digit, the block padded with leading zeros to five characters, and the lot padded to four. Borough 1, block 16, and lot 1 produce 1000160001.
Other search modes
| Mode | What it checks | Where it goes |
|---|---|---|
| Address | The SDK Search returns a point. It is intersected with the parcel layer. If there is no parcel, the search is repeated with a 100-foot buffer. | /parcels/parcel/<bbl>, or the notice Address not found within the NYC limits |
| Map click | A spatial query on the parcel layer. If the point does not fall on a parcel, it tries the 3D volumes. | /parcels/parcel/<bbl>, or selection of the volume |
| Condominium, air, subsurface | They search by number on the matching layer and navigate with that layer’s BBL. | condo, air, or sub |
| Block | Checks that the borough and block exist in the historical library (DTM_ETL_DAILY_view/7). | /block/<borough>/<block> and a highlight of the block |
| REUC | Searches by identifier. | /reuc/…, route not mounted |
What the detail panel does when it opens
- It compares
:typeand:bblon the route with the last values already loaded. If they have not changed, it does not query again. - Depending on the type, it obtains the parent parcel (see the table in 3. Components) and calls
updateSelectedParcelByBBL. - It calls
queryMainwith the detail-panel BBL (the unit’s BBL, if the type isunit). - It requests the neighborhood, the associated property types, and, for condominiums, the unit list (
CONDO_BASE_BBL_KEY, excluding rows withCINC_PARENT). - It projects the parcel geometry to EPSG:26918 so Cyclomedia can be opened.
- It removes the loading indicator. Each card paints the part of state that belongs to it; if a query has not returned yet, that card stays empty.
Pressing Find Another Property clears the selected parcel and returns to /.
Volumes in 3D
When the map is in 3D and a parcel is selected, AppContext.updateSelectedCondo3D walks the layers from useAreas and leaves visible only what satisfies bblBaseField = BBL of the parcel. Those layers are:
Layer in AppConfig.webmap3d | Feature field | Parent-parcel field |
|---|---|---|
unitLayer, unitExtrusionLayer | UNIT_BBL | BASE_BBL |
airLayer | AIR_LOT_BBL | PARENT_BBL |
airMultipatchLayer | AIR_LOT_BBL | PARENT_BBL |
subLayer | SUB_LOT_BBL | PARENT_BBL |
subMultipatchLayer | SUB_LOT_BBL | PARENT_BBL |
buildingLayer | BBL_TEXT | BBL_TEXT |
Choosing a unit on the detail panel also calls changeSelectedAreaByBBL(AreaType.unit, bbl), which queries the 3D feature service and highlights that volume.
Print and links
- Print.
HeaderCardopens a window with the panel HTML and callswindow.print(). - Property tax account. Several cards and the search panel link to
a836-pts-access.nyc.govwith the BBL aspinandjur=65. - Guide. The header opens
/pdf/PIP_UserGuide.pdf, a static file that IIS does not rewrite (see 6. Build and deployment).
5. Data and services
In short: the application has no database of its own. It reads feature services and scene services from ArcGIS Online, and register documents through the portal proxy. The key of almost every query is the ten-character BBL, using the field name each layer expects.
Annex: service catalog
Diagram: Sequence of a BBL lookup
The BBL key
A BBL is a ten-character string: borough (1) + block (5) + lot (4), with leading zeros. Layers do not always use the same field name:
| Field | Where it appears | What it identifies |
|---|---|---|
BBL | Web map parcel layer, change book | Current or historical lot |
PARID | Daily detail layers, assessment, exemptions | The same BBL on the property views |
CONDO_BILLING_BBL | Condominium layer | Condominium billing BBL |
CONDO_BASE_BBL | Condominium layer | Parcel the condominium sits on |
UNIT_BBL | Condominium units | The unit’s BBL |
AIR_LOT_BBL, SUB_LOT_BBL | Air and subterranean lots | The special lot |
PARENT_BBL | Air and subterranean lots | Parcel they hang from |
APPURTENANT_BBL | REUC | Parcel the record is appurtenant to |
For a block, history queries split the BBL: the first character is the borough and the next five, with leading zeros removed, are the block. MapPLUTO filters on BoroCode and Block the same way.
Daily tax map service
Most of the detail panel comes from DTM_ETL_DAILY_view (https://services6.arcgis.com/yG5s3afENB5iO9fj/arcgis/rest/services/DTM_ETL_DAILY_view/FeatureServer).
| Layer | Name in AppConfig | Used by |
|---|---|---|
| 0 | details.taxLot | Defined; the current parcel is read from the web map layer |
| 1 | details.taxBlock | Defined in configuration |
| 2 | propertyServices.air | Air-lot search and detail panel |
| 3 | propertyServices.condo and details.condoService | Condominiums and the detail-panel table |
| 4 | propertyServices.condoUnit | Units |
| 5 | propertyServices.reuc | REUC records for the parcel |
| 6 | propertyServices.sub | Subterranean lots |
| 7 | maplibrary_hab | Historical books and the block existence check |
| 8 | maplibrary_map | Map-library PDFs |
| 9 | v_dab_book_header | Change book and dropped lots |
| 10–12, 15–17 | v_dab_air, v_dab_block, v_dab_boundary, v_dab_lot, v_dab_reuc, v_dab_sub | Defined in configuration |
| 13 | v_dab_condo | Transaction numbers for a condominium |
| 14 | v_dab_condo_unit | Transaction numbers for a unit |
| 18 | details.dailyDescService | Daily record: address, building, and land |
| 19 | details.dailyCondoService | Condominium detail and dropped condominiums |
Other ArcGIS Online services
| Service | Layer | Used for | Filter |
|---|---|---|---|
EXDET_PIP_VIEW | 0 | Exemptions | PARID |
PROPMAST__VIEW | 0 | Current assessment | PARID |
PROPMAST_HIST_VIEW | 0 | Historical assessment series, ordered by TAXYR DESC | PARID |
MapPLUTO_View | 0 | Neighborhood | BoroCode and Block |
DTM_3D_view | 1, 2, and 4 | Air, unit, and subsurface volumes | Each layer’s BBL field |
AIR_LOT_3D | SceneServer 0 | Air-lot mesh | AIR_LOT_BBL |
SUB_LOT_3D | SceneServer 0 | Subterranean-lot mesh | SUB_LOT_BBL |
Buildings3D_ElevationPackage | SceneServer 0 | Buildings | BBL_TEXT |
The three scene services are at https://tiles.arcgis.com/tiles/yG5s3afENB5iO9fj/. DTM_3D_view is on services6, like the rest of the feature services.
The web maps are not queried by a standalone layer URL for the parcel and the block: MapController finds them by the layerId configured inside the map item. If the web map is republished and those identifiers change, highlighting stops finding the layer even though the feature service is unchanged.
ACRIS
Sales and other documents are not in the feature service. useDetails.queryMoreDetails requests two URLs from the portal’s own proxy:
https://propertyinformationportal.nyc.gov/proxy/proxy.ashx?https://a836-acrissds.nyc.gov/AcrisDtm/AcrisDtmApi/AcrisDocuments?returntype=SALES&borough=…&block=…&lot=…
The second call uses returntype=OTHER. Borough, block, and lot come from the daily record or, if they are missing, from the attributes of the selected parcel. The code still has the propertyinformationportal-stg.nyc.gov variant commented out; the active URL is production.
Who reads each group
| Group | Readers | Does the application write |
|---|---|---|
| Map parcel and block | SearchBBL, SearchPanel (address), Map, AppContext | No |
| Daily record (layer 18) | useDetails.queryPropertyDetails, queryBuildingDetails, queryCondoDetails | No |
| Condominium, unit, air, subsurface, REUC | The specific searches, RedirectPanel, queryPropertyTypes, queryREUCDetails | No |
| Assessment | queryAssessmentDetails, queryAssessmentMainDetails | No |
| Exemptions | queryMoreDetails | No |
| Tax map history | queryHistoryDetails, queryHistoryHOTMC, queryHistoryHAB, useDetailsBlock, History | No |
| 3D volumes | useAreas | No. It only changes the layer’s definitionExpression on the client |
| ACRIS | queryMoreDetails | No |
Links that are not detail-panel data
These destinations open in another tab. They do not return data to the application:
| Destination | From |
|---|---|
a836-pts-access.nyc.gov (property tax account, with pin = BBL) | TaxCard, ReucCard, search panel |
a836-citypay.nyc.gov | TaxCard (Pay online) |
a836-pts-efile.nyc.gov and nyc.gov/site/finance pages | Header |
ArcGIS Dashboards panel (nyc.maps.arcgis.com/apps/dashboards/…) | Route /qa/ |
| Map Tool experience | Header |
6. Build and deployment
In short: the application is compiled to a static site with Vite. On the server, IIS serves those files and rewrites any route that is not a real file back to the React entry, so the browser router can open a detail panel directly.
Build
| Item | Value |
|---|---|
| Package name | nyc_webapp |
| Scripts | npm run dev (Vite), npm run build (tsc and then vite build), npm run preview |
| Entry | index.html loads /src/main.tsx |
| Base | <base href="/" />. The production and staging bases are commented out in the same file |
| Output | dist/ folder |
index.html also loads, from a CDN, React 18.2, React DOM, Lodash, and the Cyclomedia Street Smart API, plus the Google Analytics tag.
IIS
web.config does three things:
- HTTPS. Redirects any HTTP request to HTTPS.
- React routes. If the URL is neither a file nor a directory, and it does not start with
/api,/pdf/, or/proxy/, it is rewritten to/. That is how/parcels/parcel/1000160001reaches the application and React Router resolves the detail panel. - Headers. Removes
X-Powered-ByandServer, and addsX-Frame-Options: SAMEORIGIN,Referrer-Policy: no-referrer, andAccess-Control-Allow-Origin: *. A commented content-security policy lists the ArcGIS, Cyclomedia, and CDN origins.
.htaccess repeats the rewrite idea for Apache: anything that is not a file is sent to index.html.
The user guide has to stay under /pdf/, because that path is excluded from the rewrite. The ACRIS proxy lives at /proxy/ on the same site; the application calls propertyinformationportal.nyc.gov/proxy/proxy.ashx, not a relative path.
Build pipeline
azure-pipelines.yml triggers on the feature/develop branch, on an Ubuntu agent:
- Installs Node.js 18.
- Configures the Font Awesome registry (the pro icons are not on the public registry).
- Runs
npm installandnpm run build.
The pipeline file describes packaging as ArcGIS Pro tasks for the DTM workflows. The step that actually runs is the front-end build. The output comment (dtm_pro_tasks_yyyymmdd.zip) does not match an artifact declared in the visible steps.
Environments
Two environment footprints coexist in the code, with no single switch:
| Footprint | Production (active) | Alternative, commented out |
|---|---|---|
| HTML base | / | https://propertyinformationportal.nyc.gov/ and https://propertyinformationportal-stg.nyc.gov/ |
| ACRIS proxy | propertyinformationportal.nyc.gov | propertyinformationportal-stg.nyc.gov |
| Analytics | G-LEFZ7Y5WC6 | G-9VF1DCR9J5 |
The feature services point at a single ArcGIS Online organization. There is no per-environment copy of the configuration inside AppConfig.
7. Using the portal
In short: the public site opens on a search panel and a tax map. A borough, block, and lot are enough to open the detail panel, highlight the lot, and, for a condominium unit, switch into the 3D scene. The screenshots below are frames from a recording of propertyinformationportal.nyc.gov made on 11 August 2025. The example is Manhattan block 1010, lot 1816.
The screen
The page has three zones. The header carries the Department of Finance mark and the links that leave the portal: tax map filings, exemptions and abatements, valuation, the user guide, and Map Tool. The left panel is the search or the detail panel. The rest of the window is the map, with a 3D control that switches to the scene.

Search by borough, block, and lot
Select chooses the search mode. This recording uses Borough / Block / Lot. Borough is a list (here, Manhattan), and block and lot are typed. Search classifies the ten-digit BBL and opens the detail panel.
Manhattan, block 1010, and lot 1816 become BBL 1010101816. The portal resolves that number as a condominium unit and navigates to /parcels/unit/1010101816.

The detail panel
The panel title changes to Property Details. The header of the panel shows the address (111 West 57th Street, unit PH20), the borough, the block, and the lot, plus shortcuts to the property tax account, print, pay online, and the other Department of Finance actions. A photograph of the front sits beside those shortcuts. The blue chips jump to a card: Property Info, Building, Land, Assessments, Exemptions, Sales, Mortgages, Tax Map History, and Neighborhood.
On the map the condominium’s base lot is filled in cyan and the view zooms to the block. The label on that lot in this recording is C2985, the condominium number. Find Another Property returns to the search panel.

Two controls under the address are specific to a condominium. Condominium switches the record between the unit and the condominium. The unit list on the right names the current unit and its tax lot.
Street-level view
From the detail panel the portal opens the street imagery in its own browser tab, at /cyclomedia/<x>/<y>/. The viewer is a Cyclomedia panorama at the parcel. In this recording the capture date shown in the viewer is 4 April 2025, on West 57th Street beside Central Park Mews. The original detail panel stays open in the other tab.

Cards on the panel
Scrolling the panel (or using the chips) walks the same record. Four cards from this lookup:
The condominium unit card includes the floor plan of the unit, with Previous and Next when there is more than one sheet.

Land shows frontage, depth, area, and zoning. Assessment shows the current market value and taxable assessed value, and a year-by-year table under Assessed Value History. Request for Review and Request AHHS leave the portal for the Department of Finance filing pages.

Mortgages lists recorded documents that are not sales (the sales card is the one before it). The note on the card says the panel shows the recent records and links to ACRIS for the full set.

Tax Map History lists the library dates for the block. Neighborhood shows the community district, council district, land use, and the school and health districts, with links out to CityMaps and ZoLa.

Choosing another unit
On a condominium, the unit control opens a list. Each row is a unit id and its tax lot. Picking one loads that unit’s detail panel and changes the route. In the recording, unit 2 is lot 1802 (/parcels/unit/1010101802) and unit 11A is lot 1803. The map stays on the same condominium lot; the panel and, in 3D, the highlighted volume follow the unit.

The 3D scene
3D replaces the tax map with the scene. The same detail panel stays on the left. Condo units are drawn as translucent volumes stacked on the lot; the selected unit is outlined in green. The control in the corner of the map flips back to 2D.

The layer control on the right lists what the scene is drawing. In this recording the entries are 3D Footprint Selected Building and 3D Footprint All Buildings. The eye beside each row turns that layer on or off.

The blue tab collapses the detail panel so the scene uses the full width. Orbit and zoom move around the stack of units. The selected unit stays outlined. Expanding the tab brings the panel back.

Components
Updated 29/09/2026.
Paths relative to src/.
| Piece | File | Responsibility |
|---|---|---|
| Startup | main.tsx | BrowserRouter and AppContextProvider |
| Composition | App.tsx | Routes, mobile and desktop layout |
| Context | context/AppContext.tsx | View, parcel, highlight, and 3D filter |
| 3D areas | hooks/useAreas.tsx | Unit, air, subsurface, and building layers |
| Map | components/Map/Map.tsx | 2D/3D web map and click |
| Map control | context/MapController.ts | Locates the parcel and block layers |
| Header | components/Header/Header.tsx | Branding and external links |
| Search | components/panels/SearchPanel/ | Seven search modes |
| Detail panel | components/panels/DetailsPanelBBL/ | Lot cards |
| Detail data | hooks/useDetails.tsx | Queries to feature services and ACRIS |
| Block | components/panels/DetailsPanelBlock/ | History for one block |
| Block data | hooks/useDetailsBlock.tsx | Three history queries |
| External link | components/panels/RedirectPanel/RedirectPanel.tsx | Classifies a BBL that arrived by URL |
| History | components/History/History.tsx | Free lookup by borough and block |
| Street | components/Cyclomedia/Cyclomedia.tsx | Street Smart panorama |
| Accounts | hooks/useAccountManager.ts | ArcGIS sign-in, not mounted |
| Configuration | constants/AppConfig.ts | Maps, services, and portal |
Detail-panel cards, in components/panels/DetailsPanelBBL/Cards/:
| Card | Mounted in the panel |
|---|---|
HeaderCard | Yes |
PropertyInfoCard | Yes |
BuildingCard | Yes |
CondoCard | Yes, if the type is condo or unit |
CondoUnitCard | Yes, if the type is unit |
ReucCard | Yes, if there are records |
LandCard | Yes |
AssessmentCard | Yes |
ExcemptiosCard | Yes |
SalesCard | Yes |
MortgagesCard | Yes |
HistoryCard | Yes |
NeighborhoodCard | Yes |
LoadingCard | Yes, through Loading |
TaxCard | No |
LibraryCard | No |
HeaderREUCCard | No |
Routes
Updated 29/09/2026.
| Route | Id in AppRoutes | Mounted in App.tsx | Component |
|---|---|---|---|
/ | search | Yes | SearchPanel |
/parcels | parcels | No | — |
/parcels/:type/:bbl | parcel | Yes | DetailsPanelBBL |
/block/:boro/:block | block | Yes | DetailsPanelBlock |
/parcels/:boro/:block/:lot | parcelExtern | Yes | RedirectPanel |
/reuc/:boro/:reucNumber | reuc | No | The REUC search navigates here |
/history/:type/:bbl | parcel | No | — |
/cyclomedia/:x/:y/ | cyclomedia | Yes | Cyclomedia |
/qa/ | qa | Yes | Quality-dashboard iframe |
/searchHistory | history | Desktop only | History |
Types accepted by /parcels/:type/:bbl: unit, condo, air, sub, parcel, dropParcel, dropCondo. The reuc type is commented out in DetailsPanelBBL.
Services
Updated 29/09/2026.
ArcGIS Online organization: yG5s3afENB5iO9fj. Feature services at https://services6.arcgis.com/yG5s3afENB5iO9fj/. Scene services at https://tiles.arcgis.com/tiles/yG5s3afENB5iO9fj/.
Web maps
| Key | Type | Item id |
|---|---|---|
webmap2d | 2D | 255d7693e1f242139d35b8f626f07700 |
webmap3d | 3D | 608e246adb914558b9e4b04db520eb4a |
Portal: https://nyc.maps.arcgis.com.
DTM_ETL_DAILY_view
| Layer | Key | Primary search field |
|---|---|---|
| 0 | details.taxLot | — |
| 1 | details.taxBlock | — |
| 2 | propertyServices.air | AIR_LOT_BBL, PARENT_BBL |
| 3 | propertyServices.condo | CONDO_BILLING_BBL, CONDO_BASE_BBL |
| 4 | propertyServices.condoUnit | UNIT_BBL, CONDO_BASE_BBL_KEY |
| 5 | propertyServices.reuc | APPURTENANT_BBL |
| 6 | propertyServices.sub | SUB_LOT_BBL, PARENT_BBL |
| 7 | maplibrary_hab | BOROUGH, BLOCK |
| 8 | maplibrary_map | BOROUGH, BLOCK |
| 9 | v_dab_book_header | BBL, Borough, Block |
| 10 | v_dab_air | — |
| 11 | v_dab_block | — |
| 12 | v_dab_boundary | — |
| 13 | v_dab_condo | Borough, Block, Condo_Number |
| 14 | v_dab_condo_unit | Borough, Block, Condo_Unit |
| 15 | v_dab_lot | — |
| 16 | v_dab_reuc | — |
| 17 | v_dab_sub | — |
| 18 | details.dailyDescService | PARID |
| 19 | details.dailyCondoService | PARID |
Other services
| Service | Layer | Key | Field |
|---|---|---|---|
EXDET_PIP_VIEW | 0 | details.extraServices (exdet) | PARID |
PROPMAST__VIEW | 0 | details.propmast | PARID |
PROPMAST_HIST_VIEW | 0 | details.propmastHist | PARID |
MapPLUTO_View | 0 | details.neighborhoodService | BoroCode, Block |
DTM_3D_view | 2 | webmap3d.unitLayer | UNIT_BBL, BASE_BBL |
DTM_3D_view | 1 | webmap3d.airLayer | AIR_LOT_BBL, PARENT_BBL |
DTM_3D_view | 4 | webmap3d.subLayer | SUB_LOT_BBL, PARENT_BBL |
AIR_LOT_3D | SceneServer 0 | webmap3d.airMultipatchLayer | AIR_LOT_BBL |
SUB_LOT_3D | SceneServer 0 | webmap3d.subMultipatchLayer | SUB_LOT_BBL |
Buildings3D_ElevationPackage | SceneServer 0 | webmap3d.buildingLayer | BBL_TEXT |
Outside ArcGIS
| System | URL the code uses |
|---|---|
| ACRIS proxy | https://propertyinformationportal.nyc.gov/proxy/proxy.ashx toward a836-acrissds.nyc.gov |
| Cyclomedia Street Smart | Script in index.html (streetsmart.cyclomedia.com) and the Atlas API in Cyclomedia2D |
| Property tax account | https://a836-pts-access.nyc.gov/care/… |
| Payment | https://a836-citypay.nyc.gov/ |
| Quality dashboard | https://nyc.maps.arcgis.com/apps/dashboards/d424a17b7c2a4ed89164eddab262c501 |