# Cenogram > Cenogram provides access to 8M+ Polish real estate transactions from the national price registry (Rejestr Cen Nieruchomości / RCN) - prices recorded in notarial deeds, not asking prices from listings. Coverage spans the whole country from 2003, refreshed roughly every two weeks. Used by property appraisers (rzeczoznawcy majątkowi), real estate agents, buyers, and investors for market analysis, comparable transaction search, and professional appraisal reports (operaty szacunkowe). A listing price is what somebody wanted for a property; a notarial deed records what they actually got for it. Cenogram aggregates the second kind. The platform offers map-based search with filters for property type, market segment (primary/secondary), transaction date, area, and price. Results can be exported in professional formats used by Polish property appraisers: Walor CSV, ZAWAM XLSX, and S79-compliant XLS. Key facts: - 8M+ property transactions across all 380 Polish counties (powiaty) - Data from 2003 to present, refreshed roughly every two weeks from the RCN registry - Covers: lokale mieszkalne (residential apartments), grunty niezabudowane (undeveloped land), grunty zabudowane (developed land), budynki (buildings) - Per-property context layers: flood risk, landslide risk, heritage register, zoning, building permits, public transport, surrounding land use, agricultural classification - Export formats: Walor CSV, ZAWAM XLSX, S79-compliant XLS (Polish appraiser standards) ## MCP Server (Model Context Protocol) Polish real estate transaction prices from notarial deeds, not listings - available to any AI assistant over MCP, with OAuth 2.1 authentication. - MCP server page (setup, tools, config): https://cenogram.pl/en/mcp (Polish: https://cenogram.pl/mcp) - carries step-by-step connection instructions for Claude, ChatGPT and Grok - Streamable HTTP endpoint: https://mcp.cenogram.pl/mcp - NPM (stdio): `npx @cenogram/mcp-server` - Repository: https://github.com/cenogram/mcp-server - Authentication: API key (`X-Api-Key` header or `Authorization: Bearer`) or OAuth 2.1 with dynamic client registration - Get an API key: https://cenogram.pl/api?src=llmstxt - 20+ tools, including: - `search_transactions`: search 8M+ transactions by location, property type, price range, date range, area - `search_by_area`: geographic radius search with lat/lng coordinates - `search_by_polygon`: search inside an arbitrary GeoJSON polygon - `get_price_statistics`: price per m² statistics by location - `get_price_distribution`: price histogram showing market price structure - `get_market_overview`: database overview - total count, date range, top locations, breakdowns - `compare_locations`: side-by-side price comparison across locations - `estimate_value`: comparable-sales value estimate for a property - `list_locations`: browse ~3,000 cities and districts with search - `resolve_parcel`: resolve a cadastral parcel identifier to its canonical record - `get_parcel_report`: full report for a single cadastral parcel - `get_transaction_flood`, `get_transaction_landslide`, `get_transaction_heritage`, `get_transaction_planning`, `get_transaction_permits`, `get_transaction_transit`, `get_transaction_surroundings`, `get_transaction_farmland`: per-property risk, zoning and context layers - `get_demographics`, `get_infrastructure_signals`, `get_building_breakdown`: location context ## API Access - [Machine-readable API reference](https://cenogram.pl/api/llms.txt): every endpoint with its parameters, token cost and refund rules, in one plain-text file. Start here if you are integrating. - [API Documentation & Developer Portal](https://cenogram.pl/api?src=llmstxt): REST API with 30+ endpoints for property transaction data - [OpenAPI 3.1 specification](https://cenogram.pl/api/docs/json): the full machine-readable contract - [Interactive documentation](https://cenogram.pl/api/docs): Swagger UI - it renders in a browser, so fetching this URL with a script returns an empty application shell; use the two links above instead - [Per-dataset catalogue](https://cenogram.pl/dane): one page per dataset available for a single parcel, each with its response fields, a runnable example call and its token cost - [Building permits API (GUNB register)](https://cenogram.pl/dane/gunb): building permits with an issued decision and notifications accepted without objection, registered since 2016, keyed by the parcel's current cadastral identifier. GET /api/v1/parcels/{id}/permits returns record kind (permit/notification), works type, statutory object category, decision and intake dates, deciding authority, investment address and volume, as JSON - [General zoning plan API (POG, municipal general plans)](https://cenogram.pl/dane/pog): planning zones and the building limits a municipality's general plan sets for a given parcel. GET /api/v1/parcels/{id}/planning returns zone symbol and name, share of the parcel covered, maximum building height, development intensity, built-up coverage and minimum biologically active area, plus the date the plan took effect. Coverage follows the municipality, not the parcel: a general plan covers the whole municipality by statute, so an empty answer usually means the municipality's plan is not in the set yet - [Flood hazard map API (MZP)](https://cenogram.pl/dane/mzp): whether a parcel intersects a mapped flood hazard zone and under which scenario. GET /api/v1/parcels/{id}/flood returns a risk category (1-in-10, 1-in-100, 1-in-500 year), the worst scenario, hazard source (river, coastal, hydraulic-structure failure), the share of the parcel inside the worst zone, and every scenario touching it. MZP is a flood hazard map and is unrelated to MPZP, the local land-use plan, whose land-use designations are not in this dataset - [Monument register API (NID)](https://cenogram.pl/dane/nid): whether a parcel carries an entry in the register of immovable monuments, either as an object on the parcel or as land inside a protected area. GET /api/v1/parcels/{id}/heritage returns protection status (listed or zone), the share of the parcel inside protected areas, the number of matched entries and, for each, its category, name, function, dating and register entry date. This is the statutory register, not a municipal monument record - [Landslide hazard API (SOPO)](https://cenogram.pl/dane/sopo): whether a parcel intersects a mapped landslide or a terrain classed as threatened by mass movement. GET /api/v1/parcels/{id}/landslide returns the hazard class (mapped landslide or threatened terrain), the share of the parcel inside the heavier class, and every matched extent with its kind and source version date. Field mapping concentrated on the mountainous south and the dataset carries no layer saying where mapping was done, so an empty answer outside those regions does not settle whether the ground is stable - [Mining terrains and groundwater API (MIDAS, GZWP)](https://cenogram.pl/dane/midas-gzwp): whether a parcel sits over a licensed mining terrain or a major groundwater reservoir. GET /api/v1/parcels/{id}/subsurface returns mining status (active or expired), mineral class (surface extraction or subsidence-prone underground), overlap share and the matched terrains with their supervising mining authority and expiry dates, plus groundwater status, overlap share and the matched reservoirs with their type, depth to the top and year of documentation. The reservoir extent says where the resource lies, not what legal regime applies to the parcel: statutory protection areas are a separate dataset and are not included - [Nuisance surroundings API (BDOT10k)](https://cenogram.pl/dane/bdot10k): how far a parcel is from the nearest cemetery, landfill, sewage treatment plant, industrial or warehouse area, large industrial plant and intensive livestock farm. GET /api/v1/parcels/{id}/surroundings returns one distance in metres per category, measured from the parcel boundary. Each category has its own search radius, so a null distance means nothing of that kind within that radius rather than nothing anywhere - [Building attributes API](https://cenogram.pl/dane/budynki): what stands on a parcel. GET /api/v1/parcels/{id}/buildings returns one row per building with its footprint area, the share of the building lying on this parcel, storey count, an estimated total floor area, its function category and whether it exists, is under construction or has been demolished. Each row also carries an age estimate that names its own uncertainty: a year range with a confidence level where one can be derived, and an explicit reason where it cannot - [Public transport access API (GTFS)](https://cenogram.pl/dane/gtfs): how far a parcel is from the nearest rail, metro, tram and bus stop. GET /api/v1/parcels/{id}/transit returns a distance in metres and the stop name for each mode. Rail is national; metro, tram and bus come from municipal feeds covering a subset of cities, so a missing mode can mean either no stop nearby or no feed for that city - [Parcel lookup API (cadastral identifiers)](https://cenogram.pl/dane/uldk): how to turn a place name plus a plot number, a point on the map, or a full cadastral identifier into one specific parcel. GET /api/v1/parcels/resolve takes exactly one lookup mode and returns the matching parcels with their identifier in both spellings (slash for reading, dash for URLs), area, district, county code and centroid. The identifier it returns is the key every other layer here is addressed by. A lookup that matches nothing is refunded - [Municipal demographics and economy API (GUS BDL)](https://cenogram.pl/dane/gus-bdl): population, unemployment, household incomes, housing completions and planning coverage for the municipality or county around a property. GET /api/v1/demographics takes a place name or a TERYT code and returns each indicator with its unit, year, category and the administrative level it was published at. A place name resolves to the county, so municipal figures need a TERYT code; one answer mixes levels, and comparing an indicator published at voivodeship level with one published at municipal level is a conclusion about nothing. This is the only dataset here keyed by area rather than by parcel - [Property list enrichment](https://cenogram.pl/wzbogacanie-danych): send a spreadsheet of properties identified by full cadastral (EGiB) parcel numbers and get it back with added columns - comparable transaction prices, zoning designations, flood and landslide exposure, heritage protection, building permits, utility access, transport distance, on-parcel buildings, land classification, mining terrain and water proximity. A one-off, human-reviewed service, not a self-serve API endpoint - [TERYT administrative division codes API](https://cenogram.pl/dane/teryt): the codes for voivodeship, county, municipality and cadastral precinct that address every other route here. GET /api/v1/locations takes a parent code and returns the units one level down: a voivodeship code returns counties, a county code returns municipalities, a municipality code returns precincts. Each unit carries its code, name, unit type and level. This is a division to descend by code, not the full TERYT register - no localities, streets or code-change history, and precincts are not part of TERYT itself (they come from the cadastral register the starosta keeps). Outside the data gate, no API key required - [Nature protection and forest API (CRFOP, Bank Danych o Lasach)](https://cenogram.pl/dane/przyroda): which nature-protection forms cover a parcel and how far it is from the nearest forest. GET /api/v1/parcels/{id}/nature returns the distance to the nearest forest within 2 km (0 = the parcel outline touches or overlaps forest, so a 0 distance can still carry a near-zero overlap share) and the share of the parcel under forest; the sharpest protection rank (national park, nature reserve, Natura 2000 site, landscape park, protected landscape, and a buffer zone around a park or reserve, which is reported but is not itself a form of protection), a build-restriction flag saying whether the ban follows straight from the Nature Protection Act or depends on the act establishing the area, the combined share of the parcel under protection, and up to five named protected areas. An empty answer is never a statement that building is allowed: local land-use plans, planning-permission decisions and areas still being designated are not in this dataset. Forest coverage is mainly publicly-managed land, so private forests may be incomplete - Base URL: https://cenogram.pl/api/v1/ - Authentication: X-Api-Key header - Key endpoints: - GET /api/v1/transactions - search with filters (location, price, date, area, property type) - GET /api/v1/stats - market overview (total transactions, breakdowns) - GET /api/v1/price-per-m2 - price statistics by district - GET /api/v1/districts - location autocomplete (~3,000 cities and districts) - POST /api/v1/transactions/spatial - polygon search (GeoJSON) - GET /api/v1/transactions/map - GeoJSON point features for map visualization ## Property Prices by City - [Property Prices in Poland](https://cenogram.pl/ceny): Index page with all cities and regions - [Warsaw (Warszawa)](https://cenogram.pl/ceny/warszawa): Capital city, largest market - [Kraków](https://cenogram.pl/ceny/krakow): Second-largest city - [Wrocław](https://cenogram.pl/ceny/wroclaw): Major metropolitan area - [Gdańsk](https://cenogram.pl/ceny/gdansk): Tri-City region - [Poznań](https://cenogram.pl/ceny/poznan): Western Poland hub - [Łódź](https://cenogram.pl/ceny/lodz): Central Poland - [Katowice](https://cenogram.pl/ceny/katowice): Silesia region - [Warsaw Mokotów](https://cenogram.pl/ceny/warszawa/mokotow): Most popular Warsaw district - [Warsaw Śródmieście](https://cenogram.pl/ceny/warszawa/srodmiescie): City center district ## Use Cases - Property appraisal (operat szacunkowy): find comparable transactions and export to Walor, ZAWAM, S79 formats required by Polish appraisal standards - Market research: analyze transaction price trends by location, property type, and time period - Investment analysis: compare prices across districts, identify undervalued areas - Due diligence: verify actual transaction prices vs listing prices for any Polish property market - AI agents: ground an assistant in recorded Polish transaction data instead of scraped listing estimates ## Optional - [Pricing](https://cenogram.pl/api?src=llmstxt#cennik): free trial, then a free tier with weekly limits or a single subscription (no limits) covering both the web search and API/MCP access - [Atom Feed](https://cenogram.pl/feed.xml): Latest price data updates - [Interactive Map Search](https://cenogram.pl/ceny-transakcyjne): Full-featured transaction explorer with polygon search, filters, and map visualization - [GML to Excel converter](https://cenogram.pl/konwerter-gml?src=llmstxt): free, account-less browser tool that turns a county's GML export from the RCN registry into an XLSX spreadsheet with correct deed dates and area units - the file is processed locally and never leaves the browser