{
    "openapi": "3.0.3",
    "info": {
        "title": "FARMA — publiczne API",
        "version": "1.0.0",
        "description": "Dane o polskich gminach z rejestrów publicznych. \n\n**Każda odpowiedź niesie sekcję `zrodlo`** — skąd dane pochodzą, z jakiego dnia i na jakich warunkach wolno ich użyć. Portal obiecuje, że każda liczba ma podane pochodzenie, a dane wzięte przez API trafią do cudzych opracowań już bez tej obietnicy.\n\n**Do pobrania całych zbiorów służą paczki**, nie pętla po tym API: https://farma.waw.pl/zrodla/#paczki — jeden plik zamiast setek żądań.\n\n**Czego API nie oddaje:** opinii i ocen wystawionych przez ludzi. To treść moderowana, pisana w zaufaniu do tego portalu.",
        "contact": {
            "url": "https://farma.waw.pl/api/"
        }
    },
    "servers": [
        {
            "url": "https://farma.waw.pl"
        }
    ],
    "security": [
        {
            "KluczApi": []
        }
    ],
    "components": {
        "securitySchemes": {
            "KluczApi": {
                "type": "apiKey",
                "in": "header",
                "name": "X-Api-Key",
                "description": "Klucz przyznaje człowiek po przeczytaniu wniosku — formularz jest na https://farma.waw.pl/api/. Klucz działa też jako `Authorization: Bearer …` albo parametr `?klucz=`."
            }
        }
    },
    "paths": {
        "/api/v1/placowki/": {
            "get": {
                "summary": "Apteki, hurtownie i placówki NFZ: nazwa, typ, adres, gmina.",
                "description": "Filtry: q (nazwa), typ, teryt (gmina), od_id, strona. Stronicowanie: `od_id` (kursor, zalecane) albo `strona` (starsze, kosztowniejsze). Format: `format=csv` zamiast JSON.",
                "tags": [
                    "dane"
                ],
                "parameters": [
                    {
                        "name": "od_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "description": "Kursor: oddaj rekordy o identyfikatorze większym niż ten. Wartość do następnego wywołania jest w `strona.nastepne_od_id` oraz w nagłówku `Link: rel=\"next\"`. Przy kursorze wyniki idą po identyfikatorze, a nie po nazwie."
                    },
                    {
                        "name": "strona",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5000
                        },
                        "deprecated": true,
                        "description": "Numer strony. Droga starsza: koszt rośnie z numerem, a rekord dopisany między żądaniami przesuwa wyniki."
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "json",
                                "csv"
                            ]
                        },
                        "description": "CSV ma separator średnik i znacznik BOM (dla Excela); metryczka źródła idzie wtedy w liniach komentarza."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Koperta z danymi, stronicowaniem i metryczką źródła."
                    },
                    "401": {
                        "description": "Brak klucza albo klucz nieznany."
                    },
                    "429": {
                        "description": "Limit wyczerpany. Nagłówek `Retry-After` mówi, kiedy spróbować."
                    }
                }
            }
        },
        "/api/v1/leki/": {
            "get": {
                "summary": "Katalog leków z RPL: nazwa, moc, postać, ATC, podmiot, kategoria.",
                "description": "Filtry: q (nazwa lub substancja), kategoria (na-recepte|bez-recepty), od_id, strona. Stronicowanie: `od_id` (kursor, zalecane) albo `strona` (starsze, kosztowniejsze). Format: `format=csv` zamiast JSON.",
                "tags": [
                    "dane"
                ],
                "parameters": [
                    {
                        "name": "od_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "description": "Kursor: oddaj rekordy o identyfikatorze większym niż ten. Wartość do następnego wywołania jest w `strona.nastepne_od_id` oraz w nagłówku `Link: rel=\"next\"`. Przy kursorze wyniki idą po identyfikatorze, a nie po nazwie."
                    },
                    {
                        "name": "strona",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5000
                        },
                        "deprecated": true,
                        "description": "Numer strony. Droga starsza: koszt rośnie z numerem, a rekord dopisany między żądaniami przesuwa wyniki."
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "json",
                                "csv"
                            ]
                        },
                        "description": "CSV ma separator średnik i znacznik BOM (dla Excela); metryczka źródła idzie wtedy w liniach komentarza."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Koperta z danymi, stronicowaniem i metryczką źródła."
                    },
                    "401": {
                        "description": "Brak klucza albo klucz nieznany."
                    },
                    "429": {
                        "description": "Limit wyczerpany. Nagłówek `Retry-After` mówi, kiedy spróbować."
                    }
                }
            }
        },
        "/api/v1/firmy/": {
            "get": {
                "summary": "Podmioty z KRS: dane rejestrowe, adres, kapitał, PKD.",
                "description": "Filtry: q (nazwa, KRS, NIP, REGON), pkd, teryt (gmina), od_id, strona. Stronicowanie: `od_id` (kursor, zalecane) albo `strona` (starsze, kosztowniejsze). Format: `format=csv` zamiast JSON.",
                "tags": [
                    "dane"
                ],
                "parameters": [
                    {
                        "name": "od_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "description": "Kursor: oddaj rekordy o identyfikatorze większym niż ten. Wartość do następnego wywołania jest w `strona.nastepne_od_id` oraz w nagłówku `Link: rel=\"next\"`. Przy kursorze wyniki idą po identyfikatorze, a nie po nazwie."
                    },
                    {
                        "name": "strona",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5000
                        },
                        "deprecated": true,
                        "description": "Numer strony. Droga starsza: koszt rośnie z numerem, a rekord dopisany między żądaniami przesuwa wyniki."
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "json",
                                "csv"
                            ]
                        },
                        "description": "CSV ma separator średnik i znacznik BOM (dla Excela); metryczka źródła idzie wtedy w liniach komentarza."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Koperta z danymi, stronicowaniem i metryczką źródła."
                    },
                    "401": {
                        "description": "Brak klucza albo klucz nieznany."
                    },
                    "429": {
                        "description": "Limit wyczerpany. Nagłówek `Retry-After` mówi, kiedy spróbować."
                    }
                }
            }
        },
        "/api/v1/lokalizacje/": {
            "get": {
                "summary": "Słownik terytorialny: województwa, powiaty, gminy z kodem TERYT.",
                "description": "Filtry: q (nazwa), poziom (wojewodztwo|powiat|gmina), od_id, strona. Stronicowanie: `od_id` (kursor, zalecane) albo `strona` (starsze, kosztowniejsze). Format: `format=csv` zamiast JSON.",
                "tags": [
                    "dane"
                ],
                "parameters": [
                    {
                        "name": "od_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "description": "Kursor: oddaj rekordy o identyfikatorze większym niż ten. Wartość do następnego wywołania jest w `strona.nastepne_od_id` oraz w nagłówku `Link: rel=\"next\"`. Przy kursorze wyniki idą po identyfikatorze, a nie po nazwie."
                    },
                    {
                        "name": "strona",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5000
                        },
                        "deprecated": true,
                        "description": "Numer strony. Droga starsza: koszt rośnie z numerem, a rekord dopisany między żądaniami przesuwa wyniki."
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "json",
                                "csv"
                            ]
                        },
                        "description": "CSV ma separator średnik i znacznik BOM (dla Excela); metryczka źródła idzie wtedy w liniach komentarza."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Koperta z danymi, stronicowaniem i metryczką źródła."
                    },
                    "401": {
                        "description": "Brak klucza albo klucz nieznany."
                    },
                    "429": {
                        "description": "Limit wyczerpany. Nagłówek `Retry-After` mówi, kiedy spróbować."
                    }
                }
            }
        },
        "/api/v1/zrodla/": {
            "get": {
                "summary": "Rejestry, z których pochodzą dane: adres, licencja, częstotliwość.",
                "description": "Filtry: brak — zasób mieści się w jednej odpowiedzi. Stronicowanie: `strona` — ten zasób nie ma kursora, bo nie ma czym go zaadresować. Format: `format=csv` zamiast JSON.",
                "tags": [
                    "dane"
                ],
                "parameters": [
                    {
                        "name": "strona",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5000
                        },
                        "deprecated": true,
                        "description": "Numer strony. Droga starsza: koszt rośnie z numerem, a rekord dopisany między żądaniami przesuwa wyniki."
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "json",
                                "csv"
                            ]
                        },
                        "description": "CSV ma separator średnik i znacznik BOM (dla Excela); metryczka źródła idzie wtedy w liniach komentarza."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Koperta z danymi, stronicowaniem i metryczką źródła."
                    },
                    "401": {
                        "description": "Brak klucza albo klucz nieznany."
                    },
                    "429": {
                        "description": "Limit wyczerpany. Nagłówek `Retry-After` mówi, kiedy spróbować."
                    }
                }
            }
        },
        "/api/v1/oceny/": {
            "get": {
                "summary": "FARMA SCORE i ocena dostępności leczenia dla gmin, razem z pokryciem danych i wersją metodologii.",
                "description": "Filtry: teryt (gmina), typ (farma_score|zdrowie), min_pokrycie, strona. Stronicowanie: `strona` — ten zasób nie ma kursora, bo nie ma czym go zaadresować. Format: `format=csv` zamiast JSON.",
                "tags": [
                    "dane"
                ],
                "parameters": [
                    {
                        "name": "strona",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5000
                        },
                        "deprecated": true,
                        "description": "Numer strony. Droga starsza: koszt rośnie z numerem, a rekord dopisany między żądaniami przesuwa wyniki."
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "json",
                                "csv"
                            ]
                        },
                        "description": "CSV ma separator średnik i znacznik BOM (dla Excela); metryczka źródła idzie wtedy w liniach komentarza."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Koperta z danymi, stronicowaniem i metryczką źródła."
                    },
                    "401": {
                        "description": "Brak klucza albo klucz nieznany."
                    },
                    "429": {
                        "description": "Limit wyczerpany. Nagłówek `Retry-After` mówi, kiedy spróbować."
                    }
                }
            }
        }
    }
}