
openapi: "3.0.0"
info:
  description: |
    [Annofab](https://annofab.com) のWeb APIです。
    キャッシュが有効になって[大幅に高速化された v2 はこちら](/docs/api/v2/) です。

    APIベースURL: https://annofab.com/api/v1<br>
    例） /projects というAPIを使う場合、 https://annofab.com/api/v1/projects をリクエストします。


    ■APIの変更ポリシー

    **現在、APIは開発途上版です。予告なく互換性のない変更がある可能性をご了承ください。**
    ご要望の実現、あるいは、セキュリティやパフォーマンスの改善などを実現するにあたり、互換性のない変更が必要になる場合があります。
    その場合、開発途上版では開発リソースを改善に集中するため、古いバージョンを共存させずに互換性のない変更を行う場合があります。


    ■機能の要望や不具合報告

    「こんな機能が欲しい」というご要望や、「APIが予期せぬ動作をする」といった不具合報告などは、[こちらのお問い合わせフォーム](https://docs.google.com/forms/d/e/1FAIpQLSePryikS_wo_H11pxL2ewUe2d0ud0jxZlBQwH2rVVfcifKyQw/viewform)からご連絡ください。

    # SDKとツール
    * [annofab-api-python-client](https://github.com/kurusugawa-computer/annofab-api-python-client)：AnnofabのPython SDKです。
    * [annofab-cli](https://github.com/kurusugawa-computer/annofab-cli)：AnnofabのCLIです。

    # API Convention

    ## 用語

    * **属性○○○を必須**とは、「JSONに属性キー○○○を含め、かつ、その値が`null`以外」であること
    * **属性○○○を未指定**とは、「JSONに属性キー○○○を含めない」または「属性○○○のキーはあるが値は`null`」のどちらかであること

    ## 更新系APIのリクエストボディに必須の属性

    * 更新系APIとは、HTTPメソッドが **PUT** または **POST** のAPIです。
    * 更新系APIでは、更新対象の「リソースの最終更新日」を必須とする場合があります。
      * これは、複数ユーザーからのAPIリクエストのデータ競合を避けるための、一般的なAPI設計慣習によるものです。
      * ここで「リソースの最終更新日」とは、`last_updated_datetime` または `updated_datetime` という名前の属性です。
      * 一部のAPIでは、操作対象リソースと別のリソースの最終更新日を必要とします。
        その場合は、`last_***_update_datetime` のような名前です（***には別リソースが入ります）。
      * **新規作成のとき**は、リクエストボディの「リソースの最終更新日」を未指定にします。
        * リソースがすでに作成されているときは、新規作成リクエストは失敗します。
      * **存在するリソースを更新または削除するとき**は、リクエストボディの「リソースの最終更新日」に、そのリソースの現在の`updated_datetime`を指定します。
        * 更新しようとしたリソースが存在しないとき、またはすでに更新されているときは、更新リクエストは失敗します。
    * 「リソースの最終更新日」以外の属性については、新規作成/更新それぞれで必須が異なる場合、API個別に特筆されています。

    ## APIのリクエストボディに指定する _type 属性について

    * 一部のAPIではリクエストボディに `_type` 属性を指定することができます。
    * `_type` 属性を指定する場合は、`_type` 属性で指定された型にデコードします。
      例えば、`_type` 属性に `ByDirectory` を指定すると `TaskGenerateRuleByDirectory` にデコードされ、`Polyline` を指定すると `InspectionDataPolyline` にデコードされます。
      リクエストボディが誤っている場合はエラーになります。
    * 必須でない `_type` 属性を指定しない場合は、リクエストボディで指定された `_type` 以外の属性からデコードすべき型を推論します。適切な型が見つからない場合はエラーになります。
    * `_type` 属性は「推論が失敗して別の型にデコードされる」ことを防ぐために指定することを推奨します。

    ## APIに指定するID/名前の制約

    * APIで使用する各データのIDに使用できる文字種は次の通りです。
      * 半角英数字
      * `_` (アンダースコア)
      * `-` (ハイフン)
      * `.` (ドット)
    * 特に制限がない限り、IDはUUID version4形式とすることを推奨します。
      * 例） `b048c6b3-b36f-4c8d-97ea-96828a50a44c`
    * 各データのIDは、以下のように特定のデータに対して一意な値である必要があります。

    ID/名前 | 一意制約
    ---|---
    組織名 | Annofab内で一意
    組織ID | Annofab内で一意
    ユーザーID | Annofab内で一意
    アカウントID  | Annofab内で一意
    プロジェクトID | Annofab内で一意
    タスクID（プレフィックス含む） | プロジェクト内で一意
    入力データID | プロジェクト内で一意
    アノテーションID | フレーム内（タスクID、入力データIDの組み合わせ）で一意
    検査ID | プロジェクト内で一意
    補助情報ID | プロジェクト内で一意
    WebhookID | プロジェクト内で一意
    作業ガイド画像ID | プロジェクト内で一意
    ラベルID | プロジェクト内で一意
    属性ID | プロジェクト内で一意
    選択肢ID | 属性内で一意
    ジョブID | プロジェクト内で一意
    入力データセットID | 組織内で一意
    プラグインID | 組織内で一意
    組織IDプロバイダーID | 組織内で一意
    パーソナルアクセストークンID | アカウント内で一意
    プロジェクト追加データの種別ID | Annofab内で一意

    ## 検索結果の集約を表す AggregationResult

    いくつかの検索系 API の検索結果レスポンスは、`AggregationResult` というデータ構造のフィールドを持っています。
    `AggregationResult` は、検索対象リソースをある観点で集約した結果を表します。
    このような集約は、「検索結果を属性 XXX の件数別に分類」などするために使われます。

    例えば、タスクを検索する API には、以下のような「タスクの現在担当者での集約 `account_id_count`」などの `AggregationResult` がいくつか含まれています。

    ```json
    {
      "list": [ ... ],
      "aggregations": [
        {
          "_type": "CountResult",
          "name": "account_id_count",
          "field": "account_id",
          "docCount": 15,
          "items": [
            {"key":"c5eee002", "count":9, "aggregations":[], "_type":"..."},
            {"key":"9f110e48", "count":5, "aggregations":[], "_type":"..."},
            {"key":"b25dfeb3", "count":1, "aggregations":[], "_type":"..."}
          ]
        }
      ]
    }
    ```

    上記例 `account_id_count` は、タスクのフィールド `account_id` でタスクを分類したところ「`account_id` が `c5eee002` であるタスクが9件、`9f110e48` であるタスクが5件、`b25dfeb3` であるタスクが1件」だったという結果を表しています。
    また、AggregationResultの集約の件数は、合計で10000件以下に制限されており、それを超える件数がある場合は上位10000件が取得されます。もし、省略された部分を取得したい場合は、検索条件を縛って結果に上る集約の数を減らしてください。

  version: 0.204.1
  title: Annofab Web API
  x-logo:
    url: "https://annofab.com/resource/images/logo_landscape.png"
    href: "https://annofab.com/"
  contact:
    url: "https://annofab.com/docs/forms/trouble-shooting.html"
servers:
- url: https://annofab.com/api/v1
tags:
- name: af-annotation
  x-displayName: Annotation
  description: アノテーションに対する操作
- name: af-annotation-specs
  x-displayName: Annotation Specs
  description: アノテーション仕様に対する操作
- name: af-comment
  x-displayName: Comment
  description: コメントに対する操作
- name: af-input
  x-displayName: Input
  description: |
    入力データに対する操作

    入力データは、Annofabにファイルをアップロードして利用します。
    プライベートストレージにあるファイルを補助情報として利用することも可能です（ただし[問い合わせ](https://annofab.com/docs/forms/contact-sales.html)が必要です）。

- name: af-inspection
  x-displayName: Inspection
  description: 検査コメントに対する操作
- name: af-instruction
  x-displayName: Instruction
  description: 作業ガイドに対する操作
- name: af-job
  x-displayName: Job
  description: バッチ処理ジョブに対する操作
- name: af-login
  x-displayName: Login
  description: ログイン関連の操作
- name: af-my
  x-displayName: My
  description: 自身のリソースに対する操作
- name: af-organization
  x-displayName: Organization
  description: 組織に対する操作
- name: af-organization-idp
  x-displayName: Organization IdP
  description: |
    組織で使用するIDプロバイダーに対する操作

    **このAPIは Annofab に許可された組織だけで使用できます。また、予告なく変更されることがあります。**
- name: af-organization-member
  x-displayName: Organization Member
  description: 組織メンバーに対する操作
- name: af-organization-plugin
  x-displayName: Organization Plugin
  description: |
    組織で使用するプラグインに対する操作

    **このAPIは Annofab に許可された組織だけで使用できます。またアルファ版につき、予告なく変更されることがあります。**
- name: af-usage-status
  x-displayName: Organization Usage Status
  description: 利用状況に対する操作
- name: af-project
  x-displayName: Project
  description: プロジェクトに対する操作
- name: af-project-member
  x-displayName: Project Member
  description: プロジェクトメンバーに対する操作
- name: af-project-extra-data
  x-displayName: Project Extra Data
  description: プロジェクトの追加データに対する操作
- name: af-statistics
  x-displayName: Statistics
  description: 統計に関する操作
- name: af-supplementary
  x-displayName: Supplementary
  description: |
    補助情報に対する操作です。

    補助情報とは、アノテーションする対象となる[入力データ](#tag/af-input)では*ありません*が、
    アノテーションするときに何らかの手がかりや文脈を与えるデータのことです。
    例えば、次のようなものです。
    * 現在の写真に対する、過去の写真
    * 光学写真に対する、暗視写真
    * 前方を撮影した写真に対する、左側面・右側面・後方の写真
    * 写真や動画を撮影した日時、緯度経度、撮影者などのメタデータ（テキスト）

    補助情報は入力データに紐付けられています。

    補助情報は、Annofabにファイルをアップロードして利用します。
    プライベートストレージにあるファイルを補助情報として利用することも可能です（ただし[問い合わせ](https://annofab.com/docs/forms/contact-sales.html)が必要です）。


- name: af-task
  x-displayName: Task
  description: タスクに対する操作
- name: af-webhook
  x-displayName: Webhook
  description: Webhookに対する操作
- name: x-annotation-zip
  x-displayName: Annotation ZIP
  description: |
    Annofabで作成したアノテーションは、元となった入力データ（画像や動画など）に対応する形で1ファイルのJSONとなります。
    これらのJSONはZIP形式で圧縮され、一括で取得できます。

    アノテーションZIPには、SimpleアノテーションとFullアノテーションの2種類があります。ただし、Fullアノテーションは非推奨です。

    ## Simple Annotation ZIP
    [getAnnotationArchive](#operation/getAnnotationArchive) APIで取得できます。

    ### ZIPファイル内の構造

    ```
    SimpleアノテーションZIP/
    ├── {タスクID}/
    │   ├── {入力データID}.json              アノテーションのデータ
    │   ├── {入力データID}/
    │   │   ├── {アノテーションデータID}    塗りつぶしのPNG画像
    ```

    ### アノテーションJSONデータの構造
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/SimpleAnnotation" />

    ## Full Annotation ZIP
    Fullアノテーションに含まれるアノテーションJSONは、画像やアノテーションやアノテーション作成者など管理用の詳細情報が付随しています。
    [getArchiveFullWithProId](#operation/getArchiveFullWithProId) APIで取得できます。

    **Fullアノテーションは非推奨です。**

    ### ZIPファイル内の構造
    ```
    FullアノテーションZIP/
    ├── {タスクID}/
    │   ├── {入力データID}.json              アノテーションのデータ
    │   ├── {入力データID}/
    │   │   ├── {アノテーションデータID}    塗りつぶしのPNG画像
    ```

    ### アノテーションJSONデータの構造
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/FullAnnotation" />

- name: x-data-types
  x-displayName: Data Types
  description: |
    # Task
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/Task" />

    # TaskHistory
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/TaskHistory" />

    # TaskHistoryEvent
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/TaskHistoryEvent" />

    # Inspection
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/Inspection" />

    # InputDataType
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/InputDataType" />

    # Comment
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/Comment" />

    # TaskStatus
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/TaskStatus" />

    # TaskPhase
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/TaskPhase" />

    # AnnotationId
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/AnnotationId" />

    # InputData
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/InputData" />

    # ProjectJobType
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/ProjectJobType" />

    # OrganizationJobType
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/OrganizationJobType" />

    # GraphType
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/GraphType" />

    # AnnotationQuery
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/AnnotationQuery" />

    # ArrayOfLabelStatistics

    アノテーションラベルごとに以下の項目を集計したデータです。
    * 受入が完了したアノテーション数
    * 受入が完了していないアノテーション数

    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/ArrayOfLabelStatistics" />

    # AnnotationType
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/AnnotationType" />

    # UserDefinedAnnotationTypeDefinition
    <SchemaDefinition schemaRef="swagger-api-components.yaml#/components/schemas/UserDefinedAnnotationTypeDefinition" />

x-tagGroups:
  - name: API
    tags:
      - af-annotation
      - af-annotation-specs
      - af-comment
      - af-input
      - af-inspection
      - af-instruction
      - af-job
      - af-login
      - af-my
      - af-organization
      - af-organization-idp
      - af-organization-member
      - af-organization-plugin
      - af-usage-status
      - af-project
      - af-project-member
      - af-project-extra-data
      - af-statistics
      - af-supplementary
      - af-task
      - af-webhook
  - name: Appendix
    tags:
      - x-annotation-zip
      - x-data-types
components:
  securitySchemes:
    AnnofabUser:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/AnnofabUser"
    AnnofabAdminOnly:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/AnnofabAdminOnly"
    AllProjectMember:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/AllProjectMember"
    ProjectAccepter:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/ProjectAccepter"
    ProjectDataUser:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/ProjectDataUser"
    ProjectAccepterOrDataUser:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/ProjectAccepterOrDataUser"
    ProjectOwner:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/ProjectOwner"
    AllOrganizationMember:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/AllOrganizationMember"
    OrganizationAdministrator:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/OrganizationAdministrator"
    OrganizationOwner:
      $ref: "swagger-api-components.yaml#/components/securitySchemes/OrganizationOwner"
paths:
  /login:
    post:
      tags:
      - af-login
      summary: ログイン
      description: |
        ログインして、APIの認証に必要なトークンを取得します。

        なりすましなどの悪用を防ぐため、トークンは他人に教えたり外部に公開しないでください。
      operationId: login
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/LoginRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/LoginResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /logout:
    post:
      tags:
      - af-login
      summary: ログアウト
      description: ログアウトします。
      operationId: logout
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/Token"
      responses:
        "200":
          $ref: "swagger-api-components.yaml#/components/responses/SuccessMessage"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /login-respond-to-auth-challenge:
    post:
      tags:
        - af-login
      summary: MFAコードによるログイン
      description: MFAコードによるログインを行います。
      operationId: loginRespondToAuthChallenge
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/LoginRespondToAuthChallengeRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/LoginSucceedResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /refresh-token:
    post:
      tags:
      - af-login
      summary: トークンの再発行
      description: |
        トークンを再発行します。
        IDトークンやアクセストークンの有効期限が切れた場合に使います。

        リフレッシュトークンの有効期限が切れた場合は、本APIでは再発行できません。代わりに、[login API](#operation/login)を実行してください。
      operationId: refreshToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/RefreshTokenRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Token"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorRefreshTokenExpired"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /plugin-token:
    post:
      tags:
        - af-login
      summary: プラグイン用トークン発行
      description: |
        プラグイン用のトークンを発行します。
        ここで発行されるアクセストークンは、プラグインの種別に応じた範囲のAPIアクセスに使用することができます。

        現時点ではカスタムアノテーションエディタ用のプラグインのみに対応しています。

        #### authorization_code を使う場合 (PluginTokenRequestAuthorizationCode)
        1. プラグイン: PKCE (RFC 7636) の code_challenge_method=S256 の場合に準ずる形で `code_verifier` `code_challenge`  を生成
        1. プラグイン: `https://annofab.com/project/{project_id}/authorize-plugin?plugin_type={plugin_type}&code_challenge={code_challenge}` へリダイレクト
          - `plugin_type` はカスタムアノテーションエディタの場合は `AnnotationEditor` を、カスタムアノテーション仕様の場合は `AnnotationSpecs` を指定
        1. Annofab: リクエストやユーザー権限の確認後、プラグインの auth_redirect_url に設定されたURLへクエリパラメータ `code` つきでリダイレクト
        1. プラグイン: 本APIに上記 code および1で生成した code_verifier を渡し、access_token と refresh_token を得る

        code付きでカスタムエディタにリダイレクトする際のURLは、タスク一覧等からのリダイレクトに使うURLとは別に設定し、projectIdやtaskIdは含まれません。
        Annofabへリダイレクトする前に `location.href` などを保存しておき、トークン取得後にURL書き換えやリダイレクトを行うことを推奨します。

        この手順で取得したaccess_tokenを使って他のAPIをリクエストする際には `Authorization: Bearer <access_token>` としてBearer付きでアクセスしてください。

        #### refresh_token を使う場合 (PluginTokenRequestRefreshToken)
        1. プラグイン: 前回のトークン発行時に access_token と共に発行される refresh_token を記憶しておく
        1. プラグイン: 本APIに上記 refresh_token を渡し、 access_token と refresh_token を得る
      operationId: requestPluginToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PluginTokenRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/PluginTokenResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /issue-project-token:
    post:
      tags:
        - af-login
      summary: プロジェクトトークン発行
      description: |
        プロジェクトゲストトークン発行の前段となるプロジェクトトークンを発行します。
        ここで発行されるトークンは、[issueProjectGuestUserToken](#operation/issueProjectGuestUserToken)で利用します。
      security:
        - ProjectOwner: []
      operationId: issueProjectToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/IssueProjectTokenRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectToken"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /list-project-token:
    post:
      tags:
        - af-login
      summary: プロジェクトトークン一覧の取得
      description: |
        [issueProjectToken](#operation/issueProjectToken)で発行されたトークン列を取得します。
      security:
        - ProjectOwner: []
      operationId: listProjectToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              title: "listProjectTokenRequest"
              type: object
              required:
                - project_id
              properties:
                project_id:
                  type: string
                  description: 一覧を取得する対象プロジェクト
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/ProjectToken"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /revoke-project-token:
    post:
      tags:
        - af-login
      summary: プロジェクトトークン無効化
      description: |
        発行済のプロジェクトトークンを無効化します。
      security:
        - ProjectOwner: []
      operationId: revokeProjectToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/RevokeProjectTokenRequest"
      responses:
        "200":
          description: 正常時、無効化したトークンの情報を返す
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectToken"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /issue-project-guest-token:
    post:
      tags:
        - af-login
      summary: プロジェクトゲストユーザートークン発行
      description: |
        プロジェクトゲスト用のトークンを発行します。
        このAPIが返すトークンを利用することで、Annofabにユーザー登録を行わず、対象のプロジェクトの一部操作が可能となります。
      operationId: issueProjectGuestUserToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/IssueProjectGuestUserTokenRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectGuestUserTokenResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/account:
    get:
      tags:
      - af-my
      summary: 自分のアカウント取得
      description: |
        自分のアカウント情報を取得します。
      security:
      - AnnofabUser: []
      operationId: getMyAccount
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/MyAccount"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-my
      summary: 自分のアカウント情報更新
      description: |
        自分のアカウント情報を更新します。
      security:
      - AnnofabUser: []
      operationId: putMyAccount
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutMyAccountRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/MyAccount"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/project-members:
    get:
      tags:
      - af-my
      summary: 自分のプロジェクトメンバー情報一括取得
      description: |
        自分が所属するプロジェクトのメンバー情報を一括で取得します。
      security:
      - AnnofabUser: []
      operationId: getMyProjectMembers
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/ProjectMember"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
  /my/messages:
    get:
      tags:
        - af-my
      summary: 自分に届いている通知メッセージの一括取得
      description: |
        自分に届いている通知メッセージを、メッセージの作成日時が新しい順で、一括取得します。
        自身に届いている通知メッセージが上限(10000件)を超える場合、上限を超えた分の通知メッセージは取得できません。
        また、上限を超える場合、開封済みの通知メッセージの数は、取得可能な通知メッセージ中の集計値となります。詳細はレスポンスの項目を参照ください。
      security:
        - AnnofabUser: []
      operationId: getMyNotificationMessages
      parameters:
        - name: page
          in: query
          description: |
            表示するページ番号
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
        - name: limit
          in: query
          description: |
            1ページあたりの取得するデータ件数
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 20
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/MyNotificationList"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/unread-messages-count:
    get:
      tags:
        - af-my
      summary: 自分に届いている通知メッセージの未読件数を取得
      description: |
        自分に届いている通知メッセージの未読件数を取得します。
      security:
        - AnnofabUser: []
      operationId: getMyNotificationUnreadMessagesCount
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/MyNotificationUnreadMessagesCount"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/messages/{message_id}:
    get:
      tags:
        - af-my
      summary: 自分に届いているメッセージの取得
      description: |
        自分に届いているメッセージを取得します。
      security:
        - AnnofabUser: []
      operationId: getMyNotificationMessage
      parameters:
        - name: message_id
          in: path
          description: |
            通知メッセージID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/NotificationMessageId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/MyNotificationMessage"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/messages/{message_id}/opened:
    put:
      tags:
        - af-my
      summary: 通知メッセージのステータス更新
      description: |
        通知メッセージのステータスを更新します。
        自分に届いた通知メッセージのみ更新できます。
      security:
        - AnnofabUser: []
      operationId: putMyNotificationMessageOpened
      parameters:
        - name: message_id
          in: path
          description: |
            通知メッセージID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/NotificationMessageId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutMyNotificationMessageOpenedRequest"
      responses:
        "200":
          description: 正常
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/personal-access-tokens:
    get:
      tags:
        - af-my
      summary: パーソナルアクセストークン一覧を取得
      description: |
        自分が発行したパーソナルアクセストークンの一覧を取得します。
      security:
        - AnnofabUser: []
      operationId: getPersonalAccessTokens
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/PersonalAccessTokenInfo"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/issue-personal-access-token:
    post:
      tags:
        - af-my
      summary: パーソナルアクセストークンの発行
      description: |
        パーソナルアクセストークンを発行します。
      security:
        - AnnofabUser: []
      operationId: issuePersonalAccessToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/IssuePersonalAccessTokenRequest"
      responses:
        "200":
          description: 正常時、発行したトークンの情報を返す
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/PersonalAccessToken"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/revoke-personal-access-token:
    post:
      tags:
        - af-my
      summary: パーソナルアクセストークンの無効化
      description: |
        発行済のパーソナルアクセストークンを無効化します。
      security:
        - AnnofabUser: []
      operationId: revokePersonalAccessToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/RevokePersonalAccessTokenRequest"
      responses:
        "200":
          description: 正常時、無効化したトークンの情報を返す
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/PersonalAccessTokenInfo"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations:
    post:
      tags:
        - af-organization
      summary: 組織の作成
      description: |
        組織を作成します。

        既に存在する組織名をリクエストボディに指定すると、400エラーが発生します。
      security:
        - AnnofabUser: []
      operationId: createNewOrganization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/OrganizationRegistrationRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Organization"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/organizations:
    get:
      tags:
      - af-my
      summary: 所属組織の一括取得
      description: |
        自分が所属している組織を一括で取得します。
      security:
      - AllOrganizationMember: []
      operationId: getMyOrganizations
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/MyOrganizationList"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}:
    get:
      tags:
      - af-organization
      summary: 組織の取得
      description: |
        組織を取得します。
      security:
      - AllOrganizationMember: []
      operationId: getOrganization
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Organization"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
        - af-organization
      summary: 組織の更新
      description: |
        組織を更新します。
      security:
        - OrganizationAdministrator: []
      operationId: putOrganization
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutOrganizationRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Organization"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 先に更新されているため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorAlreadyUpdated"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      tags:
        - af-organization
      summary: 組織の削除
      description: |
        組織を完全に削除します。

        組織内のプロジェクトが1件も存在しない場合のみ削除できます。
        組織を削除したい場合は全てのプロジェクトを削除してください。


        **削除された組織は元に戻せません。ご注意ください。**
      security:
        - OrganizationOwner: []
      operationId: deleteOrganization
      parameters:
        - name: organization_name
          in: path
          description: 組織名
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Organization"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: プロジェクトが存在する組織を削除しようとした
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/projects:
    get:
      tags:
      - af-organization
      summary: 組織配下プロジェクトの一括取得
      description: |
        指定した組織のプロジェクトを一括で取得します。

        APIにアクセスしたユーザー（`Authorization`ヘッダーに格納されているIDトークンを発行したユーザー）の組織内ロールによって取得するプロジェクトが変化します
        * `組織オーナー` - 組織配下のプロジェクトすべて取得可能
        * `組織管理者` - 組織配下のプロジェクトすべて取得可能
        * `組織貢献者` - 組織配下のプロジェクトのうちアクセスしたユーザーが所属しているプロジェクトのみ取得可能
      security:
      - AllOrganizationMember: []
      operationId: getProjectsOfOrganization
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
      - name: page
        in: query
        description: |
          表示するページ番号
        required: false
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: limit
        in: query
        description: |
          1ページあたりの取得するデータ件数
        required: false
        schema:
          type: integer
          minimum: 0
          default: 30
          maximum: 200
      - name: account_id
        in: query
        description: |
          指定したアカウントIDをメンバーに持つプロジェクトで絞り込む。

          APIにアクセスしたユーザー（`Authorization`ヘッダーに格納されているIDトークンを発行したユーザー）の組織内ロールが`組織貢献者`の場合、**アクセスしたユーザーと指定したアカウントIDのユーザーがどちらも所属しているプロジェクトのみ**が取得されます。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/AccountId"
      - name: except_account_id
        in: query
        description: |
          指定したアカウントIDをメンバーに持たないプロジェクトで絞り込む。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/AccountId"
      - name: title
        in: query
        description: |
          プロジェクトタイトルでの部分一致検索。大文字小文字は区別しません。
        required: false
        schema:
          type: string
          minLength: 1
      - name: status
        in: query
        description: |
          指定した状態のプロジェクトで絞り込む。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectStatus"
      - name: plugin_id
        in: query
        description: |
          指定したプラグインIDを使用しているプロジェクトで絞り込む。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/PluginId"
      - name: input_data_type
        in: query
        description: |
          入力データの種類でプロジェクトを絞り込みます。[詳細はこちら](#section/InputDataType)を参照してください。
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataType"
      - name: sort_by
        in: query
        description: |
          `date` を指定することでプロジェクトの最新のタスク更新時間の順にソートして出力する。
          未指定時はプロジェクト名でソートする。
        required: false
        schema:
          type: string
          example: date
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectList"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/members:
    get:
      tags:
      - af-organization-member
      summary: 組織メンバー一括取得
      description: |
        組織メンバーを一括で取得します。

        ただし、組織から脱退したメンバーは取得できません。

      security:
      - AllOrganizationMember: []
      operationId: getOrganizationMembers
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationMemberList"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/members/{user_id}:
    get:
      tags:
      - af-organization-member
      summary: 組織メンバー取得
      description: |
        組織メンバーを取得します。
      security:
      - AllOrganizationMember: []
      operationId: getOrganizationMember
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          type: string
      - name: user_id
        in: path
        description: ユーザーID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/UserId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationMember"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      tags:
      - af-organization-member
      summary: 組織メンバーの削除
      description: |
        組織メンバーを削除します。削除された組織メンバーの`status`は`inactive`になります。
      security:
      - OrganizationAdministrator: []
      operationId: deleteOrganizationMember
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          type: string
      - name: user_id
        in: path
        description: ユーザーID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/UserId"
      responses:
        "200":
          description: 正常。削除したメンバーを返します
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationMember"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/members/{user_id}/role:
    put:
      tags:
      - af-organization-member
      summary: 組織メンバーのロール更新
      description: |
        組織メンバーのロールを変更します。
      security:
      - OrganizationOwner: []
      operationId: updateOrganizationMemberRole
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          type: string
      - name: user_id
        in: path
        description: ユーザーID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/UserId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutOrganizationMemberRoleRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationMember"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/members/{user_id}/invitation:
    post:
      tags:
      - af-organization-member
      summary: ユーザーを組織に招待
      description: |
        指定したユーザーを組織に招待します。招待されたユーザーにはメールが届きます。メールに記載されたURLにアクセスすることで組織に参加することができます。
      security:
      - OrganizationAdministrator: []
      operationId: inviteOrganizationMember
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          type: string
      - name: user_id
        in: path
        description: ユーザーID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/UserId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/InviteOrganizationMemberRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationMember"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/members/{user_id}/invitation/accept:
    post:
      tags:
      - af-organization-member
      summary: 組織への招待の受諾
      description: |
        組織への招待を受諾し、組織へのメンバー登録を完了します。

      operationId: acceptOrganizationInvitation
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          type: string
      - name: user_id
        in: path
        description: ユーザーID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/UserId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/AcceptOrganizationInvitationRequest"
      responses:
        "200":
          $ref: "swagger-api-components.yaml#/components/responses/SuccessMessage"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/activity:
    get:
      tags:
      - af-organization
      summary: 組織の活動状況の取得
      description: |
        Annofabストレージの使用量など、組織の活動状況を取得します。
      security:
      - AllOrganizationMember: []
      operationId: getOrganizationActivity
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationActivity"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/plugins:
    get:
      operationId: getOrganizationPlugins
      summary: プラグインの一括取得
      description: |
        プラグインを一括で取得します。

        **この API は Annofab に許可された組織だけで使用できます。またアルファ版につき、予告なく変更されることがあります。**
      tags:
        - af-organization-plugin
      security:
        - AllOrganizationMember: []
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationPluginList"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/plugins/{plugin_id}:
    get:
      operationId: getOrganizationPlugin
      summary: プラグインの取得
      description: |
        プラグインを取得します。

        **この API は Annofab に許可された組織だけで使用できます。またアルファ版につき、予告なく変更されることがあります。**
      tags:
        - af-organization-plugin
      security:
        - AllOrganizationMember: []
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: plugin_id
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/PluginId"
          description: プラグインID
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationPlugin"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      operationId: putOrganizationPlugin
      summary: プラグインの作成/更新
      description: |
        プラグインを作成または更新します。

        **この API は Annofab に許可された組織だけで使用できます。またアルファ版につき、予告なく変更されることがあります。**
      tags:
        - af-organization-plugin
      security:
        - OrganizationAdministrator: []
        - OrganizationOwner: []
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: plugin_id
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/PluginId"
          description: プラグインID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutOrganizationPluginRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationPlugin"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      operationId: deleteOrganizationPlugin
      summary: プラグインの削除
      description: |
        プラグインを削除します。

        **この API は Annofab に許可された組織だけで使用できます。またアルファ版につき、予告なく変更されることがあります。**
      tags:
        - af-organization-plugin
      security:
        - OrganizationAdministrator: []
        - OrganizationOwner: []
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: plugin_id
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/PluginId"
          description: プラグインID
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationPlugin"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/usage-status:
    get:
      tags:
        - af-usage-status
      summary: 利用状況の一覧を取得
      description: 利用状況の一覧を取得します。
      security:
        - OrganizationAdministrator: []
      operationId: getOrganizationUsageStatusList
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: from
          in: query
          description: 指定した年月以降の利用状況を取得します。省略した場合はtoで指定した年月の1年前です。年月のフォーマットは YYYY-MM です。指定年月は閉区間となります。
          required: false
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/YearMonth"
        - name: to
          in: query
          description: 指定した年月以前の利用状況を取得します。省略した場合はJSTでの現在の年月です。年月のフォーマットは YYYY-MM です。指定年月は閉区間となります。
          required: false
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/YearMonth"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/UsageStatus"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/usage-status/{year_month}:
    get:
      tags:
        - af-usage-status
      summary: 利用状況を取得
      description: 指定した月の利用状況を取得します。
      security:
        - OrganizationAdministrator: []
      operationId: getOrganizationUsageStatus
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: year_month
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/YearMonth"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/UsageStatusByDay"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/usage-status-detail/{year_month}:
    get:
      tags:
        - af-usage-status
      summary: 利用状況の詳細情報を取得
      description: 指定した月の利用状況の詳細情報を取得します。
      security:
        - OrganizationAdministrator: []
      operationId: getOrganizationUsageStatusDetail
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: year_month
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/YearMonth"
      responses:
        "201":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/UsageStatusCsvFileUrl"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/projects:
    get:
      tags:
      - af-my
      summary: 所属プロジェクトの一括取得
      description: |
        自分が所属しているプロジェクトを一括で取得します。
      security:
      - AnnofabUser: []
      operationId: getMyProjects
      parameters:
      - name: page
        in: query
        description: |
          表示するページ番号
        required: false
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: limit
        in: query
        description: |
          1ページあたりの取得するデータ件数
        required: false
        schema:
          type: integer
          minimum: 0
          default: 30
          maximum: 200
      - name: organization_id
        in: query
        description: |
          指定した組織に属するプロジェクトに絞り込む。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/OrganizationId"
      - name: title
        in: query
        description: |
          プロジェクトタイトルでの部分一致検索。大文字小文字は区別しません。
        required: false
        schema:
          type: string
          minLength: 1
      - name: status
        in: query
        description: |
          指定した状態のプロジェクトで絞り込む。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectStatus"
      - name: input_data_type
        in: query
        description: |
          入力データの種類でプロジェクトを絞り込みます。[詳細はこちら](#section/InputDataType)を参照してください。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataType"
      - name: sort_by
        in: query
        description: |
          `date` を指定することでプロジェクトの最新のタスク更新時間の順にソートして出力する。
          未指定時はプロジェクト名でソートする。
        required: false
        schema:
          type: string
          example: date
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectList"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}:
    get:
      tags:
      - af-project
      summary: プロジェクト取得
      description: |
        プロジェクトを取得します。
      security:
      - AllProjectMember: []
      operationId: getProject
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Project"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-project
      summary: プロジェクト作成/更新
      description: |
        プロジェクトを新規作成または更新します。

        ### 新規作成する場合
        ユーザーは、作成するプロジェクトをひもづける組織の [OrganizationAdministrator](#section/Authentication/OrganizationAdministrator) である必要があります。

        ### 更新する場合
        ユーザーは、更新するプロジェクトの [ProjectOwner](#section/Authentication/ProjectOwner) である必要があります。
        また所属組織を変更する場合は、新しくひもづける組織の [OrganizationAdministrator](#section/Authentication/OrganizationAdministrator) である必要があります。

        なお、プロジェクト状態を「停止中」にした場合、アノテーションZIPやタスク進捗状況などの集計情報は自動更新されなくなります。

        所属組織が変更された場合バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`move-project`）。

        APIの制限事項は、以下の通りです。
         * `status`を`initializing`に変更できません。
         * `status`が`initializing`のときは、所属組織を変更できません。

      security:
      - OrganizationAdministrator: []
        ProjectOwner: []
      operationId: putProject
      parameters:
      - name: project_id
        in: path
        description: |
          プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID)
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: v
        in: query
        description: |
          **所属組織を変更したとき**のレスポンスのフォーマットバージョンを指定します。
          - "1"：ステータスコードは200で、スキーマは`Project`
          - "2"：ステータスコードは202で、スキーマは`PutProjectResponse`。`PutProjectResponse`には、登録されたジョブが含まれます。
        required: false
        schema:
          type: string
          enum:
            - "1"
            - "2"
          default: "1"
          example: "2"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutProjectRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Project"
        "202":
          description: クエリパラメータに`v=2`を指定して、所属組織変更を実施した場合
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/PutProjectResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 現在のプロジェクトやタスクの状態ではできない操作をしようとした、またはジョブの同時実行制限による失敗（所属組織を変更した場合）
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      tags:
      - af-project
      summary: プロジェクト削除
      description: |
        プロジェクトを完全に削除します。
        アノテーション仕様、タスク、入力データ、アノテーションなど、プロジェクト配下のリソースがすべて削除されます。

        **削除されたプロジェクトは元に戻せません。**
        完了したプロジェクトは削除せず、プロジェクトの状態を「停止中」に変更するのを推奨します。

        本APIを実行すると、バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`delete-project`）。

      security:
      - ProjectOwner: []
      operationId: deleteProject
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "202":
          description: バッチにてプロジェクトの削除開始
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/DeleteProjectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 停止中ではないプロジェクトを削除しようとした、またはジョブの同時実行制限による失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/organization:
    get:
      tags:
      - af-project
      summary: プロジェクトの所属組織取得
      description: |
        プロジェクトが所属する組織を取得します。
      security:
      - AllProjectMember: []
      operationId: getOrganizationOfProject
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Organization"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/copy:
    post:
      tags:
      - af-project
      summary: プロジェクトのコピー
      description: |
        プロジェクトをコピーします。

        以下のデータがコピーされます。
        * プロジェクト設定
        * プロジェクトメンバー
        * アノテーション仕様

        オプションを指定することで、以下のデータもコピーできます。

        |コピー対象のデータ|同時にコピーする必要があるデータ|
        |:--|:--|
        |入力データ||
        |タスク|入力データ|
        |アノテーション|入力データ、タスク|
        |補助情報|入力データ|
        |作業ガイド||
        |Webhook||

        このAPIを利用するには、以下のロールが必要です。
        * コピー元プロジェクトのプロジェクトオーナーロール
        * コピー元プロジェクトが所属している組織の組織管理者または組織オーナーロール

        本APIを実行すると、バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`copy-project`）。
      security:
      - OrganizationAdministrator: []
        ProjectOwner: []
      operationId: initiateProjectCopy
      parameters:
      - name: project_id
        in: path
        description: コピー元となるプロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/ProjectCopyRequest"
      responses:
        "202":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectCopyResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: ジョブの同時実行制限による失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/rawdata/inputs:
    get:
      tags:
        - af-project
      summary: 入力データ情報全件ファイルの取得
      description: |
        入力データ全件ファイルにアクセスするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効し、アクセスできなくなります。

        入力データ全件ファイルは、すべての入力データが記載されたJSONファイルです。SON構造は、[InputData](#section/InputData)の配列です。
        ただしInputData中のurlは常にnullです。

        毎日AM02:00(JST)頃に更新されます。
        [postProjectInputsUpdate](#operation/postProjectInputsUpdate) APIを利用すれば、手動で入力データ全件ファイルを更新できます。

      security:
        - ProjectDataUser: []
      operationId: getProjectInputsUrl
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    post:
      tags:
        - af-project
      summary: 入力データ全件ファイルの更新開始
      description: |
        入力データ全件ファイルの更新を開始します。
        ファイルの更新には、データ量に応じて数分～数十分程度かかります。

        本APIを実行すると、バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`gen-inputs-list`）。

        入力データ全件ファイルについては、[getProjectInputsUrl](#operation/getProjectInputsUrl) APIを参照ください。
      security:
        - ProjectDataUser: []
      operationId: postProjectInputsUpdate
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "202":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectInputsUpdateResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: ジョブの同時実行制限による失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/rawdata/tasks:
    get:
      tags:
      - af-project
      summary: タスク全件ファイルの取得
      description: |
        タスク全件ファイルにアクセスするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効し、アクセスできなくなります。

        タスク全件ファイルは、すべてのタスクが記載されたJSONファイルです。JSON構造は、[Task](#section/Task)の配列です。

        毎日AM02:00(JST)頃に更新されます。
        [postProjectTasksUpdate](#operation/postProjectTasksUpdate) APIを利用すれば、手動でタスク全件ファイルを更新できます。

      security:
      - ProjectDataUser: []
      operationId: getProjectTasksUrl
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    post:
      tags:
      - af-project
      summary: タスク全件ファイルの更新開始
      description: |
        タスク全件ファイルの更新を開始します。
        ファイルの更新には、データ量に応じて数分～数十分程度かかります。

        本APIを実行すると、バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`gen-tasks-list`）。

        タスク全件ファイルについては、[getProjectTasksUrl](#operation/getProjectTasksUrl) APIを参照ください。
      security:
        - ProjectDataUser: []
      operationId: postProjectTasksUpdate
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "202":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/PostProjectTasksUpdateResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: ジョブの同時実行制限による失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/rawdata/inspections:
    get:
      deprecated: true
      tags:
      - af-project
      summary: 検査コメント全件ファイルの取得
      description: |
        検査コメント全件ファイルにアクセスするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効し、アクセスできなくなります。

        検査コメント全件ファイルには、すべての検査コメントが記載されたファイルです。
        JSON構造は、[Inspection](#section/Inspection)の配列です。

        毎日AM02:00(JST)頃に更新されます。
      security:
      - ProjectDataUser: []
      operationId: getProjectInspectionsUrl
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/rawdata/comments:
    get:
      tags:
        - af-project
      summary: コメント全件ファイルの取得
      description: |
        コメント全件ファイルにアクセスするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効し、アクセスできなくなります。

        コメント全件ファイルは、すべてのコメントが記載されたJSONファイルです。
        JSON構造は、[Comment](#section/Comment)の配列です。

        毎日AM02:00(JST)頃に更新されます。
      security:
        - ProjectDataUser: []
      operationId: getProjectCommentsUrl
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/rawdata/task_history_events:
    get:
      deprecated: true
      tags:
      - af-project
      summary: プロジェクトのタスク履歴イベント全件ファイルの取得
      description: |
        タスク履歴イベント全件ファイルにアクセスするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効し、アクセスできなくなります。


        タスク履歴イベント全件ファイルは、すべてのタスク履歴イベント情報が記載されたJSONファイルです。
        JSON構造は、[TaskHistoryEvent](#section/TaskHistoryEvent)の配列です。

        毎日AM02:00(JST)頃に更新されます。
      security:
      - ProjectDataUser: []
      operationId: getProjectTaskHistoryEventsUrl
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/rawdata/task_histories:
    get:
      tags:
        - af-project
      summary: プロジェクトのタスク履歴全件ファイルの取得
      description: |
        タスク履歴全件ファイルにアクセスするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効し、アクセスできなくなります。


        タスク履歴イベント全件ファイルは、すべてのタスク履歴情報が記載されたJSONファイルです。JSON構造は、キーがタスクID、値が[TaskHistory](#section/TaskHistory)の配列となるマップです。

        毎日AM02:00(JST)頃に更新されます。
      security:
        - ProjectDataUser: []
      operationId: getProjectTaskHistoriesUrl
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /my/projects/{project_id}/member:
    get:
      tags:
      - af-my
      summary: 自分のプロジェクトメンバー取得
      description: |
        自分のプロジェクトメンバー情報を取得します。
      security:
      - AllProjectMember: []
      operationId: getMyMemberInProject
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectMember"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/members:
    get:
      tags:
      - af-project-member
      summary: プロジェクトメンバー一括取得
      description: |
        プロジェクトメンバを一括で取得します。
      security:
      - AllProjectMember: []
      operationId: getProjectMembers
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: include_inactive_member
        in: query
        description: 脱退したプロジェクトメンバーも取得する時に、キーのみ指定します（値は無視されます）。
        required: false
        allowEmptyValue: true
        schema:
          type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectMemberList"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/members/{user_id}:
    get:
      tags:
      - af-project-member
      summary: プロジェクトメンバー取得
      description: |
        プロジェクトメンバーを取得します。
      security:
      - AllProjectMember: []
      operationId: getProjectMember
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: user_id
        in: path
        description: ユーザーID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/UserId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectMember"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-project-member
      summary: プロジェクトメンバー追加/更新
      description: |
        プロジェクトにメンバーを新規に追加、または存在するメンバーの設定を変更します。
      security:
      - ProjectOwner: []
      operationId: putProjectMember
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: user_id
        in: path
        description: ユーザーID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/UserId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/ProjectMemberRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectMember"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/extra-data/{kind_id}:
    get:
      tags:
        - af-project-extra-data
      summary: プロジェクトの追加データ取得
      description: |
        プロジェクトの追加データを取得します。
      security:
        - AllProjectMember: []
      operationId: getProjectExtraData
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: kind_id
          in: path
          description: 追加データの種類ID
          required: true
          schema:
              $ref: "swagger-api-components.yaml#/components/schemas/ProjectExtraDataKindId"
        - name: user_scope
          in: query
          description: |
            ユーザスコープの値を取得するかどうか。
            trueの場合、ユーザスコープの値を取得します。
            未指定の場合、falseとして扱います。
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectExtraData"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
        - af-project-extra-data
      summary: プロジェクトの追加データ更新
      description: |
        プロジェクトの追加データを更新します。
      security:
        - AllProjectMember: []
      operationId: putProjectExtraData
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: kind_id
          in: path
          description: 追加データの種類ID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectExtraDataKindId"
        - name: user_scope
          in: query
          description: |
            ユーザに割りつく値を保存するかどうか。
            trueの場合、ユーザに割りつく値を保存します。
            未指定の場合、falseとして扱います。
          required: false
          schema:
            type: boolean
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutProjectExtraDataBody"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectExtraData"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/extra-data-kinds:
    get:
      tags:
        - af-project-extra-data
      summary: プロジェクトに紐づく追加データ種別取得
      description: |
        プロジェクトに保存され得る追加データ種別をすべて取得します。
      security:
        - AllProjectMember: []
      operationId: getProjectExtraDataKinds
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/ProjectExtraDataKind"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/dates:
    get:
      tags:
        - af-statistics
      summary: 統計情報の期間の取得
      description: |
        統計情報が存在する期間を取得します。

        たとえば、プロジェクトの状態が以下のように変化したとします。

        1. 2022/01/01にプロジェクトを作成した。
        2. 2022/02/01にプロジェクトの状態を停止中にした。
        3. 2022/03/01にプロジェクトの状態を進行中にした。
        4. 2022/04/01にプロジェクトの状態を停止中にした。

        このAPIを実行すると、以下のJSONが取得されます。

        ```
        [
          {"from":"2022-01-01", "to":"2022-02-01"},
          {"from":"2022-03-01", "to":"2022-04-01"}
        ]
        ```

        プロジェクトを停止中にすると統計情報は記録されないので、統計情報が存在する期間は複数になります。


      security:
        - AllProjectMember: []
      operationId: getStatisticsAvailableDates
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ArrayOfDateRanges"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/tasks/daily:
    get:
      tags:
      - af-statistics
      summary: フェーズ別タスク数の取得
      description: |
        タスクのフェーズごと、タスクのステータスごとのタスク数などを取得します。

        取得期間は最大3か月です。

      security:
      - AllProjectMember: []
      operationId: getTaskDailyStatistics
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: from
        in: query
        description: 取得する統計の区間の開始日 - `YYYY-MM-DD`
        required: true
        schema:
          type: string
      - name: to
        in: query
        description: 取得する統計の区間の終了日 - `YYYY-MM-DD` 。この日は含まれます。
        required: true
        schema:
          type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ArrayOfProjectTaskStatisticsHistory"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/accounts/daily:
    get:
      tags:
        - af-statistics
      summary: メンバー別作業時間の取得
      description: |
        プロジェクトメンバーごとの作業時間やタスクの提出回数を取得します。

        * 作業時間
        * 教師付フェーズのタスクを提出した回数、または検査/受入フェーズのタスクを合格/差戻にした回数
        * 教師付フェーズを担当して提出したタスクが差し戻された回数、または受入フェーズを担当して合格にしたタスクが受入完了状態を取り消された回数

        取得期間は最大3か月です。

      security:
        - AllProjectMember: [ ]
      operationId: getAccountDailyStatistics
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: from
          in: query
          description: 取得する統計の区間の開始日 - `YYYY-MM-DD`
          required: true
          schema:
            type: string
        - name: to
          in: query
          description: 取得する統計の区間の終了日 - `YYYY-MM-DD` 。この日は含まれます。
          required: true
          schema:
            type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ArrayOfProjectAccountStatistics"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/inspections/daily:
    get:
      tags:
      - af-statistics
      summary: ラベル別検査コメント数の取得
      description: |
        ラベルごとの検査コメント数を取得します。

        取得期間は最大3か月です。
      security:
      - AllProjectMember: [ ]
      operationId: getInspectionDailyStatistics
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: from
        in: query
        description: 取得する統計の区間の開始日 - `YYYY-MM-DD`
        required: true
        schema:
          type: string
      - name: to
        in: query
        description: 取得する統計の区間の終了日 - `YYYY-MM-DD` 。この日は含まれます。
        required: true
        schema:
          type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ArrayOfInspectionStatistics"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/task-phases/daily:
    get:
      tags:
      - af-statistics
      summary: フェーズ別作業時間の取得
      description: |
        フェーズごとの累積作業時間を取得します。

        取得期間は最大3か月です。
      security:
      - AllProjectMember: [ ]
      operationId: getPhaseDailyStatistics
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: from
        in: query
        description: 取得する統計の区間の開始日 - `YYYY-MM-DD`
        required: true
        schema:
          type: string
      - name: to
        in: query
        description: 取得する統計の区間の終了日 - `YYYY-MM-DD` 。この日は含まれます。
        required: true
        schema:
          type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ArrayOfTaskPhaseStatistics"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/labels:
    get:
      tags:
      - af-statistics
      summary: ラベル別アノテーション数の取得
      description: |
        [ラベル別アノテーション数集計データ](#section/ArrayOfLabelStatistics) を取得するための認証済み一時URLを取得します。
      security:
      - AllProjectMember: []
      operationId: getLabelStatistics
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/worktimes/daily:
    get:
      tags:
        - af-statistics
      summary: 単位あたり作業時間の取得
      description: |
        プロジェクトの単位あたり作業時間情報を取得します。

        以下の作業時間情報を取得できます。
        * タスク1個あたりの作業時間情報
        * 画像1枚あたりの作業時間情報（画像プロジェクトのみ）
        * 動画1分あたりの作業時間情報（動画プロジェクトのみ）

        取得期間は最大3か月です。
      security:
        - AllProjectMember: [ ]
      operationId: getWorktimeDailyStatistics
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: from
          in: query
          description: 取得する統計の区間の開始日 - `YYYY-MM-DD`
          required: true
          schema:
            type: string
        - name: to
          in: query
          description: 取得する統計の区間の終了日 - `YYYY-MM-DD` 。この日は含まれます。
          required: true
          schema:
            type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/WorktimeStatisticsByProject"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/worktimes-by-account/{account_id}/daily:
    get:
      tags:
        - af-statistics
      summary: メンバーの単位あたり作業時間の取得
      description: |
        プロジェクトメンバーの単位あたり作業時間情報を取得します。

        以下の作業時間情報を取得できます。
        * タスク1個あたりの作業時間情報
        * 画像1枚あたりの作業時間情報（画像プロジェクトのみ）
        * 動画1分あたりの作業時間情報（動画プロジェクトのみ）

        取得期間は最大3か月です。
      security:
        - AllProjectMember: [ ]
      operationId: getWorktimeDailyStatisticsByAccount
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: account_id
          in: path
          description: アカウントID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/AccountId"
        - name: from
          in: query
          description: 取得する統計の区間の開始日 - `YYYY-MM-DD`
          required: true
          schema:
            type: string
        - name: to
          in: query
          description: 取得する統計の区間の終了日 - `YYYY-MM-DD` 。この日は含まれます。
          required: true
          schema:
            type: string
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/WorktimeStatisticsByAccount"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/statistics/markers:
    get:
      tags:
      - af-statistics
      summary: 統計グラフマーカー一括取得
      description: |
        統計グラフマーカーをすべて取得します。
      security:
      - AllProjectMember: []
      operationId: getMarkers
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Markers"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-statistics
      summary: 統計グラフマーカー更新
      description: |
        統計グラフマーカーを更新します。
      security:
      - ProjectOwner: []
      operationId: putMarkers
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutMarkersRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Markers"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/jobs:
    get:
      tags:
      - af-job
      summary: 組織のバックグラウンドジョブ情報取得
      description: |
        組織のバックグラウンドジョブの情報を取得します。

        バックグラウンドジョブ情報は、完了(失敗含む)から14日経過後に自動で削除されます。
      security:
      - AllOrganizationMember: []
      operationId: getOrganizationJob
      parameters:
      - name: organization_name
        in: path
        description: 組織名
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
      - name: type
        in: query
        description: 取得するジョブの種別。[詳細はこちら](#section/OrganizationJobType)。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/OrganizationJobType"
      - name: limit
        in: query
        description: |
          1ページあたりの取得するデータ件数。
          未指定時は30件取得。
        required: false
        schema:
          type: integer
          minimum: 0
          maximum: 200
          default: 30
      - name: exclusive_start_created_datetime
        in: query
        description: 作成日時が、指定した日付より古いジョブを取得します。
        required: false
        schema:
          type: string
          format: date-time
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationJobInfoContainer"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/id-providers:
    get:
      operationId: getOrganizationIdpList
      summary: 組織のIDプロバイダー一覧取得
      description: |
        組織のIDプロバイダー一覧を取得します。
        2024/10現在、一つの組織が持つことのできるIDプロバイダーは1つのみです。

        **このAPIは Annofab に許可された組織だけで使用できます。また、予告なく変更されることがあります。**
      tags:
        - af-organization-idp
      security:
        - AllOrganizationMember: []
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/OrganizationOidcIdp"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /organizations/{organization_name}/id-providers/{id}:
    put:
      operationId: putOrganizationIdp
      summary: 組織のIDプロバイダーを作成・更新
      description: |
        組織のIDプロバイダーを作成または更新します。
        2024/10現在、一つの組織が持つことのできるIDプロバイダーは1つのみです。

        **このAPIは Annofab に許可された組織だけで使用できます。また、予告なく変更されることがあります。**
      tags:
        - af-organization-idp
      security:
        - OrganizationAdministrator: []
        - OrganizationOwner: []
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: id
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationIdpId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutOrganizationIdpBody"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationOidcIdp"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      operationId: deleteOrganizationIdp
      summary: 組織のIDプロバイダーを削除
      description: |
          組織のIDプロバイダーを削除します。

          **このAPIは Annofab に許可された組織だけで使用できます。また、予告なく変更されることがあります。**
      tags:
        - af-organization-idp
      security:
        - OrganizationAdministrator: []
        - OrganizationOwner: []
      parameters:
        - name: organization_name
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationName"
          description: 組織名
        - name: id
          in: path
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/OrganizationIdpId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/OrganizationOidcIdp"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/jobs:
    get:
      tags:
      - af-job
      summary: プロジェクトのバックグラウンドジョブ情報取得
      description: |
        プロジェクトのバックグラウンドジョブの情報を取得します。

        バックグラウンドジョブ情報は、完了(失敗含む)から14日経過後に自動で削除されます。
      security:
      - AllProjectMember: []
      operationId: getProjectJob
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: type
        in: query
        description: 取得するジョブの種別。[詳細はこちら](#section/ProjectJobType)。
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectJobType"
      - name: limit
        in: query
        description: |
          1ページあたりの取得するデータ件数。
          未指定時は30件取得。
        required: false
        schema:
          type: integer
          minimum: 0
          maximum: 200
          default: 30
      - name: exclusive_start_created_datetime
        in: query
        description: 作成日時が、指定した日付より古いジョブを取得します。
        required: false
        schema:
          type: string
          format: date-time
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectJobInfoContainer"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/jobs/{job_type}/{job_id}:
    delete:
      tags:
      - af-job
      summary: プロジェクトのバックグラウンドジョブ情報削除
      description: |
        プロジェクトのバックグラウンドジョブ情報を削除します。

        なお、バックグラウンドジョブ情報は、完了(失敗含む)から14日経過後に自動で削除されます。
      security:
      - ProjectOwner: []
      operationId: deleteProjectJob
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: job_type
        in: path
        description: このパラメータは互換性のために残されています。 この値は無視され、動作に影響を与えません。
        required: true
        schema:
          type: string
      - name: job_id
        in: path
        description: ジョブID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/JobId"
      responses:
        "200":
          description: 正常
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/webhooks:
    get:
      tags:
      - af-webhook
      summary: Webhookの一括取得
      description: |
        Webhookをすべて取得します。
      security:
      - ProjectOwner: []
      operationId: getWebhooks
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/Webhook"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/webhooks/{webhook_id}:
    put:
      tags:
      - af-webhook
      summary: Webhookの作成/更新
      description: |
        Webhookを新規作成/更新します。

        Webhookが送信するHTTPリクエストのボディには、以下のプレースホルダーを含めることができます。

        * `task-completed`
          * {{PROJECT_ID}} :  プロジェクトID
          * {{TASK_ID}}	: タスクID
          * {{PROJECT_TITLE}}	: プロジェクトタイトル
          * {{COMPLETE_DATETIME}}	: タスク受入完了日時
            * 例 : 2019-05-08T10:00:00.000+09:00
          * {{LAST_ACCOUNT}} : 最終作業者のアカウントID

        * `annotation-archive-updated`
          * {{PROJECT_ID}} :  プロジェクトID
          * {{PROJECT_TITLE}}	: プロジェクトタイトル
          * {{COMPLETE_DATETIME}}	: アノテーションZIP作成完了日時
            * 例 : 2019-05-08T10:00:00.000+09:00

        * `input-data-zip-registered`
          * {{PROJECT_ID}} :  プロジェクトID
          * {{PROJECT_TITLE}}	: プロジェクトタイトル
          * {{COMPLETE_DATETIME}}	: 入力データZIP登録完了日時
            * 例 : 2019-05-08T10:00:00.000+09:00
          * {{ZIP_NAME}} : ZIPファイル名
            * 例 : input_data.zip

        * `project-copy-completed`
          * {{PROJECT_ID}} :  プロジェクトID
          * {{DEST_PROJECT_ID}} :  コピー先プロジェクトID
          * {{DEST_PROJECT_TITLE}}	: コピー先プロジェクトタイトル
          * {{COMPLETE_DATETIME}}	: プロジェクトコピー完了日時
            * 例 : 2019-05-08T10:00:00.000+09:00

        Webhookが起動されると、ジョブ種別が`invoke-hook`のバックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます。
      security:
      - ProjectOwner: []
      operationId: putWebhook
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: webhook_id
        in: path
        description: |
          WebhookID。[値の制約についてはこちら。](#section/API-Convention/APIID)
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/WebhookId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutWebhookRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Webhook"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      tags:
      - af-webhook
      summary: Webhookの削除
      description: |
        Webhookを削除します。
      security:
      - ProjectOwner: []
      operationId: deleteWebhook
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: webhook_id
        in: path
        description: WebhookID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/WebhookId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Webhook"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/webhooks/{webhook_id}/test:
    post:
      tags:
        - af-webhook
      summary: Webhookのテスト実行
      description: |
        Webhookが実際にHTTPリクエストを送信します。

        Webhookが送信するHTTPリクエストのボディに含まれるプレースホルダーは、このAPIで指定されたプレースホルダーの値に置き換えられます。
      security:
        - ProjectOwner: []
      operationId: testWebhook
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: webhook_id
          in: path
          description: WebhookID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/WebhookId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/WebhookTestRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/WebhookTestResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/annotation-specs:
    get:
      tags:
      - af-annotation-specs
      summary: アノテーション仕様取得
      description: |
        アノテーション仕様を取得します。
      security:
      - AllProjectMember: []
      operationId: getAnnotationSpecs
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: history_id
        in: query
        description: |
          アノテーション仕様の履歴ID。過去のアノテーション仕様を取得する場合は、[getAnnotationSpecsHistories](#operation/getAnnotationSpecsHistories) APIで取得した `history_id` の値を指定してください。
          未指定時は最新のアノテーション仕様を取得します。
        required: false
        schema:
          type: string
          example: "1234567890"
      - name: v
        in: query
        description: |
          取得するアノテーション仕様のフォーマットバージョンを指定します。`v=1`及び`v=2`は将来廃止する予定なので、非推奨です。
        required: false
        schema:
          type: string
          enum:
            - "1"
            - "2"
            - "3"
          default: "1"
          example: "3"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/AnnotationSpecs"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-annotation-specs
      summary: アノテーション仕様更新
      description: |
        アノテーション仕様を更新します。
      security:
      - ProjectOwner: []
      operationId: putAnnotationSpecs
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: v
        in: query
        description: |
          レスポンスに含まれるアノテーション仕様のフォーマットバージョンを指定します。`v=1`及び`v=2`は将来廃止する予定なので、非推奨です。
        required: false
        schema:
          type: string
          enum:
            - "1"
            - "2"
            - "3"
          default: "2"
          example: "3"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/AnnotationSpecsRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/AnnotationSpecs"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/annotation-specs-histories:
    get:
      tags:
      - af-annotation-specs
      summary: アノテーション仕様履歴一括取得
      description: |
        アノテーション仕様のすべての更新履歴を取得します。
      security:
      - AllProjectMember: []
      operationId: getAnnotationSpecsHistories
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/AnnotationSpecsHistory"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks:
    get:
      tags:
      - af-task
      summary: タスクの一括取得
      description: |
        タスクを一括で取得します。

      security:
      - AllProjectMember: []
      operationId: getTasks
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: page
        in: query
        description: 検索結果のうち、取得したいページの番号(1始まり）
        required: false
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: limit
        in: query
        description: 1ページあたりの取得するデータ件数
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 200
          default: 30
      - name: task_id
        in: query
        description: タスクIDでの部分一致検索で使用。大文字小文字は区別しません
        required: false
        schema:
          type: string
          minLength: 1
          maxLength: 300
      - name: input_data_ids
        in: query
        description: 指定された入力データIDを使用しているタスクを絞り込みます。カンマ区切りで複数の入力データIDを指定可能です。大文字小文字は区別しません
        required: false
        schema:
          type: string
          minLength: 1
      - name: phase
        in: query
        description: 絞り込み条件となるフェーズ名
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskPhase"
      - name: phase_stage
        in: query
        description: 絞り込み条件となるステージ
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskPhaseStage"
      - name: status
        in: query
        description: 絞り込み条件となる状態名
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskStatus"
      - name: account_id
        in: query
        description: 絞り込み条件となる作業中のアカウントID
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/AccountId"
      - name: no_user
        in: query
        description: 未割り当てのタスクを絞り込む時に、キーのみ指定します（値は無視されます）。
        required: false
        allowEmptyValue: true
        schema:
          type: string
      - name: previous_account_id
        in: query
        description: そのタスクをこれまでに担当したことのあるユーザー（現在の担当者含む）のアカウントID
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/AccountId"
      - name: previous_phase
        in: query
        description: そのタスクがこれまでに遷移したことのあるフェーズ名（現在のフェーズ含む）
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskPhase"
      - name: previous_phase_stage
        in: query
        description: そのタスクがこれまでに遷移したことのあるステージ（現在のステージ含む）
        required: false
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskPhaseStage"
      - name: rejected_only
        in: query
        description: 差し戻されたタスクだけを絞り込む時に、キーのみ指定します（値は無視されます）。
        required: false
        allowEmptyValue: true
        schema:
          type: string
      - name: auto_accepted_only
        in: query
        description: 「抜取検査の対象外となり、自動受入されたタスク」だけを絞り込む時に、キーのみ指定します（値は無視されます）。
        required: false
        allowEmptyValue: true
        schema:
          type: string
      - name: metadata
        in: query
        example: priority:>=1 assignable:true
        description: |
          メタデータからタスクを検索できます。

          例えば、 `priority` (数値) や `assignable` (真偽値) といったメタデータを個々のタスクに登録していたとします。
          その場合、次のように検索できます。

          ```
          // priorityが5のタスクを検索
          priority:5

          // priorityが5以外のタスクを検索
          -priority:5

          // priorityが1より大きいタスクを検索
          priority:>1

          // priorityが1以上のタスクを検索
          priority:>=1

          // priorityが100未満のタスクを検索
          priority:<100

          // priorityが100以下のタスクを検索
          priority:<=100

          // priorityが1~100のタスクを検索 (複数の検索条件は半角スペースで区切ります)
          priority:>=1 priority:<=100

          // priorityが1以上、且つ、assignableがtrueのタスクを検索
          priority:>=1 assignable:true
          ```

          (注意) これらの例は、説明の都合上「URLエンコード」を施していません。実際には、URLエンコードを施してください。
        required: false
        schema:
          type: string
      - name: sort
        in: query
        description: |
          ソート順の指定。以下のキーを使用できます。
          * `task_id`
          * `updated_datetime`
          * `number_of_rejections`
          * `phase`
          * `phase_stage`
          * `account_id`
          * `metadata.{メタデータのキー}`


          * キーの先頭に`-`を付けると、降順でソートされます。
          * `,`でキーを区切ると、複数のキーでソートされます。先頭のキーから順に優先順位が割り振られます。

        required: false
        example: metadata.priority,-updated_datetime
        schema:
          type: string
      - name: annotation
        in: query
        description: |
          アノテーションの絞り込み条件をJSON形式([AnnotationQuery](#section/AnnotationQuery))で指定したもの。指定した条件に合致するアノテーションを持つタスクを絞り込む際に指定する。
        required: false
        example: '{"label_id":"b048c6b3-b36f-4c8d-97ea-96828a50a44c"}'
        schema:
          type: string
      responses:
        "200":
          description: 指定された条件にあてはまるタスクを返します。条件にあてはまるタスクが多数に及ぶことがあるので、すべての結果を得るにはページングしてください。
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/TaskList"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    post:
      tags:
      - af-task
      summary: タスク一括更新
      description: |
        タスクを一括更新します。

        リクエストボディは、1個以上の「操作」オブジェクトを含むJSON配列になります。
        操作オブジェクトには、現在「削除」の1通りのみがあります。
        これら操作オブジェクトを複数含めることで、1リクエストで複数の削除ができます。

        複数の操作のうち、1つでも失敗するとAPIのレスポンス全体としては失敗になります。 成功した部分までは反映されます。
      security:
      - ProjectOwner: []
      operationId: batchUpdateTasks
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "swagger-api-components.yaml#/components/schemas/BatchTaskRequestItem"
      responses:
        "200":
          description: |
            正常。レスポンスには更新されたタスクが含まれます。
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/Task"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          # TODO Error定義構造化(KRSANNOFAC-1502)
          description: 停止中プロジェクトに対する操作のため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Errors"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/generate-tasks:
    post:
      tags:
      - af-task
      summary: タスク一括作成
      description: |
        タスク作成ルールに基づいて、タスクを一括で作成します。

        タスク作成ルールは、以下の3つです。

        * `ByCount`：1つのタスクに割り当てる入力データの個数を指定してタスクを生成します。この作成ルールは、画像を同じ枚数均等にタスクに割り振りたい場合に便利です。
        * `ByDirectory`：入力データ名をファイルパスに見立て、ディレクトリ単位でタスクを生成します。この作成ルールは、動画などから切り出した画像をディレクトリ別に格納し、その動画（ディレクトリ）の単位でタスクを作りたい場合に便利です。
        * `ByInputDataCsv`：入力データを各タスクに割り振ったCSVへの一時データ保存先を指定してタスクを生成できます。この作成ルールは、特定のデータの組み合わせを持ったタスクを作成したい場合に便利です。

        本APIを実行すると、バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`gen-tasks`）。

        **注意:** タスクに割り当てることができる入力データの個数は最大200です。

        #### ByDirectory: ディレクトリ単位でのタスク一括生成の使い方
        例えば、次のような `input_data_name` の入力データが登録されているとします。

        * a.zip/dir1/image1.png
        * a.zip/dir1/image2.png
        * a.zip/dir1/subdir/image3.png
        * a.zip/dir1/subdir/image4.png
        * a.zip/dir1/subdir/image5.png
        * b.zip/dir2/subdir1/image6.png
        * b.zip/dir2/subdir1/image7.png
        * b.zip/dir2/subdir1/image8.png
        * b.zip/dir2/subdir2/image9.png
        * b.zip/dir2/subdir2/image10.png

        ここで、`input_data_name_prefix`フィールド に `a.zip` を指定すると、次の2タスクが生成されます。

        1. タスク: `{task_id_prefix}_a.zip_dir1`
          * a.zip/dir1/image1.png
          * a.zip/dir1/image2.png
        2. タスク: `{task_id_prefix}_a.zip_dir1_subdir`
          * a.zip/dir1/subdir/image3.png
          * a.zip/dir1/subdir/image4.png
          * a.zip/dir1/subdir/image5.png

        次に、`input_data_name_prefix` に `b.zip/dir2` を指定すると、次の2タスクが生成されます。

        1. タスク: `{task_id_prefix}_b.zip_dir2_subdir1`
          * b.zip/dir2/subdir1/image6.png
          * b.zip/dir2/subdir1/image7.png
          * b.zip/dir2/subdir1/image8.png
        2. タスク: `{task_id_prefix}_b.zip_dir2_subdir2`
          * b.zip/dir2/subdir2/image9.png
          * b.zip/dir2/subdir2/image10.png

        `input_data_name_prefix` が未指定の時は、全ディレクトリごとにタスクが作成されます。つまり次のように4つのタスクが生成されます。

        1. タスク: `{task_id_prefix}_a.zip_dir1`
          * a.zip/dir1/image1.png
          * a.zip/dir1/image2.png
        2. タスク: `{task_id_prefix}_a.zip_dir1_subdir`
          * a.zip/dir1/subdir/image3.png
          * a.zip/dir1/subdir/image4.png
          * a.zip/dir1/subdir/image5.png
        3. タスク: `{task_id_prefix}_b.zip_dir2_subdir1`
          * b.zip/dir2/subdir1/image6.png
          * b.zip/dir2/subdir1/image7.png
          * b.zip/dir2/subdir1/image8.png
        4. タスク: `{task_id_prefix}_b.zip_dir2_subdir2`
          * b.zip/dir2/subdir2/image9.png
          * b.zip/dir2/subdir2/image10.png

        タスクに割り当てられる「ディレクトリ内の入力データ」の順序は、名前の昇順となります。

        **注意:** `ByDirectory`では、入力データ名がファイルパス形式になっていない入力データはタスクの作成対象になりません。
        例えば、`foo/bar.png` はタスクの作成対象になりますが、ディレクトリを含まない`bar.png` や、最後がディレクトリになっている`foo/bar.png/` は対象になりません。

        **注意:** `ByDirectory`では、入力データ名のディレクトリ部分がタスクIDの一部として利用されます。そのため、入力データ名のディレクトリ部分は、タスクIDとして利用できる文字で構成されている必要があります。[値の制約についてはこちら。](#section/API-Convention/APIID)
        入力データ名のディレクトリ部分にタスクIDとして利用できない文字が含まれている場合、タスクの生成は失敗します。

        **注意:** `ByDirectory`では、一つのディレクトリに200ファイルより多くの入力データがある場合、複数のタスクに分かれます。
        例えば、`foo/` の中に201ファイルがある場合、fooから２つのタスクが作成されます。１つ目は最初の200ファイルを割り当て、２つ目は最後の１ファイルのタスクに分かれます。
        分かれたタスクは、 `{上述のタスクIDの付与則}_連番` の形式でタスクIDが付与されます。連番は、対象の入力データ数の桁数まで0埋めされます。

        **注意:** 動画プロジェクトの場合、ディレクトリに含まれる動画の入力データは1つに制限してください。
        これが守られない場合、作成されたタスクで動画を再生できない場合があります。

        #### ByInputDataCsv: CSVによるタスク一括生成の使い方
        以下のように「タスクID,入力データ名,入力データID」を1行毎に指定したCSVを作成します。

        ```
        task_1,a001.jpg,ca0cb2f9-fec5-49b4-98df-dc34490f9785
        task_1,a002.jpg,5ac1987e-ca7c-42a0-9c19-b5b23a41836b
        task_1,centinel.jpg,81d6407b-2172-4fa8-8525-2e43c49267ee
        task_2,b001.jpg,4f2ae4d0-7a38-4f9a-be6f-170ba76aba73
        task_2,b002.jpg,45ac5852-f20c-4938-9ee9-cc0274401df7
        task_2,centinel.jpg,81d6407b-2172-4fa8-8525-2e43c49267ee
        task_3,c001.jpg,3260c7a0-4820-424d-a26e-db7e91dbc139
        task_3,centinel.jpg,81d6407b-2172-4fa8-8525-2e43c49267ee
        ```
        CSVのエンコーディングは UTF-8(BOM付き)、UTF-8(BOMなし)、UTF-16(BOM付きLE) のいずれかのみ対応しています。

        リクエストボディの`csv_data_path`には、[createTempPath](#operation/createTempPath) APIで取得した一時データ保存先パスを指定してください。[createTempPath](#operation/createTempPath) APIで取得したURLに、事前にCSVファイルをアップロードする必要があります。

      security:
      - ProjectOwner: []
      operationId: initiateTasksGeneration
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/TaskGenerateRequest"
      responses:
        "202":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/TaskGenerateResponse"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 停止中プロジェクトに対する操作のため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}:
    get:
      tags:
      - af-task
      summary: タスク取得
      description: |
        タスクを取得します。

      security:
      - AllProjectMember: []
      operationId: getTask
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: タスクID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Task"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-task
      summary: タスク作成/更新
      description: |
        タスクを作成または更新します。

        大量のタスクを一括で生成する場合は、[initiateTasksGeneration](#operation/initiateTasksGeneration) APIの使用を検討してください。

      security:
      - ProjectOwner: []
      operationId: putTask
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: |
          タスクID。[値の制約についてはこちら。](#section/API-Convention/APIID)
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/TaskRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Task"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 停止中プロジェクトに対する操作のため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      tags:
      - af-task
      summary: タスク削除
      description: |
        タスクを削除します。
      security:
      - ProjectOwner: []
      operationId: deleteTask
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: タスクID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      responses:
        "200":
          description: 正常。削除したタスクを返します
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Task"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/assign-tasks:
    post:
      tags:
        - af-task
      summary: タスク割当
      description: |
        自分自身またはメンバーにタスクを割り当てます。

      security:
        - AllProjectMember: []
      operationId: assignTasks
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/TaskAssignRequest"
      responses:
        "200":
          description: 正常。割り当てられたタスクを返します。
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/Task"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: プロジェクトが停止中のため、タスクの割当ができない。
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/metadata:
    patch:
      tags:
        - af-task
      summary: タスクメタデータの一括更新
      description: |
        複数のタスクのメタデータを一括で更新します。
      security:
        - ProjectDataUser: []
      operationId: patchTasksMetadata
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PatchTasksMetadataRequest"
      responses:
        "200":
          $ref: "swagger-api-components.yaml#/components/responses/SuccessMessage"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 停止中プロジェクトに対する操作のため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}/operate:
    post:
      tags:
      - af-task
      summary: タスク状態変更
      description: |
        タスクのステータスやフェーズ、担当者を変更できます。

        ユースケースごとのリクエストボディのサンプルを、以下に記載します。

        ### タスクのステータスを作業中に変更

        ```
        {"status": "working", "account_id": "{現在の担当者のアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        APIの制約は以下の通りです。
        * API実行者は、現在のタスクの担当者
        * 現在のタスクのステータスが`not_started`, `break`, `on_hold` のいずれか

        ### タスクのステータスを休憩中に変更

        ```
        {"status": "break", "account_id": "{現在の担当者のアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        APIの制約は以下の通りです。
        * API実行者は、現在のタスクの担当者
        * 現在のタスクのステータスが`working`

        ### タスクのステータスを保留中に変更

        ```
        {"status": "on_hold", "account_id": "{現在の担当者のアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        APIの制約は以下の通りです。
        * API実行者は、現在のタスクの担当者
        * 現在のタスクのステータスが`working`


        ### タスクの提出

        ```
        {"status": "complete", "account_id": "{現在の担当者のアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        APIの制約は以下の通りです。
        * API実行者は、現在のタスクの担当者
        * 現在のタスクのステータスが`working`

        ### タスクの提出取り消し

        ```
        {"status": "cancelled", "account_id": "{タスクを提出したユーザーのアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        APIの制約は以下の通りです。
        * API実行者は、タスクを提出したユーザー
        * 現在のタスクのステータスが`not_started`
        * 現在のタスクのフェーズが`inspection`または`acceptance`
        * タスクの提出後に、検査/受入(抜取含む)等の作業が一切行われていない

        ### タスクの差し戻し

        ```
        {"status": "rejected", "account_id": "{現在の担当者のアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        APIの制約は以下の通りです。
        * API実行者は、現在のタスクの担当者
        * 現在のタスクのステータスが`working`
        * 現在のタスクのフェーズが`inspection`または`acceptance`


        ### タスクの強制差し戻し

        ```
        {"status": "rejected", "force": true, "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        「強制差し戻し」は、通常の「差し戻し」と比較して以下の点が異なります。
        * 現在のタスクのステータスやフェーズに関わらず、タスクを差し戻せる
        * 検査コメントを付与しなくても、タスクを指し戻せる
        * 抜取検査・抜取受入のスキップ判定に影響を及ぼさない


        APIの制約は以下の通りです。
        * API実行者は、プロジェクトオーナーロールを持つ

        ### タスクの受入取り消し

        ```
        {"status": "not_started", "account_id": "{受入取り消し後の担当者のアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        APIの制約は以下の通りです。
        * API実行者は、プロジェクトオーナーロールを持つ
        * 現在のタスクのステータスが`completed`
        * 現在のタスクのフェーズが`acceptance`

        ### タスクの担当者の変更

        ```
        {"status": "not_started", "account_id": "{担当させるユーザーのアカウントID}", "last_updated_datetime": "2018-08-14T19:01:51.775+09:00"}
        ```

        タスクに担当者を割り当てない場合は、`account_id`を未指定にしてください。

        このAPIは、メンバー1人に割り当てられるタスク数の上限を無視して、担当者を変更できます。

        APIの制約は以下の通りです。
        * API実行者は、プロジェクトオーナーまたはチェッカーロールを持つ

      security:
      - AllProjectMember: []
      operationId: operateTask
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: タスクID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/TaskOperation"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Task"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 指定された現在の状態が実際の現在の状態と食い違っている
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}/histories:
    get:
      tags:
      - af-task
      summary: タスク履歴一括取得
      description: |
        タスクの作業履歴をすべて取得します。
      security:
      - AllProjectMember: []
      operationId: getTaskHistories
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: タスクID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/TaskHistory"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/annotations:
    get:
      tags:
      - af-annotation
      summary: アノテーション一括取得
      description:
        アノテーションを一括で取得します。
      security:
      - AllProjectMember: []
      operationId: getAnnotationList
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: page
        in: query
        description: 検索結果のうち、取得したいページの番号(1始まり）
        required: false
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: limit
        in: query
        description: 1ページあたりの取得するデータ件数
        required: false
        schema:
          type: integer
          minimum: 0
          maximum: 200
          default: 30
      - name: aggregate_by_task_and_input
        in: query
        description: |
          `true`を指定すると、「タスクIDと入力データIDの組」ごとに検索結果を集計します。
        required: false
        schema:
          type: boolean
          default: false
      - name: no_aggregate_label_and_input
        in: query
        description: |
          `true`を指定すると、ラベルIDによるアノテーション検索数の集約結果、および属性IDによるアノテーション検索数の集約結果を取得しません。

          このパラメーターを`true`に指定することで集約計算は行われなくなるので、アノテーションの検索が速くなる可能性があります。
        required: false
        schema:
          type: boolean
          default: false
      - name: query
        in: query
        description: |
          絞り込み条件([AnnotationQuery](#section/AnnotationQuery))をJSON形式で表した文字列。
        required: false
        example: '{"label_id":"b048c6b3-b36f-4c8d-97ea-96828a50a44c"}'
        schema:
          type: string
      - name: sort
        in: query
        description: |
          ソート順の指定。
          以下のキーを使用できます。
          * `task_id`
          * `input_data_id`
          * `detail.annotation_id`
          * `detail.account_id`
          * `detail.label_id`
          * `detail.data_holding_type`
          * `detail.created_datetime`
          * `detail.updated_datetime`


          キーの先頭に`-`を付けると、降順でソートされます。

          `,`でキーを区切ると、複数のキーでソートされます。先頭のキーから順に優先順位が割り振られます。
        required: false
        example: task_id,input_data_id,detail.annotation_id,-detail.updated_datetime
        schema:
          type: string
      - name: v
        in: query
        description: |
          レスポンスに含まれるアノテーションのフォーマットバージョンを指定します。
          未指定の場合や"2"以外が指定された場合は"1"が指定されたものとして扱います。
        required: false
        schema:
          type: string
          enum:
            - "1"
            - "2"
          default: "1"
          example: "2"
      responses:
        "200":
          description: 指定された条件にあてはまるアノテーションを返します。条件にあてはまるアノテーションが多数に及ぶことがあるので、すべての結果を得るにはページングしてください。
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/AnnotationList"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    post:
      tags:
      - af-annotation
      summary: アノテーション一括更新
      description: |
        複数のアノテーションを一括更新します。

        リクエストボディは、1個以上の「操作」オブジェクトを含むJSON配列になります。
        操作オブジェクトには、「更新」と「削除」の2通りがあり、それぞれJSONオブジェクト構造が異なります。
        これら操作オブジェクトを複数含めることで、1つのリクエストで複数の更新や削除ができます。

        APIの制約は以下の通りです。
        * アノテーションラベルの以下の変更はできない
          * 異なるアノテーションの種類のラベルへの変更
          * 「全体」アノテーションラベルの変更
          * 「塗りつぶしv2」アノテーションラベルの変更
        * 受入完了タスクのアノテーションは、プロジェクトオーナーロールを持つユーザーのみ更新/削除できる。

        複数の操作のうち、1つでも失敗するとAPIのレスポンス全体としては失敗になります。 成功した部分までは反映されます。

      security:
      - ProjectAccepter: []
      operationId: batchUpdateAnnotations
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: v
        in: query
        description: |
          レスポンスに含まれるアノテーションのフォーマットバージョンを指定します。
          未指定の場合や"2"以外が指定された場合は"1"が指定されたものとして扱います。
        required: false
        schema:
          type: string
          enum:
            - "1"
            - "2"
          default: "1"
          example: "2"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "swagger-api-components.yaml#/components/schemas/BatchAnnotationRequestItem"
      responses:
        "200":
          description: |
            正常。レスポンスには、更新されたアノテーションが含まれます。
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/SingleAnnotation"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          # TODO Error定義構造化(KRSANNOFAC-1502)
          description: 停止中プロジェクトに対する操作、または、先に更新されているため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Errors"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}/inputs/{input_data_id}/annotation:
    get:
      tags:
        - af-annotation
      summary: アノテーションの取得
      description: |
        アノテーションを取得します。
      security:
        - AllProjectMember: []
      operationId: getEditorAnnotation
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: task_id
          in: path
          description: タスクID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
        - name: input_data_id
          in: path
          description: 入力データID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
        - name: task_history_id
          in: query
          description: |
            過去のフェーズのアノテーションを取得する場合、タスク履歴IDを指定します。未指定時は最新のアノテーションを取得します。

            過去のアノテーションデータは最後に保存してから30日前のデータまで取得できます。
            30日より前のデータを取得しようとした場合はアノテーションデータは空リストとなります。
          required: false
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/TaskHistoryId"
        - name: v
          in: query
          description: |
            レスポンスに含まれるアノテーションのフォーマットバージョンを指定します。
            未指定の場合や"2"以外が指定された場合は"1"が指定されたものとして扱います。
          required: false
          schema:
            type: string
            enum:
              - "1"
              - "2"
            default: "1"
            example: "2"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/AnnotationOutput"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
        - af-annotation
      summary: アノテーション更新
      description: |
        アノテーションを更新します。

        APIを実行できるユーザーは、以下の通りです。
        * 過去に誰にも割り当てられていないタスク：プロジェクトオーナーロールを持つユーザー
        * 過去に誰かに割り当てられたことがあるタスク：タスクの現在の担当者

        ただし、`is_protected`は、プロジェクトオーナーロールを持つユーザーのみ変更可能です。
      security:
        - AllProjectMember: []
      operationId: putAnnotation
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: task_id
          in: path
          description: タスクID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
        - name: input_data_id
          in: path
          description: 入力データID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
        - name: v
          in: query
          description: |
            レスポンスに含まれるアノテーションのフォーマットバージョンを指定します。
            未指定の場合や"2"以外が指定された場合は"1"が指定されたものとして扱います。
          required: false
          schema:
            type: string
            enum:
              - "1"
              - "2"
            default: "1"
            example: "2"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/AnnotationInput"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/AnnotationOutput"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          # TODO Error定義構造化(KRSANNOFAC-1502)
          description: 停止中プロジェクトに対する操作、または、先に更新されているため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Errors"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}/inputs/{input_data_id}/annotation/simple:
    get:
      tags:
      - af-annotation
      summary: Simpleアノテーションの取得
      description: |
        Simpleアノテーションを取得します。

        [getAnnotationArchive](#operation/getAnnotationArchive) APIでダウンロードできるSimpleアノテーションZIPの一部を、取得することができます。

        **注意:** このAPIでは、塗りつぶし画像をダウンロードするためのURLを取得できません。

      security:
      - AllProjectMember: []
      operationId: getAnnotation
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: タスクID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/SimpleAnnotation"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/archive/full:
    get:
      tags:
      - af-annotation
      summary: FullアノテーションZIP取得
      description: |
        FullアノテーションZIPをダウンロードするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効します。

        アノテーションZIPの更新中に、このAPIを実行すると409エラーが発生します。

        FullアノテーションZIPのデータ構造については、[Full Annotation ZIP](#section/Full-Annotation-ZIP)を参照ください。
      security:
      - ProjectDataUser: []
      operationId: getArchiveFullWithProId
      deprecated: true
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: アノテーションZIPを更新中のため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/archive/simple:
    get:
      tags:
      - af-annotation
      summary: SimpleアノテーションZIP取得
      description: |
        SimpleアノテーションZIPをダウンロードするための、認証済み一時URLを取得します。
        取得したURLは1時間で失効します。

        アノテーションZIPの更新中に、このAPIを実行すると409エラーが発生します。

        SimpleアノテーションZIPのデータ構造については、[Simple Annotation ZIP](#section/Simple-Annotation-ZIP)を参照ください。

      security:
      - ProjectDataUser: []
      operationId: getAnnotationArchive
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "201":
          $ref: "swagger-api-components.yaml#/components/responses/FileRedirectResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: アノテーションZIPを更新中のため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/archive/update:
    post:
      tags:
      - af-annotation
      summary: アノテーションZIP更新開始
      description: |
        アノテーションZIPの更新を開始します。
        アノテーションZIPの更新は、データ量によっては数十分以上かかる場合もあります。

        アノテーションZIPは毎日AM03:00(JST)頃に自動更新されますが、本APIを用いると、自動更新を待たずにアノテーションZIPの更新を要求できます。

        本APIを実行すると、バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`gen-annotation`）。

      security:
      - ProjectDataUser: []
      operationId: postAnnotationArchiveUpdate
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "202":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/PostAnnotationArchiveUpdateResponse"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: ジョブの同時実行制限による失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}/inputs/{input_data_id}/inspections:
    get:
      deprecated: true
      tags:
      - af-inspection
      summary: 検査コメント一括取得
      description: |
        指定されたタスクで、指定された入力データにつけられた検査コメントをすべて取得します。
      security:
      - AllProjectMember: []
      operationId: getInspections
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: タスクID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/Inspection"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    post:
      deprecated: true
      tags:
      - af-inspection
      summary: 検査コメント一括更新
      description: |
        検査コメントを一括更新します。
        タスクの現在の担当者でない場合、またはタスクの状態が「作業中」でない場合は409エラーになります。

        リクエストボディは、1個以上の「操作」オブジェクトを含むJSON配列になります。
        操作オブジェクトには、「更新（作成含む）」と「削除」の2通りがあり、それぞれJSONオブジェクト構造が異なります。
        これら操作オブジェクトを複数含めることで、1リクエストで複数の更新や削除ができます。

        既に作成済みの検査コメントのうち、リクエストボディの配列に含まれないものは更新されません。

        複数の操作のうち、1つでも失敗するとAPIのレスポンス全体としては失敗になります。 成功した部分までは反映されます。
      security:
      - AllProjectMember: []
      operationId: batchUpdateInspections
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: task_id
        in: path
        description: タスクID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "swagger-api-components.yaml#/components/schemas/BatchInspectionRequestItem"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/Inspection"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          # TODO Error定義構造化(KRSANNOFAC-1502)
          description: 停止中プロジェクトに対する操作、または、先に更新されているため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Errors"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}/inputs/{input_data_id}/comments:
    get:
      tags:
        - af-comment
      summary: コメント一括取得
      description: |
        指定されたタスクで、指定された入力データにつけられたコメントをすべて取得します。
      security:
        - AllProjectMember: [ ]
      operationId: getComments
      parameters:
        - name: v
          in: query
          description: |
            2 を指定した場合、検査コメントのデータも含めたコメントデータを返します。

            パラメーターの指定がない、あるいは値が 2 以外の場合は検査コメントを除いたコメントデータを返します。
          required: false
          schema:
            type: string
            example: "2"
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: task_id
          in: path
          description: タスクID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
        - name: input_data_id
          in: path
          description: 入力データID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/Comment"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    post:
      tags:
        - af-comment
      summary: コメント一括更新
      description: |
        コメントを一括更新します。
        タスクの現在の担当者でない場合、またはタスクの状態が「作業中」でない場合は409エラーになります。

        リクエストボディは、1個以上の「操作」オブジェクトを含むJSON配列になります。
        操作オブジェクトには、「更新（作成含む）」と「削除」の2通りがあり、それぞれJSONオブジェクト構造が異なります。
        これら操作オブジェクトを複数含めることで、1リクエストで複数の更新や削除ができます。

        既に作成済みのコメントのうち、リクエストボディの配列に含まれないものは更新されません。

        複数の操作のうち、1つでも失敗するとAPIのレスポンス全体としては失敗になります。 成功した部分までは反映されます。
      security:
        - AllProjectMember: [ ]
      operationId: batchUpdateComments
      parameters:
        - name: v
          in: query
          description: |
            2 を指定した場合、検査コメントのデータも含めたコメントデータを返します。

            パラメーターの指定がない、あるいは値が 2 以外の場合は検査コメントを除いたコメントデータを返します。
          required: false
          schema:
            type: string
            example: "2"
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: task_id
          in: path
          description: タスクID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
        - name: input_data_id
          in: path
          description: 入力データID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "swagger-api-components.yaml#/components/schemas/BatchCommentRequestItem"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/Comment"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          # TODO Error定義構造化(KRSANNOFAC-1502)
          description: 停止中プロジェクトに対する操作、または、先に更新されているため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Errors"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/inputs:
    get:
      tags:
      - af-input
      summary: 入力データの一括取得
      description: |
        入力データを一括で取得します。

      security:
      - AllProjectMember: []
      operationId: getInputDataList
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: input_data_id
        in: query
        description: 入力データIDでの部分一致検索で使用。大文字小文字は区別しません。
        required: false
        schema:
          type: string
          minLength: 1
          maxLength: 300
      - name: input_data_name
        in: query
        description: 入力データ名での部分一致検索で使用。大文字小文字は区別しません。
        required: false
        schema:
          type: string
          minLength: 1
          maxLength: 300
      - name: input_data_path
        in: query
        description: 入力データパスでの部分一致検索で使用。
        required: false
        schema:
          type: string
          minLength: 1
          maxLength: 300
      - name: task_id
        in: query
        description: 入力データが紐づくタスクIDの部分一致検索で使用。大文字小文字は区別しません。条件に合致した先頭100件のタスクに使われている入力データを検索します。
        required: false
        schema:
          type: string
          minLength: 1
          maxLength: 300
      - name: from
        in: query
        description: 指定した日時以降に更新された入力データを取得します。日時のフォーマットはISO 8601 拡張形式です。
        required: false
        schema:
          type: string
          format: date-time
      - name: to
        in: query
        description: 指定した日時以前に更新された入力データを取得します。日時のフォーマットはISO 8601 拡張形式です。
        required: false
        schema:
          type: string
          format: date-time
      - name: page
        in: query
        description: 検索結果のうち、取得したいページの番号(1始まり）
        required: false
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: limit
        in: query
        description: 1ページあたりの取得するデータ件数
        required: false
        schema:
          type: integer
          minimum: 0
          maximum: 200
          default: 30
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/InputDataList"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    post:
      tags:
      - af-input
      summary: 入力データの一括更新
      description: |
        入力データを一括更新します。

        リクエストボディは、1個以上の「操作」オブジェクトを含むJSON配列になります。
        操作オブジェクトには、現在「削除」しかありません。
        これら操作オブジェクトを複数含めることで、1個のリクエストで複数の削除ができます。

        複数の操作のうち、1つでも失敗するとAPIのレスポンス全体としては失敗になります。 成功した部分までは反映されます。
      security:
      - ProjectOwner: []
      operationId: batchUpdateInputs
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "swagger-api-components.yaml#/components/schemas/BatchInputDataRequestItem"
      responses:
        "200":
          description: 正常。レスポンスには、更新された入力データが含まれます。
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/InputData"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          # TODO Error定義構造化(KRSANNOFAC-1502)
          description: 停止中プロジェクトに対する操作のため失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Errors"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/inputs/{input_data_id}:
    get:
      tags:
      - af-input
      summary: 入力データの取得
      description: |
        入力データを取得します。

      security:
      - AllProjectMember: []
      operationId: getInputData
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/InputData"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-input
      summary: |
        入力データの作成/更新
      description: |
        入力データを作成または更新します。

        Annofabにファイルをアップロードして入力データを作成する場合は、事前に[createTempPath](#operation/createTempPath) APIを実行してください。

        ### 画像のリサイズ
        Annofabにアップロードした画像は、自動的に「長辺4096px以内」になるよう縮小されます。
        アノテーションの座標値は、縮小前の画像サイズに対応する値に復元されます。

        ### ZIPファイルで入力データをまとめて作成する
        複数のファイルをZIPで圧縮してAnnofabにアップロードすると、入力データをまとめて作成できます。

        パスパラメータの`input_data_id`は無視されるため、任意の値を指定してください。
        リクエストボディの`input_data_name`には、入力データ名のプレフィックスを指定してください。

        ZIPファイルを入力データとして登録すると、バックグラウンドジョブが登録されます。ジョブは [getProjectJob](#operation/getProjectJob) APIで確認できます（ジョブ種別は`gen-inputs`）。

        ZIPファイルでの入力データ登録には以下の制限があります。
        * アップロードできるZIPファイルのサイズは、最大5GBです。
        * ファイル名の文字コードはUTF-8エンコーディングのみ対応しています。

        #### 画像ファイル・動画ファイルから入力データを作成する
        画像ファイル・動画ファイルを圧縮したZIPファイルをアップロードすることで、入力データとして登録できます。

        なお、ZIPファイルに次のようなファイルが含まれていた場合、該当ファイルは入力データとして登録されません。
        * プロジェクトがサポートしていないファイル
            * 画像プロジェクトの場合：jpeg, png, gif以外のファイル
            * 動画プロジェクトの場合：m3u8, ts, mp4, webm, ogg以外のファイル
        * ファイル名が`.`（ドット）から始まるファイル
        * フォルダ名が`.`（ドット）から始まるフォルダ以下のファイル

        以下に、画像ファイルを登録する際のサンプルを記載します。

        ```
          foo.zip/
          ├── image1.jpg
          ├── image2.jpg
        ```
        このフォルダ構成のZIPファイルをアップロードして、リクエストボディの`input_data_name`に`bar.zip`を指定した場合、入力データ名が`bar.zip/image1.jpg`,`bar.zip/image2.jpg`の2つの入力データが生成されます。

        #### ストリーミング形式の動画を入力データとして登録する
        ストリーミング形式の動画をAnnofabにアップロードして、入力データとして登録できます。

        ただし、ZIPで圧縮する必要があります。ZIPファイルには、m3u8ファイルとtsファイルの両方を含めてください。
        m3u8ファイルに記述された相対パスでtsファイルは、参照可能である必要があります。

        以下に、フォルダ構成のサンプルを記載します。

        ```
          hoge.zip/
          ├── hoge.ts
          ├── fuga/
          │   ├── foo.m3u8    (hoge.ts, fuga/foo1.ts, fuga/foo2.tsを参照)
          │   ├── foo1.ts
          │   ├── foo2.ts
          │   └── lib
          ├── piyo1/
          │   ├── piyo2
          │   │   ├── bar.ts
          │   ├── bar.m3u8    (hoge.ts, piyo1/piyo2/bar.tsを参照)
        ```

        #### 3次元点群の入力データを作成する
        KITTI形式、およびAnnofab 点群形式（KITTIベース）でのデータ登録に対応しています。
        ZIPファイルの形式など、詳細は[Annofabのユーザーマニュアル](https://annofab.readme.io/docs)に記載予定です。

        ### 注意事項
        * `input_data_path`のURLスキームが`https`の場合、`input_data_name`もしくは`input_data_path`の末尾にファイルの拡張子を含むようにしてください。
        Annofabは拡張子からファイル形式を識別します。`input_data_name`と`input_data_path`の両方に拡張子が含まれている場合は、`input_data_name`の拡張子がファイル形式の識別に使われます。
      security:
      - ProjectOwner: []
      operationId: putInputData
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: input_data_id
        in: path
        description: |
          入力データID。[値の制約についてはこちら。](#section/API-Convention/APIID)
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/InputDataRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/InputData"
        "202":
          description: zipファイルを受領、バッチにて登録開始。
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ProjectJobInfo"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          description: 先に更新されているため、またはジョブの同時実行制御（zipファイルをアップロードした場合）により失敗
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/ErrorAlreadyUpdated"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      tags:
      - af-input
      summary: 入力データの削除
      description: |
        入力データを削除します。

      security:
      - ProjectOwner: []
      operationId: deleteInputData
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      responses:
        "200":
          description: 正常。削除した入力データを返します
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/InputData"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/inputs/{input_data_id}/supplementary-data:
    get:
      tags:
      - af-supplementary
      summary: 補助情報一括取得
      description: |
        入力データに紐付けられた補助情報をすべて取得します。
      security:
      - AllProjectMember: []
      operationId: getSupplementaryDataList
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/SupplementaryData"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/inputs/{input_data_id}/supplementary-data/{supplementary_data_id}:
    put:
      tags:
      - af-supplementary
      summary: 補助情報作成/更新
      description: |
        補助情報を作成または更新します。
      security:
      - ProjectOwner: []
      operationId: putSupplementaryData
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      - name: supplementary_data_id
        in: path
        description: 補助情報ID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/SupplementaryDataId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/SupplementaryDataRequest"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/SupplementaryData"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    delete:
      tags:
      - af-supplementary
      summary: 補助情報削除
      description: |
        補助情報を削除します。
      security:
      - ProjectOwner: []
      operationId: deleteSupplementaryData
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: input_data_id
        in: path
        description: 入力データID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      - name: supplementary_data_id
        in: path
        description: 補助情報ID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/SupplementaryDataId"
      responses:
        "200":
          description: 正常
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/create-temp-path:
    post:
      tags:
      - af-input
      summary: アップロード先URLの取得
      description: |
        Annofabにファイルをアップロードするのに必要な情報を取得します。

        このAPIは、Annofabにファイルをアップロードして、入力データや補助情報を作成する際に使用します。

        Annofabにファイルをアップロードして入力データを作成する手順は、以下の通りです。

        1. APIを実行して、ファイルのアップロードに必要な情報を取得する。

        ```
        $ curl --request POST 'https://annofab.com/api/v1/projects/{project_id}/create-temp-path'
        {
          "url": "https://s3.<REGION>.amazonaws.com/<ANNOFAB-TEMP-BUCKET>/<UUID>/<UUID>?param1=...&param2=...",
          "path": "s3://<ANNOFAB-TEMPORARY-BUCKET-NAME>/<UUID>/<UUID>"
        }
        ```

        2. 手順1で取得した`url`に対して、HTTP PUTメソッドで、ファイルをアップロードする。

        ```
        $ curl --request PUT --header 'Content-Type: {CONTENT_TYPE_HERE}' --data-binary @/hoge.zip 'https://{手順1で取得したurl}'
        ```

        3. 手順1で取得した`path`を、[putInputData](#operation/putInputData) APIのリクエストボディ`input_data_path`に指定して、putInputData APIを実行する。

        ```
        $ curl --request PUT --header 'Content-Type: text/json' \
         --data '{"input_data_name":"{input_data_name}", "input_data_path":"{手順1で取得したpath}" }' \
         'https://annofab.com/api/v1/projects/{project_id}/inputs/{input_data_id}'
        ```

        #### 注意事項
        * 手順2を実行してから24時間以内に、手順3の操作を完了させてください。手順2でアップロードしたファイルは、24時間経過すると削除されます。

      security:
      - AllProjectMember: []
      operationId: createTempPath
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: |
            正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/DataPath"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/instruction:
    get:
      tags:
      - af-instruction
      summary: 作業ガイドの取得
      description: |
        作業ガイドのHTMLを取得します。
      security:
      - AllProjectMember: []
      operationId: getInstruction
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: history_id
        in: query
        description: |
          [getInstructionHistory](#operation/getInstructionHistory) APIで取得した、作業ガイドの履歴ID
        required: true
        schema:
          type: string
        example: "ed55914c-9f04-470e-8af2-373c8def3e8b"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/Instruction"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
      - af-instruction
      summary: 作業ガイドの更新
      description: |
        作業ガイドのHTMLを更新します。
      security:
      - ProjectOwner: []
      - ProjectAccepter: []
      operationId: putInstruction
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutInstructionRequest"
      responses:
        "200":
          description: 作業ガイドの更新が成功した。
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/InstructionHistory"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "409":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorStateMismatch"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/instruction-history:
    get:
      tags:
      - af-instruction
      summary: 作業ガイドの編集履歴の取得
      description: |
        作業ガイドの編集履歴を取得します。
        取得される編集履歴は日付の新しい順にソートされます。
      security:
      - AllProjectMember: []
      operationId: getInstructionHistory
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: limit
        in: query
        description: 取得する編集履歴の件数
        required: false
        schema:
          type: integer
          default: 30
          minimum: 0
          maximum: 200
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/InstructionHistory"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/instruction-images:
    get:
      tags:
      - af-instruction
      summary: 作業ガイドの画像一覧の取得
      description: |
        作業ガイドの画像一覧を取得します。
      security:
      - AllProjectMember: []
      operationId: getInstructionImages
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "swagger-api-components.yaml#/components/schemas/InstructionImage"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/instruction-images/{image_id}:
    delete:
      tags:
      - af-instruction
      summary: 作業ガイドの画像削除
      description: |
        作業ガイドの画像を削除します。
      security:
      - ProjectOwner: []
      - ProjectAccepter: []
      operationId: deleteInstructionImage
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: image_id
        in: path
        description: 作業ガイド画像ID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InstructionImageId"
      responses:
        "200":
          description: 正常
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/instruction-images/{image_id}/put-url:
    get:
      tags:
      - af-instruction
      summary: 作業ガイドの画像登録・更新用URL取得
      description: |
        プロジェクトの作業ガイドの画像を登録するためのput先URLを取得します。

        作業ガイド画像の登録/更新方法は以下の通りです。
        1. APIを実行して、ファイルアップロード用のURLを取得する。

        ```
        $ curl -X GET -H 'Content-Type: {CONTENT_TYPE_HERE}' 'https://annofab.com/api/v1/projects/{project_id}/instruction-images/{image_id}/put-url'
        ```

        2. 手順1で取得したファイルアップロード用のURLに対して、登録/更新する作業ガイド画像ファイル(`hoge.jpg`)をPUTする。

        ```
        $ curl -X PUT -H 'Content-Type: {CONTENT_TYPE_HERE}' --data-binary @/hoge.jpg '{ファイルアップロード用のURL}'
        ```


      security:
      - ProjectOwner: []
      - ProjectAccepter: []
      operationId: getInstructionImageUrlForPut
      parameters:
      - name: project_id
        in: path
        description: プロジェクトID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
      - name: image_id
        in: path
        description: 作業ガイド画像ID
        required: true
        schema:
          $ref: "swagger-api-components.yaml#/components/schemas/InstructionImageId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/InstructionImagePath"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
  /projects/{project_id}/tasks/{task_id}/inputs/{input_data_id}/thumbnail:
    get:
      tags:
        - af-annotation
      summary: アノテーションのサムネイル情報の取得
      description: |
        アノテーションのサムネイル情報を取得します。

        入力データの種類がカスタムであるプロジェクトにのみ対応しています。
      security:
        - AllProjectMember: []
      operationId: getAnnotationThumbnail
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: task_id
          in: path
          description: タスクID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
        - name: input_data_id
          in: path
          description: 入力データID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/AnnotationThumbnail"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
    put:
      tags:
        - af-annotation
      summary: アノテーションのサムネイル情報の更新
      description: |
        アノテーションのサムネイル情報を更新します。

        入力データの種類がカスタムであるプロジェクトにのみ対応しています。

        このAPIを呼び出せるユーザーは [putAnnotation](#operation/putAnnotation) API に準じます。
      security:
        - AllProjectMember: []
      operationId: putAnnotationThumbnail
      parameters:
        - name: project_id
          in: path
          description: プロジェクトID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/ProjectId"
        - name: task_id
          in: path
          description: タスクID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/TaskId"
        - name: input_data_id
          in: path
          description: 入力データID
          required: true
          schema:
            $ref: "swagger-api-components.yaml#/components/schemas/InputDataId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "swagger-api-components.yaml#/components/schemas/PutAnnotationThumbnailBody"
      responses:
        "200":
          description: 正常
          content:
            application/json:
              schema:
                $ref: "swagger-api-components.yaml#/components/schemas/AnnotationThumbnail"
        "400":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest"
        "401":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi"
        "403":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource"
        "404":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource"
        "503":
          $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance"
