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:

SourceWhat it contributes to the lookup
Digital Tax MapThe 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 viewsMarket value and taxable assessed value for the current year, and the historical series ordered by tax year.
Exemption viewExemptions tied to the same property identifier.
ACRISSales and mortgages from the city register (Automated City Register Information System), requested through the portal proxy.
Tax map libraryPDF plans, change-book transactions, and historical books for the block.
MapPLUTONeighborhood context: community district, council district, land use, and school and health districts.
CyclomediaStreet-level imagery of the point, in coordinate system EPSG:26918.
ArcGIS Online web mapsThe 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.

  1. 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.
  2. 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, or dropCondo) 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).
  3. 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, portal https://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.
  4. 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

DocumentContents
1. OverviewThe 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. ApplicationScreen layout, routes, shared state, and web maps.
3. ComponentsThe panels, the detail-panel cards, and the modules that load data.
4. Lookup flowHow a search is resolved, and what is shown for each lot type.
5. Data and servicesThe BBL identifier, the feature service catalog, and who reads each layer.
6. Build and deploymentThe Vite build, the IIS rules, and the Azure Pipelines channel.
7. Using the portalA 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

TermMeaning
BBLBorough-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.
BoroughNumeric code of the borough. On the forms the value runs from 1 to 9.
Tax lot / parcelThe tax lot drawn on the map. In the code it is queried by the BBL field.
Condo billing BBLThe condominium’s billing BBL (CONDO_BILLING_BBL). Units hang off that condominium.
Air lot / subterranean lotAir-rights lots (AIR_LOT_BBL) or subterranean lots (SUB_LOT_BBL), tied to a parent parcel (PARENT_BBL).
REUCAn appurtenant utility record attached to a parcel. It is identified by IDENT and SUBIDENT and related by APPURTENANT_BBL.
Feature serviceAn ArcGIS service that exposes layers and tables so the browser can query them.
Web mapA map published on the ArcGIS Online portal. The application loads one in 2D and another in 3D.

Scope

ItemWhat was reviewed
ApplicationCode in src/: routes, context, search and detail panels, map, and street viewer.
ConfigurationMap and service addresses in AppConfig.ts.
Deploymentvite.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

DateChange
29/09/2026First version.
29/09/2026Project goal placed at the start of the documentation.
29/09/2026Documentation translated to English.
29/09/2026Walkthrough of the public site, with screenshots from a recorded lookup.
29/09/2026Overview: data section on the national and local cadastral spatial-data infrastructure.

Diagrams

PIP (Property Information Portal) · System architectureOpen full screen ↗
Sequence of a BBL lookupOpen full screen ↗

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

LayerWhat it isWhere it lives
1. Web applicationThe interface: header, search or detail panel, and map.src/ — entry in main.tsx and composition in App.tsx
2. MapsA 2D map and a 3D scene published on the portal https://nyc.maps.arcgis.com.Identifiers in AppConfig.webmap2d and AppConfig.webmap3d
3. DataDaily tax map layers, assessments, exemptions, history, and 3D volumes.ArcGIS Online feature services and scene services (organization yG5s3afENB5iO9fj)
4. External systemsRegister 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:

StandardWhat it coversHow it appears in PIP
FGDC Cadastral Data Content StandardThe 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: CadastralHow 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.

  1. Form. SearchBBL builds 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.
  2. Navigation. If there is a result, the application opens /parcels/<type>/<bbl>. The type (unit, condo, air, sub, parcel, dropParcel, or dropCondo) decides which extra card is shown.
  3. Map. AppContext highlights the parcel on the map and, in 3D, filters the unit, air, and subsurface layers by the parent BBL.
  4. Detail panel. useDetails queries, in parallel, the detail layers, the assessment, the exemptions, the tax map history, and, through the portal proxy, the ACRIS documents.
  5. Presentation. DetailsPanelBBL splits that response across the cards of the detail panel.
Diagram: Sequence of a BBL lookup

Technology

ComponentDetail
ApplicationReact 18, TypeScript, and Vite 4. Routing with React Router 6. Styles with Reactstrap, Bootstrap 5, and styled-components.
MapsArcGIS Maps SDK for JavaScript 4.30 (@arcgis/core). The map starts in 2D and the user can switch to the 3D scene.
PortalArcGIS Online https://nyc.maps.arcgis.com. The OAuth application identifier is in AppConfig.auth; the current startup does not mount sign-in.
DataRead-only queries with query.executeQueryJSON and FeatureLayer.queryFeatures against ArcGIS Online feature services.
Street imageryCyclomedia Street Smart API, loaded in index.html. Coordinates in EPSG:26918.
RegisterACRIS, through https://propertyinformationportal.nyc.gov/proxy/proxy.ashx.
AnalyticsGoogle Analytics, tag in index.html.
HostingStatic 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. AppContext holds 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:

