{
  "components": {
    "headers": {
      "CacheControl": {
        "description": "W uwierzytelnionych odpowiedziach zawsze private, max-age=0, must-revalidate, nigdy public.",
        "schema": {
          "type": "string"
        }
      },
      "ETag": {
        "description": "Dla GET według id (parcel, check, layer). Przekaż tę wartość jako If-None-Match. Obejmuje dokładnie treść odpowiedzi, bez pominiętych danych. Każda wcześniej obliczona kategoria w odpowiedzi (pog, wz, mpzp, flood, landslide, protected, buildings) wnosi L_hash i L_version z parcel_record; not_computed wnosi znacznik null. Każda kategoria ustalana podczas żądania (permits, prices, road_access, soil) wnosi as_of źródła i datę odpowiedzi (UTC, YYYY-MM-DD); cały ETag jest wtedy słaby, W/\"...\", i zmienia się co najmniej raz na dobę nawet bez zmian w źródle. ETag obejmuje też żądany zestaw kategorii i tryb geometrii, więc layers=flood i pełna karta nigdy nie mają wspólnego ETag. Odpowiedź wyłącznie z wcześniej obliczonych danych ma silny ETag, zmieniający się tylko po zmianie objętego nim skrótu lub wersji. /v1/check zawsze zawiera road_access, więc jego ETag jest zawsze słaby. If-None-Match stosuje słabe porównanie (RFC 9110 13.1.2): słaby ETag nadal pozwala uzyskać HTTP 304 w tym samym dniu.",
        "schema": {
          "type": "string"
        }
      },
      "XCreditsCharged": {
        "description": "Ta sama wartość co billing.charged.",
        "schema": {
          "type": "integer"
        }
      },
      "XCreditsRefunded": {
        "description": "Ta sama wartość co billing.refunded.",
        "schema": {
          "type": "integer"
        }
      },
      "XRequestCost": {
        "description": "Wartość x-request-cost operacji.",
        "schema": {
          "type": "integer"
        }
      }
    },
    "parameters": {
      "IfNoneMatch": {
        "description": "ETag z wcześniejszego GET według id. Dopasowanie zwraca bezpłatne HTTP 304.",
        "in": "header",
        "name": "If-None-Match",
        "schema": {
          "type": "string"
        }
      },
      "cursor": {
        "in": "query",
        "name": "cursor",
        "schema": {
          "type": "string"
        }
      },
      "geometry": {
        "in": "query",
        "name": "geometry",
        "schema": {
          "default": "centroid",
          "enum": [
            "none",
            "centroid",
            "full"
          ],
          "type": "string"
        }
      },
      "id": {
        "description": "EGiB id_dzialki z ukośnikiem, łącznikiem lub kropką jako separatorem, np. 146501_1.0101.12/3, 146501_1.0101.12-3, 247701_1.0003.AR_4.734/113. landfeed.normalize_parcel_id normalizuje zapis; odpowiedzi zawierają ujednoliconą postać z ukośnikiem. Dokładnie jeden parametr: q, id albo point.",
        "in": "query",
        "name": "id",
        "schema": {
          "$ref": "./envelope.json#/$defs/ParcelIdInput"
        }
      },
      "lat": {
        "description": "Szerokość geograficzna WGS84; wraz z lng odpowiada point.",
        "in": "query",
        "name": "lat",
        "schema": {
          "maximum": 55.0,
          "minimum": 49.0,
          "type": "number"
        }
      },
      "layers": {
        "description": "Lista LayerKey oddzielona przecinkami; domyślnie wszystkie kategorie v1.",
        "in": "query",
        "name": "layers",
        "schema": {
          "type": "string"
        }
      },
      "limit": {
        "in": "query",
        "name": "limit",
        "schema": {
          "default": 100,
          "maximum": 1000,
          "minimum": 1,
          "type": "integer"
        }
      },
      "lng": {
        "description": "Długość geograficzna WGS84; wraz z lat odpowiada point.",
        "in": "query",
        "name": "lng",
        "schema": {
          "maximum": 24.5,
          "minimum": 14.0,
          "type": "number"
        }
      },
      "point": {
        "description": "WGS84 lat,lng, np. 52.2297,21.0122. Dokładnie jeden parametr q, id albo point lub para lat i lng.",
        "in": "query",
        "name": "point",
        "schema": {
          "type": "string"
        }
      },
      "q": {
        "description": "Tekst wpisany przez użytkownika (działka, adres, gmina). Dokładnie jeden parametr: q, id albo point.",
        "in": "query",
        "name": "q",
        "schema": {
          "maxLength": 300,
          "minLength": 1,
          "type": "string"
        }
      }
    },
    "responses": {
      "CheckOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "oneOf": [
                        {
                          "type": "null"
                        },
                        {
                          "$ref": "#/components/schemas/CheckResult"
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to CheckResult z pełną kartą działki.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "EventsOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "oneOf": [
                        {
                          "type": "null"
                        },
                        {
                          "items": {
                            "$ref": "#/components/schemas/Event"
                          },
                          "type": "array"
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to tablica Event; pole page jest wypełnione.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "Failure": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "./envelope.json"
            }
          }
        },
        "description": "Odpowiedź Envelope ze statusem not_found lub error, result=null i wypełnionym error (hint, docs, example_id przy danych wejściowych dotyczących działki; signup_url przy HTTP 401). Zwrot opłaty albo bezpłatne przy HTTP 401.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "InvalidInput": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "./envelope.json"
            }
          }
        },
        "description": "Bezpłatne HTTP 400. Odpowiedź Envelope ze statusem error, error.code=invalid_input, error.hint, error.example_id i billing {charged 0, rule free_invalid_input}.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "LayerOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "oneOf": [
                        {
                          "type": "null"
                        },
                        {
                          "properties": {
                            "answer": {
                              "$ref": "./envelope.json#/$defs/LayerAnswer"
                            },
                            "id": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "id",
                            "answer"
                          ],
                          "type": "object"
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to jedna odpowiedź LayerAnswer i identyfikator działki.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "NotModified": {
        "description": "If-None-Match odpowiada faktycznemu bieżącemu ETag. Sama gwiazdka jest pomijana i zwraca zwykle płatną reprezentację. Faktyczna zgodność oznacza brak treści i brak opłaty (reguła free_not_modified).",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          }
        }
      },
      "ParcelOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "oneOf": [
                        {
                          "type": "null"
                        },
                        {
                          "$ref": "#/components/schemas/ParcelRecord",
                          "required": [
                            "display_geometry",
                            "display_simplified",
                            "adjacent_parcel_ids",
                            "adjacent_parcel_ids_truncated"
                          ]
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to ParcelRecord (null przy ambiguous lub not_covered).",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "PlanningOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "oneOf": [
                        {
                          "type": "null"
                        },
                        {
                          "$ref": "#/components/schemas/GminaPlanning"
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to GminaPlanning.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "ResolveOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "oneOf": [
                        {
                          "type": "null"
                        },
                        {
                          "$ref": "./envelope.json#/$defs/Candidate"
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to najlepszy kandydat albo null; candidates jest zawsze obecne.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "SearchOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "oneOf": [
                        {
                          "type": "null"
                        },
                        {
                          "items": {
                            "$ref": "#/components/schemas/ParcelSummary"
                          },
                          "type": "array"
                        },
                        {
                          "$ref": "./envelope.json#/$defs/SearchResultV2"
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to tablica ParcelSummary; pole page jest wypełnione.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      },
      "SourcesOk": {
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "./envelope.json"
                },
                {
                  "properties": {
                    "result": {
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      },
                      "type": "array"
                    }
                  }
                }
              ]
            }
          }
        },
        "description": "Odpowiedź Envelope; result to tablica Source.",
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "ETag": {
            "$ref": "#/components/headers/ETag"
          },
          "X-Credits-Charged": {
            "$ref": "#/components/headers/XCreditsCharged"
          },
          "X-Credits-Refunded": {
            "$ref": "#/components/headers/XCreditsRefunded"
          },
          "X-Request-Cost": {
            "$ref": "#/components/headers/XRequestCost"
          }
        }
      }
    },
    "schemas": {
      "AccountKey": {
        "additionalProperties": false,
        "properties": {
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "expires_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "label": {
            "maxLength": 80,
            "type": "string"
          },
          "last_used_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "prefix": {
            "pattern": "^lf_live_[A-Za-z0-9_-]{0,8}$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "prefix",
          "label",
          "created_at",
          "last_used_at",
          "expires_at"
        ],
        "type": "object"
      },
      "AccountKeyCreated": {
        "additionalProperties": false,
        "properties": {
          "key": {
            "$ref": "#/components/schemas/AccountKey"
          },
          "secret": {
            "pattern": "^lf_live_[A-Za-z0-9_-]{43}$",
            "type": "string"
          }
        },
        "required": [
          "key",
          "secret"
        ],
        "type": "object"
      },
      "AccountKeyCreatedResponse": {
        "allOf": [
          {
            "$ref": "./envelope.json"
          },
          {
            "properties": {
              "billing": {
                "additionalProperties": false,
                "properties": {
                  "charged": {
                    "const": 0
                  },
                  "cost": {
                    "const": 0
                  },
                  "credits": {
                    "const": 0
                  },
                  "refunded": {
                    "const": 0
                  },
                  "rule": {
                    "const": "free_operation"
                  }
                },
                "required": [
                  "cost",
                  "charged",
                  "refunded",
                  "credits",
                  "rule"
                ],
                "type": "object"
              },
              "result": {
                "$ref": "#/components/schemas/AccountKeyCreated"
              },
              "status": {
                "const": "ok"
              }
            },
            "type": "object"
          }
        ]
      },
      "AccountKeyList": {
        "additionalProperties": false,
        "properties": {
          "keys": {
            "items": {
              "$ref": "#/components/schemas/AccountKey"
            },
            "maxItems": 10,
            "type": "array"
          },
          "limit": {
            "const": 10
          }
        },
        "required": [
          "keys",
          "limit"
        ],
        "type": "object"
      },
      "AccountKeyListResponse": {
        "allOf": [
          {
            "$ref": "./envelope.json"
          },
          {
            "properties": {
              "billing": {
                "additionalProperties": false,
                "properties": {
                  "charged": {
                    "const": 0
                  },
                  "cost": {
                    "const": 0
                  },
                  "credits": {
                    "const": 0
                  },
                  "refunded": {
                    "const": 0
                  },
                  "rule": {
                    "const": "free_operation"
                  }
                },
                "required": [
                  "cost",
                  "charged",
                  "refunded",
                  "credits",
                  "rule"
                ],
                "type": "object"
              },
              "result": {
                "$ref": "#/components/schemas/AccountKeyList"
              },
              "status": {
                "const": "ok"
              }
            },
            "type": "object"
          }
        ]
      },
      "AccountKeyRevoked": {
        "additionalProperties": false,
        "properties": {
          "revoked": {
            "const": true
          }
        },
        "required": [
          "revoked"
        ],
        "type": "object"
      },
      "AccountKeyRevokedResponse": {
        "allOf": [
          {
            "$ref": "./envelope.json"
          },
          {
            "properties": {
              "billing": {
                "additionalProperties": false,
                "properties": {
                  "charged": {
                    "const": 0
                  },
                  "cost": {
                    "const": 0
                  },
                  "credits": {
                    "const": 0
                  },
                  "refunded": {
                    "const": 0
                  },
                  "rule": {
                    "const": "free_operation"
                  }
                },
                "required": [
                  "cost",
                  "charged",
                  "refunded",
                  "credits",
                  "rule"
                ],
                "type": "object"
              },
              "result": {
                "$ref": "#/components/schemas/AccountKeyRevoked"
              },
              "status": {
                "const": "ok"
              }
            },
            "type": "object"
          }
        ]
      },
      "AccountKeyRotated": {
        "additionalProperties": false,
        "properties": {
          "key": {
            "$ref": "#/components/schemas/AccountKey"
          },
          "previous_key_id": {
            "format": "uuid",
            "type": "string"
          },
          "previous_valid_until": {
            "format": "date-time",
            "type": "string"
          },
          "secret": {
            "pattern": "^lf_live_[A-Za-z0-9_-]{43}$",
            "type": "string"
          }
        },
        "required": [
          "key",
          "secret",
          "previous_key_id",
          "previous_valid_until"
        ],
        "type": "object"
      },
      "AccountKeyRotatedResponse": {
        "allOf": [
          {
            "$ref": "./envelope.json"
          },
          {
            "properties": {
              "billing": {
                "additionalProperties": false,
                "properties": {
                  "charged": {
                    "const": 0
                  },
                  "cost": {
                    "const": 0
                  },
                  "credits": {
                    "const": 0
                  },
                  "refunded": {
                    "const": 0
                  },
                  "rule": {
                    "const": "free_operation"
                  }
                },
                "required": [
                  "cost",
                  "charged",
                  "refunded",
                  "credits",
                  "rule"
                ],
                "type": "object"
              },
              "result": {
                "$ref": "#/components/schemas/AccountKeyRotated"
              },
              "status": {
                "const": "ok"
              }
            },
            "type": "object"
          }
        ]
      },
      "AccountKeyWrite": {
        "additionalProperties": false,
        "default": {},
        "properties": {
          "label": {
            "maxLength": 80,
            "pattern": "^[^\\x00-\\x1f\\x7f]*$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "AccountLedger": {
        "additionalProperties": false,
        "properties": {
          "entries": {
            "items": {
              "$ref": "#/components/schemas/AccountLedgerEntry"
            },
            "maxItems": 100,
            "type": "array"
          },
          "next_cursor": {
            "maxLength": 1024,
            "type": [
              "string",
              "null"
            ]
          },
          "period": {
            "$ref": "#/components/schemas/AccountPeriod"
          }
        },
        "required": [
          "period",
          "entries",
          "next_cursor"
        ],
        "type": "object"
      },
      "AccountLedgerEntry": {
        "additionalProperties": false,
        "allOf": [
          {
            "else": {
              "properties": {
                "credits": {
                  "minimum": 1
                }
              }
            },
            "if": {
              "properties": {
                "type": {
                  "enum": [
                    "charge",
                    "expiry"
                  ]
                }
              }
            },
            "then": {
              "properties": {
                "credits": {
                  "maximum": -1
                }
              }
            }
          }
        ],
        "properties": {
          "balance_after": {
            "type": "integer"
          },
          "credits": {
            "type": "integer"
          },
          "id": {
            "pattern": "^[1-9][0-9]*$",
            "type": "string"
          },
          "operation": {
            "type": [
              "string",
              "null"
            ]
          },
          "request_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "timestamp": {
            "format": "date-time",
            "type": "string"
          },
          "type": {
            "enum": [
              "charge",
              "refund",
              "grant",
              "expiry"
            ]
          }
        },
        "required": [
          "id",
          "type",
          "credits",
          "operation",
          "request_id",
          "timestamp",
          "balance_after"
        ],
        "type": "object"
      },
      "AccountLedgerResponse": {
        "allOf": [
          {
            "$ref": "./envelope.json"
          },
          {
            "properties": {
              "billing": {
                "additionalProperties": false,
                "properties": {
                  "charged": {
                    "const": 0
                  },
                  "cost": {
                    "const": 0
                  },
                  "credits": {
                    "const": 0
                  },
                  "refunded": {
                    "const": 0
                  },
                  "rule": {
                    "const": "free_operation"
                  }
                },
                "required": [
                  "cost",
                  "charged",
                  "refunded",
                  "credits",
                  "rule"
                ],
                "type": "object"
              },
              "result": {
                "$ref": "#/components/schemas/AccountLedger"
              },
              "status": {
                "const": "ok"
              }
            },
            "type": "object"
          }
        ]
      },
      "AccountPeriod": {
        "additionalProperties": false,
        "properties": {
          "ends_at": {
            "format": "date-time",
            "type": "string"
          },
          "starts_at": {
            "format": "date-time",
            "type": "string"
          },
          "timezone": {
            "const": "UTC"
          }
        },
        "required": [
          "starts_at",
          "ends_at",
          "timezone"
        ],
        "type": "object"
      },
      "AccountUsage": {
        "additionalProperties": false,
        "properties": {
          "by_day": {
            "items": {
              "$ref": "#/components/schemas/AccountUsageDay"
            },
            "maxItems": 367,
            "type": "array"
          },
          "by_operation": {
            "items": {
              "$ref": "#/components/schemas/AccountUsageOperation"
            },
            "maxItems": 32,
            "type": "array"
          },
          "credits_used": {
            "minimum": 0,
            "type": "integer"
          },
          "period": {
            "$ref": "#/components/schemas/AccountPeriod"
          }
        },
        "required": [
          "period",
          "credits_used",
          "by_operation",
          "by_day"
        ],
        "type": "object"
      },
      "AccountUsageDay": {
        "additionalProperties": false,
        "properties": {
          "credits_used": {
            "minimum": 0,
            "type": "integer"
          },
          "date": {
            "format": "date",
            "type": "string"
          }
        },
        "required": [
          "date",
          "credits_used"
        ],
        "type": "object"
      },
      "AccountUsageOperation": {
        "additionalProperties": false,
        "properties": {
          "credits_used": {
            "minimum": 0,
            "type": "integer"
          },
          "operation": {
            "type": "string"
          }
        },
        "required": [
          "operation",
          "credits_used"
        ],
        "type": "object"
      },
      "AccountUsageResponse": {
        "allOf": [
          {
            "$ref": "./envelope.json"
          },
          {
            "properties": {
              "billing": {
                "additionalProperties": false,
                "properties": {
                  "charged": {
                    "const": 0
                  },
                  "cost": {
                    "const": 0
                  },
                  "credits": {
                    "const": 0
                  },
                  "refunded": {
                    "const": 0
                  },
                  "rule": {
                    "const": "free_operation"
                  }
                },
                "required": [
                  "cost",
                  "charged",
                  "refunded",
                  "credits",
                  "rule"
                ],
                "type": "object"
              },
              "result": {
                "$ref": "#/components/schemas/AccountUsage"
              },
              "status": {
                "const": "ok"
              }
            },
            "type": "object"
          }
        ]
      },
      "AddressValue": {
        "properties": {
          "addresses": {
            "items": {
              "properties": {
                "house_number": {
                  "type": "string"
                },
                "locality": {
                  "type": "string"
                },
                "postcode": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "street": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "addresses"
        ],
        "type": "object"
      },
      "AreaV2": {
        "$ref": "./envelope.json#/$defs/AreaV2"
      },
      "AskCall": {
        "$ref": "./envelope.json#/$defs/AskCall"
      },
      "AskCitation": {
        "$ref": "./envelope.json#/$defs/AskCitation"
      },
      "AskClientTool": {
        "$ref": "./envelope.json#/$defs/AskClientTool"
      },
      "AskContinuation": {
        "$ref": "./envelope.json#/$defs/AskContinuation"
      },
      "AskEvent": {
        "$ref": "./envelope.json#/$defs/AskEvent"
      },
      "AskRequest": {
        "$ref": "./envelope.json#/$defs/AskRequest"
      },
      "AskResponse": {
        "$ref": "./envelope.json#/$defs/AskResponse"
      },
      "AskSignedResult": {
        "$ref": "./envelope.json#/$defs/AskSignedResult"
      },
      "AskTurn": {
        "$ref": "./envelope.json#/$defs/AskTurn"
      },
      "Auth": {
        "$ref": "./envelope.json#/$defs/Auth"
      },
      "BatchCheckJob": {
        "$ref": "./envelope.json#/$defs/BatchCheckJob"
      },
      "BatchCheckRequest": {
        "$ref": "./envelope.json#/$defs/BatchCheckRequest"
      },
      "BatchCheckResults": {
        "$ref": "./envelope.json#/$defs/BatchCheckResults"
      },
      "BatchCheckSubmission": {
        "$ref": "./envelope.json#/$defs/BatchCheckSubmission"
      },
      "BillingV2": {
        "$ref": "./envelope.json#/$defs/BillingV2"
      },
      "BuildingsValue": {
        "properties": {
          "count": {
            "type": "integer"
          },
          "footprint_m2_total": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "count"
        ],
        "type": "object"
      },
      "CheckResult": {
        "properties": {
          "checks": {
            "items": {
              "properties": {
                "basis": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "detail": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "id": {
                  "enum": [
                    "pog_zone",
                    "wz_possible",
                    "mpzp_status",
                    "mpzp_params",
                    "flood_q100",
                    "landslide",
                    "protected",
                    "road_access"
                  ],
                  "type": "string"
                },
                "layer": {
                  "$ref": "./envelope.json#/$defs/LayerKey"
                },
                "result": {
                  "enum": [
                    "pass",
                    "fail",
                    "warn",
                    "unknown"
                  ],
                  "type": "string"
                },
                "source": {
                  "$ref": "./envelope.json#/$defs/SourceRef"
                },
                "value": {}
              },
              "required": [
                "id",
                "layer",
                "result",
                "source"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "disclaimer": {
            "type": "string"
          },
          "record": {
            "$ref": "#/components/schemas/ParcelRecord"
          },
          "verdict": {
            "description": "Reguła przeniesiona z bezpłatnego sprawdzania (geofeed/resolve). pass: wszystkie sprawdzenia zakończone pomyślnie. fail: negatywny wynik sprawdzenia rozstrzygającego (brak ścieżki WZ i MPZP dopuszczającego zabudowę). conditional: możliwość zabudowy zależy od wskazanego warunku (dojazd, powódź, forma ochrony). unknown: wynik sprawdzenia rozstrzygającego jest nieznany.",
            "enum": [
              "pass",
              "conditional",
              "fail",
              "unknown"
            ],
            "type": "string"
          }
        },
        "required": [
          "verdict",
          "checks",
          "record",
          "disclaimer"
        ],
        "type": "object"
      },
      "CheckResultV2": {
        "$ref": "./envelope.json#/$defs/CheckResultV2"
      },
      "Event": {
        "anyOf": [
          {
            "properties": {
              "after": {},
              "as_of": {
                "format": "date",
                "type": [
                  "string",
                  "null"
                ]
              },
              "before": {},
              "detected_at": {
                "format": "date-time",
                "type": "string"
              },
              "event": {
                "type": "string"
              },
              "id": {
                "type": "string"
              },
              "layer": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "source": {
                "$ref": "./envelope.json#/$defs/SourceRef"
              }
            },
            "required": [
              "id",
              "event",
              "detected_at"
            ],
            "type": "object"
          },
          {
            "$ref": "./envelope.json#/$defs/EventV2"
          }
        ]
      },
      "EventTypeV2": {
        "$ref": "./envelope.json#/$defs/EventTypeV2"
      },
      "EventV2": {
        "$ref": "./envelope.json#/$defs/EventV2"
      },
      "EventsRequestV2": {
        "$ref": "./envelope.json#/$defs/EventsRequestV2"
      },
      "ExportV2": {
        "$ref": "./envelope.json#/$defs/ExportV2"
      },
      "FeatureSearchFacets": {
        "$ref": "./envelope.json#/$defs/FeatureSearchFacets"
      },
      "FeatureSearchFilters": {
        "$ref": "./envelope.json#/$defs/FeatureSearchFilters"
      },
      "FloodValue": {
        "description": "covered_no_data oznacza zmapowany obszar i działkę poza wszystkimi strefami: {q10: false, q100: false, q500: false}. Uwagi powodziowe używają polskich nazw miesięcy, wskazują scenariusz Q1% (raz na 100 lat) i odróżniają brak zagrożenia na mapie od nieznanego zakresu danych.",
        "properties": {
          "map_edition": {
            "description": "Cykl MZP i daty publikacji obiektów z validityPeriod.beginPosition; brakujące daty są wyraźnie wskazane. endPosition metadanych nigdy nie wyznacza zakresu danych.",
            "type": [
              "string",
              "null"
            ]
          },
          "q10": {
            "type": "boolean"
          },
          "q100": {
            "type": "boolean"
          },
          "q100_share_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "q500": {
            "type": "boolean"
          }
        },
        "required": [
          "q10",
          "q100",
          "q500"
        ],
        "type": "object"
      },
      "GminaPlanning": {
        "properties": {
          "as_of": {
            "format": "date",
            "type": "string"
          },
          "gmina_name": {
            "type": "string"
          },
          "gmina_teryt": {
            "description": "Kod gminy administracyjnej z ostatnią cyfrą 1, 2 lub 3.",
            "pattern": "^[0-9]{6}[123]$",
            "type": "string"
          },
          "mpzp_count": {
            "type": [
              "integer",
              "null"
            ]
          },
          "mpzp_coverage_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "pog_adopted_on": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "pog_effective_from": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "pog_resolution_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "pog_status": {
            "enum": [
              "draft",
              "adopted",
              "in_force",
              "none",
              "unknown"
            ],
            "type": "string"
          },
          "sources": {
            "items": {
              "$ref": "./envelope.json#/$defs/SourceRef"
            },
            "type": "array"
          },
          "studium_expired": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "wz_regime": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "gmina_teryt",
          "gmina_name",
          "pog_status",
          "as_of",
          "sources"
        ],
        "type": "object"
      },
      "IdempotencyKey": {
        "$ref": "./envelope.json#/$defs/IdempotencyKey"
      },
      "LandslideValue": {
        "description": "Punktowe sprawdzenie SOPO. Trafienie ma stan covered; puste identify oznacza covered_no_data z present=false wyłącznie wewnątrz prawidłowego, ukończonego obszaru mapowania, przy dostępnych danych aplikacji. W pozostałych przypadkach not_covered i value=null. Bez twierdzeń o bezpieczeństwie całej działki ani o przecięciu jej geometrii.",
        "properties": {
          "count": {
            "type": "integer"
          },
          "forms": {
            "items": {
              "properties": {
                "id": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "kind": {
                  "enum": [
                    "landslide",
                    "threatened_area"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "id"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "kinds": {
            "items": {
              "enum": [
                "landslide",
                "threatened_area"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "present": {
            "type": "boolean"
          }
        },
        "required": [
          "present"
        ],
        "type": "object"
      },
      "LayerAnswerV2": {
        "$ref": "./envelope.json#/$defs/LayerAnswerV2"
      },
      "Licence": {
        "$ref": "./envelope.json#/$defs/Licence"
      },
      "ListingCandidate": {
        "$ref": "./envelope.json#/$defs/ListingCandidate"
      },
      "ListingResolution": {
        "$ref": "./envelope.json#/$defs/ListingResolution"
      },
      "ListingResolveRequest": {
        "$ref": "./envelope.json#/$defs/ListingResolveRequest"
      },
      "Method": {
        "$ref": "./envelope.json#/$defs/Method"
      },
      "MpzpValue": {
        "allOf": [
          {
            "if": {
              "properties": {
                "status": {
                  "type": "null"
                }
              }
            },
            "then": {
              "properties": {
                "effective_from": {
                  "type": "null"
                }
              }
            }
          }
        ],
        "description": "covered_no_data oznacza, że źródło obejmuje gminę, ale żaden MPZP nie obejmuje działki: {status: none, symbol: null, plans: [], effective_from: null}. Plan w przygotowaniu ma status draft. Plan lub strefa bez opublikowanego statusu prawnego ma coverage=covered, status=null, effective_from=null i uwagę wyjaśniającą; symbol, przeznaczenie, identyfikator i nazwa planu są zachowywane, jeżeli je opublikowano.",
        "properties": {
          "effective_from": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "plans": {
            "items": {
              "properties": {
                "adopted_on": {
                  "format": "date",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "effective_from": {
                  "format": "date",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "plan_id": {
                  "type": "string"
                },
                "resolution_url": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "status": {
                  "$ref": "./envelope.json#/$defs/MpzpStatus"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "share_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "status": {
            "$ref": "./envelope.json#/$defs/MpzpStatus"
          },
          "symbol": {
            "description": "Symbol KIMPZP, jeżeli go opublikowano; w przeciwnym razie null z wyjaśnieniem w note.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "status",
          "symbol",
          "plans",
          "effective_from"
        ],
        "type": "object"
      },
      "ParcelFeatures": {
        "$ref": "./envelope.json#/$defs/ParcelFeatures"
      },
      "ParcelRecord": {
        "properties": {
          "adjacent_parcel_ids": {
            "$ref": "./envelope.json#/$defs/ParcelRecordV2/properties/adjacent_parcel_ids"
          },
          "adjacent_parcel_ids_truncated": {
            "$ref": "./envelope.json#/$defs/ParcelRecordV2/properties/adjacent_parcel_ids_truncated"
          },
          "admin": {
            "properties": {
              "admin_gmina_teryt": {
                "description": "Gmina administracyjna (parcel_record.admin_gmina_teryt), której kod przyjmuje /v1/gminy/{teryt}/planning.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "gmina_name": {
                "type": "string"
              },
              "gmina_teryt": {
                "description": "Jednostka TERYT w identyfikatorze działki (parcel_record.gmina_teryt).",
                "type": "string"
              },
              "gmina_type": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "number": {
                "type": "string"
              },
              "obreb_id": {
                "type": "string"
              },
              "obreb_name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "powiat_name": {
                "type": "string"
              },
              "voivodeship": {
                "type": "string"
              },
              "voivodeship_name": {
                "type": "string"
              }
            },
            "required": [
              "voivodeship",
              "gmina_teryt",
              "gmina_name",
              "obreb_id",
              "number"
            ],
            "type": "object"
          },
          "area": {
            "oneOf": [
              {
                "properties": {
                  "geometry_m2": {
                    "type": "number"
                  },
                  "official_m2": {
                    "description": "Powierzchnia deklarowana w EGiB w m², nigdy w hektarach.",
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "source": {
                    "$ref": "./envelope.json#/$defs/SourceRef"
                  }
                },
                "required": [
                  "official_m2",
                  "geometry_m2",
                  "source"
                ],
                "type": "object"
              },
              {
                "$ref": "./envelope.json#/$defs/AreaV2"
              }
            ]
          },
          "centroid": {
            "$ref": "./envelope.json#/$defs/LonLat"
          },
          "display_geometry": {
            "$ref": "./envelope.json#/$defs/ParcelRecordV2/properties/display_geometry"
          },
          "display_simplified": {
            "$ref": "./envelope.json#/$defs/ParcelRecordV2/properties/display_simplified"
          },
          "features": {
            "$ref": "./envelope.json#/$defs/ParcelFeatures"
          },
          "geometry": {
            "description": "GeoJSON MultiPolygon w układzie WGS84 przy geometry=full.",
            "type": [
              "object",
              "null"
            ]
          },
          "id": {
            "type": "string"
          },
          "layers": {
            "additionalProperties": {
              "$ref": "./envelope.json#/$defs/LayerAnswer"
            },
            "description": "Jedna odpowiedź LayerAnswer na żądaną kategorię; poniżej schematy value według klucza kategorii.",
            "type": "object"
          },
          "record_as_of": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "record_hash": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "admin",
          "area",
          "layers",
          "record_hash"
        ],
        "type": "object"
      },
      "ParcelRecordV2": {
        "$ref": "./envelope.json#/$defs/ParcelRecordV2"
      },
      "ParcelSummary": {
        "properties": {
          "address": {
            "description": "Adres PRG przy wyszukiwaniu według adresu.",
            "type": [
              "string",
              "null"
            ]
          },
          "admin_gmina_teryt": {
            "description": "Gmina administracyjna (parcel_record.admin_gmina_teryt), której kod przyjmuje /v1/gminy/{teryt}/planning.",
            "type": [
              "string",
              "null"
            ]
          },
          "area_official_m2": {
            "type": [
              "number",
              "null"
            ]
          },
          "centroid": {
            "$ref": "./envelope.json#/$defs/LonLat"
          },
          "distance_m": {
            "type": [
              "number",
              "null"
            ]
          },
          "gmina_name": {
            "type": "string"
          },
          "gmina_teryt": {
            "description": "Jednostka TERYT w identyfikatorze działki (parcel_record.gmina_teryt).",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "number": {
            "type": "string"
          },
          "obreb_id": {
            "type": "string"
          },
          "obreb_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "powiat_name": {
            "type": "string"
          },
          "voivodeship": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "gmina_teryt",
          "gmina_name",
          "obreb_name",
          "number",
          "centroid"
        ],
        "type": "object"
      },
      "PermitsValue": {
        "description": "GUNB RWDZ w promieniu 500 m, odpytywany podczas żądania. Nazwy inwestorów nigdy nie są udostępniane.",
        "properties": {
          "count_500m": {
            "type": "integer"
          },
          "recent": {
            "items": {
              "properties": {
                "decision_date": {
                  "format": "date",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "distance_m": {
                  "type": "number"
                },
                "kind": {
                  "type": "string"
                },
                "object_category": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "count_500m"
        ],
        "type": "object"
      },
      "PlaceSuggestion": {
        "$ref": "./envelope.json#/$defs/PlaceSuggestion"
      },
      "PlacesResult": {
        "$ref": "./envelope.json#/$defs/PlacesResult"
      },
      "Plan": {
        "$ref": "./envelope.json#/$defs/Plan"
      },
      "PlanningValue": {
        "description": "Informacje planistyczne o działce w jednym żądaniu: odpowiedzi o planie ogólnym, MPZP i WZ (każda jako pełne LayerAnswer z własnym coverage, source i note) oraz stan planowania gminy. Bez stwierdzenia „brak planu” bez wskazania rodzaju planu i źródła.",
        "properties": {
          "gmina": {
            "$ref": "#/components/schemas/GminaPlanning"
          },
          "mpzp": {
            "$ref": "./envelope.json#/$defs/LayerAnswer"
          },
          "pog": {
            "$ref": "./envelope.json#/$defs/LayerAnswer"
          },
          "wz": {
            "$ref": "./envelope.json#/$defs/LayerAnswer"
          }
        },
        "required": [
          "pog",
          "mpzp",
          "wz",
          "gmina"
        ],
        "type": "object"
      },
      "PogValue": {
        "description": "Plan ogólny. Projekty są pokazywane i oznaczane jako projekty. covered_no_data oznacza, że źródło obejmuje gminę, ale nie zawiera rekordu planu ogólnego: {status: none, zone_symbol: null, zones: []}.",
        "properties": {
          "adopted_on": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "effective_from": {
            "description": "Data wejścia planu w życie; null dla draft i none.",
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "in_ouz": {
            "description": "W granicach obszaru uzupełnienia zabudowy.",
            "type": [
              "boolean",
              "null"
            ]
          },
          "plan_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "resolution_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "$ref": "./envelope.json#/$defs/PlanStatus"
          },
          "zone_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "zone_symbol": {
            "description": "Dominująca strefa o największym udziale, np. SW, SJ, SN, SR, SI, SH, SU, SK, SC, SG, SO, SP.",
            "type": [
              "string",
              "null"
            ]
          },
          "zones": {
            "items": {
              "properties": {
                "name": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "parameters": {
                  "properties": {
                    "max_coverage_pct": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "max_height_m": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "max_intensity": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "min_biologically_active_pct": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "min_new_plot_area_m2": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  },
                  "type": "object"
                },
                "share_pct": {
                  "type": "number"
                },
                "symbol": {
                  "type": "string"
                }
              },
              "required": [
                "symbol",
                "share_pct"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "status",
          "zone_symbol",
          "zones",
          "effective_from"
        ],
        "type": "object"
      },
      "PricesValue": {
        "description": "Zbiorcze dane porównawcze RCN. Przy mniej niż 5 transakcjach dane zbiorcze nie są udostępniane, a coverage wynosi covered_no_data.",
        "properties": {
          "comparables_count": {
            "type": "integer"
          },
          "median_pln_m2": {
            "type": [
              "number",
              "null"
            ]
          },
          "p25_pln_m2": {
            "type": [
              "number",
              "null"
            ]
          },
          "p75_pln_m2": {
            "type": [
              "number",
              "null"
            ]
          },
          "radius_m": {
            "type": "integer"
          },
          "window_months": {
            "type": "integer"
          }
        },
        "required": [
          "comparables_count"
        ],
        "type": "object"
      },
      "ProtectedValue": {
        "properties": {
          "forms": {
            "items": {
              "properties": {
                "code": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": {
                  "type": "string"
                },
                "type": {
                  "description": "Kody form ochrony: park_narodowy, rezerwat, park_krajobrazowy, obszar_chronionego_krajobrazu, natura2000_oso, natura2000_soo, uzytek_ekologiczny, zespol_przyrodniczo_krajobrazowy, stanowisko_dokumentacyjne, pomnik_przyrody.",
                  "type": "string"
                }
              },
              "required": [
                "type",
                "name"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "inside_any": {
            "type": "boolean"
          }
        },
        "required": [
          "inside_any",
          "forms"
        ],
        "type": "object"
      },
      "RoadAccessValue": {
        "properties": {
          "nearest_public_road_m": {
            "type": [
              "number",
              "null"
            ]
          },
          "verdict": {
            "enum": [
              "pass",
              "fail",
              "unknown"
            ],
            "type": "string"
          },
          "via": {
            "enum": [
              "adjacent_public_road_parcel",
              "bdot_road_within_30m",
              null
            ],
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "verdict"
        ],
        "type": "object"
      },
      "Scope": {
        "$ref": "./envelope.json#/$defs/Scope"
      },
      "SearchRequestV2": {
        "$ref": "./envelope.json#/$defs/SearchRequestV2"
      },
      "SearchResultV2": {
        "$ref": "./envelope.json#/$defs/SearchResultV2"
      },
      "SoilValue": {
        "properties": {
          "classes": {
            "items": {
              "properties": {
                "share_pct": {
                  "type": "number"
                },
                "symbol": {
                  "type": "string"
                }
              },
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "classes"
        ],
        "type": "object"
      },
      "Source": {
        "properties": {
          "approved_at": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "approved_by": {
            "description": "Operator, który zatwierdził źródło; niezależne od aktualności danych.",
            "type": [
              "string",
              "null"
            ]
          },
          "as_of": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "attribution": {
            "type": "string"
          },
          "band": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "coverage_here": {
            "description": "Ustawiane wyłącznie po przekazaniu q|id|point.",
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "./envelope.json#/$defs/Coverage"
              }
            ]
          },
          "coverage_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "coverage_unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "freshness": {
            "enum": [
              "fresh",
              "stale",
              "unknown"
            ],
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "last_success_at": {
            "format": "date-time",
            "type": [
              "string",
              "null"
            ]
          },
          "layers": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "licence": {
            "type": "string"
          },
          "licence_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "publisher": {
            "type": "string"
          },
          "refresh_target": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "title",
          "publisher",
          "licence",
          "attribution",
          "as_of",
          "freshness"
        ],
        "type": "object"
      },
      "WatchAttempt": {
        "additionalProperties": false,
        "properties": {
          "attempt": {
            "minimum": 1,
            "type": "integer"
          },
          "attempted_at": {
            "format": "date-time",
            "type": "string"
          },
          "delivery_id": {
            "format": "uuid",
            "type": "string"
          },
          "id": {
            "minimum": 1,
            "type": "integer"
          },
          "latency_ms": {
            "minimum": 0,
            "type": "integer"
          },
          "outcome": {
            "enum": [
              "delivered",
              "http_failure",
              "network_failure",
              "blocked_destination",
              "response_too_large",
              "unsafe_event",
              "secret_unavailable",
              "expired"
            ]
          },
          "status": {
            "maximum": 599,
            "minimum": 100,
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "delivery_id",
          "attempt",
          "attempted_at",
          "status",
          "latency_ms",
          "outcome"
        ],
        "type": "object"
      },
      "WatchAttemptList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/WatchAttempt"
            },
            "maxItems": 100,
            "type": "array"
          },
          "next_cursor": {
            "minimum": 1,
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "required": [
          "items",
          "next_cursor"
        ],
        "type": "object"
      },
      "WatchConfigured": {
        "additionalProperties": false,
        "allOf": [
          {
            "required": [
              "id",
              "items",
              "created_at",
              "updated_at",
              "enabled",
              "disabled_reason",
              "consecutive_failures",
              "secret_version"
            ]
          }
        ],
        "properties": {
          "consecutive_failures": {
            "minimum": 0,
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "disabled_reason": {
            "enum": [
              null,
              "unconfigured",
              "operator_disabled",
              "blocked_destination",
              "consecutive_failures"
            ]
          },
          "enabled": {
            "type": "boolean"
          },
          "entitlement_paused": {
            "description": "Konfiguracja jest zachowana, gdy plan lub członkostwo w zespole nie uprawnia do wysyłki.",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "items": {
            "$ref": "#/components/schemas/WatchWrite/properties/items"
          },
          "secret": {
            "pattern": "^lf_whsec_[A-Za-z0-9_-]{43}$",
            "type": "string"
          },
          "secret_version": {
            "minimum": 0,
            "type": "integer"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "secret"
        ],
        "type": "object"
      },
      "WatchDelivery": {
        "additionalProperties": false,
        "description": "POST z niezmienioną treścią JSON UTF-8. X-Landfeed-Delivery jest stałym identyfikatorem. X-Landfeed-Signature: t=unix_seconds,v1=hex_hmac_sha256(secret, ASCII(timestamp) + dot + raw_body). Zweryfikuj podpis w ciągu 300 sekund, a przed wykonaniem skutków trwale wyklucz ponowne przetworzenie id. Ponowienia zachowują treść i id oraz aktualizują czas podpisu. Zmiana sekretu natychmiast unieważnia poprzedni. Limit połączenia: 3 sekundy, odczytu: 5 sekund, całej odpowiedzi: 10 sekund, nagłówków i treści łącznie: 65 536 bajtów. Ponowienia zaczynają się od 30 sekund, odstęp rośnie wykładniczo do godziny, przez 24 godziny od dodania do kolejki; dziesięć kolejnych niepowodzeń wyłącza subskrypcję. Zablokowany adres wyłącza ją natychmiast. Dzienniki nigdy nie zapisują treści odpowiedzi. Po awarii HTTP może dostarczyć więcej niż raz; dodanie do kolejki następuje dokładnie raz na parę obserwacja/zdarzenie.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "notification": {
            "$ref": "#/components/schemas/WatchNotification"
          },
          "subscription_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "id",
          "subscription_id",
          "created_at",
          "notification"
        ],
        "type": "object"
      },
      "WatchEventType": {
        "description": "Można rejestrować tylko rodziny zdarzeń, dla których działają produkcyjne ścieżki zapisu i obsługi. Rodziny EventV2 nie mają jeszcze producenta i zwracają event_type_has_no_producer. Zaufane adaptery o określonych typach nie oznaczają obsługi produkcyjnej.",
        "enum": [
          "pog.changed",
          "wz.changed",
          "mpzp.changed",
          "flood.changed",
          "landslide.changed",
          "protected.changed",
          "buildings.changed"
        ],
        "type": "string"
      },
      "WatchItem": {
        "additionalProperties": false,
        "oneOf": [
          {
            "required": [
              "parcel_id"
            ]
          },
          {
            "required": [
              "gmina_teryt"
            ]
          },
          {
            "required": [
              "polygon"
            ]
          }
        ],
        "properties": {
          "gmina_teryt": {
            "pattern": "^[0-9]{6}[123]$",
            "type": "string"
          },
          "parcel_id": {
            "$ref": "./envelope.json#/$defs/ParcelId"
          },
          "polygon": {
            "$ref": "./envelope.json#/$defs/SearchPolygon"
          },
          "types": {
            "items": {
              "$ref": "#/components/schemas/WatchEventType"
            },
            "maxItems": 32,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "types"
        ],
        "type": "object"
      },
      "WatchLayerEvidence": {
        "additionalProperties": false,
        "allOf": [
          {
            "$ref": "./envelope.json#/$defs/LayerAnswer"
          }
        ],
        "description": "Historyczny zakres danych potwierdza zapisany skrót coverage/value, a daty źródeł potwierdza zapis wersji. Pierwotna treść uwagi i podstawa są niedostępne i wyraźnie oznaczone jako nieznane. Brak dowodów wstrzymuje powiadomienie; bieżące metadane źródła nigdy nie zastępują historycznych dat.",
        "properties": {
          "as_of": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "coverage": {
            "$ref": "./envelope.json#/$defs/Coverage"
          },
          "hash": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "layer": {
            "enum": [
              "pog",
              "wz",
              "mpzp",
              "flood",
              "landslide",
              "protected",
              "buildings"
            ],
            "type": "string"
          },
          "layer_version": {
            "minLength": 1,
            "type": "string"
          },
          "note": {
            "maxLength": 4000,
            "minLength": 1,
            "type": "string"
          },
          "source": {
            "$ref": "./envelope.json#/$defs/SourceRef"
          },
          "value": {}
        },
        "required": [
          "layer",
          "coverage",
          "value",
          "source",
          "as_of",
          "layer_version",
          "hash",
          "note"
        ],
        "type": "object"
      },
      "WatchLegacyEvent": {
        "additionalProperties": false,
        "description": "Zapisana różnica z wcześniejszych obliczeń. Typ jest zachowany; nie wnioskuje się o uchwaleniu, statusie prawnym ani dacie zdarzenia. Dopuszczalne są tylko zwalidowane wartości kategorii; dotychczasowe pojedyncze sprzedaże są pomijane. Starsze identyfikatory źródeł muszą należeć do zapisanej macierzy zaakceptowanej przez operatora i mieć prawidłowy stan w v_sources. Obecny zapis WZ korzysta z gmina_planning_status i zachowuje to pochodzenie. EventV2 zachowuje dodatkowo wymagania dotyczące sprawdzonej licencji.",
        "properties": {
          "after": {},
          "after_evidence": {
            "$ref": "#/components/schemas/WatchLayerEvidence"
          },
          "as_of": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "before": {},
          "before_evidence": {
            "$ref": "#/components/schemas/WatchLayerEvidence"
          },
          "detected_at": {
            "format": "date-time",
            "type": "string"
          },
          "event": {
            "enum": [
              "pog.changed",
              "wz.changed",
              "mpzp.changed",
              "flood.changed",
              "landslide.changed",
              "protected.changed",
              "buildings.changed"
            ],
            "type": "string"
          },
          "from_version": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "pattern": "^parcel_events:[0-9]+$",
            "type": "string"
          },
          "layer": {
            "enum": [
              "pog",
              "wz",
              "mpzp",
              "flood",
              "landslide",
              "protected",
              "buildings"
            ],
            "type": "string"
          },
          "parcel_id": {
            "$ref": "./envelope.json#/$defs/ParcelId"
          },
          "source": {
            "$ref": "./envelope.json#/$defs/SourceRef"
          },
          "to_version": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "event",
          "parcel_id",
          "layer",
          "before",
          "after",
          "before_evidence",
          "after_evidence",
          "from_version",
          "to_version",
          "detected_at",
          "source",
          "as_of"
        ],
        "type": "object"
      },
      "WatchList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/WatchRecord"
            },
            "maxItems": 100,
            "type": "array"
          },
          "next_cursor": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "items",
          "next_cursor"
        ],
        "type": "object"
      },
      "WatchMpzpPlanMetadata": {
        "description": "Sprawdzone metadane zwracane przez precompute.run.compile_answer, obok dotychczasowych otwartych pól planu MpzpValue.",
        "properties": {
          "share_pct": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "WatchNotification": {
        "additionalProperties": false,
        "description": "Zachowaj typ zdarzenia i uwagę o korekcie lub regule. Zapisana różnica nigdy nie staje się dowodem zmiany w rzeczywistości. Dopuszczalne są tylko źródła zatwierdzone przez operatora; wspólne listy zakazów dotyczących prywatności i ogłoszeń obowiązują przed zapisem i ponownie przed wysyłką.",
        "properties": {
          "classification": {
            "enum": [
              "observation_change",
              "source_correction",
              "source_refresh"
            ],
            "type": "string"
          },
          "event": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WatchLegacyEvent"
              },
              {
                "$ref": "./envelope.json#/$defs/EventV2"
              }
            ]
          },
          "note": {
            "maxLength": 4000,
            "minLength": 1,
            "type": "string"
          },
          "rule_version": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "event",
          "classification",
          "note",
          "rule_version"
        ],
        "type": "object"
      },
      "WatchPogZoneMetadata": {
        "description": "Sprawdzone metadane zwracane przez precompute.model.pog_value, obok dotychczasowych otwartych pól strefy PogValue.",
        "properties": {
          "designation": {
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "WatchRecord": {
        "additionalProperties": false,
        "properties": {
          "consecutive_failures": {
            "minimum": 0,
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "disabled_reason": {
            "enum": [
              null,
              "unconfigured",
              "operator_disabled",
              "blocked_destination",
              "consecutive_failures"
            ]
          },
          "enabled": {
            "type": "boolean"
          },
          "entitlement_paused": {
            "description": "Konfiguracja jest zachowana, gdy plan lub członkostwo w zespole nie uprawnia do wysyłki.",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "items": {
            "$ref": "#/components/schemas/WatchWrite/properties/items"
          },
          "secret_version": {
            "minimum": 0,
            "type": "integer"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "items",
          "created_at",
          "updated_at",
          "enabled",
          "disabled_reason",
          "consecutive_failures",
          "secret_version"
        ],
        "type": "object"
      },
      "WatchResponse": {
        "additionalProperties": false,
        "description": "Format zarządzania kontem; zapytanie i rozpoznawanie nie mają zastosowania. Koszty są wartościami zastępczymi do decyzji operatora. Cache-Control: private, max-age=0, must-revalidate. Bez zastępczego przypisywania konta według klucza statycznego.",
        "properties": {
          "billing": {
            "additionalProperties": false,
            "properties": {
              "charged": {
                "const": 0
              },
              "cost": {
                "const": 0
              },
              "refunded": {
                "const": 0
              },
              "rule": {
                "const": "free_watch"
              }
            },
            "required": [
              "cost",
              "charged",
              "refunded",
              "rule"
            ],
            "type": "object"
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "result": {
            "anyOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/WatchRecord"
              },
              {
                "$ref": "#/components/schemas/WatchConfigured"
              },
              {
                "$ref": "#/components/schemas/WatchList"
              },
              {
                "$ref": "#/components/schemas/WatchAttemptList"
              }
            ]
          },
          "status": {
            "enum": [
              "ok",
              "error"
            ],
            "type": "string"
          }
        },
        "required": [
          "status",
          "result",
          "error",
          "billing"
        ],
        "type": "object"
      },
      "WatchWebhookWrite": {
        "additionalProperties": false,
        "description": "Wyłącznie HTTPS na porcie 443, bez danych użytkownika w adresie, fragmentów, znaków sterujących oraz prywatnych lub niepublicznych odpowiedzi DNS. Zdekodowane pola zapytania, także powtórzone i puste, muszą przejść kontrolę prywatności kontraktu i wspólne listy zakazów usuwania danych podczas obsługi. Odrzucenie następuje przed zapisem, a kontrola jest powtarzana przy każdej próbie; połączenie jest przypięte do dopuszczonej odpowiedzi DNS. Awaria rozpoznawania adresów powoduje ponowienie, niebezpieczny adres blokadę. TLS weryfikuje pierwotną nazwę hosta. Bez przekierowań i pośredników z konfiguracji środowiska.",
        "properties": {
          "enabled": {
            "default": true,
            "type": "boolean"
          },
          "url": {
            "format": "uri",
            "maxLength": 2048,
            "pattern": "^https://",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "WatchWrite": {
        "additionalProperties": false,
        "description": "Kontrola dopuszczenia poprzedza parsowanie i walidację poza głównym wątkiem. Treść do 256 KiB; łącznie do 100 elementów i 1 024 wierzchołków wielokątów na żądanie. Przekroczenie limitu pracy walidatora zwraca validation_work_limit (413).",
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/WatchItem"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "WzValue": {
        "description": "Wynik własnych obliczeń: czy w dniu zapytania można wydać decyzję WZ dla działki. basis wskazuje przepis.",
        "properties": {
          "possible": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "possible"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "ApiKey": {
        "description": "Klucz API konta korzystający z tych samych kredytów co wywołania przez połączenie OAuth.",
        "in": "header",
        "name": "X-Api-Key",
        "type": "apiKey"
      },
      "OAuthConnector": {
        "bearerFormat": "OAuth 2.1 access token",
        "description": "Autoryzacja połączenia OAuth ze wspólnymi kredytami konta. Wykrywanie konfiguracji i zgodę obsługuje usługa uwierzytelniania.",
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "description": "Kontrakt pierwszego tygodnia (docs/landfeed/README.md, krok 1; zmiany względem analizy Cenogram: context/research/cenogram-teardown-2026-10-12.md, części 8 i 9). Usługa udostępnia ten dokument przez GET /v1/openapi.json; operacje jeszcze niedostępne są pomijane w wykazie funkcji. Każdy punkt API zachowuje następujące zasady. Jeden odczyt udziela odpowiedzi: przyjmuje dokładnie jeden parametr q (tekst użytkownika), id (EGiB id_dzialki z ukośnikiem lub łącznikiem) albo point (WGS84 lat,lng lub para lat i lng), samodzielnie rozpoznaje działkę, a przy niejednoznaczności zwraca HTTP 200, status ambiguous i candidates, bez błędu i bez wyboru za użytkownika. Każda odpowiedź tematyczna zawiera source, as_of, zrozumiałe note i coverage o jednym z czterech stanów: covered, covered_no_data, not_covered, not_computed. Niewiadoma oznacza not_covered z value=null. Koszt określa x-request-cost dla operacji i billing {cost, charged, refunded, rule} w odpowiedzi oraz nagłówki X-Request-Cost, X-Credits-Charged i X-Credits-Refunded. Błędne dane wejściowe powodują bezpłatne HTTP 400. Opłaty za 4xx, 5xx i not_covered są zwracane; potwierdzone braki rekordów covered_no_data i listy kandydatów są płatne. GET według id zwraca ETag obejmujący dokładnie treść odpowiedzi; zgodne If-None-Match powoduje bezpłatne HTTP 304. Odpowiedź z danymi ustalanymi podczas żądania otrzymuje słaby ETag (W/), zmieniający się co najmniej codziennie (components.headers.ETag). Uwierzytelnione odpowiedzi mają Cache-Control: private, max-age=0, must-revalidate, nigdy public. Informacje planistyczne są dostępne w jednym żądaniu planning: plan ogólny, MPZP, WZ i stan planowania gminy; należą także do check. Status planu to draft, adopted, in_force lub none z effective_from. Tylko MPZP może mieć status=null, gdy integracja wymienia strefę bez statusu prawnego. Nigdy nie udostępnia się numerów KW, danych właścicieli ani władających, nazw inwestorów ani cen transakcyjnych powiązanych z konkretnym adresem. Dla planów podstawowym źródłem jest Rejestr Urbanistyczny, a przegląd POG Działkopedii jest źródłem zastępczym ze wskazaniem pochodzenia (source.fallback: true). Format każdej odpowiedzi: contracts/envelope.json (Envelope). W środowisku deweloperskim uwierzytelnianie odbywa się przez nagłówek z kluczem statycznym. Odpowiedzi v2 mają meta.contract_version=2.0.0 i obowiązkowe nowe informacje o pochodzeniu danych; zobacz contracts/README.md. Nowe źródła wymagają indywidualnej zgody operatora. LANDFEED_LISTING_LOOKUP_ENABLED jest domyślnie false.",
    "summary": "Rozpoznaj polską działkę na podstawie tekstu użytkownika i uzyskaj dane źródłowe oraz wynik sprawdzenia w jednym wywołaniu.",
    "title": "landfeed - API polskich działek ewidencyjnych",
    "version": "2.0.0",
    "x-contract-revision": "int-r11"
  },
  "openapi": "3.1.0",
  "paths": {
    "/v1/account/keys": {
      "get": {
        "description": "Maksymalnie 10 aktywnych kluczy, łącznie z kluczami ważnymi podczas wymiany. Bez sekretu i skrótu. Unieważnione i wygasłe klucze są pomijane. Ostatnie użycie oznacza udane bezpośrednie uwierzytelnienie kluczem.",
        "operationId": "account_keys_list",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountKeyListResponse"
                }
              }
            },
            "description": "Wyłącznie metadane klucza."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ],
        "summary": "Lista ważnych kluczy tego konta; tylko dla właściciela lub administratora zespołu.",
        "tags": [
          "account"
        ],
        "x-landfeed-surface": "account",
        "x-request-cost": 0
      },
      "post": {
        "description": "Tylko właściciel lub administrator zespołu może zarządzać własnymi kluczami. Maksymalnie 10 ważnych kluczy, łącznie z okresem wymiany. Sekretu nie można pobrać ponownie. Po utracie odpowiedzi unieważnij nowy klucz widoczny na liście i utwórz kolejny. Wszystkie operacje konta są bezpłatne.",
        "operationId": "account_keys_create",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "label": "Console"
              },
              "schema": {
                "$ref": "#/components/schemas/AccountKeyWrite"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountKeyCreatedResponse"
                }
              }
            },
            "description": "Metadane nowego klucza i sekret dostępny jeden raz. Cache-Control: no-store."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ],
        "summary": "Utwórz klucz konta i pokaż jego sekret jeden raz.",
        "tags": [
          "account"
        ],
        "x-landfeed-surface": "account",
        "x-request-cost": 0
      }
    },
    "/v1/account/keys/{key_id}": {
      "delete": {
        "description": "Po zatwierdzeniu zmiany bezpośrednie uwierzytelnienie i powiązane OAuth natychmiast przestają działać. Klucz innego konta zwraca 404. Można unieważnić używany obecnie klucz.",
        "operationId": "account_keys_revoke",
        "parameters": [
          {
            "in": "path",
            "name": "key_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountKeyRevokedResponse"
                }
              }
            },
            "description": "Klucz unieważniony; bez sekretu."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ],
        "summary": "Natychmiast unieważnij klucz tego konta; tylko dla właściciela lub administratora zespołu.",
        "tags": [
          "account"
        ],
        "x-landfeed-surface": "account",
        "x-request-cost": 0
      }
    },
    "/v1/account/keys/{key_id}/rotate": {
      "post": {
        "description": "Tylko właściciel lub administrator zespołu. Stary klucz zachowuje ważność dokładnie przez 24 godziny, chyba że wcześniej go unieważniono; powiązane OAuth wygasa w tym samym momencie. Ponowna wymiana klucza w okresie wspólnej ważności zwraca 409. Oba klucze wliczają się do limitu 10; przy pełnym limicie najpierw unieważnij inny klucz. Pominięta etykieta jest dziedziczona ze starego klucza.",
        "operationId": "account_keys_rotate",
        "parameters": [
          {
            "in": "path",
            "name": "key_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "label": "Console"
              },
              "schema": {
                "$ref": "#/components/schemas/AccountKeyWrite"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountKeyRotatedResponse"
                }
              }
            },
            "description": "Nowy klucz z sekretem dostępnym jeden raz, identyfikator poprzedniego klucza i termin wygaśnięcia w UTC. Cache-Control: no-store."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ],
        "summary": "Wymień klucz z 24-godzinnym okresem wspólnej ważności; pokaż nowy sekret jeden raz.",
        "tags": [
          "account"
        ],
        "x-landfeed-surface": "account",
        "x-request-cost": 0
      }
    },
    "/v1/account/ledger": {
      "get": {
        "description": "Liczby ze znakiem; opłaty są ujemne. Saldo po wpisie obejmuje rezerwacje i przyszłe przyznania kredytów, więc nie jest saldem dostępnym do wydania. Kursor wyklucza wpisy zatwierdzone po pierwszej stronie. Kolejność jest malejąca według czasu i numeru w puli. Powtórz period, jeśli podano go na pierwszej stronie. Korekty są pokazywane jako charge lub grant zależnie od znaku. Każda operacja konta kosztuje zero kredytów; limit wynosi 30 wywołań na konto na minutę.",
        "operationId": "account_ledger",
        "parameters": [
          {
            "description": "Data ISO w UTC wybiera zawierający ją okres płatny albo miesiąc kalendarzowy, gdy takiego okresu nie ma. Domyślnie wybierana jest bieżąca data. Początek włącznie, koniec wyłącznie; maksymalnie 366 dni.",
            "in": "query",
            "name": "period",
            "schema": {
              "format": "date",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "maxLength": 1024,
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 50,
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountLedgerResponse"
                }
              }
            },
            "description": "Strona historii rozliczeń ze stałym zakresem wpisów; bez danych osobowych."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ],
        "summary": "Odczytaj zaksięgowane zmiany kredytów we wspólnej puli.",
        "tags": [
          "account"
        ],
        "x-landfeed-surface": "account",
        "x-request-cost": 0
      }
    },
    "/v1/account/usage": {
      "get": {
        "description": "Ta sama pula i wybór okresu co w historii rozliczeń. Kredyty są liczone w chwili rozliczenia, po zwrotach; oczekujące rezerwacje i ręczne korekty są pomijane. Dni bez zużycia mają zero. Niesklasyfikowane dawne operacje mają kod other. Każdy członek konta może odczytać historię i zużycie bieżącej puli.",
        "operationId": "account_usage",
        "parameters": [
          {
            "description": "Data ISO w UTC wybiera zawierający ją okres płatny albo miesiąc kalendarzowy, gdy takiego okresu nie ma. Domyślnie wybierana jest bieżąca data. Początek włącznie, koniec wyłącznie; maksymalnie 366 dni.",
            "in": "query",
            "name": "period",
            "schema": {
              "format": "date",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountUsageResponse"
                }
              }
            },
            "description": "Granice okresu i łączne rozliczone zużycie."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ],
        "summary": "Rozliczone zużycie netto kredytów według operacji i dnia UTC w okresie rozliczeniowym.",
        "tags": [
          "account"
        ],
        "x-landfeed-surface": "account",
        "x-request-cost": 0
      }
    },
    "/v1/ask": {
      "post": {
        "description": "Operacja jest wyłączona bez LANDFEED_ASK_PROVIDER i uwierzytelnienia dostawcy. Wtedy zwraca stan niedostępności bez opłaty. Domyślny budżet wynosi 5 kredytów, maksymalny 20. Budżet jest rezerwowany przed pracą modelu; rozliczenie obejmuje publiczne ceny wywołań narzędzi i 1 kredyt za ukończoną odpowiedź. billing.cost oznacza rezerwację, a billing.refunded obejmuje niewykorzystany budżet. calls podaje opłatę za każde wywołanie. max_credits nigdy nie jest przekraczane. W JSON v1 po wyczerpaniu budżetu odpowiedź zawiera zebrane dowody i wskazuje brakujące dane. Nieznany zakres danych nigdy nie oznacza braku ryzyka. Dane właścicieli i numery KW nie są pobierane ani podawane. Pytania, uwagi źródłowe i rozmowy z modelem nie są zapisywane ani logowane. Cytowania wskazują konkretną odpowiedź źródłową przez wywołanie, wskaźnik JSON i SHA-256 oraz datę i zakres danych. Uwagi źródłowe są niezaufane; tekst modelu nigdy nie jest udostępniany jako dowód faktów. Nagłówek Accept: text/event-stream wybiera zdarzenia SSE według AskEvent. Każde zdarzenie zawiera nazwę i dane JSON. Przed wykonaniem kroku podawane są metoda, ścieżka, parametry, treść żądania i koszt publicznej operacji. Wyniki i kontynuacje są podpisane HMAC-SHA256, związane z kontem i sprawdzane przed naliczeniem opłat. LANDFEED_ASK_HMAC_SECRET wymaga co najmniej 32 bajtów. Zmienione, wygasłe lub należące do innego konta dane są odrzucane. Prześlij ponownie messages, podpisane results z pełną treścią oraz continuation. Do modelu trafia ostatnich 20 wiadomości; wcześniejszy zamiar jest streszczany w bieżącym żądaniu. Wywołania narzędzi aplikacji i oczekiwanie na potwierdzenie nie mają dopłaty za odpowiedź. Tworzenie i usuwanie obserwacji, konfiguracja webhooka, eksport i krok powyżej 3 kredytów wymagają potwierdzenia. Wznowienie wymaga podpisanej kontynuacji oraz pasującego confirmation lub client_results. Zatrzymanie z powodu budżetu zwalnia całą turę z opłat, także wcześniejsze odczyty. Zdarzenia z rozliczeniem kroku są wysyłane po ostatecznym rozliczeniu. W v2 przed rozliczeniem ujawniana jest tylko aktywność kroków; nowe wyniki i fakty są wstrzymywane po zatrzymaniu z powodu budżetu lub błędzie rozliczenia. Rozłączenie nie powoduje automatycznego powtórzenia operacji. Rozmowa nie jest przechowywana. Protokół konsoli opisuje ask/README-v2.md.",
        "operationId": "ask",
        "parameters": [
          {
            "description": "SSE wybiera ask-v2; JSON zachowuje v1, chyba że podano version=ask-v2 lub pola rozmowy.",
            "in": "header",
            "name": "Accept",
            "schema": {
              "enum": [
                "application/json",
                "text/event-stream"
              ],
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "context": {
                  "parcel_id": "141803_2.0001.12/3"
                },
                "max_credits": 5,
                "question": "Czy działka leży w obszarze zagrożenia powodziowego?"
              },
              "schema": {
                "$ref": "#/components/schemas/AskRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              },
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/AskEvent"
                }
              }
            },
            "description": "Stan answered, incomplete, budget_exhausted, refused albo stan niedostępności przy wyłączonej lub niedostępnej usłudze; sprawdź status i billing."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              }
            },
            "description": "Nieprawidłowe dane wejściowe; bez opłaty."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              }
            },
            "description": "Wymagany ważny klucz konta; bez opłaty."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              }
            },
            "description": "Wymagany klucz przypisany do konta; bez opłaty."
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              }
            },
            "description": "Treść przekracza 1 MiB (v2) lub 16 KiB (v1); bez opłaty."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              }
            },
            "description": "Za mało kredytów lub przekroczony limit żądań; bez opłaty."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              }
            },
            "description": "Dostawca lub rozliczenia są niedostępne; sprawdź wywołania i rozliczone kredyty."
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ],
        "summary": "Odpowiedz na pytanie o działkę po polsku na podstawie płatnych odczytów landfeed.",
        "x-credit-rule": "ask: public tool charges + 1 answer; reserve max_credits, default 5, max 20; disabled/invalid/refusal free",
        "x-landfeed-surface": "ask",
        "x-request-cost": 1
      }
    },
    "/v1/billing/account": {
      "delete": {
        "operationId": "billing_account_delete",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami; zero kredytów."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Unieważnij dane uwierzytelniające i usuń pola osobowe; trwale anuluj testową subskrypcję i usuń klienta Stripe. Zachowaj pseudonimowe rekordy księgowe.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      },
      "get": {
        "operationId": "billing_account",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami. billing.credits zawsze wynosi zero."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Wspólna pula kont, rola i obliczone saldo kredytów.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/checkout": {
      "post": {
        "operationId": "billing_checkout",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "$ref": "./envelope.json#/$defs/IdempotencyKey"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "payment_method": {
                    "default": "card",
                    "description": "Płatności cykliczne Przelewy24 nie są obsługiwane; osobny produkt na jeden okres wymaga decyzji operatora.",
                    "enum": [
                      "card"
                    ],
                    "type": "string"
                  },
                  "plan": {
                    "enum": [
                      "start",
                      "pro",
                      "team",
                      "developer"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "plan"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami. billing.credits zawsze wynosi zero."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Utwórz testową subskrypcję Stripe Checkout z ochroną przed powtórnym utworzeniem.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/plans": {
      "get": {
        "operationId": "billing_plans",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami. billing.credits zawsze wynosi zero."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Katalog planów abonamentowych w trybie testowym.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/stripe/webhook": {
      "post": {
        "operationId": "billing_stripe_webhook",
        "parameters": [
          {
            "in": "header",
            "name": "Stripe-Signature",
            "required": true,
            "schema": {
              "maxLength": 4096,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami. billing.credits zawsze wynosi zero."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "security": [],
        "summary": "Testowe zdarzenia Stripe z weryfikacją podpisu i ochroną przed ponownym przetworzeniem. Dane trybu produkcyjnego nie są przyjmowane.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/team": {
      "get": {
        "operationId": "billing_team",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami; zero kredytów."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Lista członków uwierzytelnionej wspólnej puli kont.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/team/accept": {
      "post": {
        "operationId": "billing_team_accept",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "token": {
                    "pattern": "^[A-Za-z0-9_-]{43}$",
                    "type": "string"
                  }
                },
                "required": [
                  "token"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami; zero kredytów."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Przyjmij zaproszenie przypisane do uwierzytelnionego, istniejącego konta.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/team/invitations": {
      "post": {
        "operationId": "billing_team_invite",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "$ref": "./envelope.json#/$defs/IdempotencyKey"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "account_id": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "role": {
                    "enum": [
                      "admin",
                      "member"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "account_id",
                  "role"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami; zero kredytów."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Właściciel tworzy zaproszenie ważne siedem dni, rezerwując jedno z pięciu miejsc.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/team/invitations/{invitation_id}": {
      "delete": {
        "operationId": "billing_team_revoke_invite",
        "parameters": [
          {
            "in": "path",
            "name": "invitation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami; zero kredytów."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Właściciel lub administrator unieważnia nieprzyjęte zaproszenie.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/billing/team/members/{account_id}": {
      "delete": {
        "operationId": "billing_team_remove",
        "parameters": [
          {
            "in": "path",
            "name": "account_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami; zero kredytów."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Właściciel lub administrator usuwa miejsce; członek może zrezygnować z własnego miejsca. Właściciela nie można usunąć.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      },
      "patch": {
        "operationId": "billing_team_role",
        "parameters": [
          {
            "in": "path",
            "name": "account_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "role": {
                    "enum": [
                      "admin",
                      "member"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "role"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem zarządzania rozliczeniami; zero kredytów."
          },
          "400": {
            "$ref": "#/components/responses/Failure"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "403": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          },
          "429": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Właściciel ustawia rolę admin lub member. Nie można zmienić właściciela.",
        "x-landfeed-surface": "billing",
        "x-request-cost": 0
      }
    },
    "/v1/check": {
      "get": {
        "description": "Nie jest to porada prawna: wartości logiczne wynikają ze źródeł, tak jak oznaczenie zagrożenia powodziowego. Sprawdzenie danych, których państwo nie publikuje maszynowo, ma wynik unknown, bez zgadywania. result.record zawiera pełną kartę działki, aby jedno wywołanie odpowiadało także na dalsze pytania. Sprawdzanie obejmuje planowanie: pog_zone ze statusem planu i effective_from, wz_possible oraz mpzp_status.",
        "operationId": "check",
        "parameters": [
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          },
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/CheckOk"
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Czy można tu budować? Wynik według stałych reguł, ze wskazaniem sprawdzeń, źródeł i pełnej karty działki.",
        "x-request-cost": 1
      },
      "post": {
        "description": "Operacja jest niedostępna w tej usłudze, bez rezerwacji i opłaty. Zarezerwowany kontrakt POST /v1/check z Idempotency-Key przewiduje 1 kredyt za identyfikator po zakończeniu, z dotychczasowym zwrotem za każdą pozycję. Zgłoszenie i sprawdzanie stanu nie mają opłaty. To samo konto, klucz i treść żądania zwracają to samo zadanie bez ponownej opłaty; zmieniona treść z tym samym kluczem daje 409 i zwrot. Klucze są przechowywane co najmniej 24 godziny po zakończeniu zadania.",
        "operationId": "check_batch",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "$ref": "./envelope.json#/$defs/IdempotencyKey"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "./envelope.json#/$defs/BatchCheckRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "./envelope.json"
                    },
                    {
                      "properties": {
                        "result": {
                          "anyOf": [
                            {
                              "type": "null"
                            },
                            {
                              "$ref": "./envelope.json#/$defs/BatchCheckJob"
                            }
                          ]
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem v2 o określonym typie.",
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-Credits-Charged": {
                "$ref": "#/components/headers/XCreditsCharged"
              },
              "X-Credits-Refunded": {
                "$ref": "#/components/headers/XCreditsRefunded"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/XRequestCost"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Zbiorcze sprawdzenie check.",
        "x-credit-rule": "Submission and poll free; on completion meter 1 per id with per-item refunds, once per idempotent job.",
        "x-request-cost": 0,
        "x-runtime-supported": false
      }
    },
    "/v1/check/jobs/{job_id}": {
      "get": {
        "description": "Operacja jest niedostępna w tej usłudze. Zarezerwowany zasób zadania jest związany z kontem; inne konto nie ma do niego dostępu. Wyniki są dostępne tylko po zakończeniu zadania; wcześniej odpowiedź 409 jest bezpłatna.",
        "operationId": "check_job",
        "parameters": [
          {
            "in": "path",
            "name": "job_id",
            "required": true,
            "schema": {
              "pattern": "^check_[A-Za-z0-9_-]+$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "./envelope.json"
                    },
                    {
                      "properties": {
                        "result": {
                          "anyOf": [
                            {
                              "type": "null"
                            },
                            {
                              "$ref": "./envelope.json#/$defs/BatchCheckJob"
                            }
                          ]
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem v2 o określonym typie.",
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-Credits-Charged": {
                "$ref": "#/components/headers/XCreditsCharged"
              },
              "X-Credits-Refunded": {
                "$ref": "#/components/headers/XCreditsRefunded"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/XRequestCost"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Zadanie sprawdzenia check.",
        "x-request-cost": 0,
        "x-runtime-supported": false
      }
    },
    "/v1/check/jobs/{job_id}/results": {
      "get": {
        "description": "Operacja jest niedostępna w tej usłudze. Zarezerwowany zasób zadania jest związany z kontem; inne konto nie ma do niego dostępu. Wyniki są dostępne tylko po zakończeniu zadania; wcześniej odpowiedź 409 jest bezpłatna.",
        "operationId": "check_job_results",
        "parameters": [
          {
            "in": "path",
            "name": "job_id",
            "required": true,
            "schema": {
              "pattern": "^check_[A-Za-z0-9_-]+$",
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "./envelope.json"
                    },
                    {
                      "properties": {
                        "result": {
                          "anyOf": [
                            {
                              "type": "null"
                            },
                            {
                              "$ref": "./envelope.json#/$defs/BatchCheckResults"
                            }
                          ]
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Odpowiedź Envelope z wynikiem v2 o określonym typie.",
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-Credits-Charged": {
                "$ref": "#/components/headers/XCreditsCharged"
              },
              "X-Credits-Refunded": {
                "$ref": "#/components/headers/XCreditsRefunded"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/XRequestCost"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          },
          "409": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Wyniki zadania check.",
        "x-request-cost": 0,
        "x-runtime-supported": false
      }
    },
    "/v1/events": {
      "get": {
        "description": "Zdarzenia v2 korzystają z EventV2: siedmiu rodzajów zmian ze źródłem i datą. Dane zbiorcze RCN wymagają k>=6, mediany zaokrąglonej do 50 zł/m² i obszaru; nigdy nie opisują sprzedaży pojedynczej działki. listing_seen zawiera wyłącznie identyfikatory działek. Stronicowanie kursorem korzysta z Page. observed_at oznacza czas wykrycia, a occurred_at może być null, gdy źródło nie publikuje czasu zdarzenia.",
        "operationId": "events",
        "parameters": [
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          },
          {
            "in": "query",
            "name": "since",
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "format": "date-time",
                  "type": "string"
                }
              ]
            }
          },
          {
            "description": "Nazwy EventTypeV2 oddzielone przecinkami; tryb v1 przyjmuje także dotychczasowe nazwy zdarzeń.",
            "in": "query",
            "name": "types",
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json#/$defs/SearchArea"
                }
              }
            },
            "description": "Zastępuje q|id|point; obszar EventsRequestV2 w v2.",
            "in": "query",
            "name": "area"
          },
          {
            "description": "Do 100 różnych identyfikatorów działek; większe listy przekaż przez POST /v1/events/query.",
            "in": "query",
            "name": "parcel_ids",
            "schema": {
              "$ref": "./envelope.json#/$defs/EventsGetParcelIds"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EventsOk"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Zmiany dotyczące działki, otoczenia punktu albo gminy wskazanej w q, od najnowszych.",
        "x-request-cost": 1
      }
    },
    "/v1/events/query": {
      "post": {
        "description": "Zastępuje parametry GET dla dużych list i wielokątów. Te same zdarzenia, kursory i koszt odczytu jednego kredytu; operacja nie tworzy subskrypcji.",
        "operationId": "events_query",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "./envelope.json#/$defs/EventsRequestV2"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/EventsOk"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Pobierz zdarzenia określonych typów, przekazując w treści żądania do 10 000 identyfikatorów działek albo obszar.",
        "x-request-cost": 1
      }
    },
    "/v1/gminy/planning": {
      "get": {
        "operationId": "gmina_planning_lookup",
        "parameters": [
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/PlanningOk"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Jak /v1/gminy/{teryt}/planning, z gminą rozpoznaną na podstawie q (nazwa gminy lub tekst opisujący działkę), id albo point.",
        "x-request-cost": 1
      }
    },
    "/v1/gminy/{teryt}/planning": {
      "get": {
        "operationId": "gmina_planning",
        "parameters": [
          {
            "description": "Siedmioznakowy kod gminy administracyjnej z ostatnią cyfrą 1, 2 lub 3 (np. 1465011 Warszawa, 1418032 Lesznowola), będący kluczem gmina_planning. Kod jednostki z identyfikatora działki z ostatnią cyfrą 4, 5, 8 lub 9 jest przypisywany do gminy administracyjnej tak jak parcel_record.admin_gmina_teryt (nagłówek parcel_record.sql), co opisuje query.resolved.note. Dla nazwy, działki albo punktu użyj /v1/gminy/planning.",
            "in": "path",
            "name": "teryt",
            "required": true,
            "schema": {
              "pattern": "^[0-9]{7}$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/PlanningOk"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Stan planowania w gminie: plan ogólny, zakres MPZP i zasady wydawania WZ w dniu zapytania.",
        "x-request-cost": 1
      }
    },
    "/v1/layer/{layer}": {
      "get": {
        "operationId": "layer",
        "parameters": [
          {
            "in": "path",
            "name": "layer",
            "required": true,
            "schema": {
              "$ref": "./envelope.json#/$defs/LayerKey"
            }
          },
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          },
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/LayerOk"
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Jedna odpowiedź tematyczna dla jednej działki.",
        "x-request-cost": 1
      }
    },
    "/v1/openapi.json": {
      "get": {
        "operationId": "openapi",
        "responses": {
          "200": {
            "content": {
              "application/json": {}
            },
            "description": "Dokument OpenAPI 3.1."
          }
        },
        "security": [],
        "summary": "Ta specyfikacja w postaci udostępnianej przez usługę.",
        "x-request-cost": 0
      }
    },
    "/v1/parcel": {
      "get": {
        "description": "Karta za 1 kredyt obejmuje display_geometry, display_simplified=true i adjacent_parcel_ids (do 50 aktywnych wczytanych działek ze wspólnym odcinkiem granicy). adjacent_parcel_ids_truncated wskazuje dalszych sąsiadów. Granica jest upraszczana do 0,5 m w EPSG:2180 i zwracana w EPSG:4326. geometry=full pozostaje osobnym płatnym odczytem dokładnej geometrii do eksportu.",
        "operationId": "parcel",
        "parameters": [
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          },
          {
            "$ref": "#/components/parameters/layers"
          },
          {
            "$ref": "#/components/parameters/geometry"
          },
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ParcelOk"
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Pełna karta jednej działki z danymi źródłowymi.",
        "x-request-cost": 1
      }
    },
    "/v1/parcel/batch": {
      "post": {
        "operationId": "parcel_batch",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "geometry": {
                    "default": "centroid",
                    "enum": [
                      "none",
                      "centroid",
                      "full"
                    ],
                    "type": "string"
                  },
                  "items": {
                    "items": {
                      "$ref": "./envelope.json#/$defs/QueryInput"
                    },
                    "maxItems": 1000,
                    "minItems": 1,
                    "type": "array"
                  },
                  "layers": {
                    "items": {
                      "$ref": "./envelope.json#/$defs/LayerKey"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "items"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "./envelope.json"
                }
              }
            },
            "description": "result to tablica odpowiedzi dla poszczególnych elementów, każda z własnym statusem i kandydatami."
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Do 1 000 działek w jednym żądaniu; każdy element to q, id albo point.",
        "x-request-cost": 1,
        "x-request-cost-per": "item"
      }
    },
    "/v1/places": {
      "get": {
        "description": "Podpowiedzi ignorują wielkość liter i znaki diakrytyczne, w tym ł/l. Zakres danych wskazuje działki dostępne do wyszukiwania, a nie kompletność rejestru. Miejscowości bez SIMC mają teryt=null. Maksymalnie 20 wyników; kolejność jest stała i uwzględnia dokładną nazwę, długość pozostałego fragmentu, typ, nazwę oraz identyfikator.",
        "operationId": "places",
        "parameters": [
          {
            "in": "query",
            "name": "q",
            "required": true,
            "schema": {
              "maxLength": 100,
              "minLength": 2,
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 10,
              "maximum": 20,
              "minimum": 1,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "./envelope.json"
                    },
                    {
                      "properties": {
                        "result": {
                          "$ref": "./envelope.json#/$defs/PlacesResult"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Odpowiedź zawiera PlacesResult; koszt wynosi 0 kredytów."
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "503": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Bezpłatne podpowiedzi nazw polskich gmin, powiatów, obrębów i miejscowości na podstawie początku nazwy.",
        "x-request-cost": 0
      }
    },
    "/v1/resolve": {
      "get": {
        "description": "Zawsze zwracane są candidates (także z jednym kandydatem) i corpus_coverage. Status ok oznacza dokładnie jednego pewnego kandydata: pewność co najmniej 0,85 i przewaga co najmniej 0,15 nad kolejnym. W przeciwnym razie zwracany jest status ambiguous, a needs_obreb=true wskazuje numer występujący w kilku obrębach gminy. Nazwy miejscowości i gmin są dopasowywane w przybliżeniu, z uwzględnieniem diakrytyków i jednej lub dwóch literówek, np. „Lesnowola” znajduje Lesznowolę. Pewność jest wtedy obniżana, a założenie opisują query.resolved.note i match_reason. Identyfikatory są przyjmowane z ukośnikiem lub łącznikiem. Kandydat ze zbioru, którego jeszcze nie załadowano, ma held=false; informuje o tym także corpus_coverage.",
        "operationId": "resolve",
        "parameters": [
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 5,
              "maximum": 20,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Zastępuje q|id|point. Wymaga LANDFEED_LISTING_LOOKUP_ENABLED (domyślnie false). Odpowiedź zawiera status ambiguous i wyłącznie candidates[], także przy jednym kandydacie. Bez treści, zdjęć i cen z ogłoszenia. Pusta lista oznacza not_found i zwrot opłaty.",
            "in": "query",
            "name": "listing_url",
            "schema": {
              "format": "uri",
              "maxLength": 2048,
              "pattern": "^https://",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ResolveOk"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Rozpoznaj kandydatów na działkę na podstawie tekstu użytkownika, identyfikatora albo punktu.",
        "x-feature-flag": "LANDFEED_LISTING_LOOKUP_ENABLED",
        "x-request-cost": 1
      }
    },
    "/v1/search": {
      "get": {
        "description": "q: adres z PRG („Marcinowice 221”, „Warszawa, Puławska 1”) albo tekst opisujący działkę; zwraca działki pod danym adresem. id lub point: działki w odległości radius_m (0 oznacza wskazaną działkę i sąsiadów ze wspólną granicą). bbox: działki przecinające obszar do 4 km². Wyszukiwanie według wielokąta odbywa się przez POST /v1/search z wielokątem GeoJSON do 4 km².",
        "operationId": "search",
        "parameters": [
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          },
          {
            "description": "Administracyjny kod powiatu (4 cyfry) lub gminy (7 cyfr); zastępuje parcel/point/bbox.",
            "in": "query",
            "name": "teryt",
            "schema": {
              "pattern": "^(?:[0-9]{4}|[0-9]{6}[123])$",
              "type": "string"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "area_min_m2",
            "schema": {
              "maximum": 1000000000000.0,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "area_max_m2",
            "schema": {
              "maximum": 1000000000000.0,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "land_use_class",
            "schema": {
              "enum": [
                "R",
                "Ł",
                "Ps",
                "Br",
                "B",
                "Ba",
                "Bi",
                "Bp",
                "Bz",
                "K",
                "Ls",
                "Lz",
                "Lzr",
                "N",
                "Wp",
                "Ws",
                "Wsr",
                "W",
                "dr",
                "Tk",
                "Ti",
                "Tr",
                "E"
              ],
              "type": "string"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "shape_regularity_min",
            "schema": {
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "frontage_min_m",
            "schema": {
              "maximum": 1000000000000.0,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "road_access",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "buildings_present",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "public_road_max_m",
            "schema": {
              "maximum": 1000000000000.0,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "rcn_price_min_pln_m2",
            "schema": {
              "maximum": 1000000000000.0,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "rcn_price_max_pln_m2",
            "schema": {
              "maximum": 1000000000000.0,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "gunb_activity_min",
            "schema": {
              "maximum": 1000000000000.0,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "description": "Nieznane wartości są wykluczane i liczone w search_facets. Filtr obejmuje wartość graniczną.",
            "in": "query",
            "name": "pog_zone_class",
            "schema": {
              "enum": [
                "SW",
                "SJ",
                "SN",
                "SU",
                "SH",
                "SI",
                "SZ",
                "SC",
                "SG",
                "SO",
                "SR",
                "SK",
                "SP"
              ],
              "type": "string"
            }
          },
          {
            "description": "min_lon,min_lat,max_lon,max_lat w układzie WGS84. Zastępuje q|id|point.",
            "in": "query",
            "name": "bbox",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "radius_m",
            "schema": {
              "default": 0,
              "maximum": 2000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/SearchOk"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          },
          "404": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Działki według adresu lub tekstu (q), w pobliżu działki (id) albo punktu lub w obszarze bbox.",
        "x-request-cost": 1
      },
      "post": {
        "description": "Wyszukiwanie wielokątem obsługuje płaskie filtry cech w obiekcie filters. GET przyjmuje te same filtry oraz administracyjny teryt. Nieznany wynik nigdy nie spełnia filtra; jest liczony w search_facets przed stronicowaniem. Format SearchRequestV2 i eksport pozostają niedostępne; opłata za eksport nie jest naliczana.",
        "operationId": "search_polygon",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "properties": {
                      "cursor": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "filters": {
                        "$ref": "./envelope.json#/$defs/FeatureSearchFilters"
                      },
                      "limit": {
                        "default": 100,
                        "maximum": 1000,
                        "minimum": 1,
                        "type": "integer"
                      },
                      "polygon": {
                        "WGS84": null,
                        "description": "Obiekt GeoJSON typu Polygon lub MultiPolygon.",
                        "type": "object"
                      }
                    },
                    "required": [
                      "polygon"
                    ],
                    "type": "object"
                  }
                ]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/SearchOk"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Wyszukaj w powiecie, gminie lub obszarze Polygon z filtrami o określonych typach i stronicowaniem kursorem; dotychczasowe zapytania wielokątowe pozostają poprawne.",
        "x-credit-rule": "page: 1; export: ceil(rows/100), replaces page cost; max 2000 results; no charge for refused/unavailable answers",
        "x-request-cost": 1
      }
    },
    "/v1/sources": {
      "get": {
        "description": "Bez wskazania działki katalog i zakres danych na poziomie gminy są bezpłatne. Parametr q, id, point, lat lub lng podlega tym samym zasadom rezerwacji jednego kredytu, rozliczenia i zwrotu co GET /v1/resolve. Konto bez kredytów jest odrzucane przed rozpoznawaniem i ustalaniem zakresu danych w czasie żądania.",
        "operationId": "sources",
        "parameters": [
          {
            "$ref": "#/components/parameters/q"
          },
          {
            "$ref": "#/components/parameters/id"
          },
          {
            "$ref": "#/components/parameters/point"
          },
          {
            "$ref": "#/components/parameters/lat"
          },
          {
            "$ref": "#/components/parameters/lng"
          },
          {
            "in": "query",
            "name": "layer",
            "schema": {
              "$ref": "./envelope.json#/$defs/LayerKey"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/SourcesOk"
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "401": {
            "$ref": "#/components/responses/Failure"
          }
        },
        "summary": "Wszystkie źródła udostępniane przez API, z licencją, wskazaniem pochodzenia, as_of, aktualnością i zakresem danych.",
        "x-credit-rule": "No parcel input: free; any parcel input: meter as resolve.",
        "x-input-cost-operation": "resolve",
        "x-request-cost": 0
      }
    },
    "/v1/watches": {
      "get": {
        "operationId": "watch_list",
        "parameters": [
          {
            "in": "query",
            "name": "after",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 100,
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Lista obserwowanych wyników tego konta.",
        "x-request-cost": 0
      },
      "post": {
        "operationId": "watch_create",
        "parameters": [
          {
            "description": "To samo konto, klucz i elementy zwracają tę samą obserwację przez 24 godziny; inne elementy zwracają 409. Usunięta obserwacja nie jest tworzona ponownie.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 200,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "items": [
                  {
                    "parcel_id": "146501_1.0101.12/3",
                    "types": [
                      "mpzp.changed",
                      "flood.changed"
                    ]
                  }
                ]
              },
              "schema": {
                "$ref": "#/components/schemas/WatchWrite"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Utwórz obserwację przyszłych zdarzeń przypisaną do konta.",
        "x-request-cost": 0
      }
    },
    "/v1/watches/{watch_id}": {
      "delete": {
        "operationId": "watch_delete",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Usuń obserwację tego konta i anuluj oczekujące wysyłki.",
        "x-request-cost": 0
      },
      "get": {
        "operationId": "watch_get",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Odczytaj obserwację tego konta.",
        "x-request-cost": 0
      },
      "parameters": [
        {
          "in": "path",
          "name": "watch_id",
          "required": true,
          "schema": {
            "format": "uuid",
            "type": "string"
          }
        }
      ],
      "put": {
        "operationId": "watch_update",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "items": [
                  {
                    "parcel_id": "146501_1.0101.12/3",
                    "types": [
                      "mpzp.changed",
                      "flood.changed"
                    ]
                  }
                ]
              },
              "schema": {
                "$ref": "#/components/schemas/WatchWrite"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Zastąp elementy obserwacji tego konta; powiadomienia w kolejce zachowują pierwotny zestaw dopasowań.",
        "x-request-cost": 0
      }
    },
    "/v1/watches/{watch_id}/attempts": {
      "get": {
        "operationId": "watch_attempts",
        "parameters": [
          {
            "in": "query",
            "name": "after",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 100,
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Dziennik wysyłek tego konta, bez adresów URL i treści odpowiedzi.",
        "x-request-cost": 0
      },
      "parameters": [
        {
          "in": "path",
          "name": "watch_id",
          "required": true,
          "schema": {
            "format": "uuid",
            "type": "string"
          }
        }
      ]
    },
    "/v1/watches/{watch_id}/webhook": {
      "delete": {
        "operationId": "watch_webhook_remove",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Usuń webhook i anuluj jego oczekujące wysyłki.",
        "x-request-cost": 0
      },
      "parameters": [
        {
          "in": "path",
          "name": "watch_id",
          "required": true,
          "schema": {
            "format": "uuid",
            "type": "string"
          }
        }
      ],
      "put": {
        "operationId": "watch_webhook_configure",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "enabled": true,
                "url": "https://example.org/landfeed-hook"
              },
              "schema": {
                "$ref": "#/components/schemas/WatchWebhookWrite"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Zarejestruj lub zastąp webhook HTTPS; operacja jednorazowo zwraca nowy sekret do podpisywania i anuluje poprzednią kolejkę.",
        "x-request-cost": 0
      }
    },
    "/v1/watches/{watch_id}/webhook/rotate": {
      "parameters": [
        {
          "in": "path",
          "name": "watch_id",
          "required": true,
          "schema": {
            "format": "uuid",
            "type": "string"
          }
        }
      ],
      "post": {
        "operationId": "watch_secret_rotate",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatchResponse"
                }
              }
            },
            "description": "Wynik ograniczony do konta. Sekrety utworzone lub zmienione w tej operacji są ujawniane wyłącznie w jej odpowiedzi."
          },
          "400": {
            "description": "Błędne dane wejściowe lub event_type_has_no_producer; bezpłatne."
          },
          "401": {
            "description": "Wymagany poprawny klucz API konta; bezpłatne."
          },
          "403": {
            "description": "Statyczne dane uwierzytelniające lub nieaktywne konto; bezpłatne."
          },
          "404": {
            "description": "Brak obserwacji należącej do tego konta; bezpłatne."
          },
          "409": {
            "description": "Osiągnięto limit obserwowanych elementów; bezpłatne."
          },
          "413": {
            "description": "Treść przekracza 256 KiB lub łączny limit pracy walidatora; bezpłatne."
          },
          "429": {
            "description": "Limit 30 operacji zarządzania na konto na minutę; bezpłatne."
          },
          "503": {
            "description": "Magazyn obserwacji lub rozpoznawanie adresu odbiorcy są niedostępne; bezpłatne."
          }
        },
        "summary": "Zmień sekret konta do podpisywania i ujawnij go jednokrotnie. Oczekujące wysyłki korzystają z nowego klucza.",
        "x-request-cost": 0
      }
    }
  },
  "security": [
    {
      "ApiKey": []
    },
    {
      "OAuthConnector": []
    }
  ],
  "servers": [
    {
      "description": "Środowisko deweloperskie blackbull",
      "url": "http://localhost:8410"
    }
  ]
}
