openapi: 3.0.3
info:
  title: Tacticus API
  version: 1.0.0

servers:
  - url: https://tacticus-api.deviktta.services
    description: Production server

paths:
  /api/demo/characters:
    get:
      tags:
        - Demo
      summary: Get some characters info for demonstration-only purposes.
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DemoCharactersResponse'
              examples:
                "Only 1 item":
                  value:
                    total: 1
                    items:
                      - name: "Angrax"
                        id: "d1ad5662-a602-41cb-9bec-2ba0d471bebc"
                        faction:
                          name: "Black Legion"
                          id: "9ac95f19-0916-4958-b7d3-9c9b6e3f329a"
                        alliance:
                          name: "Chaos"
                          id: "8dd34fc0-0db4-4054-bca7-32dab542f7eb"
                        traits:
                          - name: "Let the galaxy burn"
                            id: "2078a90d-6cc4-4ecb-bce7-6e807b4baed1"
                          - name: "Deep strike"
                            id: "875f954d-7118-4dcc-a082-107014112b81"
                          - name: "Terminator armour"
                            id: "db36a642-6a29-46d5-bcd9-b5aee16237d0"
                    api_data_version: "20260105-4"
                    message: "This endpoint is capped at X entities by design and is meant for demonstration-only purposes."
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/characters:
    get:
      tags:
        - Characters, Traits & Machines of War
      summary: Get a list of characters data
      parameters:
        - name: searchName
          in: query
          description: Search for characters by name (minimum 3 characters, alphanumeric and apostrophes only).
          required: false
          schema:
            type: string
          example: "Comm"
        - name: faction
          in: query
          description: Filter by faction UUID
          required: false
          schema:
            type: string
          example: "56be1dbd-720a-443c-8720-190d119ab092"
        - name: traits
          in: query
          description: Filter by trait UUIDS (comma-separated).
          required: false
          schema:
            type: string
          example: "b33084e5-0d9e-485b-8032-57b9a7091487,b9b10006-0efe-41d0-b967-399fd8492b7f"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CharactersResponse'
              examples:
                "Only 1 item":
                  value:
                    total: 1
                    items:
                      - name: "Angrax"
                        id: "d1ad5662-a602-41cb-9bec-2ba0d471bebc"
                        faction:
                          name: "Black Legion"
                          id: "9ac95f19-0916-4958-b7d3-9c9b6e3f329a"
                        alliance:
                          name: "Chaos"
                          id: "8dd34fc0-0db4-4054-bca7-32dab542f7eb"
                        traits:
                          - name: "Let the galaxy burn"
                            id: "2078a90d-6cc4-4ecb-bce7-6e807b4baed1"
                          - name: "Deep strike"
                            id: "875f954d-7118-4dcc-a082-107014112b81"
                          - name: "Terminator armour"
                            id: "db36a642-6a29-46d5-bcd9-b5aee16237d0"
                    api_data_version: "20260105-4"
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/characters/{uuid}:
    get:
      tags:
        - Characters, Traits & Machines of War
      parameters:
        - name: uuid
          in: path
          required: true
          description: Character UUID
          schema:
            type: string
          example: "d1ad5662-a602-41cb-9bec-2ba0d471bebc"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CharacterResponse'
              examples:
                "0d110d61-7087-402a-a87e-70fcc7bffc73":
                  value:
                    character: {
                      "name": "Thutmose",
                      "id": "0d110d61-7087-402a-a87e-70fcc7bffc73",
                      "faction": {
                        "name": "Necrons",
                        "id": "44a3a0e6-762e-42d4-b397-cfc490580f26"
                      },
                      "alliance": {
                        "name": "Xenos",
                        "id": "ca50f9cd-1bff-4c1e-94db-616894e0c2e4"
                      },
                      "traits": [
                        {
                          "name": "Living metal",
                          "id": "56851ff2-ac59-408a-b3ac-00443b412170"
                        },
                        {
                          "name": "Flying",
                          "id": "b33084e5-0d9e-485b-8032-57b9a7091487"
                        }
                      ]
                    }
                    api_data_version: "20260105-4"
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/demo/mows:
    get:
      tags:
        - Demo
      summary: Get some machines of war info for demonstration-only purposes.
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DemoMowsResponse'
              examples:
                "Only 1 item":
                  value:
                    total: 1
                    items: [
                      {
                        "name": "Forgefiend",
                        "id": "ef9e5bea-7f63-43e7-9eb5-5e5677978720",
                        "faction": {
                          "name": "Black Legion",
                          "id": "9ac95f19-0916-4958-b7d3-9c9b6e3f329a"
                        },
                        "alliance": {
                          "name": "Chaos",
                          "id": "8dd34fc0-0db4-4054-bca7-32dab542f7eb"
                        }
                      }
                    ]
                    api_data_version: "20260105-4"
                    message: "This endpoint is capped at X entities by design and is meant for demonstration-only purposes."
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/mows:
    get:
      tags:
        - Characters, Traits & Machines of War
      summary: Get a list of machines of war data
      parameters:
        - name: searchName
          in: query
          description: Search for machines of wars by name (minimum 3 characters, alphanumeric and apostrophes only).
          required: false
          schema:
            type: string
          example: "Forge"
        - name: faction
          in: query
          description: Filter by faction UUID.
          required: false
          schema:
            type: string
          example: "9ac95f19-0916-4958-b7d3-9c9b6e3f329a"
        - name: alliance
          in: query
          description: Filter by alliance UUID.
          required: false
          schema:
            type: string
          example: "8dd34fc0-0db4-4054-bca7-32dab542f7eb"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MowsResponse'
              examples:
                "Only 1 item":
                  value:
                    total: 1
                    items: [
                      {
                        "name": "Forgefiend",
                        "id": "ef9e5bea-7f63-43e7-9eb5-5e5677978720",
                        "faction": {
                          "name": "Black Legion",
                          "id": "9ac95f19-0916-4958-b7d3-9c9b6e3f329a"
                        },
                        "alliance": {
                          "name": "Chaos",
                          "id": "8dd34fc0-0db4-4054-bca7-32dab542f7eb"
                        }
                      }
                    ]
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/mows/{uuid}:
    get:
      tags:
        - Characters, Traits & Machines of War
      summary: Get a machine of war info by their UUID
      parameters:
        - name: uuid
          in: path
          required: true
          description: Machines of war UUID
          schema:
            type: string
          example: "ef9e5bea-7f63-43e7-9eb5-5e5677978720"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MowResponse'
              examples:
                success:
                  value: {
                    "mow": {
                      "name": "Galatian",
                      "id": "25bda910-74bc-42b2-804c-5d2b835944b2",
                      "faction": {
                        "name": "Ultramarines",
                        "id": "c9ef17b5-7505-44a1-9434-fafd3f025ff0"
                      },
                      "alliance": {
                        "name": "Imperial",
                        "id": "82b25e78-9805-4131-99d3-b29f6e9e52bf"
                      }
                    },
                    api_data_version: "20260105-4"
                  }
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/demo/factions:
    get:
      tags:
        - Demo
      summary: Get some factions info for demonstration-only purposes.
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DemoFactionsResponse'
              examples:
                "Only 1 item":
                  value:
                    total: 1
                    items: [
                      {
                        "name": "Ultramarines",
                        "id": "c9ef17b5-7505-44a1-9434-fafd3f025ff0",
                        "characters": [
                          {
                            "name": "Varro Tigurius",
                            "id": "d0ad9fef-deb7-49ac-9496-49773abbbf94"
                          },
                          {
                            "name": "Certus",
                            "id": "c12fdbd7-dff6-460a-b990-bfdc25a07677"
                          },
                          {
                            "name": "Bellator",
                            "id": "92c96670-9b3c-46aa-b637-a7f07d3ba0ec"
                          },
                          {
                            "name": "Incisus",
                            "id": "97d798cf-fba9-4682-99e4-46c6f48bd371"
                          },
                          {
                            "name": "Marneus Calgar",
                            "id": "281c17a7-6964-4057-b78b-d0a540a3b746"
                          },
                          {
                            "name": "Titus",
                            "id": "9953e0b6-aebd-494e-b7a6-411216898934"
                          }
                        ],
                        "mows": [
                          {
                            "name": "Galatian",
                            "id": "25bda910-74bc-42b2-804c-5d2b835944b2"
                          }
                        ],
                        "alliance": {
                          "name": "Imperial",
                          "id": "82b25e78-9805-4131-99d3-b29f6e9e52bf"
                        }
                      },
                    ]
                    api_data_version: "20260105-4"
                    message: "This endpoint is capped at X entities by design and is meant for demonstration-only purposes."
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/factions:
    get:
      tags:
        - Factions
      summary: Get a list of factions data
      parameters:
        - name: searchName
          in: query
          description: Search for factions by name (minimum 3 characters, alphanumeric and apostrophes only).
          required: false
          schema:
            type: string
          example: "Black"
        - name: alliance
          in: query
          description: Filter by alliance UUID.
          required: false
          schema:
            type: string
          example: "8dd34fc0-0db4-4054-bca7-32dab542f7eb"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FactionsResponse'
              examples:
                "Only 1 item":
                  value:
                    total: 1
                    items: [
                      {
                        "name": "Ultramarines",
                        "id": "c9ef17b5-7505-44a1-9434-fafd3f025ff0",
                        "characters": [
                          {
                            "name": "Varro Tigurius",
                            "id": "d0ad9fef-deb7-49ac-9496-49773abbbf94"
                          },
                          {
                            "name": "Certus",
                            "id": "c12fdbd7-dff6-460a-b990-bfdc25a07677"
                          },
                          {
                            "name": "Bellator",
                            "id": "92c96670-9b3c-46aa-b637-a7f07d3ba0ec"
                          },
                          {
                            "name": "Incisus",
                            "id": "97d798cf-fba9-4682-99e4-46c6f48bd371"
                          },
                          {
                            "name": "Marneus Calgar",
                            "id": "281c17a7-6964-4057-b78b-d0a540a3b746"
                          },
                          {
                            "name": "Titus",
                            "id": "9953e0b6-aebd-494e-b7a6-411216898934"
                          }
                        ],
                        "mows": [
                          {
                            "name": "Galatian",
                            "id": "25bda910-74bc-42b2-804c-5d2b835944b2"
                          }
                        ],
                        "alliance": {
                          "name": "Imperial",
                          "id": "82b25e78-9805-4131-99d3-b29f6e9e52bf"
                        }
                      },
                    ]
                    api_data_version: "20260105-4"
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/factions/{uuid}:
    get:
      tags:
        - Factions
      summary: Get a faction info by their UUID
      parameters:
        - name: uuid
          in: path
          required: true
          description: Faction UUID
          schema:
            type: string
          example: "9ac95f19-0916-4958-b7d3-9c9b6e3f329a"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FactionResponse'
              examples:
                success:
                  value: {
                    "faction": {
                      "name": "Black Legion",
                      "id": "9ac95f19-0916-4958-b7d3-9c9b6e3f329a",
                      "characters": [
                        {
                          "name": "Angrax",
                          "id": "d1ad5662-a602-41cb-9bec-2ba0d471bebc"
                        },
                        {
                          "name": "Volk",
                          "id": "752fa601-b4a7-45db-acbf-be5882896118"
                        },
                        {
                          "name": "Archimatos",
                          "id": "9802e02a-56d6-45c7-a562-698415a8bb74"
                        },
                        {
                          "name": "Harkeen Worldclaimer",
                          "id": "60eb0074-8d44-4abe-bd24-be1536e98321"
                        },
                        {
                          "name": "Abaddon The Despoiler",
                          "id": "45251c69-e62c-46a8-8a5a-2f9a54272e40"
                        }
                      ],
                      "mows": [
                        {
                          "name": "Forgefiend",
                          "id": "ef9e5bea-7f63-43e7-9eb5-5e5677978720"
                        }
                      ],
                      "alliance": {
                        "name": "Chaos",
                        "id": "8dd34fc0-0db4-4054-bca7-32dab542f7eb"
                      }
                    },
                    api_data_version: "20260105-4"
                  }
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/traits:
    get:
      tags:
        - Characters, Traits & Machines of War
      summary: Get a list of traits data
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TraitsResponse'
              examples:
                "Only 1 item":
                  value:
                    "total": 1
                    "items": [
                      {
                        "name": "Synapse",
                        "id": "09ad9a37-43a2-495a-ae75-5feafd5d3a64",
                        "characters": [
                          {
                            "name": "Neurothrope",
                            "id": "2f410c38-b461-4f5f-8ced-641f38e86f35"
                          },
                          {
                            "name": "Winged Prime",
                            "id": "a8c46ee2-23b8-4337-a060-9f2859af9d67"
                          },
                          {
                            "name": "Parasite of Mortrex",
                            "id": "091db348-ab54-4127-a157-d5d668c1b12e"
                          },
                          {
                            "name": "The Patermine",
                            "id": "aadddb21-a66d-4239-bd95-fe56e35fbf87"
                          }
                        ]
                      }
                    ]
                    api_data_version: "20260105-4"
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/traits/{uuid}:
    get:
      tags:
        - Characters, Traits & Machines of War
      summary: Get an traits info by their UUID
      parameters:
        - name: uuid
          in: path
          required: true
          description: Trait UUID
          schema:
            type: string
          example: "09ad9a37-43a2-495a-ae75-5feafd5d3a64"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TraitResponse'
              examples:
                success:
                  value: {
                    "trait": {
                      "name": "Synapse",
                      "id": "09ad9a37-43a2-495a-ae75-5feafd5d3a64",
                      "characters": [
                        {
                          "name": "Neurothrope",
                          "id": "2f410c38-b461-4f5f-8ced-641f38e86f35"
                        },
                        {
                          "name": "Winged Prime",
                          "id": "a8c46ee2-23b8-4337-a060-9f2859af9d67"
                        },
                        {
                          "name": "Parasite of Mortrex",
                          "id": "091db348-ab54-4127-a157-d5d668c1b12e"
                        },
                        {
                          "name": "The Patermine",
                          "id": "aadddb21-a66d-4239-bd95-fe56e35fbf87"
                        }
                      ]
                    },
                    api_data_version: "20260105-4"
                  }
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/alliances:
    get:
      tags:
        - Alliances
      summary: Get a list of alliances data
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AlliancesResponse'
              examples:
                "Only 1 item":
                  value:
                    total: 1
                    items: [
                      {
                        "name": "Chaos",
                        "id": "8dd34fc0-0db4-4054-bca7-32dab542f7eb",
                        "characters": [
                          {
                            "name": "Angrax",
                            "id": "d1ad5662-a602-41cb-9bec-2ba0d471bebc"
                          },
                          {
                            "name": "Volk",
                            "id": "752fa601-b4a7-45db-acbf-be5882896118"
                          },
                          {
                            "name": "Archimatos",
                            "id": "9802e02a-56d6-45c7-a562-698415a8bb74"
                          },
                          {
                            "name": "Harkeen Worldclaimer",
                            "id": "60eb0074-8d44-4abe-bd24-be1536e98321"
                          },
                          {
                            "name": "Abaddon The Despoiler",
                            "id": "45251c69-e62c-46a8-8a5a-2f9a54272e40"
                          },
                          {
                            "name": "Typhus",
                            "id": "255749bf-aa3d-46dd-9d0b-6fdaf05a2bcc"
                          },
                          {
                            "name": "Maladus",
                            "id": "3fe40a9c-b76f-4908-be1e-659ce17c7bec"
                          },
                          {
                            "name": "Nauseous Rotbone",
                            "id": "b8f36ca1-4dc1-4065-8e39-4586ede7913d"
                          },
                          {
                            "name": "Pestillian",
                            "id": "ec79e945-c475-44f0-af0b-c57394252081"
                          },
                          {
                            "name": "Corrodius",
                            "id": "e7f9eb09-acc5-4bf6-a9c9-310a42cd300d"
                          },
                          {
                            "name": "Yazaghor",
                            "id": "10e089c1-2944-4c95-9c3e-8feceec261d9"
                          },
                          {
                            "name": "Toth",
                            "id": "524a880a-1541-4c7a-aef5-15d6f678a99a"
                          },
                          {
                            "name": "Abraxas",
                            "id": "e9f02f45-473a-41c8-8733-8a11f09d5b70"
                          },
                          {
                            "name": "Thaumachus",
                            "id": "ff29c9fe-b843-46ea-8b2d-97e02267ad6d"
                          },
                          {
                            "name": "Ahriman",
                            "id": "7ac7da6a-872f-48bf-899f-547a6b01aab5"
                          },
                          {
                            "name": "Wrask",
                            "id": "42e947d2-0394-4c3f-9508-f32971f9ed3a"
                          },
                          {
                            "name": "Macer",
                            "id": "2099f2b6-4dd1-4b45-9bcf-b8b133c68665"
                          },
                          {
                            "name": "Azkor",
                            "id": "b738b73e-247e-439c-bb20-286aea70621b"
                          },
                          {
                            "name": "Tarvakh",
                            "id": "20019261-fa1a-4093-b8d9-3292f0643f3d"
                          },
                          {
                            "name": "Khârn",
                            "id": "360f2538-8076-452c-a90e-a24d9d4716a3"
                          },
                          {
                            "name": "Shiron",
                            "id": "d8f263d5-0619-4ebf-a29d-87b3809042ef"
                          },
                          {
                            "name": "Hascule",
                            "id": "5913a6b5-1363-4758-ab58-80cd62ad1213"
                          },
                          {
                            "name": "Adamatar",
                            "id": "ef9bf59d-ef0b-4c58-b94e-b85e733edbc4"
                          },
                          {
                            "name": "Laviscus",
                            "id": "4b5aee38-f065-44be-bab0-9c0700eb6a3c"
                          },
                          {
                            "name": "Lucius",
                            "id": "426ecd1d-7130-4477-bb27-4a5191c68cd3"
                          }
                        ],
                        "mows": [
                          {
                            "name": "Forgefiend",
                            "id": "ef9e5bea-7f63-43e7-9eb5-5e5677978720"
                          },
                          {
                            "name": "Plagueburst Crawler",
                            "id": "479b27f2-6e01-48f3-85f2-4e53febc767e"
                          },
                          {
                            "name": "Z'Kar",
                            "id": "01346396-23e4-41b1-8aec-c618b38c2aba"
                          }
                        ],
                        "factions": [
                          {
                            "name": "Black Legion",
                            "id": "9ac95f19-0916-4958-b7d3-9c9b6e3f329a"
                          },
                          {
                            "name": "Death Guard",
                            "id": "5e259fc7-09ea-454c-bcf5-807c62d19cb8"
                          },
                          {
                            "name": "Thousand Sons",
                            "id": "8e38ce9f-2451-4220-98ac-e4f3be8de172"
                          },
                          {
                            "name": "World Eaters",
                            "id": "2ff7e9ee-2477-4117-b9cb-18f0ff3aedc9"
                          },
                          {
                            "name": "Emperor's Children",
                            "id": "5cead631-b188-45fc-ab44-83934f1fba66"
                          }
                        ]
                      },
                    ]
                    api_data_version: "20260105-4"
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found
  /api/alliances/{uuid}:
    get:
      tags:
        - Alliances
      summary: Get an alliance info by their UUID
      parameters:
        - name: uuid
          in: path
          required: true
          description: Alliance UUID
          schema:
            type: string
          example: "ca50f9cd-1bff-4c1e-94db-616894e0c2e4"
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AllianceResponse'
              examples:
                success:
                  value: {
                    "trait": {
                      "name": "Synapse",
                      "id": "09ad9a37-43a2-495a-ae75-5feafd5d3a64",
                      "characters": [
                        {
                          "name": "Neurothrope",
                          "id": "2f410c38-b461-4f5f-8ced-641f38e86f35"
                        },
                        {
                          "name": "Winged Prime",
                          "id": "a8c46ee2-23b8-4337-a060-9f2859af9d67"
                        },
                        {
                          "name": "Parasite of Mortrex",
                          "id": "091db348-ab54-4127-a157-d5d668c1b12e"
                        },
                        {
                          "name": "The Patermine",
                          "id": "aadddb21-a66d-4239-bd95-fe56e35fbf87"
                        }
                      ]
                    },
                    api_data_version: "20260105-4"
                  }
        '400':
          description: Client error
        '403':
          description: Forbidden
        '404':
          description: Not Found