WidthWhat is visibleBehavior
Under 768 pxHeader, 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 moreHeader, 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.

RoutePanelWhat it is for
/SearchPanelSearch for a property.
/parcels/:type/:bblDetailsPanelBBLThe lot’s detail panel. type records how the BBL was resolved.
/block/:boro/:blockDetailsPanelBlockTax map history for a block.
/parcels/:boro/:block/:lotRedirectPanelExternal link. It builds the BBL and redirects to the detail panel of the matching type.
/cyclomedia/:x/:y/CyclomediaStreet-imagery viewer at those coordinates.
/qa/iframeArcGIS Dashboards quality panel.
/searchHistoryHistoryHistory 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:

DataWho writes itWho reads it
mapViewMap, once the view is readySearch, highlight, and map click
parcelLayerView, blockLayerViewMapController, when it resolves the web map layersBBL search and click
selectedParcelThe detail panel and the address searchCards, Cyclomedia, and the 3D filter
areasViews, selectedAreauseAreas3D layers for unit, air, subsurface, and building

Operations the context exposes:

  • updateSelectedParcel / updateSelectedParcelByBBL. Highlight the parcel and frame the map. In 3D they apply a definitionExpression to the volume layers so only what belongs to that BBL is drawn; if nothing is selected, the expression is 1=2 (nothing is drawn).
  • updateBlockHighLight. Finds the block (BORO and BLOCK) 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:

ViewItem idLayers the code names
2D255d7693e1f242139d35b8f626f07700Parcel (parcelLayer) and block (blockLayer), both from item 2cf51c5f165c4c569691617a492d9b21
3D608e246adb914558b9e4b04db520eb4aThe 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

Map — Map

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 disclaimerAccepted cookie. In the desktop layout of App.tsx the call is commented out, so it is not shown.

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.

ModeComponentDestination
Borough / Block / LotSearchBBL/parcels/<type>/<bbl>, after the BBL is classified
Borough / BlockSearchBlock/block/<borough>/<block> if the block exists in the historical library
AddressSearch widget inside SearchPanel/parcels/parcel/<bbl> of the parcel that contains the point, or the nearest one inside a 100-foot buffer
Condominium NumberSearchCondo/parcels/condo/<bbl>
REUC IdentSearchReuc/reuc/<borough>/<number> (route not mounted)
Air Lot NumberSearchAir/parcels/air/<bbl>
Subterranean Lot NumberSearchSub/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 typeWhat it resolves before drawingParcel selected on the map
parcelThe BBL itself on the parcel layerThat BBL
unitThe unit (UNIT_BBL) and the condominium it belongs toCONDO_BASE_BBL
condoThe condominium (CONDO_BILLING_BBL)CONDO_BASE_BBL
airThe air lot (AIR_LOT_BBL)PARENT_BBL
subThe subterranean lot (SUB_LOT_BBL)PARENT_BBL
dropParcelA BBL that is no longer on the current map but is in the change bookNo current geometry
dropCondoA condominium dropped from the daily condominium layerWhatever 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.

CardWhen it appearsData
Property InfoAlwaysAddress, owner, class, and borough-block-lot
BuildingAlwaysArea, floors, year, and units
Condocondo or unitCondominium number, suffix, and building units
Condo unitunitThe chosen unit and the unit list
REUCIf there are appurtenant recordsIdentifier, tax year, and appurtenant BBL
LandAlwaysFrontage, depth, area, and zoning
AssessmentsAlwaysMarket value and taxable assessed value, current year and history
ExemptionsAlwaysExemptions from EXDET_PIP_VIEW
SalesAlwaysACRIS documents of type sale
MortgagesAlwaysACRIS documents that are not sales
Tax Map HistoryAlwaysLibrary PDFs, change-book transactions, and historical books
NeighborhoodAlwaysCommunity 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

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

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:

FunctionServiceWhat it fills
queryPropertyDetailsDTM_ETL_DAILY_view layers 18, 19, and 3Address, building, land, and condominium table
queryAssessmentDetailsPROPMAST_HIST_VIEW/0Historical assessment series
queryAssessmentMainDetailsPROPMAST__VIEW/0Assessment for the current period
queryREUCDetailsDTM_ETL_DAILY_view/5Appurtenant REUC records that are not deleted
queryHistoryDetailsDTM_ETL_DAILY_view/8Map-library PDFs
queryHistoryHOTMClayers 9, 14, and 13Change-book transactions; for condominium units it filters on TRANS_NUM
queryHistoryHABDTM_ETL_DAILY_view/7Historical books
queryMoreDetailsEXDET_PIP_VIEW/0 and the ACRIS proxyExemptions, 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.

