@cenogram/mcp-server 0.5.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,9 +4,9 @@
4
4
  [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
6
 
7
- **Polish Real Estate Transaction Data for AI**
7
+ **Polish Real Estate Transaction & Parcel Data for AI**
8
8
 
9
- MCP server for Polish real estate data. Access 8M+ real estate transactions from the national Registry of Prices and Values (Rejestr Cen Nieruchomosci, RCN) directly from Claude, Cursor, or any MCP-compatible AI assistant.
9
+ MCP server for Polish real estate data. Access 8M+ real estate transactions from the national Registry of Prices and Values (Rejestr Cen Nieruchomosci, RCN) - prices from notarial deeds, not listings - directly from Claude, Cursor, ChatGPT, Grok, or any MCP-compatible AI assistant. Beyond transaction prices, the server resolves cadastral parcels and adds per-parcel context: zoning, flood and landslide risk, heritage register, building permits and construction activity, public transport access, agricultural land classification, surrounding land use, nature - nearby forest and overlapping protected areas - what lies underground (mining terrains and major groundwater reservoirs), the land-use and soil-quality classification, and road access.
10
10
 
11
11
  Data source: Polish national RCN registry (Rejestr Cen Nieruchomosci) | Platform: [cenogram.pl](https://cenogram.pl?src=mcpstdio)
12
12
 
@@ -18,6 +18,18 @@ Data source: Polish national RCN registry (Rejestr Cen Nieruchomosci) | Platform
18
18
 
19
19
  Manage your keys at [cenogram.pl/ustawienia](https://cenogram.pl/ustawienia).
20
20
 
21
+ ### Free tier
22
+
23
+ New accounts start with 1,000 tokens and a 14-day trial of the Standard plan. After that the key keeps
24
+ working on 50 tokens a week - the balance is restored to 50 every 7 days rather than accumulating -
25
+ with no expiry date and no card.
26
+
27
+ A call costs 1 token for statistics, reference data, parcel identity and municipal context; 2 for a
28
+ transaction search, a price histogram or a list of the parcels in an area; 4 for one context layer of
29
+ a parcel or transaction; 5 for spatial search, parcel outlines, valuation and a multi-district
30
+ comparison; 45 for `get_parcel_report`, which returns every layer at once. Location catalogues are
31
+ free. Paid plans raise the allowance - see [cenogram.pl/api](https://cenogram.pl/api?src=mcpstdio#cennik).
32
+
21
33
  ## Installation
22
34
 
23
35
  Pick your client. All options below use the hosted server - no local install needed (except npx/stdio).
@@ -193,7 +205,8 @@ You can also use the `--http` CLI flag instead of `MCP_TRANSPORT=http`.
193
205
  **Polish:**
194
206
  - "Jaka jest mediana cen mieszkan w Krakowie w 2025?"
195
207
  - "Pokaz transakcje z ulicy Pulawskiej 15 na Mokotowie"
196
- - "Znajdz transakcje na dzialce 146518_8.0108.27"
208
+ - "Znajdz transakcje na dzialce 126104_9.0015.201"
209
+ - "Sprawdz plan miejscowy i ryzyko powodziowe dla dzialki 126104_9.0015.201"
197
210
  - "Znajdz transakcje gruntow w promieniu 5km od centrum Wroclawia powyzej 500 000 PLN"
198
211
  - "Porownaj ceny mieszkan na Mokotowie i Woli"
199
212
  - "Pokaz rozklad cen nieruchomosci w Polsce"
@@ -201,7 +214,8 @@ You can also use the `--http` CLI flag instead of `MCP_TRANSPORT=http`.
201
214
  **English:**
202
215
  - "What's the median apartment price in Krakow in 2025?"
203
216
  - "Show transactions at Pulawska 15 in Mokotow"
204
- - "Find all transactions on parcel 146502_8.0901.12 and then search nearby"
217
+ - "Find all transactions on parcel 126104_9.0015.201 and then search nearby"
218
+ - "Check the zoning and flood risk for parcel 126104_9.0015.201"
205
219
  - "Find land transactions within 5km of Wroclaw center above 500,000 PLN"
206
220
  - "Compare apartment prices in Mokotow and Wola districts"
207
221
  - "Show the price distribution of real estate in Poland"
@@ -213,15 +227,16 @@ You can also use the `--http` CLI flag instead of `MCP_TRANSPORT=http`.
213
227
  | `search_transactions` | Search transactions with filters | location, street, buildingNumber, parcelId, propertyType, marketType, price/date/area range |
214
228
  | `get_price_statistics` | Price/m2 stats by location (residential only) | location (optional) |
215
229
  | `get_price_distribution` | Price histogram | bins, maxPrice |
216
- | `search_by_area` | Search by geographic radius | latitude, longitude, radiusKm |
230
+ | `search_by_area` | Search transactions by geographic radius | latitude, longitude, radiusKm |
217
231
  | `get_market_overview` | Database overview and stats | (none) |
218
232
  | `list_locations` | List available locations | search (optional) |
219
233
  | `search_parcels` | Search parcels by cadastral ID prefix | q (parcel ID prefix, min 3 chars) |
220
- | `search_by_polygon` | Search within a GeoJSON polygon | polygon, propertyType, dateFrom/dateTo |
234
+ | `list_parcels_in_area` | List the cadastral parcels in an area - light list or full outlines | teryt, location, bbox, lat + lng + radiusKm, or polygon; includeGeometry, minArea/maxArea, street/buildingNumber, cursor |
235
+ | `search_by_polygon` | Search transactions within a GeoJSON polygon | polygon, propertyType, dateFrom/dateTo |
221
236
  | `compare_locations` | Compare stats across 2-5 districts | districts (comma-separated), propertyType |
222
237
  | `get_building_breakdown` | Per-building breakdown for one transaction (footprint, storeys, est. floor area) | transaction_id (UUID from a search result) |
223
- | `get_parcel_report` | Composite dossier for one parcel: core, 9 enrichment layers, transaction history, local price context and municipal context | parcelId (cadastral id or UUID) |
224
- | `resolve_parcel` | Resolve a cadastral parcel identifier to its canonical record | parcelId or q (id prefix), or lat + lng |
238
+ | `get_parcel_report` | Composite dossier for one parcel: core, 13 enrichment layers, transaction history, local price context and municipal context | parcelId (cadastral id or UUID) |
239
+ | `resolve_parcel` | Resolve a parcel to its cadastral identity | parcelId, q (full cadastral id or 'locality + parcel number' - not a street address), or lat + lng |
225
240
  | `get_demographics` | Population and demographic context for a location | location or teryt, year (or yearFrom/yearTo), category |
226
241
  | `get_infrastructure_signals` | Municipal infrastructure signals (tenders, utilities, capital spending) | location or teryt |
227
242
  | `estimate_value` | Comparable-sales value estimate for a property | area, plus lat + lng or parcelId; rooms, market |
@@ -233,6 +248,9 @@ You can also use the `--http` CLI flag instead of `MCP_TRANSPORT=http`.
233
248
  | `get_transaction_permits` | Building permits recorded for the property | transaction_id |
234
249
  | `get_transaction_planning` | Local zoning and planning status for the property | transaction_id |
235
250
  | `get_transaction_farmland` | Agricultural land-use classification for the property | transaction_id |
251
+ | `get_transaction_nature` | Nearby forest and overlapping protected natural areas for the property | transaction_id |
252
+ | `get_transaction_subsurface` | Mining terrains and major groundwater reservoirs under the property | transaction_id |
253
+ | `get_transaction_roads` | Geometric evidence of road access for the property (distances, road class, access indicator) | transaction_id |
236
254
 
237
255
  ### Location naming
238
256
 
@@ -264,12 +282,24 @@ Results include parcel IDs and GPS coordinates, enabling multi-step research:
264
282
 
265
283
  This mimics how a property appraiser finds comparable transactions for valuation reports.
266
284
 
285
+ Starting from the land rather than from a deed is a different route:
286
+
287
+ ```
288
+ 1. List the parcels -> list_parcels_in_area(location="Wawer", minArea=800)
289
+ 2. Draw the ones you want -> list_parcels_in_area(bbox="21.10,52.20,21.14,52.23", includeGeometry=true)
290
+ 3. Open one in full -> get_parcel_report(parcelId="146518_8.0108.27")
291
+ ```
292
+
293
+ Step 1 pages by cursor; step 2 is capped and usually truncated, so narrow the box rather than reading
294
+ a truncated answer as the parcel list of the area.
295
+
267
296
  ## Data
268
297
 
269
298
  - **8M+ transactions** from all of Poland (380 counties)
270
299
  - **Date range:** 2003 - present
271
300
  - **Source:** Polish national RCN registry (Rejestr Cen Nieruchomosci)
272
301
  - **Refresh:** periodic updates from RCN
302
+ - **Per-parcel context:** zoning, flood and landslide risk, heritage register, building permits and construction activity, transit access, agricultural land use, surroundings, nature (nearby forest and protected areas), subsurface (mining terrains and major groundwater reservoirs), land-use and soil-quality classification, and road access - addressable by cadastral ID
273
303
 
274
304
  ## Troubleshooting
275
305
 
@@ -281,6 +311,8 @@ This mimics how a property appraiser finds comparable transactions for valuation
281
311
 
282
312
  **401 Unauthorized (HTTP mode)** - The `Authorization` header must be `Bearer cngrm_...` (with the `Bearer` prefix). Double-check that the full API key is included, not just the prefix.
283
313
 
314
+ **402 Payment Required** - The account is out of tokens. On a free account the response says the date from which the balance is back at its weekly 50; the key and the connection stay valid until then. A paid plan lifts the limit - see [cenogram.pl/api](https://cenogram.pl/api?src=mcpstdio#cennik).
315
+
284
316
  ## Development
285
317
 
286
318
  ```bash
@@ -1,3 +1,4 @@
1
+ import { type AuthMode } from "./error-messages.js";
1
2
  export interface StatsResponse {
2
3
  counts: {
3
4
  transactions: number;
@@ -338,6 +339,7 @@ export declare function getInfrastructureSignals(params: {
338
339
  export interface CreditInfo {
339
340
  balance: number;
340
341
  cost: number;
342
+ refunded?: number;
341
343
  }
342
344
  export interface ApiResponse<T> {
343
345
  data: T;
@@ -351,6 +353,19 @@ export declare function decodeOAuthCtx(key: string): {
351
353
  } | null;
352
354
  export declare function parseRetryAfterSeconds(headerValue: string | null | undefined): number | null;
353
355
  export declare function formatRetryAfter(seconds: number): string;
356
+ export declare class ApiHttpError extends Error {
357
+ readonly status: number;
358
+ readonly code: string | undefined;
359
+ readonly authMode: AuthMode;
360
+ readonly retryAfterSeconds: number | undefined;
361
+ constructor(message: string, opts: {
362
+ status: number;
363
+ code?: string | undefined;
364
+ authMode: AuthMode;
365
+ retryAfterSeconds?: number | undefined;
366
+ });
367
+ }
368
+ export declare function isExpectedApiError(error: unknown): boolean;
354
369
  export declare function fetchApi<T>(path: string, params?: Record<string, string>, apiKey?: string): Promise<ApiResponse<T>>;
355
370
  export declare function fetchApiPost<T>(path: string, body: unknown, apiKey?: string): Promise<ApiResponse<T>>;
356
371
  export declare function getStats(apiKey?: string): Promise<ApiResponse<StatsResponse>>;
@@ -379,6 +394,10 @@ export interface TransactionParams {
379
394
  floodRisk?: string;
380
395
  heritageStatus?: string;
381
396
  landslideRisk?: string;
397
+ landUse?: string;
398
+ buildingStoreys?: string;
399
+ minFootprintArea?: number;
400
+ maxFootprintArea?: number;
382
401
  limit?: number;
383
402
  page?: number;
384
403
  sort?: string;
@@ -405,6 +424,51 @@ export declare function getPriceSpread(params: {
405
424
  export declare function getPriceSpreadLocations(params: {
406
425
  search?: string;
407
426
  }, apiKey?: string): Promise<ApiResponse<PriceSpreadLocationsResponse>>;
427
+ export interface FloodRiskResponse {
428
+ location: LocationRef;
429
+ metric: "flood_exposure_share";
430
+ result: {
431
+ flood_share_pct: number | null;
432
+ by_severity: {
433
+ low: number | null;
434
+ medium: number | null;
435
+ high: number | null;
436
+ };
437
+ };
438
+ inputs: {
439
+ assessed_sample_n: number | null;
440
+ window: "all_time";
441
+ };
442
+ quality: {
443
+ coverage: "full" | "low_sample" | "suppressed";
444
+ confidence: "high" | "low";
445
+ as_of: string | null;
446
+ stale: boolean;
447
+ notes: string[];
448
+ };
449
+ }
450
+ export interface FloodRiskLocation {
451
+ location: string;
452
+ county_code: string;
453
+ voivodeship: string;
454
+ type: "city" | "county";
455
+ assessed_sample_n: number;
456
+ confidence: "high" | "low";
457
+ }
458
+ export interface FloodRiskLocationsResponse {
459
+ data: FloodRiskLocation[];
460
+ meta: {
461
+ total: number;
462
+ snapshot_date: string | null;
463
+ };
464
+ }
465
+ export declare function getFloodRisk(params: {
466
+ location?: string;
467
+ teryt?: string;
468
+ }, apiKey?: string): Promise<ApiResponse<FloodRiskResponse>>;
469
+ export declare function getFloodRiskLocations(params: {
470
+ search?: string;
471
+ }, apiKey?: string): Promise<ApiResponse<FloodRiskLocationsResponse>>;
408
472
  export interface ValuationComparable {
409
473
  distance_m: number;
410
474
  transaction_date: string;
@@ -475,8 +539,13 @@ export interface LocationItem {
475
539
  name: string;
476
540
  typeName: string | null;
477
541
  level: "voivodeship" | "county" | "municipality" | "precinct";
542
+ parent_name: string | null;
543
+ }
544
+ export interface LocationSearchItem extends LocationItem {
545
+ rcn_district?: boolean;
478
546
  }
479
547
  export declare function getLocations(parent?: string, apiKey?: string): Promise<ApiResponse<LocationItem[]>>;
548
+ export declare function searchLocations(q: string, apiKey?: string): Promise<ApiResponse<LocationSearchItem[]>>;
480
549
  export declare function getPriceHistogram(bins?: number, max?: number, apiKey?: string): Promise<ApiResponse<HistogramBin[]>>;
481
550
  export interface ParcelSearchResult {
482
551
  parcel_id?: string;
@@ -487,8 +556,102 @@ export interface ParcelSearchResult {
487
556
  }
488
557
  export interface ParcelSearchResponse {
489
558
  results: ParcelSearchResult[];
559
+ corpus_coverage?: CorpusCoverage | null;
490
560
  }
491
561
  export declare function searchParcels(q: string, limit?: number, apiKey?: string): Promise<ApiResponse<ParcelSearchResponse>>;
562
+ export interface ParcelListRow {
563
+ id: string;
564
+ parcel_id: string | null;
565
+ parcel_key: string | null;
566
+ district: string | null;
567
+ lat: number | null;
568
+ lng: number | null;
569
+ street?: string | null;
570
+ building_number?: string | null;
571
+ address_source?: "rcn" | "approx_high" | "approx_low" | "none" | null;
572
+ }
573
+ export interface CorpusCoverage {
574
+ basis: string;
575
+ held_parcels: number | null;
576
+ source_parcels: number | null;
577
+ held_pct: number | null;
578
+ counties: number | null;
579
+ as_of: string | null;
580
+ note: string;
581
+ }
582
+ export interface ParcelListResponse {
583
+ data: ParcelListRow[];
584
+ pagination: {
585
+ limit: number;
586
+ has_more: boolean;
587
+ next_cursor?: string;
588
+ };
589
+ corpus_coverage?: CorpusCoverage | null;
590
+ suggestions?: {
591
+ streets?: string[];
592
+ building_numbers?: string[];
593
+ };
594
+ hint?: string;
595
+ }
596
+ export interface ParcelListParams {
597
+ location?: string;
598
+ teryt?: string;
599
+ bbox?: string;
600
+ lat?: number;
601
+ lng?: number;
602
+ radiusKm?: number;
603
+ minArea?: number;
604
+ maxArea?: number;
605
+ street?: string;
606
+ buildingNumber?: string;
607
+ limit?: number;
608
+ cursor?: string;
609
+ }
610
+ export declare function listParcels(p: ParcelListParams, apiKey?: string): Promise<ApiResponse<ParcelListResponse>>;
611
+ export interface StreetListRow {
612
+ street: string;
613
+ address_source: "rcn" | "approx";
614
+ }
615
+ export interface StreetListResponse {
616
+ data: StreetListRow[];
617
+ scope: {
618
+ teryt: string;
619
+ resolved_from: "teryt" | "location";
620
+ };
621
+ pagination: {
622
+ limit: number;
623
+ has_more: boolean;
624
+ };
625
+ }
626
+ export declare function getStreets(scope: {
627
+ q: string;
628
+ teryt?: string;
629
+ location?: string;
630
+ }, apiKey?: string): Promise<ApiResponse<StreetListResponse>>;
631
+ export interface ParcelFeature {
632
+ type: "Feature";
633
+ geometry: {
634
+ type: string;
635
+ coordinates: unknown;
636
+ } | null;
637
+ properties: {
638
+ id: string;
639
+ parcel_id: string | null;
640
+ parcel_key: string | null;
641
+ district: string | null;
642
+ };
643
+ }
644
+ export interface ParcelFeatureCollection {
645
+ type: "FeatureCollection";
646
+ truncated: boolean;
647
+ features: ParcelFeature[];
648
+ corpus_coverage?: CorpusCoverage | null;
649
+ }
650
+ export declare function getParcelsMap(bbox: string, limit: number | undefined, apiKey?: string): Promise<ApiResponse<ParcelFeatureCollection>>;
651
+ export declare function searchParcelsByPolygon(polygon: {
652
+ type: "Polygon";
653
+ coordinates: number[][][];
654
+ }, limit: number | undefined, apiKey?: string): Promise<ApiResponse<ParcelFeatureCollection>>;
492
655
  export interface ParcelResolveMatch {
493
656
  id: string;
494
657
  parcel_id: string | null;
@@ -511,10 +674,11 @@ export interface ParcelResolveResponse {
511
674
  lat?: number;
512
675
  lng?: number;
513
676
  };
514
- coverage: "covered" | "not_covered";
677
+ coverage: "covered" | "not_covered" | "not_computed";
515
678
  as_of: string | null;
516
679
  matches: ParcelResolveMatch[];
517
680
  truncated: boolean;
681
+ corpus_coverage?: CorpusCoverage | null;
518
682
  }
519
683
  export interface ResolveParcelParams {
520
684
  q?: string;
@@ -606,12 +770,16 @@ export interface ParcelReportResponse {
606
770
  flood: ReportSection;
607
771
  heritage: ReportSection;
608
772
  landslide: ReportSection;
773
+ subsurface: ReportSection;
609
774
  surroundings: ReportSection;
610
775
  transit: ReportSection;
611
776
  planning: ReportSection;
612
777
  buildings: ReportSection;
613
778
  permits: ReportSection;
614
779
  farmland: ReportSection;
780
+ land_class: ReportSection;
781
+ nature: ReportSection;
782
+ roads: ReportSection;
615
783
  market_context: ReportMarketContext;
616
784
  location_context: ReportLocationContext;
617
785
  };
@@ -623,6 +791,24 @@ export interface ParcelReportResponse {
623
791
  note?: string | null;
624
792
  }
625
793
  export declare function getParcelReport(parcelKey: string, apiKey?: string): Promise<ApiResponse<ParcelReportResponse>>;
794
+ export interface ParcelLandClassResponse {
795
+ parcel: {
796
+ id: string | null;
797
+ parcel_id: string | null;
798
+ parcel_key: string | null;
799
+ };
800
+ coverage: string;
801
+ as_of: string | null;
802
+ use_codes: string[];
803
+ use_names: string[];
804
+ soil_classes: string[];
805
+ protected_class_present: boolean;
806
+ in_city: boolean | null;
807
+ legal_note: string | null;
808
+ legal_state_as_of: string | null;
809
+ note?: string | null;
810
+ }
811
+ export declare function getParcelLandClass(parcelKey: string, apiKey?: string): Promise<ApiResponse<ParcelLandClassResponse>>;
626
812
  export interface SpatialSearchParams {
627
813
  polygon: {
628
814
  type: "Polygon";
@@ -645,6 +831,10 @@ export interface SpatialSearchParams {
645
831
  transactionType?: string;
646
832
  rooms?: string;
647
833
  floor?: string;
834
+ landUse?: string;
835
+ buildingStoreys?: string;
836
+ minFootprintArea?: number;
837
+ maxFootprintArea?: number;
648
838
  limit?: number;
649
839
  }
650
840
  export interface SpatialFeatureProperties {
@@ -737,6 +927,19 @@ export interface CompareParams {
737
927
  include?: string;
738
928
  }
739
929
  export declare function compareLocations(p: CompareParams, apiKey?: string): Promise<ApiResponse<CompareResponse>>;
930
+ export interface BuildingAgeEstimate {
931
+ status: "estimated" | "older_than_register" | "ambiguous_permits" | "ambiguous_buildings" | "ambiguous_both" | "no_parcel_key" | "not_applicable" | "not_computed";
932
+ year_from: number | null;
933
+ year_to: number | null;
934
+ year_point: number | null;
935
+ basis: string | null;
936
+ basis_year: number | null;
937
+ match_rule: string | null;
938
+ confidence: string | null;
939
+ offset_model: string | null;
940
+ last_works_year: number | null;
941
+ note: string;
942
+ }
740
943
  export interface BuildingBreakdownRow {
741
944
  building_type: number | null;
742
945
  footprint_area_m2: number | null;
@@ -745,6 +948,7 @@ export interface BuildingBreakdownRow {
745
948
  storeys: number | null;
746
949
  est_total_area_m2: number | null;
747
950
  match_confidence: string | null;
951
+ age_estimate?: BuildingAgeEstimate;
748
952
  }
749
953
  export interface BuildingBreakdownResponse {
750
954
  data: BuildingBreakdownRow[];
@@ -806,6 +1010,25 @@ export interface LandslideBreakdownResponse {
806
1010
  data: LandslideBreakdownRow[];
807
1011
  truncated: boolean;
808
1012
  }
1013
+ export interface NatureArea {
1014
+ form: string | null;
1015
+ name: string | null;
1016
+ overlap_pct: number | string | null;
1017
+ }
1018
+ export interface NatureBreakdownRow {
1019
+ forest_distance_m: number | null;
1020
+ forest_overlap_pct: number | string | null;
1021
+ protection_rank: number | null;
1022
+ building_restriction: "statutory_ban" | "conditional" | null;
1023
+ protected_overlap_pct: number | string | null;
1024
+ protected_forms: string[] | null;
1025
+ protected_areas: NatureArea[] | null;
1026
+ }
1027
+ export interface NatureBreakdownResponse {
1028
+ data: NatureBreakdownRow[];
1029
+ truncated: boolean;
1030
+ coverage?: "covered" | "covered_no_data" | "not_covered";
1031
+ }
809
1032
  export interface TransitBreakdownRow {
810
1033
  rail_distance_m: number | null;
811
1034
  rail_stop_name: string | null;
@@ -841,6 +1064,41 @@ export interface PermitsResponse {
841
1064
  }
842
1065
  export declare function getTransactionHeritage(transactionId: string, apiKey?: string): Promise<ApiResponse<HeritageBreakdownResponse>>;
843
1066
  export declare function getTransactionLandslide(transactionId: string, apiKey?: string): Promise<ApiResponse<LandslideBreakdownResponse>>;
1067
+ export declare function getTransactionNature(transactionId: string, apiKey?: string): Promise<ApiResponse<NatureBreakdownResponse>>;
1068
+ export interface SubsurfaceMiningTerrain {
1069
+ name: string | null;
1070
+ status: "active" | "former" | string | null;
1071
+ mineral_class: "subsidence" | "surface" | "fluid" | "other" | string | null;
1072
+ oversight_authority: string | null;
1073
+ valid_until: string | null;
1074
+ revoked_on: string | null;
1075
+ overlap_pct: number | string | null;
1076
+ }
1077
+ export interface SubsurfaceGroundwaterBody {
1078
+ number: number | null;
1079
+ name: string | null;
1080
+ documentation_status: "documented" | "undocumented" | string | null;
1081
+ documented_year: number | null;
1082
+ depth_from_m: number | null;
1083
+ medium_type: string | null;
1084
+ overlap_pct: number | string | null;
1085
+ }
1086
+ export interface SubsurfaceBreakdownRow {
1087
+ mining_status: "active" | "former" | string | null;
1088
+ mineral_class: "subsidence" | "surface" | "fluid" | "other" | string | null;
1089
+ mining_overlap_pct: number | string | null;
1090
+ mining_terrains: SubsurfaceMiningTerrain[] | null;
1091
+ mining_terrains_capped?: boolean | null;
1092
+ groundwater_status: "documented" | "undocumented" | string | null;
1093
+ groundwater_overlap_pct: number | string | null;
1094
+ groundwater_bodies: SubsurfaceGroundwaterBody[] | null;
1095
+ groundwater_bodies_capped?: boolean | null;
1096
+ }
1097
+ export interface SubsurfaceBreakdownResponse {
1098
+ data: SubsurfaceBreakdownRow[];
1099
+ truncated: boolean;
1100
+ }
1101
+ export declare function getTransactionSubsurface(transactionId: string, apiKey?: string): Promise<ApiResponse<SubsurfaceBreakdownResponse>>;
844
1102
  export interface SurroundingsRow {
845
1103
  assessed: boolean;
846
1104
  cemetery_distance_m: number | string | null;
@@ -849,12 +1107,32 @@ export interface SurroundingsRow {
849
1107
  industrial_area_distance_m: number | string | null;
850
1108
  industrial_plant_distance_m: number | string | null;
851
1109
  livestock_farm_distance_m: number | string | null;
1110
+ power_line_hv_distance_m?: number | string | null;
1111
+ power_line_ehv_distance_m?: number | string | null;
852
1112
  }
853
1113
  export interface SurroundingsResponse {
854
1114
  data: SurroundingsRow[];
855
1115
  truncated?: boolean;
856
1116
  }
857
1117
  export declare function getTransactionSurroundings(transactionId: string, apiKey?: string): Promise<ApiResponse<SurroundingsResponse>>;
1118
+ export interface RoadsBreakdownRow {
1119
+ assessed: boolean;
1120
+ access_indicator: "likely" | "uncertain" | "unlikely" | string | null;
1121
+ access_rule_version: number | null;
1122
+ public_road_distance_m: number | string | null;
1123
+ public_road_edge_distance_m: number | string | null;
1124
+ public_road_category: "national" | "voivodeship" | "county" | "municipal" | string | null;
1125
+ public_road_class: "motorway" | "expressway" | "main_accelerated" | "main" | "collector" | "local" | "access" | "other" | string | null;
1126
+ public_road_at_grade: boolean | null;
1127
+ any_road_distance_m: number | string | null;
1128
+ major_road_distance_m: number | string | null;
1129
+ source_as_of: string | null;
1130
+ }
1131
+ export interface RoadsBreakdownResponse {
1132
+ data: RoadsBreakdownRow[];
1133
+ truncated?: boolean;
1134
+ }
1135
+ export declare function getTransactionRoads(transactionId: string, apiKey?: string): Promise<ApiResponse<RoadsBreakdownResponse>>;
858
1136
  export declare function getTransactionTransit(transactionId: string, apiKey?: string): Promise<ApiResponse<TransitBreakdownResponse>>;
859
1137
  export declare function getTransactionPermits(transactionId: string, apiKey?: string): Promise<ApiResponse<PermitsResponse>>;
860
1138
  export interface PlanningRow {