{
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "scheme": "bearer",
        "type": "http"
      },
      "cookieAuth": {
        "in": "cookie",
        "name": "agro_session",
        "type": "apiKey"
      }
    }
  },
  "info": {
    "description": "Балансовый расчёт доз удобрений по 12 элементам питания, ведение угодий, технологических карт и каталога продуктов. Персональные данные обезличены.",
    "title": "agro-platform API",
    "version": "54dac36a"
  },
  "openapi": "3.0.3",
  "paths": {
    "/api/v1/calc": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Расчёт «на лету» без базы (без авторизации)"
      }
    },
    "/api/v1/calculations/{id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Сохранённый отчёт (?format=)"
      }
    },
    "/api/v1/crops": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Культуры (системные + организации)"
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Добавить или изменить культуру"
      }
    },
    "/api/v1/crops/{code}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Одна культура"
      }
    },
    "/api/v1/farms": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Хозяйства"
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Создать хозяйство"
      }
    },
    "/api/v1/fields": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Поля (?farm_id=)"
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Завести поле"
      }
    },
    "/api/v1/fields/{id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Карточка поля с последним анализом и посевами"
      }
    },
    "/api/v1/fields/{id}/soil-samples": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "История анализов"
      },
      "post": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Загрузить анализ почвы"
      }
    },
    "/api/v1/me": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Текущий субъект, организации, способ входа"
      }
    },
    "/api/v1/me/erase": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Право на забвение: уничтожить ключ шифрования субъекта"
      }
    },
    "/api/v1/openapi.json": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Описание API"
      }
    },
    "/api/v1/operations": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Технологические операции и шаблоны техкарт"
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Добавить или изменить операцию"
      }
    },
    "/api/v1/orgs": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Создать организацию и стать её администратором"
      }
    },
    "/api/v1/orgs/switch": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Переключить организацию сессии"
      }
    },
    "/api/v1/products": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Каталог продуктов (?element=, ?method=)"
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Выгрузка каталога: items[]"
      }
    },
    "/api/v1/products/compat": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Проверить совместимость баковой смеси"
      }
    },
    "/api/v1/reference/coefficients": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Кп, Ки почвы, Ки удобрений по приёмам, коридор возврата, соотношения"
      }
    },
    "/api/v1/reference/elements": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "12 расчётных элементов, формы, классы обеспеченности"
      }
    },
    "/api/v1/reference/methods": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Приёмы внесения, фазы, кривые потребления, шаблоны техкарт, совместимость"
      }
    },
    "/api/v1/seasons": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Посевы (?field_id=)"
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Создать посев с техкартой"
      }
    },
    "/api/v1/seasons/{id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Карточка посева"
      }
    },
    "/api/v1/seasons/{id}/calculate": {
      "post": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Выполнить расчёт и сохранить (?format=json|text|markdown|html)"
      }
    },
    "/api/v1/seasons/{id}/calculations": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "История расчётов"
      }
    },
    "/api/v1/seasons/{id}/operations": {
      "put": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Задать последовательность операций"
      }
    },
    "/api/v1/tokens": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "security": [
          {
            "cookieAuth": []
          },
          {
            "bearerAuth": []
          }
        ],
        "summary": "Выпустить сервисный токен"
      }
    },
    "/auth/callback": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Завершение входа OIDC"
      }
    },
    "/auth/dev": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Dev-вход (только AGRO_DEV_LOGIN=1)"
      }
    },
    "/auth/login": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Начать вход через OIDC"
      }
    },
    "/auth/logout": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": ""
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Выход"
      }
    },
    "/healthz": {
      "get": {
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Ошибка входных данных"
          },
          "401": {
            "description": "Не авторизован"
          },
          "403": {
            "description": "Нет организации или прав"
          },
          "404": {
            "description": "Не найдено"
          }
        },
        "summary": "Проверка живости и доступности базы"
      }
    }
  },
  "servers": [
    {
      "url": "/"
    }
  ]
}