OrderQueryFieldRoute type
1DTM_ETL_DAILY_view/4UNIT_BBLunit
2DTM_ETL_DAILY_view/3CONDO_BILLING_BBLcondo
3DTM_ETL_DAILY_view/2AIR_LOT_BBLair
4DTM_ETL_DAILY_view/6SUB_LOT_BBLsub
5Map parcel layerBBLparcel
6DTM_ETL_DAILY_view/9BBLdropParcel
7DTM_ETL_DAILY_view/19PARIDdropCondo

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

ModeWhat it checksWhere it goes
AddressThe 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 clickA 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, subsurfaceThey search by number on the matching layer and navigate with that layer’s BBL.condo, air, or sub
BlockChecks that the borough and block exist in the historical library (DTM_ETL_DAILY_view/7)./block/<borough>/<block> and a highlight of the block
REUCSearches by identifier./reuc/…, route not mounted

What the detail panel does when it opens

  1. It compares :type and :bbl on the route with the last values already loaded. If they have not changed, it does not query again.
  2. Depending on the type, it obtains the parent parcel (see the table in 3. Components) and calls updateSelectedParcelByBBL.
  3. It calls queryMain with the detail-panel BBL (the unit’s BBL, if the type is unit).
  4. It requests the neighborhood, the associated property types, and, for condominiums, the unit list (CONDO_BASE_BBL_KEY, excluding rows with CINC_PARENT).
  5. It projects the parcel geometry to EPSG:26918 so Cyclomedia can be opened.
  6. 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.webmap3dFeature fieldParent-parcel field
unitLayer, unitExtrusionLayerUNIT_BBLBASE_BBL
airLayerAIR_LOT_BBLPARENT_BBL
airMultipatchLayerAIR_LOT_BBLPARENT_BBL
subLayerSUB_LOT_BBLPARENT_BBL
subMultipatchLayerSUB_LOT_BBLPARENT_BBL
buildingLayerBBL_TEXTBBL_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. HeaderCard opens a window with the panel HTML and calls window.print().
  • Property tax account. Several cards and the search panel link to a836-pts-access.nyc.gov with the BBL as pin and jur=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:

FieldWhere it appearsWhat it identifies
BBLWeb map parcel layer, change bookCurrent or historical lot
PARIDDaily detail layers, assessment, exemptionsThe same BBL on the property views
CONDO_BILLING_BBLCondominium layerCondominium billing BBL
CONDO_BASE_BBLCondominium layerParcel the condominium sits on
UNIT_BBLCondominium unitsThe unit’s BBL
AIR_LOT_BBL, SUB_LOT_BBLAir and subterranean lotsThe special lot
PARENT_BBLAir and subterranean lotsParcel they hang from
APPURTENANT_BBLREUCParcel 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).

LayerName in AppConfigUsed by
0details.taxLotDefined; the current parcel is read from the web map layer
1details.taxBlockDefined in configuration
2propertyServices.airAir-lot search and detail panel
3propertyServices.condo and details.condoServiceCondominiums and the detail-panel table
4propertyServices.condoUnitUnits
5propertyServices.reucREUC records for the parcel
6propertyServices.subSubterranean lots
7maplibrary_habHistorical books and the block existence check
8maplibrary_mapMap-library PDFs
9v_dab_book_headerChange book and dropped lots
10–12, 15–17v_dab_air, v_dab_block, v_dab_boundary, v_dab_lot, v_dab_reuc, v_dab_subDefined in configuration
13v_dab_condoTransaction numbers for a condominium
14v_dab_condo_unitTransaction numbers for a unit
18details.dailyDescServiceDaily record: address, building, and land
19details.dailyCondoServiceCondominium detail and dropped condominiums

Other ArcGIS Online services

ServiceLayerUsed forFilter
EXDET_PIP_VIEW0ExemptionsPARID
PROPMAST__VIEW0Current assessmentPARID
PROPMAST_HIST_VIEW0Historical assessment series, ordered by TAXYR DESCPARID
MapPLUTO_View0NeighborhoodBoroCode and Block
DTM_3D_view1, 2, and 4Air, unit, and subsurface volumesEach layer’s BBL field
AIR_LOT_3DSceneServer 0Air-lot meshAIR_LOT_BBL
SUB_LOT_3DSceneServer 0Subterranean-lot meshSUB_LOT_BBL
Buildings3D_ElevationPackageSceneServer 0BuildingsBBL_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