components:

  schemas:
    # Responses
    DemoCharactersResponse:
      type: object
      required:
        - message
        - total
        - items
        - api_data_version
      properties:
        message:
          type: string
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/CharacterEntity'
        api_data_version:
          type: string
    DemoFactionsResponse:
      type: object
      required:
        - message
        - total
        - items
        - api_data_version
      properties:
        message:
          type: string
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/FactionEntity'
        api_data_version:
          type: string
    DemoMowsResponse:
      type: object
      required:
        - message
        - total
        - items
        - api_data_version
      properties:
        message:
          type: string
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/MowEntity'
        api_data_version:
          type: string
    CharactersResponse:
      type: object
      required:
        - total
        - items
        - api_data_version
      properties:
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/CharacterEntity'
        api_data_version:
          type: string
    CharacterResponse:
      type: object
      required:
        - character
        - api_data_version
      properties:
        character:
          $ref: '#/components/schemas/CharacterEntity'
        api_data_version:
          type: string
    FactionsResponse:
      type: object
      required:
        - total
        - items
        - api_data_version
      properties:
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/FactionEntity'
        api_data_version:
          type: string
    FactionResponse:
      type: object
      required:
        - faction
        - api_data_version
      properties:
        faction:
          $ref: '#/components/schemas/FactionEntity'
        api_data_version:
          type: string
    AlliancesResponse:
      type: object
      required:
        - total
        - items
        - api_data_version
      properties:
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/AllianceEntity'
        api_data_version:
          type: string
    AllianceResponse:
      type: object
      required:
        - alliance
        - api_data_version
      properties:
        character:
          $ref: '#/components/schemas/AllianceEntity'
        api_data_version:
          type: string
    MowsResponse:
      type: object
      required:
        - total
        - items
        - api_data_version
      properties:
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/MowEntity'
        api_data_version:
          type: string
    MowResponse:
      type: object
      required:
        - mow
        - api_data_version
      properties:
        character:
          $ref: '#/components/schemas/MowEntity'
        api_data_version:
          type: string
    TraitsResponse:
      type: object
      required:
        - total
        - items
        - api_data_version
      properties:
        total:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/TraitEntity'
        api_data_version:
          type: string
    TraitResponse:
      type: object
      required:
        - trait
        - api_data_version
      properties:
        character:
          $ref: '#/components/schemas/TraitEntity'
        api_data_version:
          type: string

    # Entities
    EntitySummary:
      type: object
      required:
        - name
        - id
      properties:
        name:
          type: string
        id:
          type: string
          format: uuid
    AllianceSummary:
      allOf:
        - $ref: '#/components/schemas/EntitySummary'
    FactionSummary:
      allOf:
        - $ref: '#/components/schemas/EntitySummary'
    CharacterSummary:
      allOf:
        - $ref: '#/components/schemas/EntitySummary'
    MowSummary:
      allOf:
        - $ref: '#/components/schemas/EntitySummary'
    TraitSummary:
      allOf:
        - $ref: '#/components/schemas/EntitySummary'

    # Summaries
    AllianceEntity:
      type: object
      required:
        - name
        - id
        - characters
        - mows
        - factions
      properties:
        name:
          type: string
        id:
          type: string
          format: uuid
        characters:
          type: array
          items:
            $ref: '#/components/schemas/CharacterSummary'
        mows:
          type: array
          items:
            $ref: '#/components/schemas/MowSummary'
        factions:
          type: array
          items:
            $ref: '#/components/schemas/FactionSummary'
    FactionEntity:
      type: object
      required:
        - name
        - id
        - characters
        - mows
        - alliance
      properties:
        name:
          type: string
        id:
          type: string
          format: uuid
        characters:
          type: array
          items:
            $ref: '#/components/schemas/CharacterSummary'
        mows:
          type: array
          items:
            $ref: '#/components/schemas/MowSummary'
        alliance:
          $ref: '#/components/schemas/AllianceSummary'
    CharacterEntity:
      type: object
      required:
        - name
        - id
        - faction
        - alliance
        - traits
      properties:
        name:
          type: string
        id:
          type: string
          format: uuid
        faction:
          $ref: '#/components/schemas/FactionSummary'
        alliance:
          $ref: '#/components/schemas/AllianceSummary'
        traits:
          type: array
          items:
            $ref: '#/components/schemas/TraitSummary'
    MowEntity:
      type: object
      required:
        - name
        - id
        - faction
        - alliance
      properties:
        name:
          type: string
        id:
          type: string
          format: uuid
        faction:
          $ref: '#/components/schemas/FactionSummary'
        alliance:
          $ref: '#/components/schemas/AllianceSummary'
    TraitEntity:
      type: object
      required:
        - name
        - id
        - characters
      properties:
        name:
          type: string
        id:
          type: string
          format: uuid
        characters:
          type: array
          items:
            $ref: '#/components/schemas/CharacterSummary'
