{
  "openapi": "3.1.0",
  "info": {
    "title": "Satelit API",
    "version": "1",
    "description": "Moldova's money data: official rates, fuel, tariffs, law, news, prices. HTTPS, JSON, UTF-8, read only. Dates are YYYY-MM-DD, times ISO 8601 with an offset, money in MDL as numbers. A credit is the unit of a quota, charged only on a 2xx. Every answer is `{data, meta}`; `meta.attribution` is a line to show wherever the data is shown, and `meta.sources` says where it comes from, under which licence. Data changes as often as its source does. Official rates are CC BY 4.0: the same data is free at bnm.md. OpenStreetMap's rows are ODbL: the same data is free, with no key, at the address in `meta.sources`. Shop prices are read from the shops' public pages: there is no agreement with any shop, and no licence over its data is granted."
  },
  "servers": [
    {
      "url": "https://api.satelit.md/v1"
    }
  ],
  "security": [
    {
      "bearer": []
    },
    {
      "apiKey": []
    }
  ],
  "tags": [
    {
      "name": "rates"
    },
    {
      "name": "fuel"
    },
    {
      "name": "tariffs"
    },
    {
      "name": "indexes"
    },
    {
      "name": "law"
    },
    {
      "name": "news"
    },
    {
      "name": "places"
    },
    {
      "name": "recipes"
    },
    {
      "name": "prices"
    },
    {
      "name": "deals"
    },
    {
      "name": "feed"
    },
    {
      "name": "export"
    },
    {
      "name": "tours"
    },
    {
      "name": "flights"
    },
    {
      "name": "rest"
    },
    {
      "name": "estate"
    },
    {
      "name": "ads_market"
    },
    {
      "name": "chain_shops"
    },
    {
      "name": "jokes"
    },
    {
      "name": "platform"
    }
  ],
  "paths": {
    "/rates": {
      "get": {
        "operationId": "rates",
        "summary": "Official exchange rates",
        "description": "Today's official leu rates from the National Bank of Moldova, with their change over 7 and 30 days. Costs 1 credit. The same data is free at bnm.md, and every answer says so.",
        "tags": [
          "rates"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Rate"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "code": "EUR",
                      "name": "Euro",
                      "value": 19.52,
                      "nominal": 1,
                      "date": "2026-11-02",
                      "change_7d_pct": 0.3,
                      "change_30d_pct": -0.4
                    }
                  ],
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "BNM",
                        "url": "https://www.bnm.md/ro/official_exchange_rates",
                        "license": "CC BY 4.0"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md); Sursa: Banca Națională a Moldovei, bnm.md, CC BY 4.0",
                    "notice": "The same data is free at bnm.md."
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/rates/history": {
      "get": {
        "operationId": "rates_history",
        "summary": "History of one rate",
        "description": "One currency's official rate per day. Costs 1 credit per started 30 days. The same data is free at bnm.md, and every answer says so.",
        "tags": [
          "rates"
        ],
        "parameters": [
          {
            "name": "code",
            "in": "query",
            "required": true,
            "description": "ISO currency code, such as EUR.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z]{3}$"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How many days back. Past the plan's history it is cut to it, and `meta.history_cut` says so.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 30
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RateHistory"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "code": "EUR",
                    "points": [
                      {
                        "date": "2026-11-01",
                        "value": 19.49
                      },
                      {
                        "date": "2026-11-02",
                        "value": 19.52
                      }
                    ]
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "BNM",
                        "url": "https://www.bnm.md/ro/official_exchange_rates",
                        "license": "CC BY 4.0"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md); Sursa: Banca Națională a Moldovei, bnm.md, CC BY 4.0",
                    "notice": "The same data is free at bnm.md."
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/fuel": {
      "get": {
        "operationId": "fuel",
        "summary": "Fuel prices today",
        "description": "ANRE's price caps and each station network's price, from ANRE's public registry. Costs 1 credit.",
        "tags": [
          "fuel"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FuelBoard"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "date": "2026-11-02",
                    "cap": {
                      "a95": 24.31,
                      "diesel": 21.03
                    },
                    "networks": [
                      {
                        "key": "example-oil",
                        "name": "Example Oil",
                        "url": null,
                        "stations": 42,
                        "date": "2026-11-02",
                        "stale": false,
                        "prices": {
                          "a95": 23.9,
                          "diesel": 20.8,
                          "lpg": 12.5
                        }
                      }
                    ],
                    "cheapest": {
                      "a95": "example-oil",
                      "diesel": "example-oil",
                      "lpg": "example-oil"
                    },
                    "range": {
                      "a95": {
                        "min": 23.9,
                        "max": 24.3,
                        "networks": 12
                      },
                      "diesel": {
                        "min": 20.8,
                        "max": 21.0,
                        "networks": 12
                      },
                      "lpg": null
                    }
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "ANRE",
                        "url": "https://anre.md",
                        "license": "Public data of ANRE"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/fuel/stations": {
      "get": {
        "operationId": "fuel_stations",
        "summary": "Fuel stations",
        "description": "Every reporting station with its prices, 100 to a page. Costs 5 credits per page.",
        "tags": [
          "fuel"
        ],
        "parameters": [
          {
            "name": "network",
            "in": "query",
            "required": false,
            "description": "A network's key, from `/fuel`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "raion",
            "in": "query",
            "required": false,
            "description": "A district, as the registry writes it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Station"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "example-oil:77",
                      "network": "example-oil",
                      "name": "Example Oil Station 77",
                      "address": "bd. Dacia 1",
                      "raion": "Chisinau",
                      "lat": 46.98,
                      "lon": 28.86,
                      "date": "2026-11-02",
                      "prices": {
                        "a95": 23.9,
                        "diesel": 20.8,
                        "lpg": null
                      }
                    }
                  ],
                  "meta": {
                    "credits": 5,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "ANRE",
                        "url": "https://anre.md",
                        "license": "Public data of ANRE"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 100,
                      "total": 1503,
                      "pages": 16
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/fuel/history": {
      "get": {
        "operationId": "fuel_history",
        "summary": "History of a fuel price",
        "description": "One network's price per day, or without `network` the middle of the networks' prices. Costs 2 credits per started 30 days.",
        "tags": [
          "fuel"
        ],
        "parameters": [
          {
            "name": "fuel",
            "in": "query",
            "required": true,
            "description": "Which fuel.",
            "schema": {
              "type": "string",
              "enum": [
                "a95",
                "diesel",
                "lpg"
              ]
            }
          },
          {
            "name": "network",
            "in": "query",
            "required": false,
            "description": "A network's key, from `/fuel`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How many days back. Past the plan's history it is cut to it, and `meta.history_cut` says so.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 30
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FuelHistory"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "fuel": "a95",
                    "network": null,
                    "points": [
                      {
                        "date": "2026-11-02",
                        "value": 24.05
                      }
                    ]
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "ANRE",
                        "url": "https://anre.md",
                        "license": "Public data of ANRE"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/tariffs": {
      "get": {
        "operationId": "tariffs",
        "summary": "Household tariffs",
        "description": "Gas, electricity, water and heat, as ANRE approves them, without VAT. Costs 1 credit.",
        "tags": [
          "tariffs"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Tariff"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "key": "gas",
                      "label": "Natural gas",
                      "provider": "Example Gaz",
                      "region": "Moldova",
                      "unit": "lei/m3",
                      "value": 13.41,
                      "valid_from": "2026-01-01",
                      "decision": "ANRE 1/2026",
                      "parts": null,
                      "vat": false
                    }
                  ],
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "ANRE",
                        "url": "https://anre.md",
                        "license": "Public data of ANRE"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/indexes/basket": {
      "get": {
        "operationId": "indexes_basket",
        "summary": "The basket index",
        "description": "What a fixed basket of staples costs per day, across shops, with no shop named. `total` is a typical shop, `cheapest_total` the lowest price of each item. Costs 2 credits, plus 1 per month past the first.",
        "tags": [
          "indexes"
        ],
        "parameters": [
          {
            "name": "months",
            "in": "query",
            "required": false,
            "description": "How many months back, up to 36. A month counts as 30 days here.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 36,
              "default": 1
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Basket"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "items": [
                      {
                        "product": "Milk",
                        "qty": 4,
                        "unit": "l"
                      }
                    ],
                    "points": [
                      {
                        "date": "2026-11-02",
                        "total": 1024.5,
                        "cheapest_total": 918.3
                      }
                    ],
                    "change_mom": 1.2,
                    "change_yoy": null
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/indexes/moves": {
      "get": {
        "operationId": "indexes_moves",
        "summary": "What got cheaper or dearer",
        "description": "The same products compared on two days, overall and per category. Served from the nearest of 7, 14, 30, 60 and 90 days: `from` and `to` say exactly what was compared. Costs 2 credits.",
        "tags": [
          "indexes"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How far back to compare.",
            "schema": {
              "type": "integer",
              "minimum": 7,
              "maximum": 90,
              "default": 30
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Moves"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "from": "2026-10-03",
                    "to": "2026-11-02",
                    "compared": 41200,
                    "up": 9100,
                    "down": 7800,
                    "same": 24300,
                    "change_pct": 0.42,
                    "groups": [
                      {
                        "key": "dairy_eggs",
                        "label": "Dairy and eggs",
                        "compared": 900,
                        "up": 300,
                        "down": 120,
                        "same": 480,
                        "change_pct": 0.9
                      }
                    ]
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/law/acts": {
      "get": {
        "operationId": "law_acts",
        "summary": "Search legal acts",
        "description": "Moldova's official acts, newest first, 20 to a page. `q` takes words in Romanian or Russian, or an act's number such as 227/2026. Costs 3 credits with `q`, else 2.",
        "tags": [
          "law"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Words or an act's number.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "An act type, such as lege or hotarare.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "topic",
            "in": "query",
            "required": false,
            "description": "A topic key, such as taxes.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issuer",
            "in": "query",
            "required": false,
            "description": "An issuer's key, such as parlamentul.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "important",
            "in": "query",
            "required": false,
            "description": "Only important acts.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "From this day, inclusive.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "To this day, inclusive.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ActBrief"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 41233,
                      "slug": "lege-227-2026",
                      "type": "lege",
                      "type_label": "Law",
                      "type_raw": "LEGE",
                      "number": "227",
                      "code": "LP227/2026",
                      "title": "pentru modificarea unor acte normative",
                      "title_ru": null,
                      "heading": "Law No. 227 on amending some normative acts",
                      "heading_lang": "en",
                      "issuer": "PARLAMENTUL",
                      "issuer_name": "Parliament",
                      "issuer_key": "parlamentul",
                      "subject": "Amending some normative acts",
                      "subject_lang": "en",
                      "topic": "taxes",
                      "kind": "amends",
                      "targets": [],
                      "adopted_on": "2026-10-20",
                      "published_on": "2026-10-31",
                      "in_force_on": "2026-10-31",
                      "repealed_on": null,
                      "status": "in_force",
                      "important": true,
                      "mo_ref": "MO 524-527/31.10.2026 art. 564",
                      "url": "https://www.legis.md/cautare/getResults?doc_id=150000&lang=ro",
                      "has_text": true,
                      "has_text_ru": false,
                      "topics": [
                        "taxes"
                      ],
                      "headline": "What changes for taxpayers",
                      "summary": "Two reporting deadlines move, from January."
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Monitorul Oficial",
                        "url": "https://monitorul.gov.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 20,
                      "total": 240,
                      "pages": 12
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/law/acts/{id}": {
      "get": {
        "operationId": "law_acts_id",
        "summary": "One legal act",
        "description": "An act by its id or slug: the official texts, their outlines, versions, what it amends and what amends it, and a plain-language summary where one exists. The official text always prevails. Costs 1 credit.",
        "tags": [
          "law"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The act's id or slug.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Act"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 41233,
                    "slug": "lege-227-2026",
                    "type": "lege",
                    "type_label": "Law",
                    "type_raw": "LEGE",
                    "number": "227",
                    "code": "LP227/2026",
                    "title": "pentru modificarea unor acte normative",
                    "title_ru": null,
                    "heading": "Law No. 227 on amending some normative acts",
                    "heading_lang": "en",
                    "issuer": "PARLAMENTUL",
                    "issuer_name": "Parliament",
                    "issuer_key": "parlamentul",
                    "subject": "Amending some normative acts",
                    "subject_lang": "en",
                    "topic": "taxes",
                    "kind": "amends",
                    "targets": [],
                    "adopted_on": "2026-10-20",
                    "published_on": "2026-10-31",
                    "in_force_on": "2026-10-31",
                    "repealed_on": null,
                    "status": "in_force",
                    "important": true,
                    "mo_ref": "MO 524-527/31.10.2026 art. 564",
                    "url": "https://www.legis.md/cautare/getResults?doc_id=150000&lang=ro",
                    "has_text": true,
                    "has_text_ru": false,
                    "topics": [
                      "taxes"
                    ],
                    "headline": "What changes for taxpayers",
                    "summary": {
                      "title": "What changes for taxpayers",
                      "summary": "Two reporting deadlines move, from January.",
                      "key_points": [
                        "Deadlines move"
                      ],
                      "tags": [
                        "taxes"
                      ],
                      "created_at": "2026-11-02T13:05:00+02:00"
                    },
                    "text": "Articolul 1\n…",
                    "text_hash": "9f2c…",
                    "lang": "ro",
                    "version_date": "2026-10-31",
                    "outline": [
                      {
                        "i": 0,
                        "k": "article",
                        "t": "Articolul 1"
                      }
                    ],
                    "text_ru": null,
                    "outline_ru": [],
                    "type_raw_ru": null,
                    "url_ru": null,
                    "attachments": [],
                    "versions": [
                      {
                        "doc_id": 150000,
                        "valid_from": "2026-10-31",
                        "url": "https://www.legis.md/cautare/getResults?doc_id=150000&lang=ro"
                      }
                    ],
                    "amends": [],
                    "amended_by": [],
                    "amended_by_acts": [],
                    "promulgates": null,
                    "promulgated_by": null,
                    "updated_at": "2026-11-02T13:05:00+02:00"
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Monitorul Oficial",
                        "url": "https://monitorul.gov.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/law/digests": {
      "get": {
        "operationId": "law_digests",
        "summary": "The latest daily digests",
        "description": "Which days have a digest, how many acts each holds, its title. Costs 2 credits.",
        "tags": [
          "law"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How many days back, up to 90.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 90,
              "default": 7
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DigestRow"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-31",
                      "acts": 16,
                      "title": "Legal news: 31 October 2026"
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Monitorul Oficial",
                        "url": "https://monitorul.gov.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/law/digests/{date}": {
      "get": {
        "operationId": "law_digests_date",
        "summary": "One day's digest",
        "description": "A day's acts, important ones first, with their status today. Costs 2 credits.",
        "tags": [
          "law"
        ],
        "parameters": [
          {
            "name": "date",
            "in": "path",
            "required": true,
            "description": "The day.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Digest"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "date": "2026-10-31",
                    "lang": "en",
                    "title": "Legal news: 31 October 2026",
                    "intro": "16 acts published, 12 important.",
                    "items": [
                      {
                        "act_id": 41233,
                        "heading": "Law No. 227 on amending some normative acts",
                        "status": "in_force"
                      }
                    ],
                    "updated_at": "2026-11-02T13:05:00+02:00"
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Monitorul Oficial",
                        "url": "https://monitorul.gov.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/news": {
      "get": {
        "operationId": "news",
        "summary": "News, newest first",
        "description": "Our own summaries of Moldova's news, each scored for gravity, linking to the original reports. Past the plan's history, `from` is cut to it. Costs 2 credits.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Only articles or only briefs.",
            "schema": {
              "type": "string",
              "enum": [
                "article",
                "brief"
              ]
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A key from `/news/categories`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Only stories whose `regions` hold this key, from `/news/regions`. A region's parent does not take in its children.",
            "schema": {
              "type": "string",
              "enum": [
                "global",
                "chisinau",
                "balti",
                "nord",
                "centru",
                "sud",
                "gagauzia",
                "transnistria",
                "diaspora"
              ]
            }
          },
          {
            "name": "slot",
            "in": "query",
            "required": false,
            "description": "Only stories of this time of day.",
            "schema": {
              "type": "string",
              "enum": [
                "morning",
                "noon",
                "evening"
              ]
            }
          },
          {
            "name": "min_gravity",
            "in": "query",
            "required": false,
            "description": "Only stories at or above this gravity.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "From this day, inclusive.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "To this day, inclusive.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Rows to a page.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 20
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/NewsCard"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "n_3f9a1c7e2b4d6a8c0e12",
                      "kind": "article",
                      "category": {
                        "key": "economy",
                        "label": "Economy & prices"
                      },
                      "title": "Gas tariff goes before the regulator",
                      "dek": "The supplier asks for a new price from December.",
                      "gravity": 62,
                      "band": "high",
                      "reach": 3,
                      "region": {
                        "key": "global",
                        "label": "Nationwide"
                      },
                      "regions": [
                        "global"
                      ],
                      "slot": {
                        "key": "noon",
                        "label": "Midday"
                      },
                      "due_at": "2026-11-02T13:05:00+02:00",
                      "published_at": "2026-11-02T13:05:00+02:00",
                      "sources": [
                        {
                          "name": "Example Outlet",
                          "url": "https://outlet.example/story"
                        }
                      ],
                      "sources_count": 1,
                      "image": {
                        "url": "https://api.satelit.md/media/n/8c1f2ab34de56789.webp",
                        "w": 640,
                        "h": 360,
                        "credit": "Example Outlet",
                        "credit_url": "https://outlet.example"
                      }
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 20,
                      "total": 240,
                      "pages": 12
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/news/now": {
      "get": {
        "operationId": "news_now",
        "summary": "What to show one reader now",
        "description": "Stories that are due, not yet seen, and of the reader's region, its parent region or the whole country. A story is due from `due_at`: the first moment at or after publication inside its time-of-day window, in Chisinau time. Order: the gravest band first; within a band the reader's region, then its parent, then the whole country; then gravity, then newest. Without `region`, only stories for the whole country. A story without a region yet counts as one for the whole country. `meta.slot` is the current time of day, null from 00:00 to 06:00; `meta.region` the region used. The plan's rules on news apply as on `/news`: its history and its fields. Costs 2 credits.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "The reader's region, a key from `/news/regions`. Without it, stories for the whole country only.",
            "schema": {
              "type": "string",
              "enum": [
                "global",
                "chisinau",
                "balti",
                "nord",
                "centru",
                "sud",
                "gagauzia",
                "transnistria",
                "diaspora"
              ]
            }
          },
          {
            "name": "seen",
            "in": "query",
            "required": false,
            "description": "Ids of the cards already shown to this reader, comma separated, at most 100.",
            "schema": {
              "type": "string",
              "example": "n_3f9a1c7e2b4d6a8c0e12,n_8b2d4f6a0c1e3a5b7d90"
            }
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "description": "How many hours back a story may have been published.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 72,
              "default": 24
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Cards in the answer.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 10
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/NewsCard"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "n_3f9a1c7e2b4d6a8c0e12",
                      "kind": "article",
                      "category": {
                        "key": "economy",
                        "label": "Economy & prices"
                      },
                      "title": "Gas tariff goes before the regulator",
                      "dek": "The supplier asks for a new price from December.",
                      "gravity": 62,
                      "band": "high",
                      "reach": 3,
                      "region": {
                        "key": "global",
                        "label": "Nationwide"
                      },
                      "regions": [
                        "global"
                      ],
                      "slot": {
                        "key": "noon",
                        "label": "Midday"
                      },
                      "due_at": "2026-11-02T13:05:00+02:00",
                      "published_at": "2026-11-02T13:05:00+02:00",
                      "sources": [
                        {
                          "name": "Example Outlet",
                          "url": "https://outlet.example/story"
                        }
                      ],
                      "sources_count": 1,
                      "image": {
                        "url": "https://api.satelit.md/media/n/8c1f2ab34de56789.webp",
                        "w": 640,
                        "h": 360,
                        "credit": "Example Outlet",
                        "credit_url": "https://outlet.example"
                      }
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "slot": {
                      "key": "noon",
                      "label": "Midday"
                    },
                    "region": {
                      "key": "balti",
                      "label": "Bălți"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/news/search": {
      "get": {
        "operationId": "news_search",
        "summary": "Search news",
        "description": "Words in a story's title and lead, in the request's language. Start searches its last 30 days, Creator 90, Pro and above everything. Costs 3 credits.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "What to look for, 2 to 100 characters.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 100
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/NewsCard"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "n_3f9a1c7e2b4d6a8c0e12",
                      "kind": "article",
                      "category": {
                        "key": "economy",
                        "label": "Economy & prices"
                      },
                      "title": "Gas tariff goes before the regulator",
                      "dek": "The supplier asks for a new price from December.",
                      "gravity": 62,
                      "band": "high",
                      "reach": 3,
                      "region": {
                        "key": "global",
                        "label": "Nationwide"
                      },
                      "regions": [
                        "global"
                      ],
                      "slot": {
                        "key": "noon",
                        "label": "Midday"
                      },
                      "due_at": "2026-11-02T13:05:00+02:00",
                      "published_at": "2026-11-02T13:05:00+02:00",
                      "sources": [
                        {
                          "name": "Example Outlet",
                          "url": "https://outlet.example/story"
                        }
                      ],
                      "sources_count": 1,
                      "image": {
                        "url": "https://api.satelit.md/media/n/8c1f2ab34de56789.webp",
                        "w": 640,
                        "h": 360,
                        "credit": "Example Outlet",
                        "credit_url": "https://outlet.example"
                      }
                    }
                  ],
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 20,
                      "total": 240,
                      "pages": 12
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/news/days/{date}": {
      "get": {
        "operationId": "news_days_date",
        "summary": "One day of news",
        "description": "A day's stories, gravest first, up to 300, with the day's numbers. A day older than the plan's history answers 402. Costs 10 credits.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "date",
            "in": "path",
            "required": true,
            "description": "The day, in Chisinau's time.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "min_gravity",
            "in": "query",
            "required": false,
            "description": "Only stories at or above this gravity.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/NewsDay"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "date": "2026-11-02",
                    "count": 1,
                    "avg_gravity": 62.0,
                    "max_gravity": 62,
                    "items": [
                      {
                        "id": "n_3f9a1c7e2b4d6a8c0e12",
                        "kind": "article",
                        "category": {
                          "key": "economy",
                          "label": "Economy & prices"
                        },
                        "title": "Gas tariff goes before the regulator",
                        "dek": "The supplier asks for a new price from December.",
                        "gravity": 62,
                        "band": "high",
                        "reach": 3,
                        "region": {
                          "key": "global",
                          "label": "Nationwide"
                        },
                        "regions": [
                          "global"
                        ],
                        "slot": {
                          "key": "noon",
                          "label": "Midday"
                        },
                        "due_at": "2026-11-02T13:05:00+02:00",
                        "published_at": "2026-11-02T13:05:00+02:00",
                        "sources": [
                          {
                            "name": "Example Outlet",
                            "url": "https://outlet.example/story"
                          }
                        ],
                        "sources_count": 1,
                        "image": {
                          "url": "https://api.satelit.md/media/n/8c1f2ab34de56789.webp",
                          "w": 640,
                          "h": 360,
                          "credit": "Example Outlet",
                          "credit_url": "https://outlet.example"
                        }
                      }
                    ]
                  },
                  "meta": {
                    "credits": 10,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/news/categories": {
      "get": {
        "operationId": "news_categories",
        "summary": "News categories",
        "description": "Every category with its label. Costs 1 credit.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Category"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "key": "economy",
                      "label": "Economy & prices"
                    }
                  ],
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/news/regions": {
      "get": {
        "operationId": "news_regions",
        "summary": "News regions and times of day",
        "description": "The keys that `region` and `slot` take, with labels in the request's language: each region's parent, and each time of day's window in Chisinau time, `to` not included. `global` is the whole country. Costs 1 credit.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/NewsRegions"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "regions": [
                      {
                        "key": "global",
                        "label": "Nationwide",
                        "parent": null
                      },
                      {
                        "key": "balti",
                        "label": "Bălți",
                        "parent": "nord"
                      },
                      {
                        "key": "nord",
                        "label": "North",
                        "parent": null
                      }
                    ],
                    "slots": [
                      {
                        "key": "morning",
                        "label": "Morning",
                        "from": "06:00",
                        "to": "11:00"
                      },
                      {
                        "key": "noon",
                        "label": "Midday",
                        "from": "11:00",
                        "to": "17:00"
                      },
                      {
                        "key": "evening",
                        "label": "Evening",
                        "from": "17:00",
                        "to": "24:00"
                      }
                    ]
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/news/{id}": {
      "get": {
        "operationId": "news_id",
        "summary": "One story",
        "description": "A story with what the plan includes: Start and Creator have the card and `summary` with `meta.fields_cut`, Pro and above add `explain` and `facts`. A brief has no summary of its own. Costs 1 credit.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The story's id, from a list.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/NewsStory"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": "n_3f9a1c7e2b4d6a8c0e12",
                    "kind": "article",
                    "category": {
                      "key": "economy",
                      "label": "Economy & prices"
                    },
                    "title": "Gas tariff goes before the regulator",
                    "dek": "The supplier asks for a new price from December.",
                    "gravity": 62,
                    "band": "high",
                    "reach": 3,
                    "region": {
                      "key": "global",
                      "label": "Nationwide"
                    },
                    "regions": [
                      "global"
                    ],
                    "slot": {
                      "key": "noon",
                      "label": "Midday"
                    },
                    "due_at": "2026-11-02T13:05:00+02:00",
                    "published_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Outlet",
                        "url": "https://outlet.example/story"
                      }
                    ],
                    "sources_count": 1,
                    "image": {
                      "url": "https://api.satelit.md/media/n/8c1f2ab34de56789.webp",
                      "w": 640,
                      "h": 360,
                      "credit": "Example Outlet",
                      "credit_url": "https://outlet.example"
                    },
                    "summary": "The supplier asks for 13.41 lei per cubic metre.",
                    "explain": "A tariff request goes through a public hearing first.",
                    "facts": [
                      "The hearing is on 12 November."
                    ]
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": null
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/places": {
      "get": {
        "operationId": "places",
        "summary": "Shops and places from OpenStreetMap",
        "description": "OpenStreetMap's shops and places to go in Moldova, 100 to a page. With `near`, nearest first. ODbL: the same data is free, with no key, at the address in `meta.sources`. Costs 2 credits per page.",
        "tags": [
          "places"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Shops or places to go.",
            "schema": {
              "type": "string",
              "enum": [
                "shop",
                "venue"
              ]
            }
          },
          {
            "name": "city",
            "in": "query",
            "required": false,
            "description": "A city's key, such as chisinau.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain",
            "in": "query",
            "required": false,
            "description": "A chain's key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A category, such as supermarket or cafe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "near",
            "in": "query",
            "required": false,
            "description": "A point: latitude,longitude.",
            "schema": {
              "type": "string",
              "example": "47.02,28.83"
            }
          },
          {
            "name": "radius",
            "in": "query",
            "required": false,
            "description": "Metres around `near`, up to 20000.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20000,
              "default": 2000
            }
          },
          {
            "name": "source",
            "in": "query",
            "required": false,
            "description": "`chains` for the shops the chains publish themselves, read from their sites, with no agreement. Without it, OpenStreetMap's only.",
            "schema": {
              "type": "string",
              "enum": [
                "osm",
                "chains"
              ]
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Place"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "shop:osm:n1234567",
                      "kind": "shop",
                      "name": "Example Market Botanica",
                      "chain": null,
                      "category": "supermarket",
                      "city": "chisinau",
                      "address": "bd. Dacia 1",
                      "lat": 46.98,
                      "lon": 28.86,
                      "phone": null,
                      "website": null,
                      "opening_hours": null,
                      "updated_at": "2026-11-02T13:05:00+02:00"
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "OpenStreetMap",
                        "url": "https://www.openstreetmap.org/copyright",
                        "license": "ODbL 1.0, © OpenStreetMap contributors",
                        "download": "https://api.satelit.md/downloads/places-osm.ndjson.gz"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md); © OpenStreetMap contributors, ODbL",
                    "page": {
                      "page": 1,
                      "per": 100,
                      "total": 15000,
                      "pages": 150
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/recipes": {
      "get": {
        "operationId": "recipes",
        "summary": "Recipes with today's cost",
        "description": "Each recipe's cost at today's prices: one total, no shop behind it. Costs 2 credits.",
        "tags": [
          "recipes"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RecipeCard"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "slug": "pancakes",
                      "title": "Pancakes",
                      "servings": 4,
                      "time_min": 30,
                      "tags": [
                        "dessert"
                      ],
                      "cost_today": 48.2,
                      "cost_per_serving": 12.05
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/recipes/{slug}": {
      "get": {
        "operationId": "recipes_slug",
        "summary": "One recipe",
        "description": "A recipe with its ingredients and steps. Costs 1 credit.",
        "tags": [
          "recipes"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The recipe's slug in any language.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Recipe"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "slug": "pancakes",
                    "title": "Pancakes",
                    "servings": 4,
                    "time_min": 30,
                    "tags": [
                      "dessert"
                    ],
                    "cost_today": 48.2,
                    "cost_per_serving": 12.05,
                    "ingredients": [
                      {
                        "name": "Milk",
                        "qty": 0.5,
                        "unit": "l"
                      }
                    ],
                    "steps": [
                      "Mix.",
                      "Fry."
                    ]
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Satelit",
                        "url": "https://satelit.md",
                        "license": "Satelit"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/prices/stores": {
      "get": {
        "operationId": "prices_stores",
        "summary": "Shops with prices",
        "description": "The shops whose prices this API serves, with how many products each has. Prices are read from the shops' public pages: there is no agreement with any shop, and no licence over its data is granted. The list can change without notice. Costs 1 credit.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PriceStore"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "key": "example",
                      "name": "Example Market",
                      "domain": "example-market.md",
                      "kind": "food",
                      "products": 12345,
                      "updated_at": "2026-11-02T13:05:00+02:00"
                    }
                  ],
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Market",
                        "url": "https://example-market.md",
                        "license": "none: read from the shop's public pages; no agreement with the shop and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/prices/search": {
      "get": {
        "operationId": "prices_search",
        "summary": "Search products and prices",
        "description": "Products with their lowest and typical price across shops, most widely sold first, 20 to a page. It stops at page 5: this is for finding a product, not for walking a shop's catalogue. Costs 3 credits.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "What to look for, 2 to 100 characters.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 100
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A shop's category key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "store",
            "in": "query",
            "required": false,
            "description": "Only this shop's offers, by its key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "in_stock",
            "in": "query",
            "required": false,
            "description": "Only what is, or only what is not, in stock.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number. Stops at 5.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1,
              "maximum": 5
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PriceItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 8812,
                      "slug": "milk-25-1l",
                      "name": "Milk 2.5% 1 l",
                      "brand": "Example",
                      "capacity": "1 l",
                      "category": "dairy_eggs",
                      "min_price": 21.9,
                      "median_price": 23.1,
                      "unit_min_price": 21.9,
                      "price_unit": "l",
                      "stores": 4,
                      "in_stock_stores": 3,
                      "updated_at": "2026-11-02T13:05:00+02:00"
                    }
                  ],
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Market",
                        "url": "https://example-market.md",
                        "license": "none: read from the shop's public pages; no agreement with the shop and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 20,
                      "total": 100,
                      "pages": 5
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/prices/groups": {
      "get": {
        "operationId": "prices_groups",
        "summary": "Staple products",
        "description": "The catalogue's products, such as milk or bread, with their numbers across every offer. Costs 2 credits.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A category key, such as dairy_eggs.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PriceGroup"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "lapte",
                      "name": "Milk",
                      "unit": "l",
                      "min_price": 19.9,
                      "median_price": 23.5,
                      "unit_min_price": 19.9,
                      "price_unit": "l",
                      "stores": 6
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Market",
                        "url": "https://example-market.md",
                        "license": "none: read from the shop's public pages; no agreement with the shop and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/prices/groups/{id}": {
      "get": {
        "operationId": "prices_groups_id",
        "summary": "One staple and its offers",
        "description": "A catalogue product with up to 50 offers, cheapest first. Costs 3 credits.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The product's id, from `/prices/groups`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PriceGroupDetail"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": "lapte",
                    "name": "Milk",
                    "unit": "l",
                    "min_price": 19.9,
                    "median_price": 23.5,
                    "unit_min_price": 19.9,
                    "price_unit": "l",
                    "stores": 6,
                    "offers": [
                      {
                        "store": {
                          "key": "example",
                          "name": "Example Market"
                        },
                        "title": "Milk 2.5% 1 l",
                        "price": 21.9,
                        "old_price": 24.5,
                        "discount_pct": 11,
                        "unit_price": 21.9,
                        "unit": "l",
                        "in_stock": true,
                        "url": "https://example-market.md/p/1",
                        "last_seen": "2026-11-02T13:05:00+02:00"
                      }
                    ]
                  },
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Market",
                        "url": "https://example-market.md",
                        "license": "none: read from the shop's public pages; no agreement with the shop and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/prices/items/{id}": {
      "get": {
        "operationId": "prices_items_id",
        "summary": "One product and its offers",
        "description": "A product with its offers, cheapest first. Costs 2 credits.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The product's id, from `/prices/search`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PriceItemDetail"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 8812,
                    "slug": "milk-25-1l",
                    "name": "Milk 2.5% 1 l",
                    "brand": "Example",
                    "capacity": "1 l",
                    "category": "dairy_eggs",
                    "min_price": 21.9,
                    "median_price": 23.1,
                    "unit_min_price": 21.9,
                    "price_unit": "l",
                    "stores": 4,
                    "in_stock_stores": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "offers": [
                      {
                        "store": {
                          "key": "example",
                          "name": "Example Market"
                        },
                        "title": "Milk 2.5% 1 l",
                        "price": 21.9,
                        "old_price": 24.5,
                        "discount_pct": 11,
                        "unit_price": 21.9,
                        "unit": "l",
                        "in_stock": true,
                        "url": "https://example-market.md/p/1",
                        "last_seen": "2026-11-02T13:05:00+02:00"
                      }
                    ]
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Market",
                        "url": "https://example-market.md",
                        "license": "none: read from the shop's public pages; no agreement with the shop and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/prices/items/{id}/history": {
      "get": {
        "operationId": "prices_items_id_history",
        "summary": "Price history of a product",
        "description": "Each shop's price per day. Costs 5 credits per started 30 days.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The product's id.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How many days back. Past the plan's history it is cut to it, and `meta.history_cut` says so.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 30
            }
          },
          {
            "name": "store",
            "in": "query",
            "required": false,
            "description": "Only this shop, by its key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PriceHistory"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "points": [
                      {
                        "date": "2026-11-02",
                        "store": "example",
                        "price": 21.9,
                        "old_price": 24.5,
                        "unit_price": 21.9,
                        "in_stock": true
                      }
                    ]
                  },
                  "meta": {
                    "credits": 5,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Market",
                        "url": "https://example-market.md",
                        "license": "none: read from the shop's public pages; no agreement with the shop and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/deals": {
      "get": {
        "operationId": "deals",
        "summary": "Current deals",
        "description": "Discounts the shop's own price history supports, 60 to a page. It stops at page 5. Costs 5 credits per page.",
        "tags": [
          "deals"
        ],
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A category key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "store",
            "in": "query",
            "required": false,
            "description": "Only this shop, by its key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number. Stops at 5.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1,
              "maximum": 5
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Deal"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "name": "Milk 2.5% 1 l",
                      "brand": "Example",
                      "capacity": "1 l",
                      "category": "dairy_eggs",
                      "store": {
                        "key": "example",
                        "name": "Example Market"
                      },
                      "price": 21.9,
                      "old_price": 24.5,
                      "discount_pct": 11,
                      "save": 2.6,
                      "unit_price": 21.9,
                      "unit": "l",
                      "stores": 4,
                      "url": "https://example-market.md/p/1"
                    }
                  ],
                  "meta": {
                    "credits": 5,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Market",
                        "url": "https://example-market.md",
                        "license": "none: read from the shop's public pages; no agreement with the shop and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 60,
                      "total": 240,
                      "pages": 4
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/tours": {
      "get": {
        "operationId": "tours",
        "summary": "Package tours",
        "description": "Stored offers of the agencies, cheapest per person first or by date, 50 to a page. It stops at page 5. Read from the agencies' public pages: there is no agreement with any of them, and no licence over their data is granted. Costs 3 credits per page.",
        "tags": [
          "tours"
        ],
        "parameters": [
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "A country, as `/tours/countries` lists it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "From this day, inclusive.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "To this day, inclusive.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "nights_min",
            "in": "query",
            "required": false,
            "description": "At least this many nights.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "nights_max",
            "in": "query",
            "required": false,
            "description": "At most this many nights.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "board",
            "in": "query",
            "required": false,
            "description": "A board code, such as AI.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "agency",
            "in": "query",
            "required": false,
            "description": "An agency's key or name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "The order.",
            "schema": {
              "type": "string",
              "enum": [
                "price",
                "date"
              ],
              "default": "price"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number. Stops at 5.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1,
              "maximum": 5
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Tour"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 9921,
                      "agency": "Example Travel",
                      "title": "Antalya, Hotel Exemplu 5*",
                      "country": "Turcia",
                      "resort": "Antalya",
                      "hotel": "Hotel Exemplu",
                      "stars": 5,
                      "board": "AI",
                      "room": "Standard",
                      "nights": 7,
                      "date_from": "2026-12-01",
                      "adults": 2,
                      "price": 405.0,
                      "currency": "EUR",
                      "price_mdl": 8100.0,
                      "price_per": "person",
                      "price_pp_mdl": 8100.0,
                      "departure": "RMO",
                      "transport": "flight",
                      "url": "https://example-travel.md/offer/1",
                      "hot": false,
                      "last_seen": "2026-11-02T13:05:00+02:00"
                    }
                  ],
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Travel",
                        "url": "https://example-travel.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 50,
                      "total": 250,
                      "pages": 5
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/tours/countries": {
      "get": {
        "operationId": "tours_countries",
        "summary": "Countries with tours",
        "description": "Every country with live offers, how many, and the lowest price. Costs 1 credit.",
        "tags": [
          "tours"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TourCountry"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "country": "Turcia",
                      "offers": 1200,
                      "min_price_mdl": 8100.0,
                      "min_price_pp_mdl": 8100.0,
                      "agencies": 4
                    }
                  ],
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Travel",
                        "url": "https://example-travel.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/tours/{id}": {
      "get": {
        "operationId": "tours_id",
        "summary": "One tour and its price history",
        "description": "An offer with what it cost on each day we saw it. Costs 2 credits.",
        "tags": [
          "tours"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The offer's id, from `/tours`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TourDetail"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 9921,
                    "agency": "Example Travel",
                    "title": "Antalya, Hotel Exemplu 5*",
                    "country": "Turcia",
                    "resort": "Antalya",
                    "hotel": "Hotel Exemplu",
                    "stars": 5,
                    "board": "AI",
                    "room": "Standard",
                    "nights": 7,
                    "date_from": "2026-12-01",
                    "adults": 2,
                    "price": 405.0,
                    "currency": "EUR",
                    "price_mdl": 8100.0,
                    "price_per": "person",
                    "price_pp_mdl": 8100.0,
                    "departure": "RMO",
                    "transport": "flight",
                    "url": "https://example-travel.md/offer/1",
                    "hot": false,
                    "last_seen": "2026-11-02T13:05:00+02:00",
                    "history": [
                      {
                        "date": "2026-11-02",
                        "price": 405.0,
                        "currency": "EUR",
                        "price_mdl": 8100.0
                      }
                    ]
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Travel",
                        "url": "https://example-travel.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/flights/destinations": {
      "get": {
        "operationId": "flights_destinations",
        "summary": "Destinations from Chisinau",
        "description": "Direct destinations from the airport's timetable and popular ones with stops, each with the lowest known fare. A fare here carries no link. Costs 2 credits.",
        "tags": [
          "flights"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Destination"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "iata": "LTN",
                      "city": "London",
                      "airlines": [
                        "Example Air"
                      ],
                      "flights_per_week": 5,
                      "season_from": "2026-10-25",
                      "season_to": "2027-03-28",
                      "direct": true,
                      "fare_from": {
                        "destination": "LON",
                        "airport": "LTN",
                        "price": 99.0,
                        "currency": "EUR",
                        "price_mdl": 1980.0,
                        "airline": "W6",
                        "flight_number": "3201",
                        "departure_at": "2026-12-01T10:00:00+02:00",
                        "return_at": null,
                        "transfers": 0,
                        "duration": 150
                      }
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "airport.md",
                        "url": "https://airport.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      },
                      {
                        "name": "Travelpayouts",
                        "url": "https://www.travelpayouts.com",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/flights/destinations/{code}": {
      "get": {
        "operationId": "flights_destinations_code",
        "summary": "One destination",
        "description": "A destination with its weekdays, the next 14 days of flights both ways, the cheapest dates and the 12 months. Costs 3 credits.",
        "tags": [
          "flights"
        ],
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "description": "An IATA code, from `/flights/destinations`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DestinationDetail"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "iata": "LTN",
                    "city": "London",
                    "airlines": [
                      "Example Air"
                    ],
                    "flights_per_week": 5,
                    "season_from": "2026-10-25",
                    "season_to": "2027-03-28",
                    "direct": true,
                    "fare_from": {
                      "destination": "LON",
                      "airport": "LTN",
                      "price": 99.0,
                      "currency": "EUR",
                      "price_mdl": 1980.0,
                      "airline": "W6",
                      "flight_number": "3201",
                      "departure_at": "2026-12-01T10:00:00+02:00",
                      "return_at": null,
                      "transfers": 0,
                      "duration": 150
                    },
                    "weekdays": [
                      1,
                      3,
                      5
                    ],
                    "departures": [
                      {
                        "flight_no": "W6 3201",
                        "airline": "Example Air",
                        "airline_code": "W6",
                        "city": "London",
                        "iata": "LTN",
                        "scheduled": "2026-11-02T10:05"
                      }
                    ],
                    "arrivals": [
                      {
                        "flight_no": "W6 3201",
                        "airline": "Example Air",
                        "airline_code": "W6",
                        "city": "London",
                        "iata": "LTN",
                        "scheduled": "2026-11-02T10:05"
                      }
                    ],
                    "fares": [
                      {
                        "destination": "LON",
                        "airport": "LTN",
                        "price": 99.0,
                        "currency": "EUR",
                        "price_mdl": 1980.0,
                        "airline": "W6",
                        "flight_number": "3201",
                        "departure_at": "2026-12-01T10:00:00+02:00",
                        "return_at": null,
                        "transfers": 0,
                        "duration": 150
                      }
                    ],
                    "months": [
                      {
                        "destination": "LON",
                        "airport": "LTN",
                        "price": 99.0,
                        "currency": "EUR",
                        "price_mdl": 1980.0,
                        "airline": "W6",
                        "flight_number": "3201",
                        "departure_at": "2026-12-01T10:00:00+02:00",
                        "return_at": null,
                        "transfers": 0,
                        "duration": 150
                      }
                    ]
                  },
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "airport.md",
                        "url": "https://airport.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      },
                      {
                        "name": "Travelpayouts",
                        "url": "https://www.travelpayouts.com",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/flights/board": {
      "get": {
        "operationId": "flights_board",
        "summary": "The airport's board",
        "description": "One day's flights from the timetable. From a week back to a month ahead; another day answers 404. Costs 2 credits.",
        "tags": [
          "flights"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Which way.",
            "schema": {
              "type": "string",
              "enum": [
                "departures",
                "arrivals"
              ],
              "default": "departures"
            }
          },
          {
            "name": "day",
            "in": "query",
            "required": false,
            "description": "The day, today by default.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Board"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "kind": "departures",
                    "day": "2026-11-02",
                    "flights": [
                      {
                        "flight_no": "W6 3201",
                        "airline": "Example Air",
                        "airline_code": "W6",
                        "city": "London",
                        "iata": "LTN",
                        "scheduled": "2026-11-02T10:05"
                      }
                    ]
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "airport.md",
                        "url": "https://airport.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      },
                      {
                        "name": "Travelpayouts",
                        "url": "https://www.travelpayouts.com",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/rest": {
      "get": {
        "operationId": "rest",
        "summary": "Places to rest in Moldova",
        "description": "Cabins, rest bases, guesthouses and picnic spots, as their sources list them, 50 to a page. It stops at page 5. No phone, no address, no photo: `sources` links to where they are listed. A place known only from classified ads has no coordinates: a private host's home is not a price. Costs 3 credits per page.",
        "tags": [
          "rest"
        ],
        "parameters": [
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "A district's key or label.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "A kind of place, such as base or cabin.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number. Stops at 5.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1,
              "maximum": 5
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RestPlace"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 12,
                      "name": "Baza de odihnă Exemplu",
                      "kind": "base",
                      "region": "Criuleni",
                      "city": "Vadul lui Vodă",
                      "lat": 47.08,
                      "lon": 29.08,
                      "price_from": 800.0,
                      "price_unit": "night",
                      "sources": [
                        {
                          "name": "Example Listing",
                          "url": "https://listing.example/1"
                        }
                      ],
                      "updated_at": "2026-11-02T13:05:00+02:00"
                    }
                  ],
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Example Listing",
                        "url": null,
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 50,
                      "total": 250,
                      "pages": 5
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/estate": {
      "get": {
        "operationId": "estate",
        "summary": "Apartment prices",
        "description": "Median asking prices per square metre and rents, for Moldova and its cities, per day. Aggregated only: a point of fewer than 20 listings stays out, and no listing or seller is in it. Costs 3 credits.",
        "tags": [
          "estate"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How many days back. Past the plan's history it is cut to it, and `meta.history_cut` says so.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 30
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Estate"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "series": [
                      {
                        "kind": "sale",
                        "scope": "md",
                        "key": "md",
                        "name": "Moldova",
                        "unit": "lei/m²",
                        "points": [
                          {
                            "date": "2026-11-02",
                            "median": 1100.0,
                            "per_m2": 1100.0,
                            "price": 60000.0,
                            "n": 900
                          }
                        ]
                      }
                    ]
                  },
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "999.md",
                        "url": "https://999.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/market/categories": {
      "get": {
        "operationId": "market_categories",
        "summary": "Classifieds market categories",
        "description": "Every classifieds category with market data on the latest day: how many ads are for sale, how many are priced, and the median asking price in lei. Aggregate numbers only — no ad, no seller, no contact. The index for the other market endpoints. Costs 2 credits.",
        "tags": [
          "ads_market"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketCategory"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "category": {
                        "id": 659,
                        "name": "Cars",
                        "url": "/en/transport/cars",
                        "group": {
                          "id": 657,
                          "name": "Transport",
                          "url": "/en/transport"
                        }
                      },
                      "volume": 18450,
                      "priced": 17230,
                      "median_mdl": 185000.0
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "999.md",
                        "url": "https://999.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      },
                      {
                        "name": "makler.md",
                        "url": "https://makler.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/market/prices": {
      "get": {
        "operationId": "market_prices",
        "summary": "Classifieds prices and volume",
        "description": "The price distribution and market volume of the latest day, from the live ads of 999.md and makler.md. Without `category`, one row per category nationwide, biggest first; with `category`, one row nationwide and one per city with enough ads. Prices are in lei; `currency` is the currency most ads are written in. Aggregate only: no ad, no seller, no contact. Costs 2 credits per 50 rows.",
        "tags": [
          "ads_market"
        ],
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A subcategory id, from `/market/categories`.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "city",
            "in": "query",
            "required": false,
            "description": "A city, as the ads write it, such as Chișinău.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number. Stops at 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1,
              "maximum": 200
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketPrice"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "category": {
                        "id": 659,
                        "name": "Cars",
                        "url": "/en/transport/cars",
                        "group": {
                          "id": 657,
                          "name": "Transport",
                          "url": "/en/transport"
                        }
                      },
                      "city": null,
                      "day": "2026-11-04",
                      "volume": 18450,
                      "priced": 17230,
                      "currency": "EUR",
                      "prices": {
                        "median": 185000.0,
                        "p10": 62000.0,
                        "p25": 110000.0,
                        "p75": 315000.0,
                        "p90": 520000.0,
                        "min": 25000.0,
                        "max": 1450000.0
                      }
                    }
                  ],
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "999.md",
                        "url": "https://999.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      },
                      {
                        "name": "makler.md",
                        "url": "https://makler.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 50,
                      "total": 310,
                      "pages": 7
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/market/history": {
      "get": {
        "operationId": "market_history",
        "summary": "Classifieds market over time",
        "description": "One category day by day: the market volume, how many ads were listed (`new`) and how many left (`removed`), and the price distribution where enough ads are priced. The whole market by default (category 0). A city carries volume and prices but no daily flow. Past the plan's history it is cut, and `meta.history_cut` says so. Costs 3 credits per started 30 days.",
        "tags": [
          "ads_market"
        ],
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A subcategory id, or 0 for the whole market.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "city",
            "in": "query",
            "required": false,
            "description": "A city, as the ads write it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How many days back. Past the plan's history it is cut to it.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 90
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MarketHistory"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "category": {
                      "id": 659,
                      "name": "Cars",
                      "url": "/en/transport/cars",
                      "group": {
                        "id": 657,
                        "name": "Transport",
                        "url": "/en/transport"
                      }
                    },
                    "city": null,
                    "points": [
                      {
                        "date": "2026-11-04",
                        "volume": 18450,
                        "new": 640,
                        "removed": 580,
                        "priced": 17230,
                        "prices": {
                          "median": 185000.0,
                          "p10": 62000.0,
                          "p25": 110000.0,
                          "p75": 315000.0,
                          "p90": 520000.0,
                          "min": 25000.0,
                          "max": 1450000.0
                        }
                      }
                    ]
                  },
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "999.md",
                        "url": "https://999.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      },
                      {
                        "name": "makler.md",
                        "url": "https://makler.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/market/sellers": {
      "get": {
        "operationId": "market_sellers",
        "summary": "Who sells what",
        "description": "Recurring classifieds sellers, most active first, 50 to a page. With `category`, ranked within it (its live ads and median price there); with `new=true`, only sellers newly on 999.md. `tenure_days`/`new` (the seller-tenure facet) and `sold`/`sold_recent` (the seller-sales facet) appear when the admin has those fields on. A seller is an opaque id that folds one seller's ads together and names no one: there is never a phone, an e-mail or any contact. 999.md only. Costs 3 credits per 50 rows.",
        "tags": [
          "ads_market"
        ],
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "A subcategory id to rank within, from `/market/categories`.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "new",
            "in": "query",
            "required": false,
            "description": "Only sellers newly on 999.md.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number. Stops at 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1,
              "maximum": 200
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketSeller"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "3f9a1c7e2b4d",
                      "source": "m999",
                      "active": 42,
                      "total": 120,
                      "categories": 2,
                      "top_category": {
                        "id": 659,
                        "name": "Cars",
                        "url": "/en/transport/cars",
                        "group": {
                          "id": 657,
                          "name": "Transport",
                          "url": "/en/transport"
                        }
                      },
                      "activity": "high",
                      "first_seen": "2026-03-01T09:00:00+02:00",
                      "last_active": "2026-11-02T13:05:00+02:00",
                      "tenure_days": 248,
                      "new": false,
                      "sold": 78,
                      "sold_recent": 12,
                      "in_category": {
                        "active": 38,
                        "total": 95,
                        "median_mdl": 210000.0
                      }
                    }
                  ],
                  "meta": {
                    "credits": 3,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "999.md",
                        "url": "https://999.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 50,
                      "total": 1200,
                      "pages": 24
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/market/sellers/{id}": {
      "get": {
        "operationId": "market_sellers_id",
        "summary": "One seller",
        "description": "A seller by its opaque id: the categories it lists in, how many ads live and in total, and its median asking price per category. Numbers only, no contact. Costs 2 credits.",
        "tags": [
          "ads_market"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The seller's opaque id, from `/market/sellers`.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{1,16}$"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MarketSeller"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": "3f9a1c7e2b4d",
                    "source": "m999",
                    "active": 42,
                    "total": 120,
                    "categories": 2,
                    "top_category": {
                      "id": 659,
                      "name": "Cars",
                      "url": "/en/transport/cars",
                      "group": {
                        "id": 657,
                        "name": "Transport",
                        "url": "/en/transport"
                      }
                    },
                    "activity": "high",
                    "first_seen": "2026-03-01T09:00:00+02:00",
                    "last_active": "2026-11-02T13:05:00+02:00",
                    "category_breakdown": [
                      {
                        "category": {
                          "id": 659,
                          "name": "Cars",
                          "url": "/en/transport/cars",
                          "group": {
                            "id": 657,
                            "name": "Transport",
                            "url": "/en/transport"
                          }
                        },
                        "active": 38,
                        "total": 95,
                        "median_mdl": 210000.0,
                        "last_active": "2026-11-02T13:05:00+02:00"
                      }
                    ]
                  },
                  "meta": {
                    "credits": 2,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "999.md",
                        "url": "https://999.md",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/feed": {
      "get": {
        "operationId": "feed",
        "summary": "The change feed",
        "description": "Business and Enterprise. Events oldest first, from a stable cursor: keep `meta.next` and pass it as `after`. It changes as often as its sources do, news hourly at most, so polling more often than that finds nothing new. Events are kept 90 days. Costs nothing on a contract plan.",
        "tags": [
          "feed"
        ],
        "parameters": [
          {
            "name": "after",
            "in": "query",
            "required": false,
            "description": "The `meta.next` of the last answer. Without it, from the oldest event kept.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "types",
            "in": "query",
            "required": false,
            "description": "A comma list of event types.",
            "schema": {
              "type": "string",
              "example": "news.published,fuel.cap"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Events to an answer.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 100
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FeedEvent"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "7c1e…",
                      "type": "fuel.cap",
                      "created_at": "2026-11-02T13:05:00+02:00",
                      "data": {
                        "fuel": "a95",
                        "price": 24.31,
                        "date": "2026-11-03",
                        "previous": 24.18
                      }
                    }
                  ],
                  "meta": {
                    "credits": 0,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "ANRE",
                        "url": "https://anre.md",
                        "license": "Public data of ANRE"
                      }
                    ],
                    "attribution": null,
                    "next": "eyJhdCI6…",
                    "has_more": false
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/jokes": {
      "get": {
        "operationId": "jokes",
        "summary": "Jokes, funniest first",
        "description": "Jokes rated and translated once by a model: how funny (`score`), how well they land in Moldova (`md_score`), from what age (`min_age`), whether a child may hear it (`kids_ok`), 18+ (`adult`), what they contain (`flags`) and their topics. The text is in the request's language, and a joke whose point is lost there is not listed in it (`langs` says where it works). Funniest first. `q` matches every word in any language's text or a topic's name, and any word when no joke has them all. Costs 1 credit per 20 rows, 2 with `q`.",
        "tags": [
          "jokes"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Words of the joke, a topic or a character, in any language, 2 to 100 characters.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 100
            }
          },
          {
            "name": "topic",
            "in": "query",
            "required": false,
            "description": "Only jokes with this topic, a key from `/jokes/topics`.",
            "schema": {
              "type": "string",
              "enum": [
                "family",
                "couples",
                "kids",
                "school",
                "work",
                "doctors",
                "police",
                "animals",
                "money",
                "drinking",
                "food",
                "tech",
                "travel",
                "sport",
                "old_age",
                "mother_in_law",
                "neighbours",
                "village",
                "army",
                "law",
                "religion",
                "politics",
                "bula",
                "ion_maria",
                "blondes",
                "regions",
                "wordplay",
                "dark",
                "other"
              ]
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Only this kind.",
            "schema": {
              "type": "string",
              "enum": [
                "joke",
                "riddle",
                "proverb",
                "quote"
              ]
            }
          },
          {
            "name": "audience",
            "in": "query",
            "required": false,
            "description": "Who will hear it. `kids`: fit for a child (under 12), up to `max_age` (6 without it). `family`: fit for a child, read out to the whole family. `general` (default): no 18+. `adult`: 18+ too. A joke mocking a people is in `general` and `adult`: leave it out with `exclude_flags=ethnic`.",
            "schema": {
              "type": "string",
              "enum": [
                "kids",
                "family",
                "general",
                "adult"
              ],
              "default": "general"
            }
          },
          {
            "name": "max_age",
            "in": "query",
            "required": false,
            "description": "Only jokes that suit a listener this young: `min_age` at or under it.",
            "schema": {
              "type": "integer",
              "minimum": 3,
              "maximum": 18
            }
          },
          {
            "name": "min_score",
            "in": "query",
            "required": false,
            "description": "Only jokes at or above this score (0-100, how funny). Without it 40 for `kids`, 50 for the rest.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "exclude_flags",
            "in": "query",
            "required": false,
            "description": "A comma list of flags to leave out, such as `alcohol,politics`.",
            "schema": {
              "type": "string",
              "example": "ethnic,politics"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Rows to a page.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Joke"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "j_1207",
                      "kind": "joke",
                      "title": "A short memory",
                      "text": "— Doctor, I forget everything.\n— Since when?\n— Since when what?",
                      "lang": "en",
                      "topic": "doctors",
                      "topics": [
                        "doctors"
                      ],
                      "score": 80,
                      "md_score": 80,
                      "min_age": 9,
                      "kids_ok": true,
                      "adult": false,
                      "flags": [],
                      "langs": [
                        "ro",
                        "ru",
                        "en",
                        "uk"
                      ],
                      "source": {
                        "name": "Râzi cu lacrimi",
                        "url": "https://raziculacrimi.ro/bancuri/"
                      },
                      "published_at": "2026-11-02T13:05:00+02:00",
                      "voice": [
                        {
                          "speaker": "narrator",
                          "text": "A patient comes to the doctor."
                        },
                        {
                          "speaker": "male",
                          "text": "Doctor, I forget everything."
                        },
                        {
                          "speaker": "female",
                          "text": "Since when?"
                        },
                        {
                          "speaker": "male",
                          "text": "Since when what?"
                        }
                      ],
                      "dialogue": true
                    }
                  ],
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Râzi cu lacrimi",
                        "url": "https://raziculacrimi.ro/bancuri/",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)",
                    "page": {
                      "page": 1,
                      "per": 20,
                      "total": 240,
                      "pages": 12
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/jokes/today": {
      "get": {
        "operationId": "jokes_today",
        "summary": "The joke of the day",
        "description": "One joke for the whole Chisinau day, the same in every answer and language: a family joke that works in all four languages, not the day's joke again within a year. With `topic`, the day's joke of that topic. Costs 1 credit.",
        "tags": [
          "jokes"
        ],
        "parameters": [
          {
            "name": "topic",
            "in": "query",
            "required": false,
            "description": "The day's joke of this topic.",
            "schema": {
              "type": "string",
              "enum": [
                "family",
                "couples",
                "kids",
                "school",
                "work",
                "doctors",
                "police",
                "animals",
                "money",
                "drinking",
                "food",
                "tech",
                "travel",
                "sport",
                "old_age",
                "mother_in_law",
                "neighbours",
                "village",
                "army",
                "law",
                "religion",
                "politics",
                "bula",
                "ion_maria",
                "blondes",
                "regions",
                "wordplay",
                "dark",
                "other"
              ]
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/JokeToday"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": "j_1207",
                    "kind": "joke",
                    "title": "A short memory",
                    "text": "— Doctor, I forget everything.\n— Since when?\n— Since when what?",
                    "lang": "en",
                    "topic": "doctors",
                    "topics": [
                      "doctors"
                    ],
                    "score": 80,
                    "md_score": 80,
                    "min_age": 9,
                    "kids_ok": true,
                    "adult": false,
                    "flags": [],
                    "langs": [
                      "ro",
                      "ru",
                      "en",
                      "uk"
                    ],
                    "source": {
                      "name": "Râzi cu lacrimi",
                      "url": "https://raziculacrimi.ro/bancuri/"
                    },
                    "published_at": "2026-11-02T13:05:00+02:00",
                    "voice": [
                      {
                        "speaker": "narrator",
                        "text": "A patient comes to the doctor."
                      },
                      {
                        "speaker": "male",
                        "text": "Doctor, I forget everything."
                      },
                      {
                        "speaker": "female",
                        "text": "Since when?"
                      },
                      {
                        "speaker": "male",
                        "text": "Since when what?"
                      }
                    ],
                    "dialogue": true,
                    "date": "2026-11-05"
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Râzi cu lacrimi",
                        "url": "https://raziculacrimi.ro/bancuri/",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/jokes/random": {
      "get": {
        "operationId": "jokes_random",
        "summary": "A joke not yet shown",
        "description": "One joke among the funniest that fit the filters and none of `seen`: what an app tells a user who asks for another, without repeating itself. 404 when every one that fits was seen. Costs 1 credit.",
        "tags": [
          "jokes"
        ],
        "parameters": [
          {
            "name": "topic",
            "in": "query",
            "required": false,
            "description": "Only jokes with this topic, a key from `/jokes/topics`.",
            "schema": {
              "type": "string",
              "enum": [
                "family",
                "couples",
                "kids",
                "school",
                "work",
                "doctors",
                "police",
                "animals",
                "money",
                "drinking",
                "food",
                "tech",
                "travel",
                "sport",
                "old_age",
                "mother_in_law",
                "neighbours",
                "village",
                "army",
                "law",
                "religion",
                "politics",
                "bula",
                "ion_maria",
                "blondes",
                "regions",
                "wordplay",
                "dark",
                "other"
              ]
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Only this kind.",
            "schema": {
              "type": "string",
              "enum": [
                "joke",
                "riddle",
                "proverb",
                "quote"
              ]
            }
          },
          {
            "name": "audience",
            "in": "query",
            "required": false,
            "description": "Who will hear it. `kids`: fit for a child (under 12), up to `max_age` (6 without it). `family`: fit for a child, read out to the whole family. `general` (default): no 18+. `adult`: 18+ too. A joke mocking a people is in `general` and `adult`: leave it out with `exclude_flags=ethnic`.",
            "schema": {
              "type": "string",
              "enum": [
                "kids",
                "family",
                "general",
                "adult"
              ],
              "default": "general"
            }
          },
          {
            "name": "max_age",
            "in": "query",
            "required": false,
            "description": "Only jokes that suit a listener this young: `min_age` at or under it.",
            "schema": {
              "type": "integer",
              "minimum": 3,
              "maximum": 18
            }
          },
          {
            "name": "min_score",
            "in": "query",
            "required": false,
            "description": "Only jokes at or above this score (0-100, how funny). Without it 40 for `kids`, 50 for the rest.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "exclude_flags",
            "in": "query",
            "required": false,
            "description": "A comma list of flags to leave out, such as `alcohol,politics`.",
            "schema": {
              "type": "string",
              "example": "ethnic,politics"
            }
          },
          {
            "name": "seen",
            "in": "query",
            "required": false,
            "description": "Ids already shown to this user, comma separated, at most 200.",
            "schema": {
              "type": "string",
              "example": "j_1207,j_88"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Joke"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": "j_1207",
                    "kind": "joke",
                    "title": "A short memory",
                    "text": "— Doctor, I forget everything.\n— Since when?\n— Since when what?",
                    "lang": "en",
                    "topic": "doctors",
                    "topics": [
                      "doctors"
                    ],
                    "score": 80,
                    "md_score": 80,
                    "min_age": 9,
                    "kids_ok": true,
                    "adult": false,
                    "flags": [],
                    "langs": [
                      "ro",
                      "ru",
                      "en",
                      "uk"
                    ],
                    "source": {
                      "name": "Râzi cu lacrimi",
                      "url": "https://raziculacrimi.ro/bancuri/"
                    },
                    "published_at": "2026-11-02T13:05:00+02:00",
                    "voice": [
                      {
                        "speaker": "narrator",
                        "text": "A patient comes to the doctor."
                      },
                      {
                        "speaker": "male",
                        "text": "Doctor, I forget everything."
                      },
                      {
                        "speaker": "female",
                        "text": "Since when?"
                      },
                      {
                        "speaker": "male",
                        "text": "Since when what?"
                      }
                    ],
                    "dialogue": true
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Râzi cu lacrimi",
                        "url": "https://raziculacrimi.ro/bancuri/",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/jokes/topics": {
      "get": {
        "operationId": "jokes_topics",
        "summary": "Joke topics",
        "description": "Every topic with jokes for this audience in the request's language, with its name and how many, most first. Costs 1 credit.",
        "tags": [
          "jokes"
        ],
        "parameters": [
          {
            "name": "audience",
            "in": "query",
            "required": false,
            "description": "Who will hear it. `kids`: fit for a child (under 12), up to `max_age` (6 without it). `family`: fit for a child, read out to the whole family. `general` (default): no 18+. `adult`: 18+ too. A joke mocking a people is in `general` and `adult`: leave it out with `exclude_flags=ethnic`.",
            "schema": {
              "type": "string",
              "enum": [
                "kids",
                "family",
                "general",
                "adult"
              ],
              "default": "general"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/JokeTopic"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "key": "doctors",
                      "name": "Doctors",
                      "count": 41
                    }
                  ],
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Râzi cu lacrimi",
                        "url": "https://raziculacrimi.ro/bancuri/",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/jokes/{id}": {
      "get": {
        "operationId": "jokes_id",
        "summary": "One joke",
        "description": "A joke with its title and text in every language its point works in. Costs 1 credit.",
        "tags": [
          "jokes"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The joke's id, such as `j_1207`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/JokeFull"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": "j_1207",
                    "kind": "joke",
                    "title": "A short memory",
                    "text": "— Doctor, I forget everything.\n— Since when?\n— Since when what?",
                    "lang": "en",
                    "topic": "doctors",
                    "topics": [
                      "doctors"
                    ],
                    "score": 80,
                    "md_score": 80,
                    "min_age": 9,
                    "kids_ok": true,
                    "adult": false,
                    "flags": [],
                    "langs": [
                      "ro",
                      "ru",
                      "en",
                      "uk"
                    ],
                    "source": {
                      "name": "Râzi cu lacrimi",
                      "url": "https://raziculacrimi.ro/bancuri/"
                    },
                    "published_at": "2026-11-02T13:05:00+02:00",
                    "voice": [
                      {
                        "speaker": "narrator",
                        "text": "A patient comes to the doctor."
                      },
                      {
                        "speaker": "male",
                        "text": "Doctor, I forget everything."
                      },
                      {
                        "speaker": "female",
                        "text": "Since when?"
                      },
                      {
                        "speaker": "male",
                        "text": "Since when what?"
                      }
                    ],
                    "dialogue": true,
                    "texts": {
                      "en": {
                        "title": "A short memory",
                        "text": "— Doctor, I forget everything.\n— Since when?\n— Since when what?"
                      }
                    }
                  },
                  "meta": {
                    "credits": 1,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [
                      {
                        "name": "Râzi cu lacrimi",
                        "url": "https://raziculacrimi.ro/bancuri/",
                        "license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
                      }
                    ],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "422": {
            "$ref": "#/components/responses/E422"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/me": {
      "get": {
        "operationId": "me",
        "summary": "Your plan and credits",
        "description": "The key's plan, its credits this period and its rate limit. Costs nothing.",
        "tags": [
          "platform"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Me"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "plan": "creator",
                    "credits": {
                      "limit": 50000,
                      "used": 12,
                      "reset": "2026-12-02T10:00:00+02:00",
                      "plan": 30000,
                      "extra": 20000
                    },
                    "rate": {
                      "per_minute": 120
                    },
                    "key": {
                      "name": "my server",
                      "prefix": "sat_live_ab1"
                    }
                  },
                  "meta": {
                    "credits": 0,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    },
    "/products": {
      "get": {
        "operationId": "products",
        "summary": "The catalogue",
        "description": "Every product with its state, credit weights, sources, and the free copies that exist. No key.",
        "tags": [
          "platform"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Catalogue"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "products": [
                      {
                        "key": "places",
                        "state": "open",
                        "freshness": "weekly",
                        "endpoints": [
                          {
                            "path": "/v1/places",
                            "credits": 2,
                            "per_rows": 100
                          }
                        ],
                        "sources": [
                          {
                            "name": "OpenStreetMap",
                            "url": "https://www.openstreetmap.org/copyright",
                            "license": "ODbL 1.0, © OpenStreetMap contributors",
                            "download": "https://api.satelit.md/downloads/places-osm.ndjson.gz"
                          }
                        ]
                      }
                    ],
                    "shops": {
                      "open": 30,
                      "offers": 120000
                    },
                    "downloads": [
                      {
                        "product": "places",
                        "url": "https://api.satelit.md/downloads/places-osm.ndjson.gz",
                        "license": "ODbL 1.0, © OpenStreetMap contributors"
                      }
                    ]
                  },
                  "meta": {
                    "credits": 0,
                    "updated_at": null,
                    "sources": [],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        },
        "security": []
      }
    },
    "/plans": {
      "get": {
        "operationId": "plans",
        "summary": "The plans",
        "description": "Every plan's credits, rate limit and what it includes. No key.",
        "tags": [
          "platform"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Plans"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "plans": [
                      {
                        "key": "pro",
                        "name": "Pro",
                        "price": 99,
                        "credits": 300000,
                        "per_minute": 600,
                        "keys": 10,
                        "apps": 10,
                        "webhooks": 10,
                        "history_days": 365,
                        "news": {
                          "delay_hours": 0,
                          "fields": "full",
                          "search_days": null
                        },
                        "attribution": false,
                        "contract": false,
                        "feed": false,
                        "export": false,
                        "pack_price": 4.5
                      }
                    ],
                    "pack": 10000,
                    "packs_max": 50,
                    "recommended": "pro",
                    "currency": "EUR",
                    "year_months": 10
                  },
                  "meta": {
                    "credits": 0,
                    "updated_at": null,
                    "sources": [],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        },
        "security": []
      }
    },
    "/status": {
      "get": {
        "operationId": "status",
        "summary": "Status",
        "description": "Whether the API answers and when each product last changed. No key.",
        "tags": [
          "platform"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Status"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "ok": true,
                    "products": [
                      {
                        "key": "rates",
                        "updated_at": "2026-11-02T13:05:00+02:00",
                        "stale": false
                      }
                    ]
                  },
                  "meta": {
                    "credits": 0,
                    "updated_at": null,
                    "sources": [],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        },
        "security": []
      }
    },
    "/stats": {
      "get": {
        "operationId": "stats",
        "summary": "How much data there is",
        "description": "Counts of every open product, counted hourly from the tables: offers, products, price history, laws, news, tours, flights, places. Numbers only, no row. No key.",
        "tags": [
          "platform"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Stats"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "counts": {
                      "shops_open": 30,
                      "offers": 1200000,
                      "products": 1000000,
                      "price_points": 1500000,
                      "price_history_from": "2026-10-28",
                      "acts": 49000,
                      "acts_from": "1991-01-22",
                      "news_rows": 5200
                    },
                    "updated_at": "2026-11-02T13:05:00+02:00"
                  },
                  "meta": {
                    "credits": 0,
                    "updated_at": null,
                    "sources": [],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        },
        "security": []
      }
    },
    "/sample": {
      "get": {
        "operationId": "sample",
        "summary": "A sample",
        "description": "A little of everything, for trying the API with no key: limited to 60 a minute per address. News here is at least 3 hours old.",
        "tags": [
          "platform"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Sample"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "rates": [
                      {
                        "code": "EUR",
                        "name": "Euro",
                        "value": 19.52,
                        "nominal": 1,
                        "date": "2026-11-02",
                        "change_7d_pct": 0.3,
                        "change_30d_pct": -0.4
                      }
                    ],
                    "fuel": {
                      "cap": {
                        "a95": 24.31,
                        "diesel": 21.03
                      },
                      "cheapest": {
                        "a95": "example-oil"
                      }
                    },
                    "news": [
                      {
                        "id": "n_3f9a1c7e2b4d6a8c0e12",
                        "kind": "article",
                        "category": {
                          "key": "economy",
                          "label": "Economy & prices"
                        },
                        "title": "Gas tariff goes before the regulator",
                        "dek": "The supplier asks for a new price from December.",
                        "gravity": 62,
                        "band": "high",
                        "reach": 3,
                        "region": {
                          "key": "global",
                          "label": "Nationwide"
                        },
                        "regions": [
                          "global"
                        ],
                        "slot": {
                          "key": "noon",
                          "label": "Midday"
                        },
                        "due_at": "2026-11-02T13:05:00+02:00",
                        "published_at": "2026-11-02T13:05:00+02:00",
                        "sources": [
                          {
                            "name": "Example Outlet",
                            "url": "https://outlet.example/story"
                          }
                        ],
                        "sources_count": 1,
                        "image": {
                          "url": "https://api.satelit.md/media/n/8c1f2ab34de56789.webp",
                          "w": 640,
                          "h": 360,
                          "credit": "Example Outlet",
                          "credit_url": "https://outlet.example"
                        }
                      }
                    ],
                    "law": {
                      "date": "2026-10-31",
                      "title": "Legal news: 31 October 2026",
                      "acts": 16
                    },
                    "price": {
                      "name": "Milk",
                      "min_price": 19.9,
                      "store": "Example Market"
                    },
                    "updated_at": "2026-11-02T13:05:00+02:00"
                  },
                  "meta": {
                    "credits": 0,
                    "updated_at": "2026-11-02T13:05:00+02:00",
                    "sources": [],
                    "attribution": "Date: Satelit (satelit.md)"
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        },
        "security": []
      }
    },
    "/export/{product}": {
      "get": {
        "operationId": "export_product",
        "summary": "Export a whole product",
        "description": "Enterprise. A whole open product as NDJSON, one row a line. The first line is `_meta`; the last is `_end` with the row count, so a file without it was cut. One export at a time per account. The data is what the product holds when the export starts; shop prices drop a shop taken down while the stream runs. Costs nothing on a contract plan.",
        "tags": [
          "export"
        ],
        "parameters": [
          {
            "name": "product",
            "in": "path",
            "required": true,
            "description": "Which product.",
            "schema": {
              "type": "string",
              "enum": [
                "news",
                "law",
                "places",
                "rates",
                "fuel",
                "tariffs",
                "indexes",
                "recipes",
                "prices",
                "tours",
                "flights",
                "rest",
                "estate",
                "chain_shops"
              ]
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of labels, texts and error messages.",
            "schema": {
              "type": "string",
              "enum": [
                "ro",
                "ru",
                "en",
                "uk"
              ],
              "default": "ro"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The stream.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              },
              "X-Credits-Cost": {
                "$ref": "#/components/headers/X-Credits-Cost"
              },
              "X-Credits-Limit": {
                "$ref": "#/components/headers/X-Credits-Limit"
              },
              "X-Credits-Remaining": {
                "$ref": "#/components/headers/X-Credits-Remaining"
              },
              "X-Credits-Reset": {
                "$ref": "#/components/headers/X-Credits-Reset"
              }
            },
            "content": {
              "application/x-ndjson": {
                "schema": {
                  "type": "string"
                },
                "example": "{\"_meta\":{\"product\":\"places\",\"lang\":\"en\",\"started_at\":\"2026-11-02T13:05:00+02:00\",\"sources\":[],\"attribution\":null}}\n{\"id\":\"shop:osm:n1\",\"kind\":\"shop\"}\n{\"_end\":{\"rows\":1,\"complete\":true,\"finished_at\":\"2026-11-02T13:05:01+02:00\"}}\n"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "402": {
            "$ref": "#/components/responses/E402"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "503": {
            "$ref": "#/components/responses/E503"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "`Authorization: Bearer sat_live_…`"
      },
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Api-Key",
        "description": "`X-Api-Key: sat_live_…`"
      }
    },
    "headers": {
      "X-RateLimit-Limit": {
        "description": "Requests a minute on this plan.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Remaining": {
        "description": "Requests left in this minute.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Reset": {
        "description": "Seconds to the next minute's window.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Credits-Cost": {
        "description": "Credits this answer cost.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Credits-Limit": {
        "description": "Credits of this period.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Credits-Remaining": {
        "description": "Credits left this period.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Credits-Reset": {
        "description": "When the credits reset.",
        "schema": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "schemas": {
      "Source": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "license": {
            "type": [
              "string",
              "null"
            ]
          },
          "download": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "notice": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "url",
          "license"
        ]
      },
      "Page": {
        "type": "object",
        "properties": {
          "page": {
            "type": "integer"
          },
          "per": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "pages": {
            "type": "integer"
          }
        },
        "required": [
          "page",
          "per",
          "total",
          "pages"
        ]
      },
      "Meta": {
        "type": "object",
        "properties": {
          "credits": {
            "type": "integer"
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Source"
            }
          },
          "attribution": {
            "type": [
              "string",
              "null"
            ]
          },
          "page": {
            "$ref": "#/components/schemas/Page"
          },
          "history_cut": {
            "type": "boolean"
          },
          "fields_cut": {
            "type": "boolean"
          },
          "notice": {
            "type": "string"
          },
          "next": {
            "type": [
              "string",
              "null"
            ]
          },
          "has_more": {
            "type": "boolean"
          },
          "slot": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "key": {
                "type": "string"
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "key",
              "label"
            ]
          },
          "region": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string"
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "key",
              "label"
            ]
          }
        },
        "required": [
          "credits",
          "updated_at",
          "sources",
          "attribution"
        ]
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "docs": {
                "type": "string",
                "format": "uri"
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "code",
              "message",
              "docs"
            ]
          }
        },
        "required": [
          "error"
        ]
      },
      "Rate": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "value": {
            "type": "number"
          },
          "nominal": {
            "type": "integer"
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "change_7d_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "change_30d_pct": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "code",
          "name",
          "value",
          "nominal",
          "date",
          "change_7d_pct",
          "change_30d_pct"
        ]
      },
      "RateHistory": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "points": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "value": {
                  "type": "number"
                }
              },
              "required": [
                "date",
                "value"
              ]
            }
          }
        },
        "required": [
          "code",
          "points"
        ]
      },
      "FuelBoard": {
        "type": "object",
        "properties": {
          "date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "cap": {
            "type": "object",
            "properties": {
              "a95": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "diesel": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "a95",
              "diesel"
            ]
          },
          "networks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri"
                },
                "stations": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "stale": {
                  "type": "boolean"
                },
                "prices": {
                  "type": "object",
                  "properties": {
                    "a95": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "diesel": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "lpg": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "a95",
                    "diesel",
                    "lpg"
                  ]
                }
              },
              "required": [
                "key",
                "name",
                "url",
                "stations",
                "date",
                "stale",
                "prices"
              ]
            }
          },
          "cheapest": {
            "type": "object",
            "properties": {
              "a95": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "diesel": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "lpg": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "a95",
              "diesel",
              "lpg"
            ]
          },
          "range": {
            "type": "object",
            "properties": {
              "a95": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "min": {
                    "type": "number"
                  },
                  "max": {
                    "type": "number"
                  },
                  "networks": {
                    "type": "integer"
                  }
                },
                "required": [
                  "min",
                  "max",
                  "networks"
                ]
              },
              "diesel": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "min": {
                    "type": "number"
                  },
                  "max": {
                    "type": "number"
                  },
                  "networks": {
                    "type": "integer"
                  }
                },
                "required": [
                  "min",
                  "max",
                  "networks"
                ]
              },
              "lpg": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "min": {
                    "type": "number"
                  },
                  "max": {
                    "type": "number"
                  },
                  "networks": {
                    "type": "integer"
                  }
                },
                "required": [
                  "min",
                  "max",
                  "networks"
                ]
              }
            },
            "required": [
              "a95",
              "diesel",
              "lpg"
            ]
          }
        },
        "required": [
          "date",
          "cap",
          "networks",
          "cheapest",
          "range"
        ]
      },
      "Station": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "network": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "raion": {
            "type": [
              "string",
              "null"
            ]
          },
          "lat": {
            "type": [
              "number",
              "null"
            ]
          },
          "lon": {
            "type": [
              "number",
              "null"
            ]
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "prices": {
            "type": "object",
            "properties": {
              "a95": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "diesel": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "lpg": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "a95",
              "diesel",
              "lpg"
            ]
          }
        },
        "required": [
          "id",
          "network",
          "name",
          "address",
          "raion",
          "lat",
          "lon",
          "date",
          "prices"
        ]
      },
      "FuelHistory": {
        "type": "object",
        "properties": {
          "fuel": {
            "type": "string"
          },
          "network": {
            "type": [
              "string",
              "null"
            ]
          },
          "points": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "value": {
                  "type": "number"
                }
              },
              "required": [
                "date",
                "value"
              ]
            }
          }
        },
        "required": [
          "fuel",
          "network",
          "points"
        ]
      },
      "Tariff": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "provider": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "value": {
            "type": "number"
          },
          "valid_from": {
            "type": [
              "string",
              "null"
            ]
          },
          "decision": {
            "type": [
              "string",
              "null"
            ]
          },
          "parts": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "water": {
                "type": "number"
              },
              "sewerage": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "water",
              "sewerage"
            ]
          },
          "vat": {
            "type": "boolean"
          }
        },
        "required": [
          "key",
          "label",
          "provider",
          "region",
          "unit",
          "value",
          "valid_from",
          "decision",
          "parts",
          "vat"
        ]
      },
      "Basket": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "product": {
                  "type": "string"
                },
                "qty": {
                  "type": "number"
                },
                "unit": {
                  "type": "string"
                }
              },
              "required": [
                "product",
                "qty",
                "unit"
              ]
            }
          },
          "points": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "total": {
                  "type": "number"
                },
                "cheapest_total": {
                  "type": "number"
                }
              },
              "required": [
                "date",
                "total",
                "cheapest_total"
              ]
            }
          },
          "change_mom": {
            "type": [
              "number",
              "null"
            ]
          },
          "change_yoy": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "items",
          "points",
          "change_mom",
          "change_yoy"
        ]
      },
      "MoveStats": {
        "type": "object",
        "properties": {
          "compared": {
            "type": "integer"
          },
          "up": {
            "type": "integer"
          },
          "down": {
            "type": "integer"
          },
          "same": {
            "type": "integer"
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "compared",
          "up",
          "down",
          "same",
          "change_pct"
        ]
      },
      "Moves": {
        "type": "object",
        "required": [
          "from",
          "to",
          "compared",
          "up",
          "down",
          "same",
          "change_pct",
          "groups"
        ],
        "properties": {
          "from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "compared": {
            "type": "integer"
          },
          "up": {
            "type": "integer"
          },
          "down": {
            "type": "integer"
          },
          "same": {
            "type": "integer"
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "groups": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "compared": {
                  "type": "integer"
                },
                "up": {
                  "type": "integer"
                },
                "down": {
                  "type": "integer"
                },
                "same": {
                  "type": "integer"
                },
                "change_pct": {
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "required": [
                "key",
                "label",
                "compared",
                "up",
                "down",
                "same",
                "change_pct"
              ]
            }
          }
        }
      },
      "NewsCard": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "article",
              "brief"
            ]
          },
          "category": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string"
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "key",
              "label"
            ]
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "dek": {
            "type": [
              "string",
              "null"
            ]
          },
          "gravity": {
            "type": "integer"
          },
          "band": {
            "type": "string",
            "enum": [
              "low",
              "moderate",
              "high",
              "severe"
            ]
          },
          "reach": {
            "type": [
              "integer",
              "null"
            ]
          },
          "region": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "key": {
                "type": "string",
                "enum": [
                  "global",
                  "chisinau",
                  "balti",
                  "nord",
                  "centru",
                  "sud",
                  "gagauzia",
                  "transnistria",
                  "diaspora"
                ]
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "key",
              "label"
            ]
          },
          "regions": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "global",
                "chisinau",
                "balti",
                "nord",
                "centru",
                "sud",
                "gagauzia",
                "transnistria",
                "diaspora"
              ]
            }
          },
          "slot": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "key": {
                "type": "string",
                "enum": [
                  "morning",
                  "noon",
                  "evening"
                ]
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "key",
              "label"
            ]
          },
          "due_at": {
            "type": "string",
            "format": "date-time"
          },
          "published_at": {
            "type": "string",
            "format": "date-time"
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "required": [
                "name",
                "url"
              ]
            }
          },
          "sources_count": {
            "type": "integer"
          },
          "image": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "url": {
                "type": "string",
                "format": "uri"
              },
              "w": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "h": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "credit": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "credit_url": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri"
              }
            },
            "required": [
              "url",
              "w",
              "h",
              "credit",
              "credit_url"
            ]
          }
        },
        "required": [
          "id",
          "kind",
          "category",
          "title",
          "dek",
          "gravity",
          "band",
          "reach",
          "region",
          "regions",
          "slot",
          "due_at",
          "published_at",
          "sources",
          "sources_count",
          "image"
        ]
      },
      "NewsDay": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "count": {
            "type": "integer"
          },
          "avg_gravity": {
            "type": [
              "number",
              "null"
            ]
          },
          "max_gravity": {
            "type": [
              "integer",
              "null"
            ]
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NewsCard"
            }
          }
        },
        "required": [
          "date",
          "count",
          "avg_gravity",
          "max_gravity",
          "items"
        ]
      },
      "Category": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "key",
          "label"
        ]
      },
      "NewsRegions": {
        "type": "object",
        "properties": {
          "regions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "parent": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "key",
                "label",
                "parent"
              ]
            }
          },
          "slots": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "from": {
                  "type": "string"
                },
                "to": {
                  "type": "string"
                }
              },
              "required": [
                "key",
                "label",
                "from",
                "to"
              ]
            }
          }
        },
        "required": [
          "regions",
          "slots"
        ]
      },
      "Place": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "shop",
              "venue"
            ]
          },
          "name": {
            "type": "string"
          },
          "chain": {
            "type": [
              "string",
              "null"
            ]
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "opening_hours": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "kind",
          "name",
          "chain",
          "category",
          "city",
          "address",
          "lat",
          "lon",
          "phone",
          "website",
          "opening_hours",
          "updated_at"
        ]
      },
      "RecipeCard": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "servings": {
            "type": [
              "integer",
              "null"
            ]
          },
          "time_min": {
            "type": [
              "integer",
              "null"
            ]
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "cost_today": {
            "type": [
              "number",
              "null"
            ]
          },
          "cost_per_serving": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "slug",
          "title",
          "servings",
          "time_min",
          "tags",
          "cost_today",
          "cost_per_serving"
        ]
      },
      "Me": {
        "type": "object",
        "properties": {
          "plan": {
            "type": [
              "string",
              "null"
            ]
          },
          "credits": {
            "type": "object",
            "properties": {
              "limit": {
                "type": "integer"
              },
              "used": {
                "type": "integer"
              },
              "reset": {
                "type": "string",
                "format": "date-time"
              },
              "plan": {
                "type": "integer"
              },
              "extra": {
                "type": "integer"
              }
            },
            "required": [
              "limit",
              "used",
              "reset",
              "plan",
              "extra"
            ]
          },
          "rate": {
            "type": "object",
            "properties": {
              "per_minute": {
                "type": "integer"
              }
            },
            "required": [
              "per_minute"
            ]
          },
          "key": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "prefix": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "prefix"
            ]
          }
        },
        "required": [
          "plan",
          "credits",
          "rate",
          "key"
        ]
      },
      "ShopRef": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "key",
          "name"
        ]
      },
      "PriceStore": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "domain": {
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": "string"
          },
          "products": {
            "type": "integer"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "key",
          "name",
          "domain",
          "kind",
          "products",
          "updated_at"
        ]
      },
      "PriceItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "brand": {
            "type": [
              "string",
              "null"
            ]
          },
          "capacity": {
            "type": [
              "string",
              "null"
            ]
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "min_price": {
            "type": "number"
          },
          "median_price": {
            "type": "number"
          },
          "unit_min_price": {
            "type": [
              "number",
              "null"
            ]
          },
          "price_unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "stores": {
            "type": "integer"
          },
          "in_stock_stores": {
            "type": "integer"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "slug",
          "name",
          "brand",
          "capacity",
          "category",
          "min_price",
          "median_price",
          "unit_min_price",
          "price_unit",
          "stores",
          "in_stock_stores",
          "updated_at"
        ]
      },
      "Offer": {
        "type": "object",
        "properties": {
          "store": {
            "$ref": "#/components/schemas/ShopRef"
          },
          "title": {
            "type": "string"
          },
          "price": {
            "type": "number"
          },
          "old_price": {
            "type": [
              "number",
              "null"
            ]
          },
          "discount_pct": {
            "type": [
              "integer",
              "null"
            ]
          },
          "unit_price": {
            "type": [
              "number",
              "null"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "in_stock": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "last_seen": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "store",
          "title",
          "price",
          "old_price",
          "discount_pct",
          "unit_price",
          "unit",
          "in_stock",
          "url",
          "last_seen"
        ]
      },
      "PriceGroup": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "min_price": {
            "type": "number"
          },
          "median_price": {
            "type": "number"
          },
          "unit_min_price": {
            "type": [
              "number",
              "null"
            ]
          },
          "price_unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "stores": {
            "type": "integer"
          }
        },
        "required": [
          "id",
          "name",
          "unit",
          "min_price",
          "median_price",
          "unit_min_price",
          "price_unit",
          "stores"
        ]
      },
      "PricePoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "store": {
            "type": "string"
          },
          "price": {
            "type": "number"
          },
          "old_price": {
            "type": [
              "number",
              "null"
            ]
          },
          "unit_price": {
            "type": [
              "number",
              "null"
            ]
          },
          "in_stock": {
            "type": [
              "boolean",
              "null"
            ]
          }
        },
        "required": [
          "date",
          "store",
          "price",
          "old_price",
          "unit_price",
          "in_stock"
        ]
      },
      "Deal": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "brand": {
            "type": [
              "string",
              "null"
            ]
          },
          "capacity": {
            "type": [
              "string",
              "null"
            ]
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "store": {
            "$ref": "#/components/schemas/ShopRef"
          },
          "price": {
            "type": "number"
          },
          "old_price": {
            "type": "number"
          },
          "discount_pct": {
            "type": "integer"
          },
          "save": {
            "type": "number"
          },
          "unit_price": {
            "type": [
              "number",
              "null"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "stores": {
            "type": "integer"
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          }
        },
        "required": [
          "name",
          "brand",
          "capacity",
          "category",
          "store",
          "price",
          "old_price",
          "discount_pct",
          "save",
          "unit_price",
          "unit",
          "stores",
          "url"
        ]
      },
      "FeedEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "news.published",
              "law.digest",
              "fuel.cap",
              "rates.updated",
              "price.changed"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "data": {
            "type": "object"
          }
        },
        "required": [
          "id",
          "type",
          "created_at",
          "data"
        ]
      },
      "ActBrief": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "slug": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": "string"
          },
          "type_label": {
            "type": "string"
          },
          "type_raw": {
            "type": [
              "string",
              "null"
            ]
          },
          "number": {
            "type": [
              "string",
              "null"
            ]
          },
          "code": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          },
          "title_ru": {
            "type": [
              "string",
              "null"
            ]
          },
          "heading": {
            "type": "string"
          },
          "heading_lang": {
            "type": "string"
          },
          "issuer": {
            "type": [
              "string",
              "null"
            ]
          },
          "issuer_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "issuer_key": {
            "type": [
              "string",
              "null"
            ]
          },
          "subject": {
            "type": "string"
          },
          "subject_lang": {
            "type": "string"
          },
          "topic": {
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": [
              "string",
              "null"
            ]
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string"
                },
                "type_label": {
                  "type": "string"
                },
                "number": {
                  "type": "string"
                },
                "year": {
                  "type": [
                    "integer",
                    "null"
                  ]
                }
              },
              "required": [
                "type",
                "type_label",
                "number",
                "year"
              ]
            }
          },
          "adopted_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "published_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "in_force_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "repealed_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "status": {
            "type": "string"
          },
          "important": {
            "type": "boolean"
          },
          "mo_ref": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "has_text": {
            "type": "boolean"
          },
          "has_text_ru": {
            "type": "boolean"
          },
          "topics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "headline": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "slug",
          "type",
          "type_label",
          "type_raw",
          "number",
          "code",
          "title",
          "title_ru",
          "heading",
          "heading_lang",
          "issuer",
          "issuer_name",
          "issuer_key",
          "subject",
          "subject_lang",
          "topic",
          "kind",
          "targets",
          "adopted_on",
          "published_on",
          "in_force_on",
          "repealed_on",
          "status",
          "important",
          "mo_ref",
          "url",
          "has_text",
          "has_text_ru",
          "topics",
          "headline",
          "summary"
        ]
      },
      "Act": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "slug": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": "string"
          },
          "type_label": {
            "type": "string"
          },
          "type_raw": {
            "type": [
              "string",
              "null"
            ]
          },
          "number": {
            "type": [
              "string",
              "null"
            ]
          },
          "code": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          },
          "title_ru": {
            "type": [
              "string",
              "null"
            ]
          },
          "heading": {
            "type": "string"
          },
          "heading_lang": {
            "type": "string"
          },
          "issuer": {
            "type": [
              "string",
              "null"
            ]
          },
          "issuer_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "issuer_key": {
            "type": [
              "string",
              "null"
            ]
          },
          "subject": {
            "type": "string"
          },
          "subject_lang": {
            "type": "string"
          },
          "topic": {
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": [
              "string",
              "null"
            ]
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string"
                },
                "type_label": {
                  "type": "string"
                },
                "number": {
                  "type": "string"
                },
                "year": {
                  "type": [
                    "integer",
                    "null"
                  ]
                }
              },
              "required": [
                "type",
                "type_label",
                "number",
                "year"
              ]
            }
          },
          "adopted_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "published_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "in_force_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "repealed_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "status": {
            "type": "string"
          },
          "important": {
            "type": "boolean"
          },
          "mo_ref": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "has_text": {
            "type": "boolean"
          },
          "has_text_ru": {
            "type": "boolean"
          },
          "topics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "headline": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "title": {
                "type": "string"
              },
              "summary": {
                "type": "string"
              },
              "key_points": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "created_at": {
                "type": "string",
                "format": "date-time"
              }
            },
            "required": [
              "title",
              "summary",
              "key_points",
              "tags",
              "created_at"
            ]
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "text_hash": {
            "type": [
              "string",
              "null"
            ]
          },
          "lang": {
            "type": "string"
          },
          "version_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "outline": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "text_ru": {
            "type": [
              "string",
              "null"
            ]
          },
          "outline_ru": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "type_raw_ru": {
            "type": [
              "string",
              "null"
            ]
          },
          "url_ru": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "versions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "doc_id": {
                  "type": "integer"
                },
                "valid_from": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "required": [
                "doc_id",
                "valid_from",
                "url"
              ]
            }
          },
          "amends": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "amended_by": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "amended_by_acts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ActBrief"
            }
          },
          "promulgates": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ActBrief"
              },
              {
                "type": "null"
              }
            ]
          },
          "promulgated_by": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ActBrief"
              },
              {
                "type": "null"
              }
            ]
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "slug",
          "type",
          "type_label",
          "type_raw",
          "number",
          "code",
          "title",
          "title_ru",
          "heading",
          "heading_lang",
          "issuer",
          "issuer_name",
          "issuer_key",
          "subject",
          "subject_lang",
          "topic",
          "kind",
          "targets",
          "adopted_on",
          "published_on",
          "in_force_on",
          "repealed_on",
          "status",
          "important",
          "mo_ref",
          "url",
          "has_text",
          "has_text_ru",
          "topics",
          "headline",
          "summary",
          "text",
          "text_hash",
          "lang",
          "version_date",
          "outline",
          "text_ru",
          "outline_ru",
          "type_raw_ru",
          "url_ru",
          "attachments",
          "versions",
          "amends",
          "amended_by",
          "amended_by_acts",
          "promulgates",
          "promulgated_by",
          "updated_at"
        ]
      },
      "DigestRow": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "acts": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "date",
          "acts",
          "title"
        ]
      },
      "Digest": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "lang": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "intro": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "date",
          "lang",
          "title",
          "intro",
          "items",
          "updated_at"
        ]
      },
      "NewsStory": {
        "allOf": [
          {
            "$ref": "#/components/schemas/NewsCard"
          },
          {
            "type": "object",
            "properties": {
              "summary": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "explain": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "facts": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "summary",
              "explain",
              "facts"
            ]
          }
        ]
      },
      "Recipe": {
        "allOf": [
          {
            "$ref": "#/components/schemas/RecipeCard"
          },
          {
            "type": "object",
            "properties": {
              "ingredients": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "qty": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "unit": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "name",
                    "qty",
                    "unit"
                  ]
                }
              },
              "steps": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "ingredients",
              "steps"
            ]
          }
        ]
      },
      "PriceItemDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PriceItem"
          },
          {
            "type": "object",
            "properties": {
              "offers": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Offer"
                }
              }
            },
            "required": [
              "offers"
            ]
          }
        ]
      },
      "PriceGroupDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PriceGroup"
          },
          {
            "type": "object",
            "properties": {
              "offers": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Offer"
                }
              }
            },
            "required": [
              "offers"
            ]
          }
        ]
      },
      "PriceHistory": {
        "type": "object",
        "properties": {
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PricePoint"
            }
          }
        },
        "required": [
          "points"
        ]
      },
      "Catalogue": {
        "type": "object",
        "properties": {
          "products": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "state": {
                  "type": "string",
                  "enum": [
                    "open",
                    "contract",
                    "closed"
                  ]
                },
                "freshness": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "endpoints": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                },
                "sources": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Source"
                  }
                }
              },
              "required": [
                "key",
                "state",
                "freshness",
                "endpoints"
              ]
            }
          },
          "shops": {
            "type": "object",
            "properties": {
              "open": {
                "type": "integer"
              },
              "offers": {
                "type": "integer"
              }
            },
            "required": [
              "open",
              "offers"
            ]
          },
          "downloads": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "product": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "license": {
                  "type": "string"
                }
              },
              "required": [
                "product",
                "url",
                "license"
              ]
            }
          }
        },
        "required": [
          "products",
          "shops",
          "downloads"
        ]
      },
      "Tour": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "agency": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "resort": {
            "type": [
              "string",
              "null"
            ]
          },
          "hotel": {
            "type": [
              "string",
              "null"
            ]
          },
          "stars": {
            "type": [
              "integer",
              "null"
            ]
          },
          "board": {
            "type": [
              "string",
              "null"
            ]
          },
          "room": {
            "type": [
              "string",
              "null"
            ]
          },
          "nights": {
            "type": [
              "integer",
              "null"
            ]
          },
          "date_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "adults": {
            "type": [
              "integer",
              "null"
            ]
          },
          "price": {
            "type": "number"
          },
          "currency": {
            "type": "string"
          },
          "price_mdl": {
            "type": [
              "number",
              "null"
            ]
          },
          "price_per": {
            "type": "string"
          },
          "price_pp_mdl": {
            "type": [
              "number",
              "null"
            ]
          },
          "departure": {
            "type": [
              "string",
              "null"
            ]
          },
          "transport": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "hot": {
            "type": "boolean"
          },
          "last_seen": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "agency",
          "title",
          "country",
          "resort",
          "hotel",
          "stars",
          "board",
          "room",
          "nights",
          "date_from",
          "adults",
          "price",
          "currency",
          "price_mdl",
          "price_per",
          "price_pp_mdl",
          "departure",
          "transport",
          "url",
          "hot",
          "last_seen"
        ]
      },
      "TourDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Tour"
          },
          {
            "type": "object",
            "properties": {
              "history": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "date": {
                      "type": "string",
                      "format": "date"
                    },
                    "price": {
                      "type": "number"
                    },
                    "currency": {
                      "type": "string"
                    },
                    "price_mdl": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "date",
                    "price",
                    "currency",
                    "price_mdl"
                  ]
                }
              }
            },
            "required": [
              "history"
            ]
          }
        ]
      },
      "TourCountry": {
        "type": "object",
        "properties": {
          "country": {
            "type": "string"
          },
          "offers": {
            "type": "integer"
          },
          "min_price_mdl": {
            "type": [
              "number",
              "null"
            ]
          },
          "min_price_pp_mdl": {
            "type": [
              "number",
              "null"
            ]
          },
          "agencies": {
            "type": "integer"
          }
        },
        "required": [
          "country",
          "offers",
          "min_price_mdl",
          "min_price_pp_mdl",
          "agencies"
        ]
      },
      "Flight": {
        "type": "object",
        "properties": {
          "flight_no": {
            "type": "string"
          },
          "airline": {
            "type": "string"
          },
          "airline_code": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "iata": {
            "type": "string"
          },
          "scheduled": {
            "type": "string"
          }
        },
        "required": [
          "flight_no",
          "airline",
          "airline_code",
          "city",
          "iata",
          "scheduled"
        ]
      },
      "Fare": {
        "type": "object",
        "properties": {
          "destination": {
            "type": "string"
          },
          "airport": {
            "type": [
              "string",
              "null"
            ]
          },
          "price": {
            "type": "number"
          },
          "currency": {
            "type": "string"
          },
          "price_mdl": {
            "type": [
              "number",
              "null"
            ]
          },
          "airline": {
            "type": [
              "string",
              "null"
            ]
          },
          "flight_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "departure_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "return_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "transfers": {
            "type": [
              "integer",
              "null"
            ]
          },
          "duration": {
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "required": [
          "destination",
          "airport",
          "price",
          "currency",
          "price_mdl",
          "airline",
          "flight_number",
          "departure_at",
          "return_at",
          "transfers",
          "duration"
        ]
      },
      "Destination": {
        "type": "object",
        "properties": {
          "iata": {
            "type": "string"
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "airlines": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "flights_per_week": {
            "type": "integer"
          },
          "season_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "season_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "direct": {
            "type": "boolean"
          },
          "fare_from": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Fare"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "iata",
          "city",
          "airlines",
          "flights_per_week",
          "season_from",
          "season_to",
          "direct",
          "fare_from"
        ]
      },
      "DestinationDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Destination"
          },
          {
            "type": "object",
            "properties": {
              "weekdays": {
                "type": "array",
                "items": {
                  "type": "integer"
                }
              },
              "departures": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Flight"
                }
              },
              "arrivals": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Flight"
                }
              },
              "fares": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Fare"
                }
              },
              "months": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Fare"
                }
              }
            },
            "required": [
              "weekdays",
              "departures",
              "arrivals",
              "fares",
              "months"
            ]
          }
        ]
      },
      "Board": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string"
          },
          "day": {
            "type": "string",
            "format": "date"
          },
          "flights": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Flight"
            }
          }
        },
        "required": [
          "kind",
          "day",
          "flights"
        ]
      },
      "RestPlace": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "lat": {
            "type": [
              "number",
              "null"
            ]
          },
          "lon": {
            "type": [
              "number",
              "null"
            ]
          },
          "price_from": {
            "type": [
              "number",
              "null"
            ]
          },
          "price_unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri"
                }
              },
              "required": [
                "name",
                "url"
              ]
            }
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "name",
          "kind",
          "region",
          "city",
          "lat",
          "lon",
          "price_from",
          "price_unit",
          "sources",
          "updated_at"
        ]
      },
      "Estate": {
        "type": "object",
        "properties": {
          "series": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "enum": [
                    "sale",
                    "rent"
                  ]
                },
                "scope": {
                  "type": "string",
                  "enum": [
                    "md",
                    "city"
                  ]
                },
                "key": {
                  "type": "string"
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "unit": {
                  "type": "string"
                },
                "points": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "date": {
                        "type": "string",
                        "format": "date"
                      },
                      "median": {
                        "type": "number"
                      },
                      "per_m2": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "price": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "n": {
                        "type": "integer"
                      }
                    },
                    "required": [
                      "date",
                      "median",
                      "per_m2",
                      "price",
                      "n"
                    ]
                  }
                }
              },
              "required": [
                "kind",
                "scope",
                "key",
                "name",
                "unit",
                "points"
              ]
            }
          }
        },
        "required": [
          "series"
        ]
      },
      "Plans": {
        "type": "object",
        "properties": {
          "plans": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "pack": {
            "type": "integer"
          },
          "packs_max": {
            "type": "integer"
          },
          "recommended": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": "string"
          },
          "year_months": {
            "type": "integer"
          }
        },
        "required": [
          "plans",
          "pack",
          "packs_max",
          "recommended"
        ]
      },
      "Status": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "products": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "updated_at": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "stale": {
                  "type": "boolean"
                }
              },
              "required": [
                "key",
                "updated_at",
                "stale"
              ]
            }
          }
        },
        "required": [
          "ok",
          "products"
        ]
      },
      "Stats": {
        "type": "object",
        "properties": {
          "counts": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "integer",
                "string"
              ]
            },
            "description": "How much of each open product there is, counted hourly: `offers`, `products`, `price_points`, `acts`, `news_rows`, `tours_offers`, `flights_destinations` and so on, and the day each history starts (`*_from`). A product switched off has no count here."
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "counts",
          "updated_at"
        ]
      },
      "Sample": {
        "type": "object",
        "properties": {
          "rates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rate"
            }
          },
          "fuel": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "cap": {
                "type": "object"
              },
              "cheapest": {
                "type": "object"
              }
            },
            "required": [
              "cap",
              "cheapest"
            ]
          },
          "news": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NewsCard"
            }
          },
          "law": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "date": {
                "type": "string",
                "format": "date"
              },
              "title": {
                "type": "string"
              },
              "acts": {
                "type": "integer"
              }
            },
            "required": [
              "date",
              "title",
              "acts"
            ]
          },
          "price": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "min_price": {
                "type": "number"
              },
              "store": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "min_price",
              "store"
            ]
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "rates",
          "fuel",
          "news",
          "law",
          "price",
          "updated_at"
        ]
      },
      "CategoryRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "group": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "id": {
                "type": "integer"
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "id",
              "name",
              "url"
            ]
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "group"
        ]
      },
      "MarketDist": {
        "type": "object",
        "properties": {
          "median": {
            "type": [
              "number",
              "null"
            ]
          },
          "p10": {
            "type": [
              "number",
              "null"
            ]
          },
          "p25": {
            "type": [
              "number",
              "null"
            ]
          },
          "p75": {
            "type": [
              "number",
              "null"
            ]
          },
          "p90": {
            "type": [
              "number",
              "null"
            ]
          },
          "min": {
            "type": [
              "number",
              "null"
            ]
          },
          "max": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "median",
          "p10",
          "p25",
          "p75",
          "p90",
          "min",
          "max"
        ]
      },
      "MarketCategory": {
        "type": "object",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/CategoryRef"
          },
          "volume": {
            "type": "integer"
          },
          "priced": {
            "type": [
              "integer",
              "null"
            ]
          },
          "median_mdl": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "category",
          "volume",
          "priced",
          "median_mdl"
        ]
      },
      "MarketPrice": {
        "type": "object",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/CategoryRef"
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "day": {
            "type": "string",
            "format": "date"
          },
          "volume": {
            "type": "integer"
          },
          "priced": {
            "type": [
              "integer",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "prices": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/MarketDist"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "category",
          "city",
          "day",
          "volume",
          "priced",
          "currency",
          "prices"
        ]
      },
      "MarketPoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "volume": {
            "type": "integer"
          },
          "new": {
            "type": [
              "integer",
              "null"
            ]
          },
          "removed": {
            "type": [
              "integer",
              "null"
            ]
          },
          "priced": {
            "type": [
              "integer",
              "null"
            ]
          },
          "prices": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/MarketDist"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "date",
          "volume"
        ]
      },
      "MarketHistory": {
        "type": "object",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/CategoryRef"
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MarketPoint"
            }
          }
        },
        "required": [
          "category",
          "city",
          "points"
        ]
      },
      "MarketSeller": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "active": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "categories": {
            "type": "integer"
          },
          "top_category": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CategoryRef"
              },
              {
                "type": "null"
              }
            ]
          },
          "activity": {
            "type": "string",
            "enum": [
              "occasional",
              "regular",
              "high"
            ]
          },
          "first_seen": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "last_active": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "tenure_days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "new": {
            "type": "boolean"
          },
          "sold": {
            "type": "integer"
          },
          "sold_recent": {
            "type": "integer"
          },
          "in_category": {
            "type": "object",
            "properties": {
              "active": {
                "type": "integer"
              },
              "total": {
                "type": "integer"
              },
              "median_mdl": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "active",
              "total",
              "median_mdl"
            ]
          },
          "category_breakdown": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "category": {
                  "$ref": "#/components/schemas/CategoryRef"
                },
                "active": {
                  "type": "integer"
                },
                "total": {
                  "type": "integer"
                },
                "median_mdl": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "last_active": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                }
              },
              "required": [
                "category",
                "active",
                "total",
                "median_mdl",
                "last_active"
              ]
            }
          }
        },
        "required": [
          "id",
          "source",
          "active",
          "total",
          "categories",
          "top_category",
          "activity",
          "first_seen",
          "last_active"
        ]
      },
      "Joke": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "joke",
              "riddle",
              "proverb",
              "quote"
            ]
          },
          "title": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "lang": {
            "type": "string"
          },
          "topic": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "family",
              "couples",
              "kids",
              "school",
              "work",
              "doctors",
              "police",
              "animals",
              "money",
              "drinking",
              "food",
              "tech",
              "travel",
              "sport",
              "old_age",
              "mother_in_law",
              "neighbours",
              "village",
              "army",
              "law",
              "religion",
              "politics",
              "bula",
              "ion_maria",
              "blondes",
              "regions",
              "wordplay",
              "dark",
              "other"
            ]
          },
          "topics": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "family",
                "couples",
                "kids",
                "school",
                "work",
                "doctors",
                "police",
                "animals",
                "money",
                "drinking",
                "food",
                "tech",
                "travel",
                "sport",
                "old_age",
                "mother_in_law",
                "neighbours",
                "village",
                "army",
                "law",
                "religion",
                "politics",
                "bula",
                "ion_maria",
                "blondes",
                "regions",
                "wordplay",
                "dark",
                "other"
              ]
            }
          },
          "score": {
            "type": "integer"
          },
          "md_score": {
            "type": "integer"
          },
          "min_age": {
            "type": "integer"
          },
          "kids_ok": {
            "type": "boolean"
          },
          "adult": {
            "type": "boolean"
          },
          "flags": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "sexual",
                "profanity",
                "violence",
                "alcohol",
                "drugs",
                "ethnic",
                "regional",
                "gender",
                "religion",
                "politics",
                "death",
                "disability",
                "toilet",
                "cheating"
              ]
            }
          },
          "langs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "source": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              }
            },
            "required": [
              "name",
              "url"
            ]
          },
          "published_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "voice": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "properties": {
                "speaker": {
                  "type": "string",
                  "enum": [
                    "narrator",
                    "female",
                    "male"
                  ]
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "speaker",
                "text"
              ]
            },
            "description": "The joke as a script to read aloud with a narrator and two voices, a woman's and a man's: no title, no speaker labels, numbers and abbreviations in words, the punchline last. Written once by a model per language; null until it is."
          },
          "dialogue": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Characters speak in it (lines for `female` or `male`); null while `voice` is."
          }
        },
        "required": [
          "id",
          "kind",
          "title",
          "text",
          "lang",
          "topic",
          "topics",
          "score",
          "md_score",
          "min_age",
          "kids_ok",
          "adult",
          "flags",
          "langs",
          "source",
          "published_at",
          "voice",
          "dialogue"
        ]
      },
      "JokeToday": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Joke"
          },
          {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "format": "date"
              }
            },
            "required": [
              "date"
            ]
          }
        ]
      },
      "JokeFull": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Joke"
          },
          {
            "type": "object",
            "properties": {
              "texts": {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "text": {
                      "type": "string"
                    },
                    "voice": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "speaker": {
                            "type": "string"
                          },
                          "text": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "speaker",
                          "text"
                        ]
                      }
                    }
                  },
                  "required": [
                    "title",
                    "text",
                    "voice"
                  ]
                },
                "description": "The title, text and voice script in each language whose point works, keyed ro, ru, en, uk."
              }
            },
            "required": [
              "texts"
            ]
          }
        ]
      },
      "JokeTopic": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "count": {
            "type": "integer"
          }
        },
        "required": [
          "key",
          "name",
          "count"
        ]
      }
    },
    "responses": {
      "E401": {
        "description": "auth_required or key_invalid: no key, or an unknown or revoked one. Past 30 failed keys a minute from one address the answer is 429.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "auth_required",
                "message": "The API key is missing.",
                "docs": "https://developer.satelit.md/en/errors/#auth_required"
              }
            }
          }
        }
      },
      "E402": {
        "description": "plan_required: the account has no plan (`choose` is where to pick one), or the plan does not include this. Nothing is charged.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "plan_required",
                "message": "Your plan does not include this.",
                "docs": "https://developer.satelit.md/en/errors/#plan_required"
              }
            }
          }
        }
      },
      "E403": {
        "description": "not_available or account_suspended.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "not_available",
                "message": "This data is not available through the API.",
                "docs": "https://developer.satelit.md/en/errors/#not_available"
              }
            }
          }
        }
      },
      "E404": {
        "description": "not_found.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "not_found",
                "message": "Not found.",
                "docs": "https://developer.satelit.md/en/errors/#not_found"
              }
            }
          }
        }
      },
      "E422": {
        "description": "invalid: `fields` says which.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "invalid",
                "message": "Invalid data.",
                "docs": "https://developer.satelit.md/en/errors/#invalid"
              }
            }
          }
        }
      },
      "E429": {
        "description": "rate_limited or quota_exceeded. Going past the quota stops the answers and is never billed. `Retry-After` says when to try again.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "rate_limited",
                "message": "Too many requests. Try again shortly.",
                "docs": "https://developer.satelit.md/en/errors/#rate_limited"
              }
            }
          }
        }
      },
      "E503": {
        "description": "busy: too many answers in flight, or the database did not answer. Nothing is charged. `Retry-After` says when to try again.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "busy",
                "message": "The service is busy. Try again in a few seconds.",
                "docs": "https://developer.satelit.md/en/errors/#busy"
              }
            }
          }
        }
      }
    }
  }
}