GroupReadersDoes the application write
Map parcel and blockSearchBBL, SearchPanel (address), Map, AppContextNo
Daily record (layer 18)useDetails.queryPropertyDetails, queryBuildingDetails, queryCondoDetailsNo
Condominium, unit, air, subsurface, REUCThe specific searches, RedirectPanel, queryPropertyTypes, queryREUCDetailsNo
AssessmentqueryAssessmentDetails, queryAssessmentMainDetailsNo
ExemptionsqueryMoreDetailsNo
Tax map historyqueryHistoryDetails, queryHistoryHOTMC, queryHistoryHAB, useDetailsBlock, HistoryNo
3D volumesuseAreasNo. It only changes the layer’s definitionExpression on the client
ACRISqueryMoreDetailsNo

These destinations open in another tab. They do not return data to the application:

DestinationFrom
a836-pts-access.nyc.gov (property tax account, with pin = BBL)TaxCard, ReucCard, search panel
a836-citypay.nyc.govTaxCard (Pay online)
a836-pts-efile.nyc.gov and nyc.gov/site/finance pagesHeader
ArcGIS Dashboards panel (nyc.maps.arcgis.com/apps/dashboards/…)Route /qa/
Map Tool experienceHeader

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

ItemValue
Package namenyc_webapp
Scriptsnpm run dev (Vite), npm run build (tsc and then vite build), npm run preview
Entryindex.html loads /src/main.tsx
Base<base href="/" />. The production and staging bases are commented out in the same file
Outputdist/ 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:

  1. HTTPS. Redirects any HTTP request to HTTPS.
  2. 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/1000160001 reaches the application and React Router resolves the detail panel.
  3. Headers. Removes X-Powered-By and Server, and adds X-Frame-Options: SAMEORIGIN, Referrer-Policy: no-referrer, and Access-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:

  1. Installs Node.js 18.
  2. Configures the Font Awesome registry (the pro icons are not on the public registry).
  3. Runs npm install and npm 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:

FootprintProduction (active)Alternative, commented out
HTML base/https://propertyinformationportal.nyc.gov/ and https://propertyinformationportal-stg.nyc.gov/
ACRIS proxypropertyinformationportal.nyc.govpropertyinformationportal-stg.nyc.gov
AnalyticsG-LEFZ7Y5WC6G-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.

Find a Property, with the tax map of the city on the right
Find a Property. The map starts at the city extent. The blue tab on the panel edge hides the panel.

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.

Borough, block, and lot filled in, with the pointer on Search
Manhattan, block 1010, lot 1816, ready to search.

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.

Property details for unit PH20, with the condominium lot highlighted on the tax map
Unit PH20 (lot 1816) on block 1010. The map highlights the condominium lot the unit belongs to.

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.

Cyclomedia street panorama looking along West 57th Street
Street-level view opened from the detail panel. The date control is in the upper left of the panorama.

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.

Unit floor plan, image 2 of 2, under the property header
Floor plan of unit PH20.

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.

Land and assessment cards, with the assessed-value history table
Assessment for the 2025/26 year, and the historical series.

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.

Mortgages, liens, and other recorded documents
Recorded documents for the same borough, block, and lot.

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.

Tax map history and the neighborhood card
History of the block’s tax map, and the neighborhood districts for block 1010.

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.

Unit list open on PH20, listing units and their tax lots
The unit list. The search box at the top filters by unit id.

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.

3D scene of the condominium, with unit 11A outlined in green
Unit 11A (lot 1803) outlined on the building. The button now reads 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.

Layer list open over the 3D scene
The two footprint layers. The eye on the right hides or shows a layer.

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.

3D scene with the detail panel hidden and one unit outlined in green
Panel hidden. The green outline is the unit selected on the detail panel (here, unit 14S, lot 1811).

Components

Updated 29/09/2026.

Paths relative to src/.

PieceFileResponsibility
Startupmain.tsxBrowserRouter and AppContextProvider
CompositionApp.tsxRoutes, mobile and desktop layout
Contextcontext/AppContext.tsxView, parcel, highlight, and 3D filter
3D areashooks/useAreas.tsxUnit, air, subsurface, and building layers
Mapcomponents/Map/Map.tsx2D/3D web map and click
Map controlcontext/MapController.tsLocates the parcel and block layers
Headercomponents/Header/Header.tsxBranding and external links
Searchcomponents/panels/SearchPanel/Seven search modes
Detail panelcomponents/panels/DetailsPanelBBL/Lot cards
Detail datahooks/useDetails.tsxQueries to feature services and ACRIS
Blockcomponents/panels/DetailsPanelBlock/History for one block
Block datahooks/useDetailsBlock.tsxThree history queries
External linkcomponents/panels/RedirectPanel/RedirectPanel.tsxClassifies a BBL that arrived by URL
Historycomponents/History/History.tsxFree lookup by borough and block
Streetcomponents/Cyclomedia/Cyclomedia.tsxStreet Smart panorama
Accountshooks/useAccountManager.tsArcGIS sign-in, not mounted
Configurationconstants/AppConfig.tsMaps, services, and portal

Detail-panel cards, in components/panels/DetailsPanelBBL/Cards/:

CardMounted in the panel
HeaderCardYes
PropertyInfoCardYes
BuildingCardYes
CondoCardYes, if the type is condo or unit
CondoUnitCardYes, if the type is unit
ReucCardYes, if there are records
LandCardYes
AssessmentCardYes
ExcemptiosCardYes
SalesCardYes
MortgagesCardYes
HistoryCardYes
NeighborhoodCardYes
LoadingCardYes, through Loading
TaxCardNo
LibraryCardNo
HeaderREUCCardNo

Routes

Updated 29/09/2026.

RouteId in AppRoutesMounted in App.tsxComponent
/searchYesSearchPanel
/parcelsparcelsNo—
/parcels/:type/:bblparcelYesDetailsPanelBBL
/block/:boro/:blockblockYesDetailsPanelBlock
/parcels/:boro/:block/:lotparcelExternYesRedirectPanel
/reuc/:boro/:reucNumberreucNoThe REUC search navigates here
/history/:type/:bblparcelNo—
/cyclomedia/:x/:y/cyclomediaYesCyclomedia
/qa/qaYesQuality-dashboard iframe
/searchHistoryhistoryDesktop onlyHistory

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

KeyTypeItem id
webmap2d2D255d7693e1f242139d35b8f626f07700
webmap3d3D608e246adb914558b9e4b04db520eb4a

Portal: https://nyc.maps.arcgis.com.

DTM_ETL_DAILY_view

LayerKeyPrimary search field
0details.taxLot—
1details.taxBlock—
2propertyServices.airAIR_LOT_BBL, PARENT_BBL
3propertyServices.condoCONDO_BILLING_BBL, CONDO_BASE_BBL
4propertyServices.condoUnitUNIT_BBL, CONDO_BASE_BBL_KEY
5propertyServices.reucAPPURTENANT_BBL
6propertyServices.subSUB_LOT_BBL, PARENT_BBL
7maplibrary_habBOROUGH, BLOCK
8maplibrary_mapBOROUGH, BLOCK
9v_dab_book_headerBBL, Borough, Block
10v_dab_air—
11v_dab_block—
12v_dab_boundary—
13v_dab_condoBorough, Block, Condo_Number
14v_dab_condo_unitBorough, Block, Condo_Unit
15v_dab_lot—
16v_dab_reuc—
17v_dab_sub—
18details.dailyDescServicePARID
19details.dailyCondoServicePARID

Other services

ServiceLayerKeyField
EXDET_PIP_VIEW0details.extraServices (exdet)PARID
PROPMAST__VIEW0details.propmastPARID
PROPMAST_HIST_VIEW0details.propmastHistPARID
MapPLUTO_View0details.neighborhoodServiceBoroCode, Block
DTM_3D_view2webmap3d.unitLayerUNIT_BBL, BASE_BBL
DTM_3D_view1webmap3d.airLayerAIR_LOT_BBL, PARENT_BBL
DTM_3D_view4webmap3d.subLayerSUB_LOT_BBL, PARENT_BBL
AIR_LOT_3DSceneServer 0webmap3d.airMultipatchLayerAIR_LOT_BBL
SUB_LOT_3DSceneServer 0webmap3d.subMultipatchLayerSUB_LOT_BBL
Buildings3D_ElevationPackageSceneServer 0webmap3d.buildingLayerBBL_TEXT

Outside ArcGIS

SystemURL the code uses
ACRIS proxyhttps://propertyinformationportal.nyc.gov/proxy/proxy.ashx toward a836-acrissds.nyc.gov
Cyclomedia Street SmartScript in index.html (streetsmart.cyclomedia.com) and the Atlas API in Cyclomedia2D
Property tax accounthttps://a836-pts-access.nyc.gov/care/…
Paymenthttps://a836-citypay.nyc.gov/
Quality dashboardhttps://nyc.maps.arcgis.com/apps/dashboards/d424a17b7c2a4ed89164eddab262c501